3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
6 * Galette plugins controller
10 * Copyright © 2020 The Galette Team
12 * This file is part of Galette (http://galette.tuxfamily.org).
14 * Galette is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation, either version 3 of the License, or
17 * (at your option) any later version.
19 * Galette is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with Galette. If not, see <http://www.gnu.org/licenses/>.
27 * @category Controllers
30 * @author Johan Cwiklinski <johan@x-tnd.be>
31 * @copyright 2020 The Galette Team
32 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
33 * @link http://galette.tuxfamily.org
34 * @since Available since 0.9.4dev - 2020-05-02
37 namespace Galette\Controllers
;
39 use Slim\Http\Request
;
40 use Slim\Http\Response
;
41 use Galette\Core\Install
;
42 use Galette\Core\PluginInstall
;
43 use Laminas\Db\Adapter\Adapter
;
47 * Galette plugins controller
49 * @category Controllers
50 * @name PluginsController
52 * @author Johan Cwiklinski <johan@x-tnd.be>
53 * @copyright 2020 The Galette Team
54 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
55 * @link http://galette.tuxfamily.org
56 * @since Available since 0.9.4dev - 2020-05-02
59 class PluginsController
extends AbstractController
64 * @param Request $request PSR Request
65 * @param Response $response PSR Response
69 public function showPlugins(Request
$request, Response
$response): Response
71 $plugins = $this->plugins
;
73 $plugins_list = $plugins->getModules();
74 $disabled_plugins = $plugins->getDisabledModules();
81 'page_title' => _T("Plugins"),
82 'plugins_list' => $plugins_list,
83 'plugins_disabled_list' => $disabled_plugins
90 * Plugins activation/desactivaion
92 * @param Request $request PSR Request
93 * @param Response $response PSR Response
94 * @param array $args Request arguments
98 public function togglePlugin(Request
$request, Response
$response, array $args = []): Response
100 if (GALETTE_MODE
!== 'DEMO') {
101 $plugins = $this->plugins
;
102 $action = $args['action'];
103 $reload_plugins = false;
104 if ($action == 'activate') {
106 $plugins->activateModule($args['module_id']);
107 $this->flash
->addMessage(
112 _T("Plugin %name has been enabled")
115 $reload_plugins = true;
116 } catch (\Exception
$e) {
117 $this->flash
->addMessage(
122 } elseif ($args['action'] == 'deactivate') {
124 $plugins->deactivateModule($args['module_id']);
125 $this->flash
->addMessage(
130 _T("Plugin %name has been disabled")
133 $reload_plugins = true;
134 } catch (\Exception
$e) {
135 $this->flash
->addMessage(
142 //If some plugins have been (de)activated, we have to reload
143 if ($reload_plugins === true) {
144 $plugins->loadModules($this->preferences
, GALETTE_PLUGINS_PATH
, $this->i18n
->getLongID());
150 ->withHeader('Location', $this->router
->pathFor('plugins'));
154 * Plugins database activation
156 * @param Request $request PSR Request
157 * @param Response $response PSR Response
158 * @param array $args Request arguments
162 public function initPluginDb(Request
$request, Response
$response, array $args = []): Response
164 if (GALETTE_MODE
=== 'DEMO') {
166 'Trying to access plugin database initialization in DEMO mode.',
169 return $response->withStatus(403);
173 $warning_detected = [];
174 $error_detected = [];
176 $plugid = $args['id'];
177 $plugin = $this->plugins
->getModules($plugid);
179 if ($plugin === null) {
181 'Unable to load plugin `' . $plugid . '`!',
184 $notFound = $this->notFoundHandler
;
185 return $notFound($request, $response);
189 $mdplugin = md5($plugin['root']);
191 isset($this->session
->$mdplugin)
192 && !isset($_GET['raz'])
194 $install = $this->session
->$mdplugin;
196 $install = new PluginInstall();
199 $post = $request->getParsedBody();
201 if (isset($post['stepback_btn'])) {
202 $install->atPreviousStep();
203 } elseif (isset($post['install_prefs_ok'])) {
204 $install->atEndStep();
205 } elseif (isset($_POST['previous_version'])) {
206 $install->setInstalledVersion($_POST['previous_version']);
207 $install->atDbUpgradeStep();
208 } elseif (isset($post['install_dbperms_ok'])) {
209 if ($install->isInstall()) {
210 $install->atDbInstallStep();
211 } elseif ($install->isUpgrade()) {
212 $install->atVersionSelection();
214 } elseif (isset($post['install_type'])) {
215 $install->setMode($post['install_type']);
216 $install->atDbStep();
222 if (isset($post['install_type'])) {
223 $params['install_type'] = $post['install_type'];
227 if (isset($post['install_dbperms_ok'])) {
228 if ($post['install_type'] === PluginInstall
::INSTALL
) {
235 if (isset($post['previous_version'])) {
239 if (isset($post['install_dbwrite_ok'])) {
243 if (isset($post['install_type'])) {
244 if ($post['install_type'] == PluginInstall
::INSTALL
) {
245 $step = 'i' . $istep;
246 } elseif ($istep > 1 && $post['install_type'] == PluginInstall
::UPDATE
) {
247 $step = 'u' . $istep;
253 //let's look for updates scripts
254 $update_scripts = $install::getUpdateScripts($plugin['root'], TYPE_DB
);
255 if (count($update_scripts) > 0) {
256 $params['update_scripts'] = $update_scripts;
261 if (!defined('GALETTE_THEME_DIR')) {
262 define('GALETTE_THEME_DIR', './themes/default/');
265 $install_plugin = true;
266 //not used here, but from include
269 include_once __DIR__
. '/../../install/steps/db_checks.php';
270 $params['results'] = ob_get_contents();
274 $update_scripts = Install
::getUpdateScripts($plugin['root'], TYPE_DB
);
275 $params['update_scripts'] = $update_scripts;
281 // begin : copyright (2002) the phpbb group (support@phpbb.com)
282 // load in the sql parser
283 include GALETTE_ROOT
. 'includes/sql_parse.php';
285 $update_scripts = Install
::getUpdateScripts(
288 $_POST['previous_version']
291 $update_scripts['current'] = TYPE_DB
. '.sql';
295 foreach ($update_scripts as $key => $val) {
296 $sql_query .= @fread
(
297 @fopen
($plugin['root'] . '/scripts/' . $val, 'r'),
298 @filesize
($plugin['root'] . '/scripts/' . $val)
303 $sql_query = preg_replace('/galette_/', PREFIX_DB
, $sql_query);
304 $sql_query = remove_remarks($sql_query);
306 $sql_query = split_sql_file($sql_query, ';');
308 for ($i = 0; $i < sizeof($sql_query); $i++
) {
309 $query = trim($sql_query[$i]);
310 if ($query != '' && $query[0] != '-') {
312 @list
($w1, $w2, $w3, $extra) = array_pad(explode(' ', $query, 4), 4, '');
317 $this->zdb
->db
->query(
319 Adapter
::QUERY_MODE_EXECUTE
321 $messages['success'][] = $w1 . ' ' . $w2 . ' ' . $w3 .
323 } catch (Exception
$e) {
325 'Error executing query | ' . $e->getMessage() .
326 ' | Query was: ' . $query,
330 (strcasecmp(trim($w1), 'drop') != 0)
331 && (strcasecmp(trim($w1), 'rename') != 0)
333 $error_detected[] = $w1 . ' ' . $w2 . ' ' . $w3 . ' ' . $extra;
334 $error_detected[] = $e->getMessage() . '<br/>(' . $query . ')';
336 //if error are on drop, DROP, rename or RENAME we can continue
337 $warning_detected[] = $w1 . ' ' . $w2 . ' ' . $w3 . ' ' . $extra;
338 $warning_detected[] = $e->getMessage() . '<br/>(' . $query . ')';
346 $this->session
->$mdplugin = $install;
349 'page_title' => $install->getStepTitle(),
354 'mode' => ($request->isXhr() ?
'ajax' : ''),
355 'error_detected' => $error_detected