Skip to content

Commit 5021f36

Browse files
Merge pull request #18375 from MauricioFauth/config-current-server
Add the `Config::getCurrentServer()` method
2 parents 5b63d84 + 250a32b commit 5021f36

14 files changed

Lines changed: 82 additions & 124 deletions

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 & 41 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;
@@ -86,17 +87,15 @@ class Config
8687

8788
public bool $errorConfigFile = false;
8889

89-
/** @var mixed[] */
90-
public array $defaultServer;
91-
9290
private bool $isHttps = false;
9391

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

9696
public function __construct()
9797
{
9898
$this->config = new Settings([]);
99-
$this->defaultServer = $this->config->Servers[1]->asArray();
10099
$config = $this->config->asArray();
101100
$this->default = $config;
102101
$this->settings = $config;
@@ -1063,34 +1062,27 @@ public function getUploadTempDir(): string|null
10631062
return null;
10641063
}
10651064

1066-
/**
1067-
* Selects server based on request parameters.
1068-
*/
1069-
public function selectServer(): int
1065+
/** @return int<0, max> */
1066+
public function selectServer(mixed $serverParamFromRequest): int
10701067
{
1071-
$request = empty($_REQUEST['server']) ? 0 : $_REQUEST['server'];
1072-
1073-
/**
1074-
* Lookup server by name
1075-
* (see FAQ 4.8)
1076-
*/
1077-
if (! is_numeric($request)) {
1078-
foreach ($this->settings['Servers'] as $i => $server) {
1079-
$verboseToLower = mb_strtolower($server['verbose']);
1080-
$serverToLower = mb_strtolower($request);
1081-
if (
1082-
$server['host'] == $request
1083-
|| $server['verbose'] == $request
1084-
|| $verboseToLower === $serverToLower
1085-
|| md5($verboseToLower) === $serverToLower
1086-
) {
1087-
$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;
10881077
break;
10891078
}
1090-
}
10911079

1092-
if (is_string($request)) {
1093-
$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+
}
10941086
}
10951087
}
10961088

@@ -1102,21 +1094,19 @@ public function selectServer(): int
11021094
* present a choice of servers in the case that there are multiple servers
11031095
* and '$this->settings['ServerDefault'] = 0' is set.
11041096
*/
1105-
1106-
if (is_numeric($request) && ! empty($request) && ! empty($this->settings['Servers'][$request])) {
1107-
$server = $request;
1108-
$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();
11091102
} else {
1110-
if (! empty($this->settings['Servers'][$this->settings['ServerDefault']])) {
1111-
$server = $this->settings['ServerDefault'];
1112-
$this->settings['Server'] = $this->settings['Servers'][$server];
1113-
} else {
1114-
$server = 0;
1115-
$this->settings['Server'] = [];
1116-
}
1103+
$serverNumber = 0;
1104+
$this->settings['Server'] = [];
11171105
}
11181106

1119-
return (int) $server;
1107+
$this->server = $serverNumber;
1108+
1109+
return $this->server;
11201110
}
11211111

11221112
/**
@@ -1252,4 +1242,9 @@ public function getSettings(): Settings
12521242
{
12531243
return $this->config;
12541244
}
1245+
1246+
public function getCurrentServer(): Server|null
1247+
{
1248+
return $this->config->Servers[$this->server] ?? null;
1249+
}
12551250
}

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 & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,6 @@ public function testConstructor(): void
377377
$config = $settings->asArray();
378378
$this->assertIsArray($config['Servers']);
379379
$this->assertEquals($settings, $object->getSettings());
380-
$this->assertSame($config['Servers'][1], $object->defaultServer);
381380
$this->assertEquals($config, $object->default);
382381
$this->assertSame($config, $object->settings);
383382
$this->assertSame($config, $object->baseSettings);
@@ -720,24 +719,29 @@ public function testGetUploadTempDir(): void
720719
/**
721720
* Test for selectServer
722721
*
723-
* @param mixed[] $settings settings array
724-
* @param string $request request
725-
* @param int $expected expected result
722+
* @param mixed[] $settings settings array
723+
* @param string|mixed[] $request request
724+
* @param int $expected expected result
726725
*
727726
* @dataProvider selectServerProvider
728727
*/
729-
public function testSelectServer(array $settings, string $request, int $expected): void
728+
public function testSelectServer(array $settings, string|array $request, int $expected): void
730729
{
731-
$object = new Config();
732-
$object->settings = (new Settings(['Servers' => $settings]))->asArray();
733-
$_REQUEST['server'] = $request;
734-
$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);
735739
}
736740

737741
/**
738742
* Data provider for selectServer test
739743
*
740-
* @return array<string, array{mixed[], string, int}>
744+
* @return array<string, array{mixed[], string|mixed[], int}>
741745
*/
742746
public static function selectServerProvider(): array
743747
{
@@ -749,6 +753,10 @@ public static function selectServerProvider(): array
749753
'md5' => [[66 => ['verbose' => 'Server 66', 'host' => '']], md5('server 66'), 66],
750754
'nonexisting_string' => [[1 => []], 'invalid', 1],
751755
'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],
752760
];
753761
}
754762

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(

0 commit comments

Comments
 (0)