extensionController.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. <?php
  2. /**
  3. * The controller to manage extensions.
  4. */
  5. class FreshRSS_extension_Controller extends Minz_ActionController {
  6. /**
  7. * This action is called before every other action in that class. It is
  8. * the common boiler plate for every action. It is triggered by the
  9. * underlying framework.
  10. */
  11. public function firstAction() {
  12. if (!FreshRSS_Auth::hasAccess()) {
  13. Minz_Error::error(403);
  14. }
  15. }
  16. /**
  17. * This action lists all the extensions available to the current user.
  18. */
  19. public function indexAction() {
  20. Minz_View::prependTitle(_t('admin.extensions.title') . ' · ');
  21. $this->view->extension_list = array(
  22. 'system' => array(),
  23. 'user' => array(),
  24. );
  25. $extensions = Minz_ExtensionManager::listExtensions();
  26. foreach ($extensions as $ext) {
  27. $this->view->extension_list[$ext->getType()][] = $ext;
  28. }
  29. }
  30. /**
  31. * This action handles configuration of a given extension.
  32. *
  33. * Only administrator can configure a system extension.
  34. *
  35. * Parameters are:
  36. * - e: the extension name (urlencoded)
  37. * - additional parameters which should be handle by the extension
  38. * handleConfigureAction() method (POST request).
  39. */
  40. public function configureAction() {
  41. if (Minz_Request::param('ajax')) {
  42. $this->view->_useLayout(false);
  43. } else {
  44. $this->indexAction();
  45. $this->view->change_view('extension', 'index');
  46. }
  47. $ext_name = urldecode(Minz_Request::param('e'));
  48. $ext = Minz_ExtensionManager::findExtension($ext_name);
  49. if (is_null($ext)) {
  50. Minz_Error::error(404);
  51. }
  52. if ($ext->getType() === 'system' && !FreshRSS_Auth::hasAccess('admin')) {
  53. Minz_Error::error(403);
  54. }
  55. $this->view->extension = $ext;
  56. $this->view->extension->handleConfigureAction();
  57. }
  58. /**
  59. * This action enables a disabled extension for the current user.
  60. *
  61. * System extensions can only be enabled by an administrator.
  62. * This action must be reached by a POST request.
  63. *
  64. * Parameter is:
  65. * - e: the extension name (urlencoded).
  66. */
  67. public function enableAction() {
  68. $url_redirect = array('c' => 'extension', 'a' => 'index');
  69. if (Minz_Request::isPost()) {
  70. $ext_name = urldecode(Minz_Request::param('e'));
  71. $ext = Minz_ExtensionManager::findExtension($ext_name);
  72. if (is_null($ext)) {
  73. Minz_Request::bad(_t('feedback.extensions.not_found', $ext_name),
  74. $url_redirect);
  75. }
  76. if ($ext->isEnabled()) {
  77. Minz_Request::bad(_t('feedback.extensions.already_enabled', $ext_name),
  78. $url_redirect);
  79. }
  80. $conf = null;
  81. if ($ext->getType() === 'system' && FreshRSS_Auth::hasAccess('admin')) {
  82. $conf = FreshRSS_Context::$system_conf;
  83. } elseif ($ext->getType() === 'user') {
  84. $conf = FreshRSS_Context::$user_conf;
  85. } else {
  86. Minz_Request::bad(_t('feedback.extensions.no_access', $ext_name),
  87. $url_redirect);
  88. }
  89. $res = $ext->install();
  90. if ($res === true) {
  91. $ext_list = $conf->extensions_enabled;
  92. array_push_unique($ext_list, $ext_name);
  93. $conf->extensions_enabled = $ext_list;
  94. $conf->save();
  95. Minz_Request::good(_t('feedback.extensions.enable.ok', $ext_name),
  96. $url_redirect);
  97. } else {
  98. Minz_Log::warning('Can not enable extension ' . $ext_name . ': ' . $res);
  99. Minz_Request::bad(_t('feedback.extensions.enable.ko', $ext_name, _url('index', 'logs')),
  100. $url_redirect);
  101. }
  102. }
  103. Minz_Request::forward($url_redirect, true);
  104. }
  105. /**
  106. * This action disables an enabled extension for the current user.
  107. *
  108. * System extensions can only be disabled by an administrator.
  109. * This action must be reached by a POST request.
  110. *
  111. * Parameter is:
  112. * - e: the extension name (urlencoded).
  113. */
  114. public function disableAction() {
  115. $url_redirect = array('c' => 'extension', 'a' => 'index');
  116. if (Minz_Request::isPost()) {
  117. $ext_name = urldecode(Minz_Request::param('e'));
  118. $ext = Minz_ExtensionManager::findExtension($ext_name);
  119. if (is_null($ext)) {
  120. Minz_Request::bad(_t('feedback.extensions.not_found', $ext_name),
  121. $url_redirect);
  122. }
  123. if (!$ext->isEnabled()) {
  124. Minz_Request::bad(_t('feedback.extensions.not_enabled', $ext_name),
  125. $url_redirect);
  126. }
  127. $conf = null;
  128. if ($ext->getType() === 'system' && FreshRSS_Auth::hasAccess('admin')) {
  129. $conf = FreshRSS_Context::$system_conf;
  130. } elseif ($ext->getType() === 'user') {
  131. $conf = FreshRSS_Context::$user_conf;
  132. } else {
  133. Minz_Request::bad(_t('feedback.extensions.no_access', $ext_name),
  134. $url_redirect);
  135. }
  136. $res = $ext->uninstall();
  137. if ($res === true) {
  138. $ext_list = $conf->extensions_enabled;
  139. array_remove($ext_list, $ext_name);
  140. $conf->extensions_enabled = $ext_list;
  141. $conf->save();
  142. Minz_Request::good(_t('feedback.extensions.disable.ok', $ext_name),
  143. $url_redirect);
  144. } else {
  145. Minz_Log::warning('Can not unable extension ' . $ext_name . ': ' . $res);
  146. Minz_Request::bad(_t('feedback.extensions.disable.ko', $ext_name, _url('index', 'logs')),
  147. $url_redirect);
  148. }
  149. }
  150. Minz_Request::forward($url_redirect, true);
  151. }
  152. /**
  153. * This action handles deletion of an extension.
  154. *
  155. * Only administrator can remove an extension.
  156. * This action must be reached by a POST request.
  157. *
  158. * Parameter is:
  159. * -e: extension name (urlencoded)
  160. */
  161. public function removeAction() {
  162. if (!FreshRSS_Auth::hasAccess('admin')) {
  163. Minz_Error::error(403);
  164. }
  165. $url_redirect = array('c' => 'extension', 'a' => 'index');
  166. if (Minz_Request::isPost()) {
  167. $ext_name = urldecode(Minz_Request::param('e'));
  168. $ext = Minz_ExtensionManager::findExtension($ext_name);
  169. if (is_null($ext)) {
  170. Minz_Request::bad(_t('feedback.extensions.not_found', $ext_name),
  171. $url_redirect);
  172. }
  173. $res = recursive_unlink($ext->getPath());
  174. if ($res) {
  175. Minz_Request::good(_t('feedback.extensions.removed', $ext_name),
  176. $url_redirect);
  177. } else {
  178. Minz_Request::bad(_t('feedback.extensions.cannot_delete', $ext_name),
  179. $url_redirect);
  180. }
  181. }
  182. Minz_Request::forward($url_redirect, true);
  183. }
  184. }