From ddf0d9604f6aaca33e31e646db66a232984e32b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Sat, 12 Feb 2022 15:52:27 -0300 Subject: [PATCH] Clear config storage params from session after failed access MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: MaurĂ­cio Meneghini Fauth --- libraries/classes/UserPreferences.php | 29 +++++++++++++++++++++------ test/classes/UserPreferencesTest.php | 4 +++- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/libraries/classes/UserPreferences.php b/libraries/classes/UserPreferences.php index 4e7ddfe4ca..b7113a457a 100644 --- a/libraries/classes/UserPreferences.php +++ b/libraries/classes/UserPreferences.php @@ -9,6 +9,7 @@ use PhpMyAdmin\Config\Forms\User\UserFormList; use function array_flip; use function array_merge; use function basename; +use function htmlspecialchars; use function http_build_query; use function is_array; use function json_decode; @@ -166,12 +167,17 @@ class UserPreferences } if (! $dbi->tryQuery($query, DatabaseInterface::CONNECT_CONTROL)) { $message = Message::error(__('Could not save configuration')); - $message->addMessage( - Message::rawError( - $dbi->getError(DatabaseInterface::CONNECT_CONTROL) - ), - '

' - ); + $message->addMessage(Message::error($dbi->getError(DatabaseInterface::CONNECT_CONTROL)), '

'); + if (! $this->hasAccessToDatabase($cfgRelation['db'])) { + /** + * When phpMyAdmin cached the configuration storage parameters, it checked if the database can be + * accessed, so if it could not be accessed anymore, then the cache must be cleared as it's out of date. + */ + $_SESSION['relation'][$GLOBALS['server']] = []; + $message->addMessage(Message::error(htmlspecialchars( + __('The phpMyAdmin configuration storage database could not be accessed.') + )), '

'); + } return $message; } @@ -179,6 +185,17 @@ class UserPreferences return true; } + private function hasAccessToDatabase(string $database): bool + { + $escapedDb = $GLOBALS['dbi']->escapeString($database); + $query = 'SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = \'' . $escapedDb . '\';'; + if ($GLOBALS['cfg']['Server']['DisableIS']) { + $query = 'SHOW DATABASES LIKE \'' . Util::escapeMysqlWildcards($escapedDb) . '\';'; + } + + return (bool) $GLOBALS['dbi']->fetchSingleRow($query, 'ASSOC', DatabaseInterface::CONNECT_CONTROL); + } + /** * Returns a user preferences array filtered by $cfg['UserprefsDisallow'] * (exclude list) and keys from user preferences form (allow list) diff --git a/test/classes/UserPreferencesTest.php b/test/classes/UserPreferencesTest.php index 13a5d47f9f..3020e4ddaf 100644 --- a/test/classes/UserPreferencesTest.php +++ b/test/classes/UserPreferencesTest.php @@ -140,6 +140,7 @@ class UserPreferencesTest extends AbstractNetworkTestCase */ public function testSave(): void { + $GLOBALS['cfg']['Server']['DisableIS'] = true; $GLOBALS['server'] = 2; $_SESSION['relation'][2]['PMA_VERSION'] = PMA_VERSION; $_SESSION['relation'][2]['userconfigwork'] = null; @@ -251,7 +252,8 @@ class UserPreferencesTest extends AbstractNetworkTestCase $this->assertInstanceOf(Message::class, $result); $this->assertEquals( - 'Could not save configuration

err1', + 'Could not save configuration

err1' + . '

The phpMyAdmin configuration storage database could not be accessed.', $result->getMessage() ); }