|
4 | 4 |
|
5 | 5 | namespace PhpMyAdmin\Controllers; |
6 | 6 |
|
| 7 | +use Fig\Http\Message\RequestMethodInterface; |
| 8 | +use Fig\Http\Message\StatusCodeInterface; |
7 | 9 | use PhpMyAdmin\Charsets; |
8 | 10 | use PhpMyAdmin\CheckUserPrivileges; |
9 | 11 | use PhpMyAdmin\Config; |
10 | 12 | use PhpMyAdmin\ConfigStorage\Relation; |
11 | 13 | use PhpMyAdmin\DatabaseInterface; |
12 | 14 | use PhpMyAdmin\Git; |
13 | 15 | use PhpMyAdmin\Html\Generator; |
| 16 | +use PhpMyAdmin\Http\Factory\ResponseFactory; |
| 17 | +use PhpMyAdmin\Http\Response; |
14 | 18 | use PhpMyAdmin\Http\ServerRequest; |
| 19 | +use PhpMyAdmin\Identifiers\DatabaseName; |
| 20 | +use PhpMyAdmin\Identifiers\TableName; |
15 | 21 | use PhpMyAdmin\LanguageManager; |
16 | 22 | use PhpMyAdmin\Message; |
17 | 23 | use PhpMyAdmin\RecentFavoriteTable; |
@@ -50,19 +56,24 @@ public function __construct( |
50 | 56 | private Config $config, |
51 | 57 | private ThemeManager $themeManager, |
52 | 58 | private DatabaseInterface $dbi, |
| 59 | + private readonly ResponseFactory $responseFactory, |
53 | 60 | ) { |
54 | 61 | parent::__construct($response, $template); |
55 | 62 | } |
56 | 63 |
|
57 | | - public function __invoke(ServerRequest $request): void |
| 64 | + public function __invoke(ServerRequest $request): Response|null |
58 | 65 | { |
| 66 | + if ($this->shouldRedirectToDatabaseOrTablePage($request)) { |
| 67 | + return $this->redirectToDatabaseOrTablePage($request); |
| 68 | + } |
| 69 | + |
59 | 70 | $GLOBALS['server'] ??= null; |
60 | 71 | $GLOBALS['message'] ??= null; |
61 | 72 | $GLOBALS['show_query'] ??= null; |
62 | 73 | $GLOBALS['errorUrl'] ??= null; |
63 | 74 |
|
64 | 75 | if ($request->isAjax() && ! empty($_REQUEST['access_time'])) { |
65 | | - return; |
| 76 | + return null; |
66 | 77 | } |
67 | 78 |
|
68 | 79 | $this->addScriptFiles(['home.js']); |
@@ -239,6 +250,8 @@ public function __invoke(ServerRequest $request): void |
239 | 250 | 'themes' => $this->themeManager->getThemesArray(), |
240 | 251 | 'errors' => $this->errors, |
241 | 252 | ]); |
| 253 | + |
| 254 | + return null; |
242 | 255 | } |
243 | 256 |
|
244 | 257 | private function checkRequirements(): void |
@@ -460,4 +473,29 @@ private function checkPhpExtensionsRequirements(): void |
460 | 473 | 'severity' => 'notice', |
461 | 474 | ]; |
462 | 475 | } |
| 476 | + |
| 477 | + /** @see https://docs.phpmyadmin.net/en/latest/faq.html#faq1-34 phpMyAdmin FAQ 1.34 */ |
| 478 | + private function shouldRedirectToDatabaseOrTablePage(ServerRequest $request): bool |
| 479 | + { |
| 480 | + return ! $request->isAjax() |
| 481 | + && $request->getMethod() === RequestMethodInterface::METHOD_GET |
| 482 | + && $request->hasQueryParam('db') |
| 483 | + && DatabaseName::tryFrom($request->getQueryParam('db')) !== null; |
| 484 | + } |
| 485 | + |
| 486 | + /** @see https://docs.phpmyadmin.net/en/latest/faq.html#faq1-34 phpMyAdmin FAQ 1.34 */ |
| 487 | + private function redirectToDatabaseOrTablePage(ServerRequest $request): Response |
| 488 | + { |
| 489 | + $db = DatabaseName::from($request->getQueryParam('db')); |
| 490 | + $table = TableName::tryFrom($request->getQueryParam('table')); |
| 491 | + $route = '/database/structure'; |
| 492 | + $params = ['db' => $db->getName()]; |
| 493 | + if ($table !== null) { |
| 494 | + $route = '/sql'; |
| 495 | + $params['table'] = $table->getName(); |
| 496 | + } |
| 497 | + |
| 498 | + return $this->responseFactory->createResponse(StatusCodeInterface::STATUS_FOUND) |
| 499 | + ->withHeader('Location', './index.php?route=' . $route . Url::getCommonRaw($params, '&')); |
| 500 | + } |
463 | 501 | } |
0 commit comments