diff --git a/libraries/classes/Controllers/Preferences/FormsController.php b/libraries/classes/Controllers/Preferences/FormsController.php index 7c25dbdbb1..6ee054fd8a 100644 --- a/libraries/classes/Controllers/Preferences/FormsController.php +++ b/libraries/classes/Controllers/Preferences/FormsController.php @@ -8,7 +8,6 @@ use PhpMyAdmin\Config\Forms\User\ExportForm; use PhpMyAdmin\Config\Forms\User\ImportForm; use PhpMyAdmin\Config\Forms\User\MainForm; use PhpMyAdmin\Config\Forms\User\NaviForm; -use PhpMyAdmin\Config\Forms\User\SqlForm; use PhpMyAdmin\Controllers\AbstractController; use PhpMyAdmin\Core; use PhpMyAdmin\DatabaseInterface; @@ -64,9 +63,6 @@ class FormsController extends AbstractController $formParam = $_GET['form'] ?? null; switch ($formParam) { - case 'Sql': - $formDisplay = new SqlForm($cf, 1); - break; case 'Navi': $formDisplay = new NaviForm($cf, 1); break; diff --git a/libraries/classes/Controllers/Preferences/SqlController.php b/libraries/classes/Controllers/Preferences/SqlController.php new file mode 100644 index 0000000000..03e330602e --- /dev/null +++ b/libraries/classes/Controllers/Preferences/SqlController.php @@ -0,0 +1,118 @@ +userPreferences = $userPreferences; + $this->relation = $relation; + } + + public function index(): void + { + global $cfg, $cf, $error, $tabHash, $hash; + global $server, $PMA_Config; + + $cf = new ConfigFile($PMA_Config->base_settings); + $this->userPreferences->pageInit($cf); + + $formDisplay = new SqlForm($cf, 1); + + if (isset($_POST['revert'])) { + // revert erroneous fields to their default values + $formDisplay->fixErrors(); + Core::sendHeaderLocation('./index.php?route=/preferences/sql'); + return; + } + + $error = null; + if ($formDisplay->process(false) && ! $formDisplay->hasErrors()) { + // Load 2FA settings + $twoFactor = new TwoFactor($cfg['Server']['user']); + // save settings + $result = $this->userPreferences->save($cf->getConfigArray()); + // save back the 2FA setting only + $twoFactor->save(); + if ($result === true) { + // reload config + $PMA_Config->loadUserPreferences(); + $tabHash = $_POST['tab_hash'] ?? null; + $hash = ltrim($tabHash, '#'); + $this->userPreferences->redirect( + 'index.php?route=/preferences/sql', + null, + $hash + ); + return; + } else { + $error = $result; + } + } + + // display forms + $header = $this->response->getHeader(); + $scripts = $header->getScripts(); + $scripts->addFile('config.js'); + + $this->response->addHTML(UserPreferencesHeader::getContent($this->template, $this->relation)); + + if ($formDisplay->hasErrors()) { + $formErrors = $formDisplay->displayErrors(); + } + + $this->response->addHTML($this->template->render('preferences/forms/main', [ + 'error' => $error ? $error->getDisplay() : '', + 'has_errors' => $formDisplay->hasErrors(), + 'errors' => $formErrors ?? null, + 'form' => $formDisplay->getDisplay( + true, + true, + true, + Url::getFromRoute('/preferences/sql'), + ['server' => $server] + ), + ])); + + if ($this->response->isAjax()) { + $this->response->addJSON('disableNaviSettings', true); + } else { + define('PMA_DISABLE_NAVI_SETTINGS', true); + } + } +} diff --git a/libraries/classes/Menu.php b/libraries/classes/Menu.php index 7237309e0a..84c83e632f 100644 --- a/libraries/classes/Menu.php +++ b/libraries/classes/Menu.php @@ -568,6 +568,7 @@ class Menu '/preferences/features', '/preferences/forms', '/preferences/manage', + '/preferences/sql', '/preferences/two-factor', ]); diff --git a/libraries/classes/UserPreferencesHeader.php b/libraries/classes/UserPreferencesHeader.php index d16655f2a0..cad337a2d6 100644 --- a/libraries/classes/UserPreferencesHeader.php +++ b/libraries/classes/UserPreferencesHeader.php @@ -75,6 +75,15 @@ class UserPreferencesHeader ] ) . "\n"; + $content .= Generator::getHtmlTab( + [ + 'link' => 'index.php?route=/preferences/sql', + 'text' => __('SQL queries'), + 'icon' => 'b_sql', + 'active' => $route === '/preferences/sql', + ] + ) . "\n"; + $content .= self::displayTabsWithIcon(); return '
' . @@ -92,7 +101,6 @@ class UserPreferencesHeader { $form_param = $_GET['form'] ?? null; $tabs_icons = [ - 'Sql' => 'b_sql', 'Navi' => 'b_select', 'Main' => 'b_props', 'Import' => 'b_import', @@ -101,7 +109,7 @@ class UserPreferencesHeader $route = $_GET['route'] ?? $_POST['route'] ?? ''; $content = null; foreach (UserFormList::getAll() as $formset) { - if ($formset === 'Features') { + if ($formset === 'Features' || $formset === 'Sql') { continue; } diff --git a/libraries/routes.php b/libraries/routes.php index a18227c252..4e194faebc 100644 --- a/libraries/routes.php +++ b/libraries/routes.php @@ -41,6 +41,7 @@ use PhpMyAdmin\Controllers\PhpInfoController; use PhpMyAdmin\Controllers\Preferences\FeaturesController; use PhpMyAdmin\Controllers\Preferences\FormsController; use PhpMyAdmin\Controllers\Preferences\ManageController; +use PhpMyAdmin\Controllers\Preferences\SqlController as PreferencesSqlController; use PhpMyAdmin\Controllers\Preferences\TwoFactorController; use PhpMyAdmin\Controllers\SchemaExportController; use PhpMyAdmin\Controllers\Server\BinlogController; @@ -374,6 +375,11 @@ return function (RouteCollector $routes) use ($containerBuilder, $response) { $controller = $containerBuilder->get(ManageController::class); $controller->index(); }); + $routes->addRoute(['GET', 'POST'], '/sql', function () use ($containerBuilder) { + /** @var PreferencesSqlController $controller */ + $controller = $containerBuilder->get(PreferencesSqlController::class); + $controller->index(); + }); $routes->addRoute(['GET', 'POST'], '/two-factor', function () use ($containerBuilder) { /** @var TwoFactorController $controller */ $controller = $containerBuilder->get(TwoFactorController::class); diff --git a/services_controllers.yml b/services_controllers.yml index 06311c765a..f1388674ce 100644 --- a/services_controllers.yml +++ b/services_controllers.yml @@ -308,6 +308,15 @@ services: userPreferences: '@user_preferences' relation: '@relation' + PhpMyAdmin\Controllers\Preferences\SqlController: + class: 'PhpMyAdmin\Controllers\Preferences\SqlController' + arguments: + response: '@response' + dbi: '@dbi' + template: '@template' + userPreferences: '@user_preferences' + relation: '@relation' + PhpMyAdmin\Controllers\Preferences\TwoFactorController: class: 'PhpMyAdmin\Controllers\Preferences\TwoFactorController' arguments: