aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2019-12-07 19:29:23 +0100
committerGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2019-12-22 15:01:02 +0100
commit7802fd33a627dc7c582df871cfa613d9be8f8788 (patch)
tree475d6a11b3314561cb90c7d9c480e4620f1d8dac /app
parent2b1f8e67f76672a5b1b0a1b0403d81dbee364c58 (diff)
tec: Allow to change CSP header from controllers
For an extension, I needed to call a script from an external domain. Unfortunately, the CSP headers didn't allow this domain and I had to patch manually the FreshRSS FrontController for my extension. It's obviously not a long-term solution since it has nothing to do in the core of FRSS, and I don't want to apply this patch manually at each update. With this patch, I allow changing the CSP header from inside the controller actions. It allows extensions to modify headers. It's also an opportunity to remove a bit of code from the FrontController. I wasn't happy with the previous implementation anyhow. Reference: https://github.com/flusio/xExtension-Flus/commit/ed12d56#diff-ff12e33ed31b23bda327499fa6e84eccR143
Diffstat (limited to 'app')
-rwxr-xr-xapp/Controllers/indexController.php14
-rw-r--r--app/Controllers/statsController.php5
-rw-r--r--app/FreshRSS.php17
3 files changed, 19 insertions, 17 deletions
diff --git a/app/Controllers/indexController.php b/app/Controllers/indexController.php
index 967029fd1..276d56acd 100755
--- a/app/Controllers/indexController.php
+++ b/app/Controllers/indexController.php
@@ -83,6 +83,13 @@ class FreshRSS_index_Controller extends Minz_ActionController {
Minz_Error::error(404);
}
};
+
+ $this->_csp([
+ 'default-src' => "'self'",
+ 'frame-src' => '*',
+ 'img-src' => '* data:',
+ 'media-src' => '*',
+ ]);
}
/**
@@ -121,6 +128,13 @@ class FreshRSS_index_Controller extends Minz_ActionController {
$title = '(' . FreshRSS_Context::$get_unread . ') ' . $title;
}
Minz_View::prependTitle($title . ' · ');
+
+ $this->_csp([
+ 'default-src' => "'self'",
+ 'frame-src' => '*',
+ 'img-src' => '* data:',
+ 'media-src' => '*',
+ ]);
}
/**
diff --git a/app/Controllers/statsController.php b/app/Controllers/statsController.php
index 1d0d9c124..0d7d8f65a 100644
--- a/app/Controllers/statsController.php
+++ b/app/Controllers/statsController.php
@@ -15,6 +15,11 @@ class FreshRSS_stats_Controller extends Minz_ActionController {
Minz_Error::error(403);
}
+ $this->_csp([
+ 'default-src' => "'self'",
+ 'style-src' => "'self' 'unsafe-inline'",
+ ]);
+
Minz_View::prependTitle(_t('admin.stats.title') . ' · ');
}
diff --git a/app/FreshRSS.php b/app/FreshRSS.php
index 8d079b268..886e30323 100644
--- a/app/FreshRSS.php
+++ b/app/FreshRSS.php
@@ -124,23 +124,6 @@ class FreshRSS extends Minz_FrontController {
}
public static function preLayout() {
- switch (Minz_Request::controllerName()) {
- case 'index':
- $urlToAuthorize = array_filter(array_map(function ($a) {
- if (isset($a['method']) && $a['method'] === 'POST') {
- return $a['url'];
- }
- }, FreshRSS_Context::$user_conf->sharing));
- $connectSrc = count($urlToAuthorize) ? sprintf("; connect-src 'self' %s", implode(' ', $urlToAuthorize)) : '';
- header(sprintf("Content-Security-Policy: default-src 'self'; frame-src *; img-src * data:; media-src *%s", $connectSrc));
- break;
- case 'stats':
- header("Content-Security-Policy: default-src 'self'; style-src 'self' 'unsafe-inline'");
- break;
- default:
- header("Content-Security-Policy: default-src 'self'");
- break;
- }
header("X-Content-Type-Options: nosniff");
FreshRSS_Share::load(join_path(APP_PATH, 'shares.php'));