From f5bb90ebb9bbbac8a02ba981fd147dac0b8ec3b4 Mon Sep 17 00:00:00 2001 From: Kamil Tekiela Date: Tue, 28 Dec 2021 23:30:59 +0000 Subject: [PATCH] Move queryAsControlUser - Dbal refactoring pt.3 Signed-off-by: Kamil Tekiela --- libraries/classes/ConfigStorage/Relation.php | 59 ++++--------- .../classes/ConfigStorage/RelationCleanup.php | 64 +++++++------- .../classes/ConfigStorage/UserGroups.php | 19 ++--- .../Database/QueryByExampleController.php | 6 +- .../Server/UserGroupsFormController.php | 2 +- libraries/classes/Database/Designer.php | 2 +- .../classes/Database/Designer/Common.php | 19 ++--- libraries/classes/DatabaseInterface.php | 34 ++++++++ libraries/classes/Menu.php | 2 +- libraries/classes/Navigation/Navigation.php | 6 +- .../classes/Navigation/Nodes/NodeDatabase.php | 2 +- .../Plugins/Schema/ExportRelationSchema.php | 2 +- libraries/classes/Plugins/Schema/Pdf/Pdf.php | 2 +- libraries/classes/RecentFavoriteTable.php | 2 +- libraries/classes/SavedSearches.php | 22 ++--- libraries/classes/Server/Privileges.php | 4 +- libraries/classes/Table.php | 10 +-- libraries/classes/Tracker.php | 16 ++-- libraries/classes/Tracking.php | 7 +- libraries/classes/Transformations.php | 4 +- phpstan-baseline.neon | 85 ------------------- psalm-baseline.xml | 27 +----- .../ConfigStorage/RelationCleanupTest.php | 26 ++++-- test/classes/ConfigStorage/RelationTest.php | 36 +------- test/classes/ConfigStorage/UserGroupsTest.php | 6 +- test/classes/Database/Designer/CommonTest.php | 2 +- test/classes/Database/DesignerTest.php | 6 +- test/classes/DatabaseInterfaceTest.php | 21 +++++ test/classes/Navigation/NavigationTest.php | 4 +- .../Plugins/Export/ExportHtmlwordTest.php | 4 +- .../Plugins/Export/ExportLatexTest.php | 4 +- test/classes/Plugins/Export/ExportOdtTest.php | 4 +- test/classes/TrackerTest.php | 12 +-- 33 files changed, 197 insertions(+), 324 deletions(-) diff --git a/libraries/classes/ConfigStorage/Relation.php b/libraries/classes/ConfigStorage/Relation.php index 2fc014014a..9ab86c1f20 100644 --- a/libraries/classes/ConfigStorage/Relation.php +++ b/libraries/classes/ConfigStorage/Relation.php @@ -6,7 +6,6 @@ namespace PhpMyAdmin\ConfigStorage; use PhpMyAdmin\ConfigStorage\Features\PdfFeature; use PhpMyAdmin\DatabaseInterface; -use PhpMyAdmin\Dbal\ResultInterface; use PhpMyAdmin\InternalRelations; use PhpMyAdmin\RecentFavoriteTable; use PhpMyAdmin\SqlParser\Parser; @@ -63,31 +62,6 @@ class Relation $this->dbi = $dbi; } - /** - * Executes a query as controluser if possible, otherwise as normal user - * - * @param string $sql the query to execute - * @param bool $show_error whether to display SQL error messages or not - * @psalm-param T $show_error - * - * @return ResultInterface|false the result set, or false if no result set - * @psalm-return (T is true ? ResultInterface : ResultInterface|false) - * - * @template T as bool - */ - public function queryAsControlUser($sql, $show_error = true) - { - // Avoid caching of the number of rows affected; for example, this function - // is called for tracking purposes but we want to display the correct number - // of rows affected by the original query, not by the query generated for - // tracking. - if ($show_error) { - return $this->dbi->query($sql, DatabaseInterface::CONNECT_CONTROL, DatabaseInterface::QUERY_BUFFERED, false); - } - - return $this->dbi->tryQuery($sql, DatabaseInterface::CONNECT_CONTROL, DatabaseInterface::QUERY_BUFFERED, false); - } - public function getRelationParameters(): RelationParameters { $server = $GLOBALS['server']; @@ -188,7 +162,7 @@ class Relation { $tabQuery = 'SHOW TABLES FROM ' . Util::backquote($GLOBALS['cfg']['Server']['pmadb']); - $tableRes = $this->queryAsControlUser($tabQuery, false); + $tableRes = $this->dbi->tryQueryAsControlUser($tabQuery); if ($tableRes === false) { return null; } @@ -361,10 +335,7 @@ class Relation */ public function canAccessStorageTable(string $tableDbName): bool { - $result = $this->queryAsControlUser( - 'SELECT NULL FROM ' . Util::backquote($tableDbName) . ' LIMIT 0', - false - ); + $result = $this->dbi->tryQueryAsControlUser('SELECT NULL FROM ' . Util::backquote($tableDbName) . ' LIMIT 0'); return $result !== false; } @@ -385,7 +356,7 @@ class Relation . Util::backquote($GLOBALS['cfg']['Server']['pmadb']) . '.' . Util::backquote($GLOBALS['cfg']['Server']['column_info']) . ' WHERE Field IN (\'' . implode('\', \'', $new_cols) . '\')'; - $result = $this->queryAsControlUser($query, false); + $result = $this->dbi->tryQueryAsControlUser($query); if ($result) { $rows = $result->numRows(); unset($result); @@ -610,7 +581,7 @@ class Relation . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'' . ' AND table_name = \'\'' . ' AND column_name = \'(db_comment)\''; - $com_rs = $this->queryAsControlUser($com_qry, false); + $com_rs = $this->dbi->tryQueryAsControlUser($com_qry); if ($com_rs && $com_rs->numRows() > 0) { $row = $com_rs->fetchAssoc(); @@ -637,7 +608,7 @@ class Relation . ' FROM ' . Util::backquote($columnCommentsFeature->database) . '.' . Util::backquote($columnCommentsFeature->columnInfo) . ' WHERE `column_name` = \'(db_comment)\''; - $com_rs = $this->queryAsControlUser($com_qry, false); + $com_rs = $this->dbi->tryQueryAsControlUser($com_qry); if ($com_rs && $com_rs->numRows() > 0) { return $com_rs->fetchAllKeyPair(); @@ -682,7 +653,7 @@ class Relation AND `column_name` = \'(db_comment)\''; } - return (bool) $this->queryAsControlUser($upd_query); + return (bool) $this->dbi->queryAsControlUser($upd_query); } /** @@ -722,7 +693,7 @@ class Relation return; } - $this->queryAsControlUser( + $this->dbi->queryAsControlUser( 'INSERT INTO ' . Util::backquote($sqlHistoryFeature->database) . '.' . Util::backquote($sqlHistoryFeature->history) . ' @@ -810,7 +781,7 @@ class Relation return; } - $this->queryAsControlUser( + $this->dbi->queryAsControlUser( 'DELETE FROM ' . Util::backquote($sqlHistoryFeature->database) . '.' . Util::backquote($sqlHistoryFeature->history) . ' @@ -1164,7 +1135,7 @@ class Relation . '\'' . ' AND display_field = \'' . $this->dbi->escapeString($field) . '\''; - $this->queryAsControlUser($table_query); + $this->dbi->queryAsControlUser($table_query); } if ($relationParameters->relationFeature === null) { @@ -1181,7 +1152,7 @@ class Relation . '\'' . ' AND master_field = \'' . $this->dbi->escapeString($field) . '\''; - $this->queryAsControlUser($table_query); + $this->dbi->queryAsControlUser($table_query); $table_query = 'UPDATE ' . Util::backquote($relationParameters->relationFeature->database) . '.' @@ -1193,7 +1164,7 @@ class Relation . '\'' . ' AND foreign_field = \'' . $this->dbi->escapeString($field) . '\''; - $this->queryAsControlUser($table_query); + $this->dbi->queryAsControlUser($table_query); } /** @@ -1230,7 +1201,7 @@ class Relation . ' AND ' . $table_field . ' = \'' . $this->dbi->escapeString($source_table) . '\''; - $this->queryAsControlUser($query); + $this->dbi->queryAsControlUser($query); } /** @@ -1318,7 +1289,7 @@ class Relation . " WHERE db_name = '" . $this->dbi->escapeString($source_db) . "'" . " AND table_name = '" . $this->dbi->escapeString($source_table) . "'"; - $this->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } } @@ -1362,7 +1333,7 @@ class Relation . " AND item_name = '" . $this->dbi->escapeString($source_table) . "'" . " AND item_type = 'table'"; - $this->queryAsControlUser($query); + $this->dbi->queryAsControlUser($query); } /** @@ -1380,7 +1351,7 @@ class Relation . ' VALUES (\'' . $this->dbi->escapeString($db) . '\', \'' . $this->dbi->escapeString($newpage ?: __('no description')) . '\')'; - $this->queryAsControlUser($ins_query, false); + $this->dbi->tryQueryAsControlUser($ins_query); return $this->dbi->insertId(DatabaseInterface::CONNECT_CONTROL); } diff --git a/libraries/classes/ConfigStorage/RelationCleanup.php b/libraries/classes/ConfigStorage/RelationCleanup.php index 215dedb5ae..1633cc2fcd 100644 --- a/libraries/classes/ConfigStorage/RelationCleanup.php +++ b/libraries/classes/ConfigStorage/RelationCleanup.php @@ -48,7 +48,7 @@ class RelationCleanup . '\'' . ' AND column_name = \'' . $this->dbi->escapeString($column) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->displayFeature !== null) { @@ -60,7 +60,7 @@ class RelationCleanup . '\'' . ' AND display_field = \'' . $this->dbi->escapeString($column) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->relationFeature === null) { @@ -76,7 +76,7 @@ class RelationCleanup . '\'' . ' AND master_field = \'' . $this->dbi->escapeString($column) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); $remove_query = 'DELETE FROM ' . Util::backquote($relationParameters->relationFeature->database) @@ -87,7 +87,7 @@ class RelationCleanup . '\'' . ' AND foreign_field = \'' . $this->dbi->escapeString($column) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } /** @@ -107,7 +107,7 @@ class RelationCleanup . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'' . ' AND table_name = \'' . $this->dbi->escapeString($table) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->displayFeature !== null) { @@ -117,7 +117,7 @@ class RelationCleanup . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'' . ' AND table_name = \'' . $this->dbi->escapeString($table) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->pdfFeature !== null) { @@ -127,7 +127,7 @@ class RelationCleanup . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'' . ' AND table_name = \'' . $this->dbi->escapeString($table) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->relationFeature !== null) { @@ -138,7 +138,7 @@ class RelationCleanup . '\'' . ' AND master_table = \'' . $this->dbi->escapeString($table) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); $remove_query = 'DELETE FROM ' . Util::backquote($relationParameters->relationFeature->database) @@ -147,7 +147,7 @@ class RelationCleanup . '\'' . ' AND foreign_table = \'' . $this->dbi->escapeString($table) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->uiPreferencesFeature !== null) { @@ -157,7 +157,7 @@ class RelationCleanup . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'' . ' AND table_name = \'' . $this->dbi->escapeString($table) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->navigationItemsHidingFeature === null) { @@ -173,7 +173,7 @@ class RelationCleanup . ' OR (item_name = \'' . $this->dbi->escapeString($table) . '\'' . ' AND item_type = \'table\'))'; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } /** @@ -193,7 +193,7 @@ class RelationCleanup . Util::backquote($relationParameters->columnCommentsFeature->database) . '.' . Util::backquote($relationParameters->columnCommentsFeature->columnInfo) . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->bookmarkFeature !== null) { @@ -201,7 +201,7 @@ class RelationCleanup . Util::backquote($relationParameters->bookmarkFeature->database) . '.' . Util::backquote($relationParameters->bookmarkFeature->bookmark) . ' WHERE dbase = \'' . $this->dbi->escapeString($db) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->displayFeature !== null) { @@ -209,7 +209,7 @@ class RelationCleanup . Util::backquote($relationParameters->displayFeature->database) . '.' . Util::backquote($relationParameters->displayFeature->tableInfo) . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->pdfFeature !== null) { @@ -217,13 +217,13 @@ class RelationCleanup . Util::backquote($relationParameters->pdfFeature->database) . '.' . Util::backquote($relationParameters->pdfFeature->pdfPages) . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); $remove_query = 'DELETE FROM ' . Util::backquote($relationParameters->pdfFeature->database) . '.' . Util::backquote($relationParameters->pdfFeature->tableCoords) . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->relationFeature !== null) { @@ -232,14 +232,14 @@ class RelationCleanup . '.' . Util::backquote($relationParameters->relationFeature->relation) . ' WHERE master_db = \'' . $this->dbi->escapeString($db) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); $remove_query = 'DELETE FROM ' . Util::backquote($relationParameters->relationFeature->database) . '.' . Util::backquote($relationParameters->relationFeature->relation) . ' WHERE foreign_db = \'' . $this->dbi->escapeString($db) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->uiPreferencesFeature !== null) { @@ -247,7 +247,7 @@ class RelationCleanup . Util::backquote($relationParameters->uiPreferencesFeature->database) . '.' . Util::backquote($relationParameters->uiPreferencesFeature->tableUiPrefs) . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->navigationItemsHidingFeature !== null) { @@ -255,7 +255,7 @@ class RelationCleanup . Util::backquote($relationParameters->navigationItemsHidingFeature->database) . '.' . Util::backquote($relationParameters->navigationItemsHidingFeature->navigationHiding) . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->savedQueryByExampleSearchesFeature !== null) { @@ -263,7 +263,7 @@ class RelationCleanup . Util::backquote($relationParameters->savedQueryByExampleSearchesFeature->database) . '.' . Util::backquote($relationParameters->savedQueryByExampleSearchesFeature->savedSearches) . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->centralColumnsFeature === null) { @@ -274,7 +274,7 @@ class RelationCleanup . Util::backquote($relationParameters->centralColumnsFeature->database) . '.' . Util::backquote($relationParameters->centralColumnsFeature->centralColumns) . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } /** @@ -295,7 +295,7 @@ class RelationCleanup . '.' . Util::backquote($relationParameters->bookmarkFeature->bookmark) . " WHERE `user` = '" . $this->dbi->escapeString($username) . "'"; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->sqlHistoryFeature !== null) { @@ -304,7 +304,7 @@ class RelationCleanup . '.' . Util::backquote($relationParameters->sqlHistoryFeature->history) . " WHERE `username` = '" . $this->dbi->escapeString($username) . "'"; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->recentlyUsedTablesFeature !== null) { @@ -313,7 +313,7 @@ class RelationCleanup . '.' . Util::backquote($relationParameters->recentlyUsedTablesFeature->recent) . " WHERE `username` = '" . $this->dbi->escapeString($username) . "'"; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->favoriteTablesFeature !== null) { @@ -322,7 +322,7 @@ class RelationCleanup . '.' . Util::backquote($relationParameters->favoriteTablesFeature->favorite) . " WHERE `username` = '" . $this->dbi->escapeString($username) . "'"; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->uiPreferencesFeature !== null) { @@ -331,7 +331,7 @@ class RelationCleanup . '.' . Util::backquote($relationParameters->uiPreferencesFeature->tableUiPrefs) . " WHERE `username` = '" . $this->dbi->escapeString($username) . "'"; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->userPreferencesFeature !== null) { @@ -340,7 +340,7 @@ class RelationCleanup . '.' . Util::backquote($relationParameters->userPreferencesFeature->userConfig) . " WHERE `username` = '" . $this->dbi->escapeString($username) . "'"; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->configurableMenusFeature !== null) { @@ -349,7 +349,7 @@ class RelationCleanup . '.' . Util::backquote($relationParameters->configurableMenusFeature->users) . " WHERE `username` = '" . $this->dbi->escapeString($username) . "'"; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->navigationItemsHidingFeature !== null) { @@ -358,7 +358,7 @@ class RelationCleanup . '.' . Util::backquote($relationParameters->navigationItemsHidingFeature->navigationHiding) . " WHERE `username` = '" . $this->dbi->escapeString($username) . "'"; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->savedQueryByExampleSearchesFeature !== null) { @@ -367,7 +367,7 @@ class RelationCleanup . '.' . Util::backquote($relationParameters->savedQueryByExampleSearchesFeature->savedSearches) . " WHERE `username` = '" . $this->dbi->escapeString($username) . "'"; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } if ($relationParameters->databaseDesignerSettingsFeature === null) { @@ -379,6 +379,6 @@ class RelationCleanup . '.' . Util::backquote($relationParameters->databaseDesignerSettingsFeature->designerSettings) . " WHERE `username` = '" . $this->dbi->escapeString($username) . "'"; - $this->relation->queryAsControlUser($remove_query); + $this->dbi->queryAsControlUser($remove_query); } } diff --git a/libraries/classes/ConfigStorage/UserGroups.php b/libraries/classes/ConfigStorage/UserGroups.php index f75be5f1a8..64f8413c42 100644 --- a/libraries/classes/ConfigStorage/UserGroups.php +++ b/libraries/classes/ConfigStorage/UserGroups.php @@ -41,7 +41,6 @@ class UserGroups $users = []; $numRows = 0; - $relation = new Relation($dbi); $userGroupSpecialChars = htmlspecialchars($userGroup); $usersTable = Util::backquote($configurableMenusFeature->database) @@ -49,7 +48,7 @@ class UserGroups $sql_query = 'SELECT `username` FROM ' . $usersTable . " WHERE `usergroup`='" . $dbi->escapeString($userGroup) . "'"; - $result = $relation->queryAsControlUser($sql_query, false); + $result = $dbi->tryQueryAsControlUser($sql_query); if ($result) { $i = 0; while ($row = $result->fetchRow()) { @@ -78,11 +77,10 @@ class UserGroups { global $dbi; - $relation = new Relation($dbi); $groupTable = Util::backquote($configurableMenusFeature->database) . '.' . Util::backquote($configurableMenusFeature->userGroups); $sql_query = 'SELECT * FROM ' . $groupTable . ' ORDER BY `usergroup` ASC'; - $result = $relation->queryAsControlUser($sql_query, false); + $result = $dbi->tryQueryAsControlUser($sql_query); $userGroups = []; $userGroupsValues = []; $action = Url::getFromRoute('/server/privileges'); @@ -173,7 +171,6 @@ class UserGroups { global $dbi; - $relation = new Relation($dbi); $userTable = Util::backquote($configurableMenusFeature->database) . '.' . Util::backquote($configurableMenusFeature->users); $groupTable = Util::backquote($configurableMenusFeature->database) @@ -181,11 +178,11 @@ class UserGroups $sql_query = 'DELETE FROM ' . $userTable . " WHERE `usergroup`='" . $dbi->escapeString($userGroup) . "'"; - $relation->queryAsControlUser($sql_query, true); + $dbi->queryAsControlUser($sql_query); $sql_query = 'DELETE FROM ' . $groupTable . " WHERE `usergroup`='" . $dbi->escapeString($userGroup) . "'"; - $relation->queryAsControlUser($sql_query, true); + $dbi->queryAsControlUser($sql_query); } /** @@ -201,7 +198,6 @@ class UserGroups ): string { global $dbi; - $relation = new Relation($dbi); $urlParams = []; $editUserGroupSpecialChars = ''; @@ -227,7 +223,7 @@ class UserGroups $sql_query = 'SELECT * FROM ' . $groupTable . " WHERE `usergroup`='" . $dbi->escapeString($userGroup) . "'"; - $result = $relation->queryAsControlUser($sql_query, false); + $result = $dbi->tryQueryAsControlUser($sql_query); if ($result) { foreach ($result as $row) { $key = $row['tab']; @@ -316,7 +312,6 @@ class UserGroups ): void { global $dbi; - $relation = new Relation($dbi); $tabs = Util::getMenuTabList(); $groupTable = Util::backquote($configurableMenusFeature->database) . '.' . Util::backquote($configurableMenusFeature->userGroups); @@ -325,7 +320,7 @@ class UserGroups $sql_query = 'DELETE FROM ' . $groupTable . " WHERE `usergroup`='" . $dbi->escapeString($userGroup) . "';"; - $relation->queryAsControlUser($sql_query, true); + $dbi->queryAsControlUser($sql_query); } $sql_query = 'INSERT INTO ' . $groupTable @@ -348,6 +343,6 @@ class UserGroups } $sql_query .= ';'; - $relation->queryAsControlUser($sql_query, true); + $dbi->queryAsControlUser($sql_query); } } diff --git a/libraries/classes/Controllers/Database/QueryByExampleController.php b/libraries/classes/Controllers/Database/QueryByExampleController.php index 44371017bd..54e1af6c33 100644 --- a/libraries/classes/Controllers/Database/QueryByExampleController.php +++ b/libraries/classes/Controllers/Database/QueryByExampleController.php @@ -53,7 +53,7 @@ class QueryByExampleController extends AbstractController $this->addScriptFiles(['database/qbe.js']); if ($savedQbeSearchesFeature !== null) { //Get saved search list. - $savedSearch = new SavedSearches($this->relation); + $savedSearch = new SavedSearches(); $savedSearch->setUsername($GLOBALS['cfg']['Server']['user']) ->setDbname($db); @@ -74,14 +74,14 @@ class QueryByExampleController extends AbstractController } elseif ($_POST['action'] === 'delete') { $savedSearch->delete($savedQbeSearchesFeature); //After deletion, reset search. - $savedSearch = new SavedSearches($this->relation); + $savedSearch = new SavedSearches(); $savedSearch->setUsername($GLOBALS['cfg']['Server']['user']) ->setDbname($db); $_POST = []; } elseif ($_POST['action'] === 'load') { if (empty($_POST['searchId'])) { //when not loading a search, reset the object. - $savedSearch = new SavedSearches($this->relation); + $savedSearch = new SavedSearches(); $savedSearch->setUsername($GLOBALS['cfg']['Server']['user']) ->setDbname($db); $_POST = []; diff --git a/libraries/classes/Controllers/Server/UserGroupsFormController.php b/libraries/classes/Controllers/Server/UserGroupsFormController.php index 698f955229..36400628d3 100644 --- a/libraries/classes/Controllers/Server/UserGroupsFormController.php +++ b/libraries/classes/Controllers/Server/UserGroupsFormController.php @@ -88,7 +88,7 @@ final class UserGroupsFormController extends AbstractController $allUserGroups = []; $sqlQuery = 'SELECT DISTINCT `usergroup` FROM ' . $groupTable; - $result = $this->relation->queryAsControlUser($sqlQuery, false); + $result = $this->dbi->tryQueryAsControlUser($sqlQuery); if ($result) { while ($row = $result->fetchRow()) { $allUserGroups[$row[0]] = $row[0]; diff --git a/libraries/classes/Database/Designer.php b/libraries/classes/Database/Designer.php index 08ef551070..7ec6272c46 100644 --- a/libraries/classes/Database/Designer.php +++ b/libraries/classes/Database/Designer.php @@ -104,7 +104,7 @@ class Designer . Util::backquote($pdfFeature->pdfPages) . " WHERE db_name = '" . $this->dbi->escapeString($db) . "'" . ' ORDER BY `page_descr`'; - $page_rs = $this->relation->queryAsControlUser($page_query, false); + $page_rs = $this->dbi->tryQueryAsControlUser($page_query); if (! $page_rs) { return []; diff --git a/libraries/classes/Database/Designer/Common.php b/libraries/classes/Database/Designer/Common.php index c20edf4649..6bb3761130 100644 --- a/libraries/classes/Database/Designer/Common.php +++ b/libraries/classes/Database/Designer/Common.php @@ -335,12 +335,12 @@ class Common $query = 'DELETE FROM ' . Util::backquote($pdfFeature->database) . '.' . Util::backquote($pdfFeature->tableCoords) . ' WHERE ' . Util::backquote('pdf_page_number') . ' = ' . intval($pg); - $this->relation->queryAsControlUser($query); + $this->dbi->queryAsControlUser($query); $query = 'DELETE FROM ' . Util::backquote($pdfFeature->database) . '.' . Util::backquote($pdfFeature->pdfPages) . ' WHERE ' . Util::backquote('page_nr') . ' = ' . intval($pg); - $this->relation->queryAsControlUser($query); + $this->dbi->queryAsControlUser($query); return true; } @@ -480,7 +480,7 @@ class Common . '.' . Util::backquote($pdfFeature->tableCoords) . " WHERE `pdf_page_number` = '" . $pageId . "'"; - $this->relation->queryAsControlUser($query); + $this->dbi->queryAsControlUser($query); foreach ($_POST['t_h'] as $key => $value) { $DB = $_POST['t_db'][$key]; @@ -500,7 +500,7 @@ class Common . "'" . $this->dbi->escapeString($_POST['t_x'][$key]) . "', " . "'" . $this->dbi->escapeString($_POST['t_y'][$key]) . "')"; - $this->relation->queryAsControlUser($query); + $this->dbi->queryAsControlUser($query); } return true; @@ -666,7 +666,7 @@ class Common . "'" . $this->dbi->escapeString($T1) . "', " . "'" . $this->dbi->escapeString($F1) . "')"; - if ($this->relation->queryAsControlUser($q, false)) { + if ($this->dbi->tryQueryAsControlUser($q)) { return [ true, __('Internal relationship has been added.'), @@ -739,7 +739,7 @@ class Common . " AND foreign_table = '" . $this->dbi->escapeString($T1) . "'" . " AND foreign_field = '" . $this->dbi->escapeString($F1) . "'"; - $result = $this->relation->queryAsControlUser($delete_query, false); + $result = $this->dbi->tryQueryAsControlUser($delete_query); if (! $result) { $error = $this->dbi->getError(DatabaseInterface::CONNECT_CONTROL); @@ -765,7 +765,6 @@ class Common public function saveSetting($index, $value): bool { $databaseDesignerSettingsFeature = $this->relation->getRelationParameters()->databaseDesignerSettingsFeature; - $success = true; if ($databaseDesignerSettingsFeature !== null) { $cfgDesigner = [ 'user' => $GLOBALS['cfg']['Server']['user'], @@ -797,7 +796,7 @@ class Common . " WHERE username = '" . $this->dbi->escapeString($cfgDesigner['user']) . "';"; - $success = $this->relation->queryAsControlUser($save_query); + $this->dbi->queryAsControlUser($save_query); } else { $save_data = [$index => $value]; @@ -808,10 +807,10 @@ class Common . " VALUES('" . $this->dbi->escapeString($cfgDesigner['user']) . "', '" . json_encode($save_data) . "');"; - $success = $this->relation->queryAsControlUser($query); + $this->dbi->queryAsControlUser($query); } } - return (bool) $success; + return true; } } diff --git a/libraries/classes/DatabaseInterface.php b/libraries/classes/DatabaseInterface.php index 95965494e3..456786c2e2 100644 --- a/libraries/classes/DatabaseInterface.php +++ b/libraries/classes/DatabaseInterface.php @@ -279,6 +279,40 @@ class DatabaseInterface implements DbalInterface return $this->extension->realMultiQuery($this->links[$linkIndex], $multiQuery); } + /** + * Executes a query as controluser. + * The result is always buffered and never cached + * + * @param string $sql the query to execute + * + * @return ResultInterface the result set + */ + public function queryAsControlUser(string $sql): ResultInterface + { + // Avoid caching of the number of rows affected; for example, this function + // is called for tracking purposes but we want to display the correct number + // of rows affected by the original query, not by the query generated for + // tracking. + return $this->query($sql, self::CONNECT_CONTROL, self::QUERY_BUFFERED, false); + } + + /** + * Executes a query as controluser. + * The result is always buffered and never cached + * + * @param string $sql the query to execute + * + * @return ResultInterface|false the result set, or false if the query failed + */ + public function tryQueryAsControlUser(string $sql) + { + // Avoid caching of the number of rows affected; for example, this function + // is called for tracking purposes but we want to display the correct number + // of rows affected by the original query, not by the query generated for + // tracking. + return $this->tryQuery($sql, self::CONNECT_CONTROL, self::QUERY_BUFFERED, false); + } + /** * returns array with table names for given db * diff --git a/libraries/classes/Menu.php b/libraries/classes/Menu.php index 48bd3bb02e..e279b72142 100644 --- a/libraries/classes/Menu.php +++ b/libraries/classes/Menu.php @@ -137,7 +137,7 @@ class Menu . $userTable . " WHERE `username` = '" . $this->dbi->escapeString($GLOBALS['cfg']['Server']['user']) . "')"; - $result = $this->relation->queryAsControlUser($sqlQuery, false); + $result = $this->dbi->tryQueryAsControlUser($sqlQuery); if ($result) { while ($row = $this->dbi->fetchAssoc($result)) { $tab = (string) $row['tab']; diff --git a/libraries/classes/Navigation/Navigation.php b/libraries/classes/Navigation/Navigation.php index 99078fda4e..f7bacef25c 100644 --- a/libraries/classes/Navigation/Navigation.php +++ b/libraries/classes/Navigation/Navigation.php @@ -175,7 +175,7 @@ class Navigation . "'" . $this->dbi->escapeString($dbName) . "'," . "'" . (! empty($tableName) ? $this->dbi->escapeString($tableName) : '' ) . "')"; - $this->relation->queryAsControlUser($sqlQuery, false); + $this->dbi->tryQueryAsControlUser($sqlQuery); } /** @@ -211,7 +211,7 @@ class Navigation ? " AND `table_name`='" . $this->dbi->escapeString($tableName) . "'" : '' ); - $this->relation->queryAsControlUser($sqlQuery, false); + $this->dbi->tryQueryAsControlUser($sqlQuery); } /** @@ -266,7 +266,7 @@ class Navigation . " AND `db_name`='" . $this->dbi->escapeString($database) . "'" . " AND `table_name`='" . (! empty($table) ? $this->dbi->escapeString($table) : '') . "'"; - $result = $this->relation->queryAsControlUser($sqlQuery, false); + $result = $this->dbi->tryQueryAsControlUser($sqlQuery); $hidden = []; if ($result) { diff --git a/libraries/classes/Navigation/Nodes/NodeDatabase.php b/libraries/classes/Navigation/Nodes/NodeDatabase.php index 29d7c5eddd..9bf7938177 100644 --- a/libraries/classes/Navigation/Nodes/NodeDatabase.php +++ b/libraries/classes/Navigation/Nodes/NodeDatabase.php @@ -396,7 +396,7 @@ class NodeDatabase extends Node . " AND `item_type`='" . $type . "' AND `db_name`='" . $dbi->escapeString($db) . "'"; - $result = $this->relation->queryAsControlUser($sqlQuery, false); + $result = $dbi->tryQueryAsControlUser($sqlQuery); if ($result) { return $result->fetchAllColumn(); } diff --git a/libraries/classes/Plugins/Schema/ExportRelationSchema.php b/libraries/classes/Plugins/Schema/ExportRelationSchema.php index 98c4601c64..eaa845fe23 100644 --- a/libraries/classes/Plugins/Schema/ExportRelationSchema.php +++ b/libraries/classes/Plugins/Schema/ExportRelationSchema.php @@ -258,7 +258,7 @@ class ExportRelationSchema . Util::backquote($pdfFeature->database) . '.' . Util::backquote($pdfFeature->pdfPages) . ' WHERE page_nr = ' . $this->pageNumber; - $_name_rs = $this->relation->queryAsControlUser($_name_sql); + $_name_rs = $dbi->queryAsControlUser($_name_sql); $_name_row = $dbi->fetchRow($_name_rs); $filename = $_name_row[0] . $extension; } diff --git a/libraries/classes/Plugins/Schema/Pdf/Pdf.php b/libraries/classes/Plugins/Schema/Pdf/Pdf.php index 1a8081748e..402722f24c 100644 --- a/libraries/classes/Plugins/Schema/Pdf/Pdf.php +++ b/libraries/classes/Plugins/Schema/Pdf/Pdf.php @@ -276,7 +276,7 @@ class Pdf extends PdfLib . Util::backquote($pdfFeature->pdfPages) . ' WHERE db_name = \'' . $dbi->escapeString($this->db) . '\' AND page_nr = \'' . $this->pageNumber . '\''; - $test_rs = $this->relation->queryAsControlUser($test_query); + $test_rs = $dbi->queryAsControlUser($test_query); $pageDesc = ''; $pages = $dbi->fetchAssoc($test_rs); if ($pages !== []) { diff --git a/libraries/classes/RecentFavoriteTable.php b/libraries/classes/RecentFavoriteTable.php index ad5e670ef1..4f07fdfeae 100644 --- a/libraries/classes/RecentFavoriteTable.php +++ b/libraries/classes/RecentFavoriteTable.php @@ -123,7 +123,7 @@ class RecentFavoriteTable $sql_query = ' SELECT `tables` FROM ' . $this->getPmaTable() . " WHERE `username` = '" . $dbi->escapeString($GLOBALS['cfg']['Server']['user']) . "'"; - $result = $this->relation->queryAsControlUser($sql_query, false); + $result = $dbi->tryQueryAsControlUser($sql_query); if ($result) { $value = $result->fetchValue(); if (is_string($value)) { diff --git a/libraries/classes/SavedSearches.php b/libraries/classes/SavedSearches.php index 011ab0e777..9ac29920b9 100644 --- a/libraries/classes/SavedSearches.php +++ b/libraries/classes/SavedSearches.php @@ -8,7 +8,6 @@ declare(strict_types=1); namespace PhpMyAdmin; use PhpMyAdmin\ConfigStorage\Features\SavedQueryByExampleSearchesFeature; -use PhpMyAdmin\ConfigStorage\Relation; use function __; use function count; @@ -59,14 +58,6 @@ class SavedSearches */ private $criterias = null; - /** @var Relation */ - private $relation; - - public function __construct(Relation $relation) - { - $this->relation = $relation; - } - /** * Setter of id * @@ -300,10 +291,7 @@ class SavedSearches . "'" . $dbi->escapeString(json_encode($this->getCriterias())) . "')"; - $result = (bool) $this->relation->queryAsControlUser($sqlQuery); - if (! $result) { - return false; - } + $dbi->queryAsControlUser($sqlQuery); $this->setId($dbi->insertId()); @@ -335,7 +323,7 @@ class SavedSearches . $dbi->escapeString(json_encode($this->getCriterias())) . "' " . 'WHERE id = ' . $this->getId(); - return (bool) $this->relation->queryAsControlUser($sqlQuery); + return (bool) $dbi->queryAsControlUser($sqlQuery); } /** @@ -362,7 +350,7 @@ class SavedSearches $sqlQuery = 'DELETE FROM ' . $savedSearchesTbl . "WHERE id = '" . $dbi->escapeString((string) $this->getId()) . "'"; - return (bool) $this->relation->queryAsControlUser($sqlQuery); + return (bool) $dbi->queryAsControlUser($sqlQuery); } /** @@ -390,7 +378,7 @@ class SavedSearches . 'FROM ' . $savedSearchesTbl . ' ' . "WHERE id = '" . $dbi->escapeString((string) $this->getId()) . "' "; - $resList = $this->relation->queryAsControlUser($sqlQuery); + $resList = $dbi->queryAsControlUser($sqlQuery); $oneResult = $resList->fetchAssoc(); if ($oneResult === []) { @@ -438,7 +426,7 @@ class SavedSearches $sqlQuery .= 'order by search_name ASC '; - $resList = $this->relation->queryAsControlUser($sqlQuery); + $resList = $dbi->queryAsControlUser($sqlQuery); return $resList->fetchAllKeyPair(); } diff --git a/libraries/classes/Server/Privileges.php b/libraries/classes/Server/Privileges.php index f0037cc3ac..726ececc4b 100644 --- a/libraries/classes/Server/Privileges.php +++ b/libraries/classes/Server/Privileges.php @@ -581,7 +581,7 @@ class Privileges return; } - $this->relation->queryAsControlUser($updQuery); + $this->dbi->queryAsControlUser($updQuery); } /** @@ -2009,7 +2009,7 @@ class Privileges if ($configurableMenusFeature !== null) { $sqlQuery = 'SELECT * FROM ' . Util::backquote($configurableMenusFeature->database) . '.' . Util::backquote($configurableMenusFeature->users); - $result = $this->relation->queryAsControlUser($sqlQuery, false); + $result = $this->dbi->tryQueryAsControlUser($sqlQuery); $groupAssignment = []; if ($result) { while ($row = $result->fetchAssoc()) { diff --git a/libraries/classes/Table.php b/libraries/classes/Table.php index e48a627bbd..3d3f4437d6 100644 --- a/libraries/classes/Table.php +++ b/libraries/classes/Table.php @@ -932,7 +932,7 @@ class Table implements Stringable // must use DatabaseInterface::QUERY_BUFFERED here, since we execute // another query inside the loop - $tableCopyRs = $relation->queryAsControlUser($tableCopyQuery); + $tableCopyRs = $dbi->queryAsControlUser($tableCopyQuery); foreach ($tableCopyRs as $tableCopyRow) { $valueParts = []; @@ -952,7 +952,7 @@ class Table implements Stringable . implode('\', \'', $valueParts) . '\', \'' . implode('\', \'', $newValueParts) . '\')'; - $relation->queryAsControlUser($newTableQuery); + $dbi->queryAsControlUser($newTableQuery); $lastId = $dbi->insertId(); } @@ -1320,7 +1320,7 @@ class Table implements Stringable if ($relationParameters->columnCommentsFeature !== null) { // Get all comments and MIME-Types for current table - $commentsCopyRs = $relation->queryAsControlUser( + $commentsCopyRs = $dbi->queryAsControlUser( 'SELECT column_name, comment' . ($relationParameters->browserTransformationFeature !== null ? ', mimetype, transformation, transformation_options' @@ -1359,7 +1359,7 @@ class Table implements Stringable . '\'' : '') . ')'; - $relation->queryAsControlUser($newCommentQuery); + $dbi->queryAsControlUser($newCommentQuery); } unset($commentsCopyRs); @@ -1759,7 +1759,7 @@ class Table implements Stringable $this->dbi->escapeString($this->name) ); - $value = $this->relation->queryAsControlUser($sqlQuery)->fetchValue(); + $value = $this->dbi->queryAsControlUser($sqlQuery)->fetchValue(); if (is_string($value)) { return json_decode($value, true); } diff --git a/libraries/classes/Tracker.php b/libraries/classes/Tracker.php index 3425b15385..9679b263d9 100644 --- a/libraries/classes/Tracker.php +++ b/libraries/classes/Tracker.php @@ -275,7 +275,7 @@ class Tracker $dbi->escapeString($trackingSet) ); - $relation->queryAsControlUser($sqlQuery); + $dbi->queryAsControlUser($sqlQuery); // Deactivate previous version return self::deactivateTracking($dbName, $tableName, (int) $version - 1); @@ -309,7 +309,7 @@ class Tracker $sqlQuery .= " AND `version` = '" . $dbi->escapeString($version) . "'"; } - return (bool) $relation->queryAsControlUser($sqlQuery); + return (bool) $dbi->queryAsControlUser($sqlQuery); } /** @@ -368,7 +368,7 @@ class Tracker $dbi->escapeString($trackingSet) ); - return (bool) $relation->queryAsControlUser($sqlQuery); + return (bool) $dbi->queryAsControlUser($sqlQuery); } /** @@ -404,7 +404,7 @@ class Tracker $dbi->escapeString((string) $version) ); - return (bool) $relation->queryAsControlUser($sqlQuery); + return (bool) $dbi->queryAsControlUser($sqlQuery); } /** @@ -465,7 +465,7 @@ class Tracker $dbi->escapeString($version) ); - $result = $relation->queryAsControlUser($sqlQuery); + $result = $dbi->queryAsControlUser($sqlQuery); return (bool) $result; } @@ -528,7 +528,7 @@ class Tracker $sqlQuery .= " AND FIND_IN_SET('" . $statement . "',tracking) > 0"; } - $result = $relation->queryAsControlUser($sqlQuery, false); + $result = $dbi->tryQueryAsControlUser($sqlQuery); if ($result === false) { return -1; @@ -575,7 +575,7 @@ class Tracker $sqlQuery .= " AND `version` = '" . $dbi->escapeString($version) . "' ORDER BY `version` DESC LIMIT 1"; - $mixed = $dbi->fetchAssoc($relation->queryAsControlUser($sqlQuery)); + $mixed = $dbi->fetchAssoc($dbi->queryAsControlUser($sqlQuery)); // PHP 7.4 fix for accessing array offset on null if ($mixed === []) { @@ -952,6 +952,6 @@ class Tracker . $dbi->escapeString($result['tablename']) . "' " . " AND `version` = '" . $dbi->escapeString($version ?? '') . "' "; - $relation->queryAsControlUser($sqlQuery); + $dbi->queryAsControlUser($sqlQuery); } } diff --git a/libraries/classes/Tracking.php b/libraries/classes/Tracking.php index 85605f409e..c8c5955acd 100644 --- a/libraries/classes/Tracking.php +++ b/libraries/classes/Tracking.php @@ -206,7 +206,7 @@ class Tracking "' " . ' ORDER BY db_name, table_name'; - return $this->relation->queryAsControlUser($sql_query); + return $this->dbi->queryAsControlUser($sql_query); } /** @@ -1105,7 +1105,6 @@ class Tracking array $urlParams, string $textDir ) { - $relation = $this->relation; $trackingFeature = $this->relation->getRelationParameters()->trackingFeature; if ($trackingFeature === null) { return ''; @@ -1120,7 +1119,7 @@ class Tracking ' GROUP BY table_name' . ' ORDER BY table_name ASC'; - $allTablesResult = $relation->queryAsControlUser($allTablesQuery); + $allTablesResult = $this->dbi->queryAsControlUser($allTablesQuery); $untrackedTables = $this->getUntrackedTables($db); // If a HEAD version exists @@ -1136,7 +1135,7 @@ class Tracking . $this->dbi->escapeString($tableName) . '\' AND `version` = \'' . $versionNumber . '\''; - $versions[] = $relation->queryAsControlUser($tableQuery)->fetchAssoc(); + $versions[] = $this->dbi->queryAsControlUser($tableQuery)->fetchAssoc(); } return $this->template->render('database/tracking/tables', [ diff --git a/libraries/classes/Transformations.php b/libraries/classes/Transformations.php index c2f37d4ac9..81df453a03 100644 --- a/libraries/classes/Transformations.php +++ b/libraries/classes/Transformations.php @@ -390,7 +390,7 @@ class Transformations AND `table_name` = \'' . $dbi->escapeString($table) . '\' AND `column_name` = \'' . $dbi->escapeString($key) . '\''; - $test_rs = $relation->queryAsControlUser($test_qry); + $test_rs = $dbi->queryAsControlUser($test_qry); if ($test_rs->numRows() > 0) { $row = $test_rs->fetchAssoc(); @@ -441,7 +441,7 @@ class Transformations } if (isset($upd_query)) { - return (bool) $relation->queryAsControlUser($upd_query); + return (bool) $dbi->queryAsControlUser($upd_query); } return false; diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 48c2de43b4..b1e3a1bff1 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -385,11 +385,6 @@ parameters: count: 1 path: libraries/classes/Config/Form.php - - - message: "#^Unreachable statement \\- code above always terminates\\.$#" - count: 2 - path: libraries/classes/Config/Form.php - - message: "#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\\.$#" count: 1 @@ -955,16 +950,6 @@ parameters: count: 1 path: libraries/classes/ConfigStorage/UserGroups.php - - - message: "#^Parameter \\#1 \\$str of function mb_substr expects string, string\\|null given\\.$#" - count: 3 - path: libraries/classes/ConfigStorage/UserGroups.php - - - - message: "#^Parameter \\#1 \\$string of function substr expects string, string\\|null given\\.$#" - count: 3 - path: libraries/classes/ConfigStorage/UserGroups.php - - message: "#^Parameter \\#1 \\$params of static method PhpMyAdmin\\\\Url\\:\\:getCommonRaw\\(\\) expects array\\, array\\ given\\.$#" count: 1 @@ -7155,16 +7140,6 @@ parameters: count: 1 path: libraries/classes/SavedSearches.php - - - message: "#^Cannot call method fetchAllKeyPair\\(\\) on PhpMyAdmin\\\\Dbal\\\\ResultInterface\\|false\\.$#" - count: 1 - path: libraries/classes/SavedSearches.php - - - - message: "#^Cannot call method fetchAssoc\\(\\) on PhpMyAdmin\\\\Dbal\\\\ResultInterface\\|false\\.$#" - count: 1 - path: libraries/classes/SavedSearches.php - - message: "#^Method PhpMyAdmin\\\\SavedSearches\\:\\:getCriterias\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -7190,16 +7165,6 @@ parameters: count: 1 path: libraries/classes/SavedSearches.php - - - message: "#^Parameter \\#1 \\$criterias of method PhpMyAdmin\\\\SavedSearches\\:\\:setCriterias\\(\\) expects array\\|string, string\\|null given\\.$#" - count: 1 - path: libraries/classes/SavedSearches.php - - - - message: "#^Parameter \\#1 \\$searchName of method PhpMyAdmin\\\\SavedSearches\\:\\:setSearchName\\(\\) expects string, string\\|null given\\.$#" - count: 1 - path: libraries/classes/SavedSearches.php - - message: "#^Property PhpMyAdmin\\\\SavedSearches\\:\\:\\$criterias \\(array\\) does not accept mixed\\.$#" count: 1 @@ -8135,16 +8100,6 @@ parameters: count: 1 path: libraries/classes/SystemDatabase.php - - - message: "#^Argument of an invalid type PhpMyAdmin\\\\Dbal\\\\ResultInterface\\|false supplied for foreach, only iterables are supported\\.$#" - count: 2 - path: libraries/classes/Table.php - - - - message: "#^Cannot call method fetchValue\\(\\) on PhpMyAdmin\\\\Dbal\\\\ResultInterface\\|false\\.$#" - count: 1 - path: libraries/classes/Table.php - - message: "#^Cannot cast mixed to string\\.$#" count: 1 @@ -8460,16 +8415,6 @@ parameters: count: 1 path: libraries/classes/Theme.php - - - message: "#^Unreachable statement \\- code above always terminates\\.$#" - count: 1 - path: libraries/classes/Theme.php - - - - message: "#^If condition is always true\\.$#" - count: 1 - path: libraries/classes/ThemeManager.php - - message: "#^Method PhpMyAdmin\\\\ThemeManager\\:\\:getThemesArray\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -8485,11 +8430,6 @@ parameters: count: 1 path: libraries/classes/ThemeManager.php - - - message: "#^Unreachable statement \\- code above always terminates\\.$#" - count: 2 - path: libraries/classes/ThemeManager.php - - message: "#^Cannot access property \\$table on PhpMyAdmin\\\\SqlParser\\\\Components\\\\Expression\\|string\\.$#" count: 1 @@ -8570,16 +8510,6 @@ parameters: count: 1 path: libraries/classes/Tracking.php - - - message: "#^Cannot call method fetchAssoc\\(\\) on PhpMyAdmin\\\\Dbal\\\\ResultInterface\\|false\\.$#" - count: 1 - path: libraries/classes/Tracking.php - - - - message: "#^Cannot call method fetchRow\\(\\) on PhpMyAdmin\\\\Dbal\\\\ResultInterface\\|false\\.$#" - count: 1 - path: libraries/classes/Tracking.php - - message: "#^Method PhpMyAdmin\\\\Tracking\\:\\:createTrackingForMultipleTables\\(\\) has parameter \\$selected with no value type specified in iterable type array\\.$#" count: 1 @@ -8820,16 +8750,6 @@ parameters: count: 1 path: libraries/classes/Tracking.php - - - message: "#^Cannot call method fetchAssoc\\(\\) on PhpMyAdmin\\\\Dbal\\\\ResultInterface\\|false\\.$#" - count: 1 - path: libraries/classes/Transformations.php - - - - message: "#^Cannot call method numRows\\(\\) on PhpMyAdmin\\\\Dbal\\\\ResultInterface\\|false\\.$#" - count: 1 - path: libraries/classes/Transformations.php - - message: "#^Method PhpMyAdmin\\\\Transformations\\:\\:getAvailableMimeTypes\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -8845,11 +8765,6 @@ parameters: count: 1 path: libraries/classes/Transformations.php - - - message: "#^Parameter \\#1 \\$string of function strlen expects string, string\\|null given\\.$#" - count: 1 - path: libraries/classes/Transformations.php - - message: "#^Call to an undefined method object\\:\\:configure\\(\\)\\.$#" count: 1 diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 1b7e874c18..2ad8110f4b 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -14433,30 +14433,9 @@ - - method - method - method - method - method - method - method - method - withConsecutive - withConsecutive - withConsecutive - withConsecutive - - - expects - expects - expects - expects - expects - expects - expects - expects - + + $dbi + diff --git a/test/classes/ConfigStorage/RelationCleanupTest.php b/test/classes/ConfigStorage/RelationCleanupTest.php index 3ad5f71cb7..1a795a2ffb 100644 --- a/test/classes/ConfigStorage/RelationCleanupTest.php +++ b/test/classes/ConfigStorage/RelationCleanupTest.php @@ -7,6 +7,7 @@ namespace PhpMyAdmin\Tests\ConfigStorage; use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\ConfigStorage\RelationCleanup; use PhpMyAdmin\ConfigStorage\RelationParameters; +use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\Tests\AbstractTestCase; use PHPUnit\Framework\MockObject\MockObject; @@ -21,6 +22,9 @@ class RelationCleanupTest extends AbstractTestCase /** @var RelationCleanup */ private $relationCleanup; + /** @var DatabaseInterface&MockObject */ + protected $dbi; + /** * Prepares environment for the test. */ @@ -30,10 +34,14 @@ class RelationCleanupTest extends AbstractTestCase $GLOBALS['server'] = 1; $this->relation = $this->getMockBuilder(Relation::class) + ->disableOriginalConstructor() + ->onlyMethods([]) + ->getMock(); + $this->dbi = $this->getMockBuilder(DatabaseInterface::class) ->disableOriginalConstructor() ->onlyMethods(['queryAsControlUser']) ->getMock(); - $this->relationCleanup = new RelationCleanup($GLOBALS['dbi'], $this->relation); + $this->relationCleanup = new RelationCleanup($this->dbi, $this->relation); } /** @@ -41,7 +49,7 @@ class RelationCleanupTest extends AbstractTestCase */ public function testColumnWithoutRelations(): void { - $this->relation->expects($this->never()) + $this->dbi->expects($this->never()) ->method('queryAsControlUser'); $this->relationCleanup->column('database', 'table', 'column'); @@ -64,7 +72,7 @@ class RelationCleanupTest extends AbstractTestCase 'column_info' => 'column_info', ])->toArray(); - $this->relation->expects($this->exactly(4)) + $this->dbi->expects($this->exactly(4)) ->method('queryAsControlUser') ->withConsecutive( [ @@ -101,7 +109,7 @@ class RelationCleanupTest extends AbstractTestCase */ public function testTableWithoutRelations(): void { - $this->relation->expects($this->never()) + $this->dbi->expects($this->never()) ->method('queryAsControlUser'); $this->relationCleanup->table('database', 'table'); @@ -131,7 +139,7 @@ class RelationCleanupTest extends AbstractTestCase 'navigationhiding' => 'navigationhiding', ])->toArray(); - $this->relation->expects($this->exactly(7)) + $this->dbi->expects($this->exactly(7)) ->method('queryAsControlUser') ->withConsecutive( [ @@ -180,7 +188,7 @@ class RelationCleanupTest extends AbstractTestCase */ public function testDatabaseWithoutRelations(): void { - $this->relation->expects($this->never()) + $this->dbi->expects($this->never()) ->method('queryAsControlUser'); $this->relationCleanup->database('database'); @@ -216,7 +224,7 @@ class RelationCleanupTest extends AbstractTestCase 'central_columns' => 'central_columns', ])->toArray(); - $this->relation->expects($this->exactly(11)) + $this->dbi->expects($this->exactly(11)) ->method('queryAsControlUser') ->withConsecutive( [$this->equalTo("DELETE FROM `pmadb`.`column_info` WHERE db_name = 'database'")], @@ -240,7 +248,7 @@ class RelationCleanupTest extends AbstractTestCase */ public function testUserWithoutRelations(): void { - $this->relation->expects($this->never()) + $this->dbi->expects($this->never()) ->method('queryAsControlUser'); $this->relationCleanup->user('user'); @@ -278,7 +286,7 @@ class RelationCleanupTest extends AbstractTestCase 'designer_settings' => 'designer_settings', ])->toArray(); - $this->relation->expects($this->exactly(10)) + $this->dbi->expects($this->exactly(10)) ->method('queryAsControlUser') ->withConsecutive( [$this->equalTo("DELETE FROM `pmadb`.`bookmark` WHERE `user` = 'user'")], diff --git a/test/classes/ConfigStorage/RelationTest.php b/test/classes/ConfigStorage/RelationTest.php index 7aa430d986..1e771eae5d 100644 --- a/test/classes/ConfigStorage/RelationTest.php +++ b/test/classes/ConfigStorage/RelationTest.php @@ -41,40 +41,6 @@ class RelationTest extends AbstractTestCase $this->relation = new Relation($GLOBALS['dbi']); } - /** - * Test for queryAsControlUser - */ - public function testPMAQueryAsControlUser(): void - { - $resultStub1 = $this->createMock(DummyResult::class); - $resultStub2 = $this->createMock(DummyResult::class); - - $dbi = $this->getMockBuilder(DatabaseInterface::class) - ->disableOriginalConstructor() - ->getMock(); - - $dbi->expects($this->once()) - ->method('query') - ->will($this->returnValue($resultStub1)); - - $dbi->expects($this->once()) - ->method('tryQuery') - ->will($this->returnValue($resultStub2)); - - $GLOBALS['dbi'] = $dbi; - $this->relation->dbi = $GLOBALS['dbi']; - - $sql = 'insert into PMA_bookmark A,B values(1, 2)'; - $this->assertSame( - $resultStub1, - $this->relation->queryAsControlUser($sql) - ); - $this->assertSame( - $resultStub2, - $this->relation->queryAsControlUser($sql, false) - ); - } - /** * Test for getDisplayField */ @@ -160,7 +126,7 @@ class RelationTest extends AbstractTestCase ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->any()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->will($this->returnValue($resultStub)); $resultStub->expects($this->any()) ->method('numRows') diff --git a/test/classes/ConfigStorage/UserGroupsTest.php b/test/classes/ConfigStorage/UserGroupsTest.php index ec2bb11ad1..7f293c3683 100644 --- a/test/classes/ConfigStorage/UserGroupsTest.php +++ b/test/classes/ConfigStorage/UserGroupsTest.php @@ -55,7 +55,7 @@ class UserGroupsTest extends AbstractTestCase ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->once()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->with($expectedQuery) ->will($this->returnValue($resultStub)); $resultStub->expects($this->once()) @@ -101,7 +101,7 @@ class UserGroupsTest extends AbstractTestCase ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->exactly(2)) - ->method('query') + ->method('queryAsControlUser') ->withConsecutive([$this->equalTo($userDelQuery)], [$this->equalTo($userGrpDelQuery)]); $dbi->expects($this->any()) ->method('escapeString') @@ -129,7 +129,7 @@ class UserGroupsTest extends AbstractTestCase ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->once()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->with($expectedQuery) ->will($this->returnValue($resultStub)); $resultStub->expects($this->exactly(1)) diff --git a/test/classes/Database/Designer/CommonTest.php b/test/classes/Database/Designer/CommonTest.php index cff9562a81..bac5348d46 100644 --- a/test/classes/Database/Designer/CommonTest.php +++ b/test/classes/Database/Designer/CommonTest.php @@ -125,7 +125,7 @@ class CommonTest extends AbstractTestCase ->getMock(); $dbi->expects($this->exactly(2)) - ->method('query') + ->method('queryAsControlUser') ->willReturnOnConsecutiveCalls($resultStub, $resultStub); $dbi->expects($this->any())->method('escapeString') ->will($this->returnArgument(0)); diff --git a/test/classes/Database/DesignerTest.php b/test/classes/Database/DesignerTest.php index 5a9664643d..68d873d471 100644 --- a/test/classes/Database/DesignerTest.php +++ b/test/classes/Database/DesignerTest.php @@ -66,12 +66,10 @@ class DesignerTest extends AbstractTestCase ->getMock(); $dbi->expects($this->once()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->with( 'SELECT `page_nr`, `page_descr` FROM `pmadb`.`pdf_pages`' - . " WHERE db_name = '" . $db . "' ORDER BY `page_descr`", - DatabaseInterface::CONNECT_CONTROL, - false + . " WHERE db_name = '" . $db . "' ORDER BY `page_descr`" ) ->will($this->returnValue($resultStub)); diff --git a/test/classes/DatabaseInterfaceTest.php b/test/classes/DatabaseInterfaceTest.php index 58a4e8feb6..010077e6da 100644 --- a/test/classes/DatabaseInterfaceTest.php +++ b/test/classes/DatabaseInterfaceTest.php @@ -6,6 +6,7 @@ namespace PhpMyAdmin\Tests; use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\Database\DatabaseList; +use PhpMyAdmin\Dbal\ResultInterface; use PhpMyAdmin\Query\Utilities; use PhpMyAdmin\SystemDatabase; use PhpMyAdmin\Utils\SessionCache; @@ -479,4 +480,24 @@ class DatabaseInterfaceTest extends AbstractTestCase $actual = $this->dbi->getTablesFull('test_db'); $this->assertEquals($expected, $actual); } + + /** + * Test for queryAsControlUser + */ + public function testQueryAsControlUser(): void + { + $sql = 'insert into PMA_bookmark A,B values(1, 2)'; + $this->dummyDbi->addResult($sql, [true]); + $this->dummyDbi->addResult($sql, [true]); + + $this->assertInstanceOf( + ResultInterface::class, + $this->dbi->queryAsControlUser($sql) + ); + $this->assertInstanceOf( + ResultInterface::class, + $this->dbi->tryQueryAsControlUser($sql) + ); + $this->assertFalse($this->dbi->tryQueryAsControlUser('Invalid query')); + } } diff --git a/test/classes/Navigation/NavigationTest.php b/test/classes/Navigation/NavigationTest.php index f62342833d..2bd6169455 100644 --- a/test/classes/Navigation/NavigationTest.php +++ b/test/classes/Navigation/NavigationTest.php @@ -69,7 +69,7 @@ class NavigationTest extends AbstractTestCase ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->once()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->with($expectedQuery); $dbi->expects($this->any())->method('escapeString') ->will($this->returnArgument(0)); @@ -91,7 +91,7 @@ class NavigationTest extends AbstractTestCase ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->once()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->with($expectedQuery); $dbi->expects($this->any())->method('escapeString') diff --git a/test/classes/Plugins/Export/ExportHtmlwordTest.php b/test/classes/Plugins/Export/ExportHtmlwordTest.php index 2df1891a9c..19c0263d21 100644 --- a/test/classes/Plugins/Export/ExportHtmlwordTest.php +++ b/test/classes/Plugins/Export/ExportHtmlwordTest.php @@ -413,7 +413,7 @@ class ExportHtmlwordTest extends AbstractTestCase ->will($this->returnValue([$columns])); $dbi->expects($this->once()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->will($this->returnValue($resultStub)); $resultStub->expects($this->once()) @@ -498,7 +498,7 @@ class ExportHtmlwordTest extends AbstractTestCase ->will($this->returnValue([$columns])); $dbi->expects($this->once()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->will($this->returnValue($resultStub)); $resultStub->expects($this->once()) diff --git a/test/classes/Plugins/Export/ExportLatexTest.php b/test/classes/Plugins/Export/ExportLatexTest.php index e1c85c6844..c0e78f1d66 100644 --- a/test/classes/Plugins/Export/ExportLatexTest.php +++ b/test/classes/Plugins/Export/ExportLatexTest.php @@ -588,7 +588,7 @@ class ExportLatexTest extends AbstractTestCase ->will($this->returnValue($columns)); $dbi->expects($this->once()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->will($this->returnValue($resultStub)); $resultStub->expects($this->once()) @@ -693,7 +693,7 @@ class ExportLatexTest extends AbstractTestCase ->will($this->returnValue($columns)); $dbi->expects($this->once()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->will($this->returnValue($resultStub)); $resultStub->expects($this->once()) diff --git a/test/classes/Plugins/Export/ExportOdtTest.php b/test/classes/Plugins/Export/ExportOdtTest.php index 06ef6b6e82..fb63ff84a0 100644 --- a/test/classes/Plugins/Export/ExportOdtTest.php +++ b/test/classes/Plugins/Export/ExportOdtTest.php @@ -599,7 +599,7 @@ class ExportOdtTest extends AbstractTestCase ->will($this->returnValue([$columns])); $dbi->expects($this->once()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->will($this->returnValue($resultStub)); $resultStub->expects($this->once()) @@ -697,7 +697,7 @@ class ExportOdtTest extends AbstractTestCase ->will($this->returnValue([$columns])); $dbi->expects($this->once()) - ->method('tryQuery') + ->method('tryQueryAsControlUser') ->will($this->returnValue($resultStub)); $resultStub->expects($this->once()) diff --git a/test/classes/TrackerTest.php b/test/classes/TrackerTest.php index cb25a0afff..4176511c7f 100644 --- a/test/classes/TrackerTest.php +++ b/test/classes/TrackerTest.php @@ -273,7 +273,7 @@ class TrackerTest extends AbstractTestCase . " AND `table_name` = 'testtable'"; $dbi->expects($this->exactly(1)) - ->method('query') + ->method('queryAsControlUser') ->with($sql_query) ->will($this->returnValue($resultStub)); $dbi->expects($this->any())->method('escapeString') @@ -305,8 +305,8 @@ class TrackerTest extends AbstractTestCase . '\', \'CREATE DATABASE,ALTER DATABASE,DROP DATABASE\')'; $dbi->expects($this->exactly(1)) - ->method('query') - ->with($this->matches($expectedMainQuery), DatabaseInterface::CONNECT_CONTROL, 0, false) + ->method('queryAsControlUser') + ->with($this->matches($expectedMainQuery)) ->will($this->returnValue($resultStub)); $dbi->expects($this->any())->method('escapeString') @@ -346,8 +346,8 @@ class TrackerTest extends AbstractTestCase " AND `version` = '" . $version . "'"; $dbi->expects($this->exactly(1)) - ->method('query') - ->with($sql_query, DatabaseInterface::CONNECT_CONTROL, 0, false) + ->method('queryAsControlUser') + ->with($sql_query) ->will($this->returnValue($resultStub)); $dbi->expects($this->any())->method('escapeString') @@ -491,7 +491,7 @@ class TrackerTest extends AbstractTestCase ->getMock(); $dbi->expects($this->once()) - ->method('query') + ->method('queryAsControlUser') ->will($this->returnValue($resultStub)); $dbi->expects($this->once())