aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2014-10-05 12:14:22 +0200
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2014-10-05 12:14:22 +0200
commitfebabccdd5e6db573ab80bd5c1758d136b91cd78 (patch)
treee72478f423302904d995402fb03caf8871f933bd
parent5474803aa7a05e4afa851c88bf21fd8383bf59d9 (diff)
Primitive extension system
https://github.com/marienfressinaud/FreshRSS/issues/252 I have been using this extension system for a little while, in particular to include custom CSS and/or JavaScript (inclusion of PHP code is not done yet). There is very little code and it does not impact performances. I hurry to post it before https://github.com/marienfressinaud/FreshRSS/issues/655
-rw-r--r--app/FreshRSS.php21
-rw-r--r--extensions/.gitignore1
-rw-r--r--extensions/Read-me.txt15
-rw-r--r--p/ext.php35
4 files changed, 72 insertions, 0 deletions
diff --git a/app/FreshRSS.php b/app/FreshRSS.php
index cdf8962cb..58aac4059 100644
--- a/app/FreshRSS.php
+++ b/app/FreshRSS.php
@@ -17,6 +17,7 @@ class FreshRSS extends Minz_FrontController {
Minz_View::_param('loginOk', $loginOk);
$this->loadStylesAndScripts($loginOk); //TODO: Do not load that when not needed, e.g. some Ajax requests
$this->loadNotifications();
+ $this->loadExtensions();
}
private static function getCredentialsFromLongTermCookie() {
@@ -179,4 +180,24 @@ class FreshRSS extends Minz_FrontController {
Minz_Session::_param ('notification');
}
}
+
+ private function loadExtensions() {
+ $extensionPath = FRESHRSS_PATH . '/extensions/';
+ //TODO: Add a preference to load only user-selected extensions
+ foreach (scandir($extensionPath) as $key => $extension) {
+ if (ctype_alpha($extension)) {
+ $mtime = @filemtime($extensionPath . $extension . '/style.css');
+ if ($mtime !== false) {
+ Minz_View::appendStyle(Minz_Url::display('/ext.php?c&amp;e=' . $extension . '&amp;' . $mtime));
+ }
+ $mtime = @filemtime($extensionPath . $extension . '/script.js');
+ if ($mtime !== false) {
+ Minz_View::appendScript(Minz_Url::display('/ext.php?j&amp;e=' . $extension . '&amp;' . $mtime));
+ }
+ if (file_exists($extensionPath . $extension . '/module.php')) {
+ //TODO: include
+ }
+ }
+ }
+ }
}
diff --git a/extensions/.gitignore b/extensions/.gitignore
new file mode 100644
index 000000000..d93e5e396
--- /dev/null
+++ b/extensions/.gitignore
@@ -0,0 +1 @@
+/[xX]
diff --git a/extensions/Read-me.txt b/extensions/Read-me.txt
new file mode 100644
index 000000000..e7b66d5bc
--- /dev/null
+++ b/extensions/Read-me.txt
@@ -0,0 +1,15 @@
+== FreshRSS extensions ==
+
+You may place in this directory some custom extensions for FreshRSS.
+
+The structure must be:
+
+./FreshRSS/extensions/
+ ./NameOfExtensionAlphanumeric/
+ ./style.css
+ ./script.js
+ ./module.php
+
+Each file is optional.
+
+The name of non-official extensions should start by an 'x'.
diff --git a/p/ext.php b/p/ext.php
new file mode 100644
index 000000000..cff194343
--- /dev/null
+++ b/p/ext.php
@@ -0,0 +1,35 @@
+<?php
+if (!isset($_GET['e'])) {
+ header('HTTP/1.1 400 Bad Request');
+ die();
+}
+$extension = substr($_GET['e'], 0, 64);
+if (!ctype_alpha($extension)) {
+ header('HTTP/1.1 400 Bad Request');
+ die();
+}
+
+require('../constants.php');
+$filename = FRESHRSS_PATH . '/extensions/' . $extension . '/';
+
+if (isset($_GET['j'])) {
+ header('Content-Type: application/javascript; charset=UTF-8');
+ header('Content-Disposition: inline; filename="script.js"');
+ $filename .= 'script.js';
+} elseif (isset($_GET['c'])) {
+ header('Content-Type: text/css; charset=UTF-8');
+ header('Content-Disposition: inline; filename="style.css"');
+ $filename .= 'style.css';
+}
+
+$mtime = @filemtime($filename);
+if ($mtime == false) {
+ header('HTTP/1.1 404 Not Found');
+ die();
+}
+
+require(LIB_PATH . '/http-conditional.php');
+
+if (!httpConditional($mtime, 604800, 2)) {
+ readfile($filename);
+}