Skip to content

Commit 250a32b

Browse files
committed
Add the Config::getCurrentServer() method
The Config::getCurrentServer() method returns the current server configuration. It's an VO that is equivalent to $GLOBALS['cfg']['Server'] setting. Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
1 parent aa119f7 commit 250a32b

7 files changed

Lines changed: 75 additions & 112 deletions

File tree

libraries/classes/Common.php

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace PhpMyAdmin;
66

77
use PhpMyAdmin\Config\ConfigFile;
8+
use PhpMyAdmin\Config\Settings\Server;
89
use PhpMyAdmin\ConfigStorage\Relation;
910
use PhpMyAdmin\Dbal\Connection;
1011
use PhpMyAdmin\Dbal\DatabaseName;
@@ -185,7 +186,7 @@ public static function run(bool $isSetupPage = false): void
185186
return;
186187
}
187188

188-
self::setCurrentServerGlobal($container, $config);
189+
self::setCurrentServerGlobal($container, $config, $request->getParam('server'));
189190

190191
$GLOBALS['cfg'] = $config->settings;
191192
$settings = $config->getSettings();
@@ -228,7 +229,8 @@ public static function run(bool $isSetupPage = false): void
228229
$container->set(DatabaseInterface::class, $GLOBALS['dbi']);
229230
$container->setAlias('dbi', DatabaseInterface::class);
230231

