aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2014-12-06 16:17:11 +0100
committerGravatar Marien Fressinaud <dev@marienfressinaud.fr> 2014-12-06 16:17:11 +0100
commit2e4682ebd451f8dd291e11141553add9164cbbef (patch)
tree006839fb0363530faf2a31b142dea58af80a2d87
parenta08c382e0651f22a7db06feba225f3d49289763d (diff)
Add enable / disable extension features
See https://github.com/FreshRSS/FreshRSS/issues/252
-rw-r--r--app/Controllers/extensionController.php72
-rw-r--r--app/Models/Configuration.php12
-rw-r--r--lib/Minz/ExtensionManager.php18
3 files changed, 97 insertions, 5 deletions
diff --git a/app/Controllers/extensionController.php b/app/Controllers/extensionController.php
index 504be56d3..415f489a6 100644
--- a/app/Controllers/extensionController.php
+++ b/app/Controllers/extensionController.php
@@ -29,12 +29,80 @@ class FreshRSS_extension_Controller extends Minz_ActionController {
}
}
+ /**
+ * This action enables a disabled extension for the current user.
+ *
+ * System extensions can only be enabled by an administrator.
+ *
+ * Parameter is:
+ * - e: the extension name (urlencoded).
+ */
public function enableAction() {
-
+ $url_redirect = array('c' => 'extension', 'a' => 'index');
+
+ if (Minz_Request::isPost()) {
+ $ext_name = urldecode(Minz_Request::param('e'));
+ $ext = Minz_ExtensionManager::find_extension($ext_name);
+
+ if (is_null($ext)) {
+ Minz_Request::bad('feedback.extension.not_found', $url_redirect);
+ }
+
+ if ($ext->is_enabled()) {
+ Minz_Request::bad('feedback.extension.already_enabled', $url_redirect);
+ }
+
+ if ($ext->getType() === 'system' && !FreshRSS_Auth::hasAccess('admin')) {
+ Minz_Request::bad('feedback.extension.no_access', $url_redirect);
+ }
+
+ $ext->install();
+
+ FreshRSS_Context::$conf->addExtension($ext_name);
+ FreshRSS_Context::$conf->save();
+
+ Minz_Request::good('feedback.extension.enabled', $url_redirect);
+ }
+
+ Minz_Request::forward($url_redirect, true);
}
+ /**
+ * This action disables an enabled extension for the current user.
+ *
+ * System extensions can only be disabled by an administrator.
+ *
+ * Parameter is:
+ * - e: the extension name (urlencoded).
+ */
public function disableAction() {
-
+ $url_redirect = array('c' => 'extension', 'a' => 'index');
+
+ if (Minz_Request::isPost()) {
+ $ext_name = urldecode(Minz_Request::param('e'));
+ $ext = Minz_ExtensionManager::find_extension($ext_name);
+
+ if (is_null($ext)) {
+ Minz_Request::bad('feedback.extension.not_found', $url_redirect);
+ }
+
+ if (!$ext->is_enabled()) {
+ Minz_Request::bad('feedback.extension.not_enabled', $url_redirect);
+ }
+
+ if ($ext->getType() === 'system' && !FreshRSS_Auth::hasAccess('admin')) {
+ Minz_Request::bad('feedback.extension.no_access', $url_redirect);
+ }
+
+ $ext->uninstall();
+
+ FreshRSS_Context::$conf->removeExtension($ext_name);
+ FreshRSS_Context::$conf->save();
+
+ Minz_Request::good('feedback.extension.disabled', $url_redirect);
+ }
+
+ Minz_Request::forward($url_redirect, true);
}
public function removeAction() {
diff --git a/app/Models/Configuration.php b/app/Models/Configuration.php
index 13ce43990..83a00d4bb 100644
--- a/app/Models/Configuration.php
+++ b/app/Models/Configuration.php
@@ -350,4 +350,16 @@ class FreshRSS_Configuration {
}
$this->data['extensions_enabled'] = $value;
}
+ public function removeExtension($ext_name) {
+ $this->data['extensions_enabled'] = array_diff(
+ $this->data['extensions_enabled'],
+ array($ext_name)
+ );
+ }
+ public function addExtension($ext_name) {
+ $found = array_search($ext_name, $this->data['extensions_enabled']) !== false;
+ if (!$found) {
+ $this->data['extensions_enabled'][] = $ext_name;
+ }
+ }
}
diff --git a/lib/Minz/ExtensionManager.php b/lib/Minz/ExtensionManager.php
index 6c32ccf19..46e421bac 100644
--- a/lib/Minz/ExtensionManager.php
+++ b/lib/Minz/ExtensionManager.php
@@ -160,10 +160,8 @@ class Minz_ExtensionManager {
}
}
-
-
/**
- * Returns a list of extensions.
+ * Return a list of extensions.
*
* @param $only_enabled if true returns only the enabled extensions (false by default).
* @return an array of extensions.
@@ -175,4 +173,18 @@ class Minz_ExtensionManager {
return self::$ext_list;
}
}
+
+ /**
+ * Return an extension by its name.
+ *
+ * @param $ext_name the name of the extension.
+ * @return the corresponding extension or null if it doesn't exist.
+ */
+ public static function find_extension($ext_name) {
+ if (!isset(self::$ext_list[$ext_name])) {
+ return null;
+ }
+
+ return self::$ext_list[$ext_name];
+ }
}