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
;
40 use Slim\Http\Request
;
41 use Slim\Http\Response
;
42 use Galette\Core\Install
;
43 use Galette\Core\PluginInstall
;
44 use Laminas\Db\Adapter\Adapter
;
48 * Galette plugins controller
50 * @category Controllers
51 * @name PluginsController
53 * @author Johan Cwiklinski <johan@x-tnd.be>
54 * @copyright 2020 The Galette Team
55 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
56 * @link http://galette.tuxfamily.org
57 * @since Available since 0.9.4dev - 2020-05-02
60 class PluginsController
extends AbstractController
65 * @param Request $request PSR Request
66 * @param Response $response PSR Response
70 public function showPlugins(Request
$request, Response
$response): Response
72 $plugins = $this->plugins
;
74 $plugins_list = $plugins->getModules();
75 $disabled_plugins = $plugins->getDisabledModules();
82 'page_title' => _T("Plugins"),
83 'plugins_list' => $plugins_list,
84 'plugins_disabled_list' => $disabled_plugins
91 * Plugins activation/desactivaion
93 * @param Request $request PSR Request
94 * @param Response $response PSR Response
95 * @param string $action Action
96 * @param string $module_id Module id
100 public function togglePlugin(Request
$request, Response
$response, string $action, string $module_id): Response
102 if (GALETTE_MODE
!== 'DEMO') {
103 $plugins = $this->plugins
;
104 $reload_plugins = false;
105 if ($action == 'activate') {
107 $plugins->activateModule($module_id);
108 $this->flash
->addMessage(
113 _T("Plugin %name has been enabled")
116 $reload_plugins = true;
117 } catch (Throwable
$e) {
118 $this->flash
->addMessage(
123 } elseif ($action == 'deactivate') {
125 $plugins->deactivateModule($module_id);
126 $this->flash
->addMessage(
131 _T("Plugin %name has been disabled")
134 $reload_plugins = true;
135 } catch (Throwable
$e) {
136 $this->flash
->addMessage(
143 //If some plugins have been (de)activated, we have to reload
144 if ($reload_plugins === true) {
145 $plugins->loadModules($this->preferences
, GALETTE_PLUGINS_PATH
, $this->i18n
->getLongID());
151 ->withHeader('Location', $this->router
->pathFor('plugins'));
155 * Plugins database activation
157 * @param Request $request PSR Request
158 * @param Response $response PSR Response
159 * @param string $id Plugin id
163 public function initPluginDb(Request
$request, Response
$response, string $id): Response
165 if (GALETTE_MODE
=== 'DEMO') {
167 'Trying to access plugin database initialization in DEMO mode.',
170 return $response->withStatus(403);
174 $warning_detected = [];
175 $error_detected = [];
178 $plugin = $this->plugins
->getModules($plugid);
180 if ($plugin === null) {
182 'Unable to load plugin `' . $plugid . '`!',
185 $notFound = $this->notFoundHandler
;
186 return $notFound($request, $response);
190 $mdplugin = md5($plugin['root']);
192 isset($this->session
->$mdplugin)
193 && !isset($_GET['raz'])
195 $install = $this->session
->$mdplugin;
197 $install = new PluginInstall();
200 $post = $request->getParsedBody();
202 if (isset($post['stepback_btn'])) {
203 $install->atPreviousStep();
204 } elseif (isset($post['install_prefs_ok'])) {
205 $install->atEndStep();
206 } elseif (isset($post['previous_version'])) {
207 $install->setInstalledVersion($post['previous_version']);
208 $install->atDbUpgradeStep();
209 } elseif (isset($post['install_dbperms_ok'])) {
210 if ($install->isInstall()) {
211 $install->atDbInstallStep();
212 } elseif ($install->isUpgrade()) {
213 $install->atVersionSelection();
215 } elseif (isset($post['install_type'])) {
216 $install->setMode($post['install_type']);
217 $install->atDbStep();
223 if (isset($post['install_type'])) {
224 $params['install_type'] = $post['install_type'];
228 if (isset($post['install_dbperms_ok'])) {
229 if ($post['install_type'] === PluginInstall
::INSTALL
) {
236 if (isset($post['previous_version'])) {
240 if (isset($post['install_dbwrite_ok'])) {
244 if (isset($post['install_type'])) {
245 if ($post['install_type'] == PluginInstall
::INSTALL
) {
246 $step = 'i' . $istep;
247 } elseif ($istep > 1 && $post['install_type'] == PluginInstall
::UPDATE
) {
248 $step = 'u' . $istep;
254 //let's look for updates scripts
255 $update_scripts = $install::getUpdateScripts($plugin['root'], TYPE_DB
);
256 if (count($update_scripts) > 0) {
257 $params['update_scripts'] = $update_scripts;
262 if (!defined('GALETTE_THEME_DIR')) {
263 define('GALETTE_THEME_DIR', './themes/default/');
266 $install_plugin = true;
267 //not used here, but from include
270 include_once GALETTE_ROOT
. '/install/steps/db_checks.php';
271 $params['results'] = ob_get_contents();
275 $update_scripts = Install
::getUpdateScripts($plugin['root'], TYPE_DB
);
276 $params['update_scripts'] = $update_scripts;
282 // begin : copyright (2002) the phpbb group (support@phpbb.com)
283 // load in the sql parser
284 include GALETTE_ROOT
. 'includes/sql_parse.php';
286 $update_scripts = Install
::getUpdateScripts(
289 $post['previous_version']
292 $update_scripts['current'] = TYPE_DB
. '.sql';
296 foreach ($update_scripts as $key => $val) {
297 $sql_query .= @fread
(
298 @fopen
($plugin['root'] . '/scripts/' . $val, 'r'),
299 @filesize
($plugin['root'] . '/scripts/' . $val)
304 $sql_query = preg_replace('/galette_/', PREFIX_DB
, $sql_query);
305 $sql_query = remove_remarks($sql_query);
307 $sql_query = split_sql_file($sql_query, ';');
309 $sql_size = sizeof($sql_query);
310 for ($i = 0; $i < $sql_size; $i++
) {
311 $query = trim($sql_query[$i]);
312 if ($query != '' && $query[0] != '-') {
314 @list
($w1, $w2, $w3, $extra) = array_pad(explode(' ', $query, 4), 4, '');
319 $this->zdb
->db
->query(
321 Adapter
::QUERY_MODE_EXECUTE
323 $messages['success'][] = $w1 . ' ' . $w2 . ' ' . $w3 .
325 } catch (Throwable
$e) {
327 'Error executing query | ' . $e->getMessage() .
328 ' | Query was: ' . $query,
332 (strcasecmp(trim($w1), 'drop') != 0)
333 && (strcasecmp(trim($w1), 'rename') != 0)
335 $error_detected[] = $w1 . ' ' . $w2 . ' ' . $w3 . ' ' . $extra;
336 $error_detected[] = $e->getMessage() . '<br/>(' . $query . ')';
338 //if error are on drop, DROP, rename or RENAME we can continue
339 $warning_detected[] = $w1 . ' ' . $w2 . ' ' . $w3 . ' ' . $extra;
340 $warning_detected[] = $e->getMessage() . '<br/>(' . $query . ')';
348 $this->session
->$mdplugin = $install;
351 'page_title' => $install->getStepTitle(),
356 'mode' => ($request->isXhr() ?
'ajax' : ''),
357 'error_detected' => $error_detected