231-
if (! empty($GLOBALS['cfg']['Server'])) {
232+
$currentServer = $config->getCurrentServer();
233+
if ($currentServer !== null) {
232234
$config->getLoginCookieValidityFromCache($GLOBALS['server']);
233235

234236
/** @var AuthenticationPluginFactory $authPluginFactory */
@@ -251,12 +253,12 @@ public static function run(bool $isSetupPage = false): void
251253
// phpcs:enable
252254
}
253255

254-
self::connectToDatabaseServer($GLOBALS['dbi'], $authPlugin);
256+
self::connectToDatabaseServer($GLOBALS['dbi'], $authPlugin, $currentServer);
255257
$authPlugin->rememberCredentials();
256258
$authPlugin->checkTwoFactor();
257259

258260
/* Log success */
259-
Logging::logUser($config, $GLOBALS['cfg']['Server']['user']);
261+
Logging::logUser($config, $currentServer->user);
260262

261263
if ($GLOBALS['dbi']->getVersion() < $settings->mysqlMinVersion['internal']) {
262264
echo self::getGenericError(sprintf(
@@ -549,14 +551,17 @@ private static function checkRequest(): void
549551
throw new RuntimeException(__('possible exploit'));
550552
}
551553

552-
private static function connectToDatabaseServer(DatabaseInterface $dbi, AuthenticationPlugin $auth): void
553-
{
554+
private static function connectToDatabaseServer(
555+
DatabaseInterface $dbi,
556+
AuthenticationPlugin $auth,
557+
Server $currentServer,
558+
): void {
554559
/**
555560
* Try to connect MySQL with the control user profile (will be used to get the privileges list for the current
556-
* user but the true user link must be open after this one so it would be default one for all the scripts).
561+
* user but the true user link must be open after this one, so it would be default one for all the scripts).
557562
*/
558563
$controlConnection = null;
559-
if ($GLOBALS['cfg']['Server']['controluser'] !== '') {
564+
if ($currentServer->controluser !== '') {
560565
$controlConnection = $dbi->connect(Connection::TYPE_CONTROL);
561566
}
562567

@@ -631,9 +636,12 @@ private static function setSQLQueryGlobalFromRequest(ContainerInterface $contain
631636
$container->setParameter('sql_query', $sqlQuery);
632637
}
633638

634-
private static function setCurrentServerGlobal(ContainerInterface $container, Config $config): void
635-
{
636-
$server = $config->selectServer();
639+
private static function setCurrentServerGlobal(
640+
ContainerInterface $container,
641+
Config $config,
642+
mixed $serverParamFromRequest,
643+
): void {
644+
$server = $config->selectServer($serverParamFromRequest);
637645
$GLOBALS['server'] = $server;
638646
$GLOBALS['urlParams']['server'] = $server;
639647
$container->setParameter('server', $server);

libraries/classes/Config.php

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace PhpMyAdmin;
66

77
use PhpMyAdmin\Config\Settings;
8+
use PhpMyAdmin\Config\Settings\Server;
89
use PhpMyAdmin\Dbal\Connection;
910
use PhpMyAdmin\Exceptions\ConfigException;
1011
use PhpMyAdmin\Theme\ThemeManager;
@@ -88,7 +89,9 @@ class Config
8889

8990
private bool $isHttps = false;
9091

91-
private Settings $config;
92+
public Settings $config;
93+
/** @var int<0, max> */
94+
public int $server = 0;
9295

9396
public function __construct()
9497
{
@@ -1059,34 +1062,27 @@ public function getUploadTempDir(): string|null
10591062
return null;
10601063
}
10611064

1062-
/**
1063-
* Selects server based on request parameters.
1064-
*/
1065-
public function selectServer(): int
1065+
/** @return int<0, max> */
1066+
public function selectServer(mixed $serverParamFromRequest): int
10661067
{
1067-
$request = empty($_REQUEST['server']) ? 0 : $_REQUEST['server'];
1068-
1069-
/**
1070-
* Lookup server by name
1071-
* (see FAQ 4.8)
1072-
*/
1073-
if (! is_numeric($request)) {
1074-
foreach ($this->settings['Servers'] as $i => $server) {
1075-
$verboseToLower = mb_strtolower($server['verbose']);
1076-
$serverToLower = mb_strtolower($request);
1077-
if (
1078-
$server['host'] == $request
1079-
|| $server['verbose'] == $request
1080-
|| $verboseToLower === $serverToLower
1081-
|| md5($verboseToLower) === $serverToLower
1082-
) {
1083-
$request = $i;
1068+
$serverNumber = 0;
1069+
if (is_numeric($serverParamFromRequest)) {
1070+
$serverNumber = (int) $serverParamFromRequest;
1071+
$serverNumber = $serverNumber >= 1 ? $serverNumber : 0;
1072+
} elseif (is_string($serverParamFromRequest) && $serverParamFromRequest !== '') {
1073+
/** Lookup server by name (see FAQ 4.8) */
1074+
foreach ($this->config->Servers as $i => $server) {
1075+
if ($server->host === $serverParamFromRequest || $server->verbose === $serverParamFromRequest) {
1076+
$serverNumber = $i;
10841077
break;
10851078
}
1086-
}
10871079

1088-
if (is_string($request)) {
1089-
$request = 0;
1080+
$verboseToLower = mb_strtolower($server->verbose);
1081+
$serverToLower = mb_strtolower($serverParamFromRequest);
1082+
if ($verboseToLower === $serverToLower || md5($verboseToLower) === $serverToLower) {
1083+
$serverNumber = $i;
1084+
break;
1085+
}
10901086
}
10911087
}
10921088

@@ -1098,21 +1094,19 @@ public function selectServer(): int
10981094
* present a choice of servers in the case that there are multiple servers
10991095
* and '$this->settings['ServerDefault'] = 0' is set.
11001096
*/
1101-
1102-
if (is_numeric($request) && ! empty($request) && ! empty($this->settings['Servers'][$request])) {
1103-
$server = $request;
1104-
$this->settings['Server'] = $this->settings['Servers'][$server];
1097+
if (isset($this->config->Servers[$serverNumber])) {
1098+
$this->settings['Server'] = $this->config->Servers[$serverNumber]->asArray();
1099+
} elseif (isset($this->config->Servers[$this->config->ServerDefault])) {
1100+
$serverNumber = $this->config->ServerDefault;
1101+
$this->settings['Server'] = $this->config->Servers[$this->config->ServerDefault]->asArray();
11051102
} else {
1106-
if (! empty($this->settings['Servers'][$this->settings['ServerDefault']])) {
1107-
$server = $this->settings['ServerDefault'];
1108-
$this->settings['Server'] = $this->settings['Servers'][$server];
1109-
} else {
1110-
$server = 0;
1111-
$this->settings['Server'] = [];
1112-
}
1103+
$serverNumber = 0;
1104+
$this->settings['Server'] = [];
11131105
}
11141106

1115-
return (int) $server;
1107+
$this->server = $serverNumber;
1108+
1109+
return $this->server;
11161110
}
11171111

11181112
/**
@@ -1248,4 +1242,9 @@ public function getSettings(): Settings
12481242
{
12491243
return $this->config;
12501244
}
1245+
1246+
public function getCurrentServer(): Server|null
1247+
{
1248+
return $this->config->Servers[$this->server] ?? null;
1249+
}
12511250
}

phpstan-baseline.neon

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -160,31 +160,6 @@ parameters:
160160
count: 1
161161
path: libraries/classes/Common.php
162162

163-
-
164-
message: "#^Argument of an invalid type mixed supplied for foreach, only iterables are supported\\.$#"
165-
count: 1
166-
path: libraries/classes/Config.php
167-
168-
-
169-
message: "#^Cannot access offset 'host' on mixed\\.$#"
170-
count: 1
171-
path: libraries/classes/Config.php
172-
173-
-
174-
message: "#^Cannot access offset 'verbose' on mixed\\.$#"
175-
count: 2
176-
path: libraries/classes/Config.php
177-
178-
-
179-
message: "#^Cannot access offset float\\|int\\<min, \\-1\\>\\|int\\<1, max\\>\\|\\(non\\-falsy\\-string&numeric\\-string\\) on mixed\\.$#"
180-
count: 2
181-
path: libraries/classes/Config.php
182-
183-
-
184-
message: "#^Cannot access offset mixed on mixed\\.$#"
185-
count: 2
186-
path: libraries/classes/Config.php
187-
188163
-
189164
message: "#^Cannot cast mixed to string\\.$#"
190165
count: 2
@@ -200,11 +175,6 @@ parameters:
200175
count: 1
201176
path: libraries/classes/Config.php
202177

203-
-
204-
message: "#^Parameter \\#1 \\$string of function mb_strtolower expects string, mixed given\\.$#"
205-
count: 1
206-
path: libraries/classes/Config.php
207-
208178
-
209179
message: "#^Parameter \\#1 \\$string of function rtrim expects string, mixed given\\.$#"
210180
count: 1

psalm-baseline.xml

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -212,17 +212,12 @@
212212
<file src="libraries/classes/Common.php">
213213
<InvalidArrayOffset>
214214
<code><![CDATA[$GLOBALS['back']]]></code>
215-
<code><![CDATA[$GLOBALS['cfg']['Server']['controluser']]]></code>
216215
<code><![CDATA[$GLOBALS['theme']]]></code>
217216
</InvalidArrayOffset>
218217
<MixedArgument>
219-
<code><![CDATA[$GLOBALS['cfg']['Server']['user']]]></code>
220218
<code><![CDATA[$_SESSION[' PMA_token ']]]></code>
221219
<code>$sqlDelimiter</code>
222220
</MixedArgument>
223-
<MixedArrayAccess>
224-
<code><![CDATA[$GLOBALS['cfg']['Server']['user']]]></code>
225-
</MixedArrayAccess>
226221
<MixedAssignment>
227222
<code><![CDATA[$GLOBALS['back']]]></code>
228223
<code><![CDATA[$GLOBALS['theme']]]></code>
@@ -260,7 +255,6 @@
260255
<code>$defaultValue</code>
261256
<code><![CDATA[$gdInfo['GD Version']]]></code>
262257
<code>$path</code>
263-
<code><![CDATA[$server['verbose']]]></code>
264258
<code><![CDATA[$this->settings['ThemeDefault']]]></code>
265259
<code><![CDATA[$this->settings['ThemeDefault']]]></code>
266260
<code>$url</code>
@@ -272,11 +266,6 @@
272266
<code><![CDATA[$_SESSION['cache'][$cacheKey]['userprefs_mtime']]]></code>
273267
<code><![CDATA[$_SESSION['cache'][$cacheKey]['userprefs_type']]]></code>
274268
<code><![CDATA[$configData['lang']]]></code>
275-
<code><![CDATA[$server['host']]]></code>
276-
<code><![CDATA[$server['verbose']]]></code>
277-
<code><![CDATA[$server['verbose']]]></code>
278-
<code><![CDATA[$this->settings['Servers'][$server]]]></code>
279-
<code><![CDATA[$this->settings['Servers'][$server]]]></code>
280269
</MixedArrayAccess>
281270
<MixedArrayAssignment>
282271
<code><![CDATA[$_SESSION['cache'][$cacheKey]]]></code>
@@ -289,26 +278,18 @@
289278
<code><![CDATA[$_SESSION['cache'][$cacheKey]['userprefs_type']]]></code>
290279
<code>$tempDir[$name]</code>
291280
</MixedArrayAssignment>
292-
<MixedArrayOffset>
293-
<code><![CDATA[$this->settings['Servers'][$server]]]></code>
294-
<code><![CDATA[$this->settings['Servers'][$this->settings['ServerDefault']]]]></code>
295-
</MixedArrayOffset>
296281
<MixedAssignment>
297282
<code><![CDATA[$GLOBALS['cfg']['LoginCookieValidity']]]></code>
298283
<code>$collationConnection</code>
299284
<code>$configData</code>
300285
<code>$defaultValue</code>
301286
<code>$defaultValue</code>
302287
<code>$evalResult</code>
303-
<code>$i</code>
304288
<code>$password</code>
305289
<code>$password</code>
306290
<code>$path</code>
307291
<code>$prefsType</code>
308292
<code>$prefsType</code>
309-
<code>$request</code>
310-
<code>$server</code>
311-
<code>$server</code>
312293
<code>$server[$item]</code>
313294
<code><![CDATA[$server['hide_connection_errors']]]></code>
314295
<code><![CDATA[$server['host']]]></code>
@@ -331,14 +312,10 @@
331312
</MixedReturnStatement>
332313
<PossiblyInvalidArgument>
333314
<code>$defaultValue</code>
334-
<code>$request</code>
335315
</PossiblyInvalidArgument>
336316
<PossiblyInvalidArrayOffset>
337317
<code><![CDATA[$_COOKIE[$this->getCookieName($cookieName)]]]></code>
338318
</PossiblyInvalidArrayOffset>
339-
<PossiblyInvalidCast>
340-
<code>$request</code>
341-
</PossiblyInvalidCast>
342319
<RiskyCast>
343320
<code><![CDATA[$server['port']]]></code>
344321
</RiskyCast>

test/classes/ConfigTest.php

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -719,24 +719,29 @@ public function testGetUploadTempDir(): void
719719
/**
720720
* Test for selectServer
721721
*
722-
* @param mixed[] $settings settings array
723-
* @param string $request request
724-
* @param int $expected expected result
722+
* @param mixed[] $settings settings array
723+
* @param string|mixed[] $request request
724+
* @param int $expected expected result
725725
*
726726
* @dataProvider selectServerProvider
727727
*/
728-
public function testSelectServer(array $settings, string $request, int $expected): void
728+
public function testSelectServer(array $settings, string|array $request, int $expected): void
729729
{
730-
$object = new Config();
731-
$object->settings = (new Settings(['Servers' => $settings]))->asArray();
732-
$_REQUEST['server'] = $request;
733-
$this->assertEquals($expected, $object->selectServer());
730+
$config = new Config();
731+
$config->config = new Settings(['Servers' => $settings, 'ServerDefault' => 1]);
732+
$selectedServer = $config->selectServer($request);
733+
$this->assertSame($expected, $selectedServer);
734+
$this->assertGreaterThanOrEqual(0, $selectedServer);
735+
$expectedServer = $expected >= 1 ? $config->config->Servers[$expected]->asArray() : [];
736+
$this->assertArrayHasKey('Server', $config->settings);
737+
$this->assertSame($config->settings['Server'], $expectedServer);
738+
$this->assertSame($expected, $config->server);
734739
}
735740

736741
/**
737742
* Data provider for selectServer test
738743
*
739-
* @return array<string, array{mixed[], string, int}>
744+
* @return array<string, array{mixed[], string|mixed[], int}>
740745
*/
741746
public static function selectServerProvider(): array
742747
{
@@ -748,6 +753,10 @@ public static function selectServerProvider(): array
748753
'md5' => [[66 => ['verbose' => 'Server 66', 'host' => '']], md5('server 66'), 66],
749754
'nonexisting_string' => [[1 => []], 'invalid', 1],
750755
'nonexisting' => [[1 => []], '100', 1],
756+
'none selected' => [[2 => []], '100', 0],
757+
'none selected with string' => [[2 => []], 'unknown', 0],
758+
'negative number' => [[1 => []], '-1', 1],
759+
'array' => [[1 => []], ['1'], 1],
751760
];
752761
}
753762

test/classes/Controllers/Export/ExportControllerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public function testExportController(): void
4949
$GLOBALS['lang'] = 'en';
5050
$GLOBALS['sql_indexes'] = null;
5151
$GLOBALS['sql_auto_increments'] = null;
52-
$GLOBALS['config']->selectServer();
52+
$GLOBALS['config']->selectServer('1');
5353
$GLOBALS['cfg'] = $GLOBALS['config']->settings;
5454

5555
$this->dummyDbi->addResult(

test/classes/Controllers/Table/OperationsControllerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function testOperationsController(): void
3838
$GLOBALS['db'] = 'test_db';
3939
$GLOBALS['table'] = 'test_table';
4040

41-
$GLOBALS['config']->selectServer();
41+
$GLOBALS['config']->selectServer('1');
4242
$GLOBALS['cfg'] = $GLOBALS['config']->settings;
4343
$GLOBALS['cfg']['MaxDbList'] = 0;
4444

0 commit comments

Comments
 (0)