diff --git a/libraries/classes/Menu.php b/libraries/classes/Menu.php index c539068437..282a26a426 100644 --- a/libraries/classes/Menu.php +++ b/libraries/classes/Menu.php @@ -201,20 +201,20 @@ class Menu $server['url'] = Util::getUrlForOption( $cfg['DefaultTabServer'], 'server' - ); + ) ?? '/'; if (strlen($this->db) > 0) { $database['name'] = $this->db; $database['url'] = Util::getUrlForOption( $cfg['DefaultTabDatabase'], 'database' - ); + ) ?? '/'; if (strlen((string) $this->table) > 0) { $table['name'] = $this->table; $table['url'] = Util::getUrlForOption( $cfg['DefaultTabTable'], 'table' - ); + ) ?? '/'; /** @var Table $tableObj */ $tableObj = $dbi->getTable($this->db, $this->table); $table['is_view'] = $tableObj->isView(); diff --git a/libraries/classes/Util.php b/libraries/classes/Util.php index db4163dab8..d399b70ede 100644 --- a/libraries/classes/Util.php +++ b/libraries/classes/Util.php @@ -1742,7 +1742,7 @@ class Util { $url = self::getUrlForOption($target, $location); if ($url === null) { - return '/'; + return './'; } return Url::getFromRoute($url); @@ -1767,26 +1767,35 @@ class Util // Values for $cfg['DefaultTabServer'] switch ($target) { case 'welcome': + case 'index.php': return '/'; case 'databases': + case 'server_databases.php': return '/server/databases'; case 'status': + case 'server_status.php': return '/server/status'; case 'variables': + case 'server_variables.php': return '/server/variables'; case 'privileges': + case 'server_privileges.php': return '/server/privileges'; } } elseif ($location === 'database') { // Values for $cfg['DefaultTabDatabase'] switch ($target) { case 'structure': + case 'db_structure.php': return '/database/structure'; case 'sql': + case 'db_sql.php': return '/database/sql'; case 'search': + case 'db_search.php': return '/database/search'; case 'operations': + case 'db_operations.php': return '/database/operations'; } } elseif ($location === 'table') { @@ -1795,14 +1804,19 @@ class Util // $cfg['NavigationTreeDefaultTabTable2'] switch ($target) { case 'structure': + case 'tbl_structure.php': return '/table/structure'; case 'sql': + case 'tbl_sql.php': return '/table/sql'; case 'search': + case 'tbl_select.php': return '/table/search'; case 'insert': + case 'tbl_change.php': return '/table/change'; case 'browse': + case 'sql.php': return '/sql'; } } diff --git a/test/classes/UtilTest.php b/test/classes/UtilTest.php index adffbc7d8d..508ebf86d3 100644 --- a/test/classes/UtilTest.php +++ b/test/classes/UtilTest.php @@ -2600,4 +2600,177 @@ class UtilTest extends AbstractTestCase $this->assertFalse(Util::currentUserHasPrivilege('EVENT', 'my_data_base', 'my_data_table')); $GLOBALS['dbi'] = $oldDbi; } + + /** + * @return array[] + */ + public function dataProviderScriptNames(): array + { + // target + // location + // function output + return [ + [ + 'structure', // Notice the typo on db_structure.php + 'databasesss', + './',// Fallback to a relative path, impossible to build a valid route link + ], + [ + 'db_structures.php', // Notice the typo on databases + 'database', + './',// Fallback to a relative path, impossible to build a valid route link + ], + [ + 'tbl_structure.php', // Support the legacy value + 'table', + 'index.php?route=/table/structure&lang=en', + ], + [ + 'structure', + 'table', + 'index.php?route=/table/structure&lang=en', + ], + [ + 'tbl_sql.php', // Support the legacy value + 'table', + 'index.php?route=/table/sql&lang=en', + ], + [ + 'sql', + 'table', + 'index.php?route=/table/sql&lang=en', + ], + [ + 'tbl_select.php', // Support the legacy value + 'table', + 'index.php?route=/table/search&lang=en', + ], + [ + 'search', + 'table', + 'index.php?route=/table/search&lang=en', + ], + [ + 'tbl_change.php', // Support the legacy value + 'table', + 'index.php?route=/table/change&lang=en', + ], + [ + 'insert', + 'table', + 'index.php?route=/table/change&lang=en', + ], + [ + 'sql.php', // Support the legacy value + 'table', + 'index.php?route=/sql&lang=en', + ], + [ + 'browse', + 'table', + 'index.php?route=/sql&lang=en', + ], + [ + 'db_structure.php', // Support the legacy value + 'database', + 'index.php?route=/database/structure&lang=en', + ], + [ + 'structure', + 'database', + 'index.php?route=/database/structure&lang=en', + ], + [ + 'db_sql.php', // Support the legacy value + 'database', + 'index.php?route=/database/sql&lang=en', + ], + [ + 'sql', + 'database', + 'index.php?route=/database/sql&lang=en', + ], + [ + 'db_search.php', // Support the legacy value + 'database', + 'index.php?route=/database/search&lang=en', + ], + [ + 'search', + 'database', + 'index.php?route=/database/search&lang=en', + ], + [ + 'db_operations.php', // Support the legacy value + 'database', + 'index.php?route=/database/operations&lang=en', + ], + [ + 'operations', + 'database', + 'index.php?route=/database/operations&lang=en', + ], + [ + 'index.php', // Support the legacy value + 'server', + 'index.php?route=/&lang=en', + ], + [ + 'welcome', + 'server', + 'index.php?route=/&lang=en', + ], + [ + 'server_databases.php', // Support the legacy value + 'server', + 'index.php?route=/server/databases&lang=en', + ], + [ + 'databases', + 'server', + 'index.php?route=/server/databases&lang=en', + ], + [ + 'server_status.php', // Support the legacy value + 'server', + 'index.php?route=/server/status&lang=en', + ], + [ + 'status', + 'server', + 'index.php?route=/server/status&lang=en', + ], + [ + 'server_variables.php', // Support the legacy value + 'server', + 'index.php?route=/server/variables&lang=en', + ], + [ + 'variables', + 'server', + 'index.php?route=/server/variables&lang=en', + ], + [ + 'server_privileges.php', // Support the legacy value + 'server', + 'index.php?route=/server/privileges&lang=en', + ], + [ + 'privileges', + 'server', + 'index.php?route=/server/privileges&lang=en', + ], + ]; + } + + /** + * @dataProvider dataProviderScriptNames + */ + public function testGetScriptNameForOption(string $target, string $location, string $finalLink): void + { + $this->assertSame( + $finalLink, + Util::getScriptNameForOption($target, $location) + ); + } }