diff --git a/libraries/classes/ConfigStorage/RelationCleanup.php b/libraries/classes/ConfigStorage/RelationCleanup.php index a986548ceb..efb32585a2 100644 --- a/libraries/classes/ConfigStorage/RelationCleanup.php +++ b/libraries/classes/ConfigStorage/RelationCleanup.php @@ -188,100 +188,130 @@ class RelationCleanup * * @param string $db database name */ - public function database($db): void + public function database(string $db): void { $relationParameters = $this->relation->getRelationParameters(); if ($relationParameters->db === null) { return; } - if ($relationParameters->columnCommentsFeature !== null) { - $remove_query = 'DELETE FROM ' - . Util::backquote($relationParameters->columnCommentsFeature->database) - . '.' . Util::backquote($relationParameters->columnCommentsFeature->columnInfo) - . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->dbi->queryAsControlUser($remove_query); + $columnCommentsFeature = $relationParameters->columnCommentsFeature; + $bookmarkFeature = $relationParameters->bookmarkFeature; + $displayFeature = $relationParameters->displayFeature; + $pdfFeature = $relationParameters->pdfFeature; + $relationFeature = $relationParameters->relationFeature; + $uiPreferencesFeature = $relationParameters->uiPreferencesFeature; + $navigationItemsHidingFeature = $relationParameters->navigationItemsHidingFeature; + $savedQueryByExampleSearchesFeature = $relationParameters->savedQueryByExampleSearchesFeature; + $centralColumnsFeature = $relationParameters->centralColumnsFeature; + + if ($columnCommentsFeature !== null) { + $statement = sprintf( + 'DELETE FROM %s.%s WHERE db_name = %s', + Util::backquote($columnCommentsFeature->database), + Util::backquote($columnCommentsFeature->columnInfo), + $this->dbi->quoteString($db), + ); + $this->dbi->queryAsControlUser($statement); } - if ($relationParameters->bookmarkFeature !== null) { - $remove_query = 'DELETE FROM ' - . Util::backquote($relationParameters->bookmarkFeature->database) - . '.' . Util::backquote($relationParameters->bookmarkFeature->bookmark) - . ' WHERE dbase = \'' . $this->dbi->escapeString($db) . '\''; - $this->dbi->queryAsControlUser($remove_query); + if ($bookmarkFeature !== null) { + $statement = sprintf( + 'DELETE FROM %s.%s WHERE dbase = %s', + Util::backquote($bookmarkFeature->database), + Util::backquote($bookmarkFeature->bookmark), + $this->dbi->quoteString($db), + ); + $this->dbi->queryAsControlUser($statement); } - if ($relationParameters->displayFeature !== null) { - $remove_query = 'DELETE FROM ' - . Util::backquote($relationParameters->displayFeature->database) - . '.' . Util::backquote($relationParameters->displayFeature->tableInfo) - . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->dbi->queryAsControlUser($remove_query); + if ($displayFeature !== null) { + $statement = sprintf( + 'DELETE FROM %s.%s WHERE db_name = %s', + Util::backquote($displayFeature->database), + Util::backquote($displayFeature->tableInfo), + $this->dbi->quoteString($db), + ); + $this->dbi->queryAsControlUser($statement); } - if ($relationParameters->pdfFeature !== null) { - $remove_query = 'DELETE FROM ' - . Util::backquote($relationParameters->pdfFeature->database) - . '.' . Util::backquote($relationParameters->pdfFeature->pdfPages) - . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->dbi->queryAsControlUser($remove_query); + if ($pdfFeature !== null) { + $statement = sprintf( + 'DELETE FROM %s.%s WHERE db_name = %s', + Util::backquote($pdfFeature->database), + Util::backquote($pdfFeature->pdfPages), + $this->dbi->quoteString($db), + ); + $this->dbi->queryAsControlUser($statement); - $remove_query = 'DELETE FROM ' - . Util::backquote($relationParameters->pdfFeature->database) - . '.' . Util::backquote($relationParameters->pdfFeature->tableCoords) - . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->dbi->queryAsControlUser($remove_query); + $statement = sprintf( + 'DELETE FROM %s.%s WHERE db_name = %s', + Util::backquote($pdfFeature->database), + Util::backquote($pdfFeature->tableCoords), + $this->dbi->quoteString($db), + ); + $this->dbi->queryAsControlUser($statement); } - if ($relationParameters->relationFeature !== null) { - $remove_query = 'DELETE FROM ' - . Util::backquote($relationParameters->relationFeature->database) - . '.' . Util::backquote($relationParameters->relationFeature->relation) - . ' WHERE master_db = \'' - . $this->dbi->escapeString($db) . '\''; - $this->dbi->queryAsControlUser($remove_query); + if ($relationFeature !== null) { + $statement = sprintf( + 'DELETE FROM %s.%s WHERE master_db = %s', + Util::backquote($relationFeature->database), + Util::backquote($relationFeature->relation), + $this->dbi->quoteString($db), + ); + $this->dbi->queryAsControlUser($statement); - $remove_query = 'DELETE FROM ' - . Util::backquote($relationParameters->relationFeature->database) - . '.' . Util::backquote($relationParameters->relationFeature->relation) - . ' WHERE foreign_db = \'' . $this->dbi->escapeString($db) - . '\''; - $this->dbi->queryAsControlUser($remove_query); + $statement = sprintf( + 'DELETE FROM %s.%s WHERE foreign_db = %s', + Util::backquote($relationFeature->database), + Util::backquote($relationFeature->relation), + $this->dbi->quoteString($db), + ); + $this->dbi->queryAsControlUser($statement); } - if ($relationParameters->uiPreferencesFeature !== null) { - $remove_query = 'DELETE FROM ' - . Util::backquote($relationParameters->uiPreferencesFeature->database) - . '.' . Util::backquote($relationParameters->uiPreferencesFeature->tableUiPrefs) - . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->dbi->queryAsControlUser($remove_query); + if ($uiPreferencesFeature !== null) { + $statement = sprintf( + 'DELETE FROM %s.%s WHERE db_name = %s', + Util::backquote($uiPreferencesFeature->database), + Util::backquote($uiPreferencesFeature->tableUiPrefs), + $this->dbi->quoteString($db), + ); + $this->dbi->queryAsControlUser($statement); } - if ($relationParameters->navigationItemsHidingFeature !== null) { - $remove_query = 'DELETE FROM ' - . Util::backquote($relationParameters->navigationItemsHidingFeature->database) - . '.' . Util::backquote($relationParameters->navigationItemsHidingFeature->navigationHiding) - . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->dbi->queryAsControlUser($remove_query); + if ($navigationItemsHidingFeature !== null) { + $statement = sprintf( + 'DELETE FROM %s.%s WHERE db_name = %s', + Util::backquote($navigationItemsHidingFeature->database), + Util::backquote($navigationItemsHidingFeature->navigationHiding), + $this->dbi->quoteString($db), + ); + $this->dbi->queryAsControlUser($statement); } - if ($relationParameters->savedQueryByExampleSearchesFeature !== null) { - $remove_query = 'DELETE FROM ' - . Util::backquote($relationParameters->savedQueryByExampleSearchesFeature->database) - . '.' . Util::backquote($relationParameters->savedQueryByExampleSearchesFeature->savedSearches) - . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->dbi->queryAsControlUser($remove_query); + if ($savedQueryByExampleSearchesFeature !== null) { + $statement = sprintf( + 'DELETE FROM %s.%s WHERE db_name = %s', + Util::backquote($savedQueryByExampleSearchesFeature->database), + Util::backquote($savedQueryByExampleSearchesFeature->savedSearches), + $this->dbi->quoteString($db), + ); + $this->dbi->queryAsControlUser($statement); } - if ($relationParameters->centralColumnsFeature === null) { + if ($centralColumnsFeature === null) { return; } - $remove_query = 'DELETE FROM ' - . Util::backquote($relationParameters->centralColumnsFeature->database) - . '.' . Util::backquote($relationParameters->centralColumnsFeature->centralColumns) - . ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''; - $this->dbi->queryAsControlUser($remove_query); + $statement = sprintf( + 'DELETE FROM %s.%s WHERE db_name = %s', + Util::backquote($centralColumnsFeature->database), + Util::backquote($centralColumnsFeature->centralColumns), + $this->dbi->quoteString($db), + ); + $this->dbi->queryAsControlUser($statement); } /** diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 63198ad902..9f775e9454 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -1390,17 +1390,6 @@ escapeString escapeString escapeString - escapeString - escapeString - escapeString - escapeString - escapeString - escapeString - escapeString - escapeString - escapeString - escapeString - escapeString @@ -3268,8 +3257,6 @@ $database - $database - $database @@ -16220,7 +16207,6 @@ withConsecutive - withConsecutive diff --git a/test/classes/ConfigStorage/RelationCleanupTest.php b/test/classes/ConfigStorage/RelationCleanupTest.php index e96b119d6f..47d8a3047d 100644 --- a/test/classes/ConfigStorage/RelationCleanupTest.php +++ b/test/classes/ConfigStorage/RelationCleanupTest.php @@ -128,8 +128,8 @@ class RelationCleanupTest extends AbstractTestCase public function testDatabaseWithRelations(): void { - $_SESSION['relation'] = []; - $_SESSION['relation'][$GLOBALS['server']] = RelationParameters::fromArray([ + $relation = $this->createStub(Relation::class); + $relation->method('getRelationParameters')->willReturn(RelationParameters::fromArray([ 'user' => 'user', 'db' => 'pmadb', 'commwork' => true, @@ -151,26 +151,27 @@ class RelationCleanupTest extends AbstractTestCase 'navigationhiding' => 'navigationhiding', 'savedsearches' => 'savedsearches', 'central_columns' => 'central_columns', - ])->toArray(); + ])); - $dbi = $this->createPartialMock(DatabaseInterface::class, ['queryAsControlUser']); - $dbi->expects($this->exactly(11)) - ->method('queryAsControlUser') - ->withConsecutive( - [$this->equalTo("DELETE FROM `pmadb`.`column_info` WHERE db_name = 'database'")], - [$this->equalTo("DELETE FROM `pmadb`.`bookmark` WHERE dbase = 'database'")], - [$this->equalTo("DELETE FROM `pmadb`.`table_info` WHERE db_name = 'database'")], - [$this->equalTo("DELETE FROM `pmadb`.`pdf_pages` WHERE db_name = 'database'")], - [$this->equalTo("DELETE FROM `pmadb`.`table_coords` WHERE db_name = 'database'")], - [$this->equalTo("DELETE FROM `pmadb`.`relation` WHERE master_db = 'database'")], - [$this->equalTo("DELETE FROM `pmadb`.`relation` WHERE foreign_db = 'database'")], - [$this->equalTo("DELETE FROM `pmadb`.`table_uiprefs` WHERE db_name = 'database'")], - [$this->equalTo("DELETE FROM `pmadb`.`navigationhiding` WHERE db_name = 'database'")], - [$this->equalTo("DELETE FROM `pmadb`.`savedsearches` WHERE db_name = 'database'")], - [$this->equalTo("DELETE FROM `pmadb`.`central_columns` WHERE db_name = 'database'")] - ); + $dbi = $this->createMock(DatabaseInterface::class); + $dbi->expects($this->any())->method('quoteString') + ->will($this->returnCallback(static fn (string $string): string => "'" . $string . "'")); + $result = $this->createStub(ResultInterface::class); + $dbi->expects($this->exactly(11))->method('queryAsControlUser')->willReturnMap([ + ["DELETE FROM `pmadb`.`column_info` WHERE db_name = 'database'", $result], + ["DELETE FROM `pmadb`.`bookmark` WHERE dbase = 'database'", $result], + ["DELETE FROM `pmadb`.`table_info` WHERE db_name = 'database'", $result], + ["DELETE FROM `pmadb`.`pdf_pages` WHERE db_name = 'database'", $result], + ["DELETE FROM `pmadb`.`table_coords` WHERE db_name = 'database'", $result], + ["DELETE FROM `pmadb`.`relation` WHERE master_db = 'database'", $result], + ["DELETE FROM `pmadb`.`relation` WHERE foreign_db = 'database'", $result], + ["DELETE FROM `pmadb`.`table_uiprefs` WHERE db_name = 'database'", $result], + ["DELETE FROM `pmadb`.`navigationhiding` WHERE db_name = 'database'", $result], + ["DELETE FROM `pmadb`.`savedsearches` WHERE db_name = 'database'", $result], + ["DELETE FROM `pmadb`.`central_columns` WHERE db_name = 'database'", $result], + ]); - (new RelationCleanup($dbi, new Relation($dbi)))->database('database'); + (new RelationCleanup($dbi, $relation))->database('database'); } public function testUserWithoutRelations(): void