diff --git a/libraries/classes/Config.php b/libraries/classes/Config.php index 2cf60cb60c..4e24502b38 100644 --- a/libraries/classes/Config.php +++ b/libraries/classes/Config.php @@ -838,6 +838,8 @@ class Config $this->settings = array_replace_recursive($this->settings, $cfg); + $this->checkServers(); + // Handling of the collation must be done after merging of $cfg // (from config.inc.php) so that $cfg['DefaultConnectionCollation'] // can have an effect. @@ -1800,6 +1802,103 @@ class Config return null; } + + /** + * Selects server based on request parameters. + * + * @return integer + */ + public function selectServer() { + $server = 0; + $request = empty($_REQUEST['server']) ? 0 : $_REQUEST['server']; + + /** + * Lookup server by name + * (see FAQ 4.8) + */ + if (! is_numeric($request)) { + foreach ($this->settings['Servers'] as $i => $server) { + $verboseToLower = mb_strtolower($server['verbose']); + $serverToLower = mb_strtolower($request); + if ($server['host'] == $request + || $server['verbose'] == $request + || $verboseToLower == $serverToLower + || md5($verboseToLower) === $serverToLower + ) { + $request = $i; + break; + } + } + if (is_string($request)) { + $request = 0; + } + } + + /** + * If no server is selected, make sure that $this->settings['Server'] is empty (so + * that nothing will work), and skip server authentication. + * We do NOT exit here, but continue on without logging into any server. + * This way, the welcome page will still come up (with no server info) and + * present a choice of servers in the case that there are multiple servers + * and '$this->settings['ServerDefault'] = 0' is set. + */ + + if (is_numeric($request) && ! empty($request) && ! empty($this->settings['Servers'][$request])) { + $server = $request; + $this->settings['Server'] = $this->settings['Servers'][$server]; + } else { + if (!empty($this->settings['Servers'][$this->settings['ServerDefault']])) { + $server = $this->settings['ServerDefault']; + $this->settings['Server'] = $this->settings['Servers'][$server]; + } else { + $server = 0; + $this->settings['Server'] = array(); + } + } + + return $server; + } + + /** + * Checks whether Servers configuration is valid and possibly apply fixups. + * + * @return void + */ + public function checkServers() { + // Do we have some server? + if (! isset($this->settings['Servers']) || count($this->settings['Servers']) == 0) { + // No server => create one with defaults + $this->settings['Servers'] = array(1 => $this->default_server); + } else { + // We have server(s) => apply default configuration + $new_servers = array(); + + foreach ($this->settings['Servers'] as $server_index => $each_server) { + + // Detect wrong configuration + if (!is_int($server_index) || $server_index < 1) { + trigger_error( + sprintf(__('Invalid server index: %s'), $server_index), + E_USER_ERROR + ); + } + + $each_server = array_merge($this->default_server, $each_server); + + // Final solution to bug #582890 + // If we are using a socket connection + // and there is nothing in the verbose server name + // or the host field, then generate a name for the server + // in the form of "Server 2", localized of course! + if (empty($each_server['host']) && empty($each_server['verbose'])) { + $each_server['verbose'] = sprintf(__('Server %d'), $server_index); + } + + $new_servers[$server_index] = $each_server; + } + $this->settings['Servers'] = $new_servers; + } + } } if (!defined('TESTSUITE')) { diff --git a/libraries/common.inc.php b/libraries/common.inc.php index 4b297cf06a..1b75f501c5 100644 --- a/libraries/common.inc.php +++ b/libraries/common.inc.php @@ -210,12 +210,6 @@ if (isset($_POST['usesubform']) && ! defined('PMA_MINIMUM_COMMON')) { */ $GLOBALS['PMA_Config'] = new Config(CONFIG_FILE); -/** - * BC - enable backward compatibility - * exports all configuration settings into $GLOBALS ($GLOBALS['cfg']) - */ -$GLOBALS['PMA_Config']->enableBc(); - /** * clean cookies on upgrade * when changing something related to PMA cookies, increment the cookie version @@ -451,107 +445,15 @@ Core::checkConfiguration(); * current server * @global integer $GLOBALS['server'] */ -$GLOBALS['server'] = 0; - -/** - * Servers array fixups. - * $default_server comes from PhpMyAdmin\Config::enableBc() - * @todo merge into PhpMyAdmin\Config - */ -// Do we have some server? -if (! isset($cfg['Servers']) || count($cfg['Servers']) == 0) { - // No server => create one with defaults - $cfg['Servers'] = array(1 => $default_server); -} else { - // We have server(s) => apply default configuration - $new_servers = array(); - - foreach ($cfg['Servers'] as $server_index => $each_server) { - - // Detect wrong configuration - if (!is_int($server_index) || $server_index < 1) { - trigger_error( - sprintf(__('Invalid server index: %s'), $server_index), - E_USER_ERROR - ); - } - - $each_server = array_merge($default_server, $each_server); - - // Final solution to bug #582890 - // If we are using a socket connection - // and there is nothing in the verbose server name - // or the host field, then generate a name for the server - // in the form of "Server 2", localized of course! - if (empty($each_server['host']) && empty($each_server['verbose'])) { - $each_server['verbose'] = sprintf(__('Server %d'), $server_index); - } - - $new_servers[$server_index] = $each_server; - } - $cfg['Servers'] = $new_servers; - unset($new_servers, $server_index, $each_server); -} - -// Cleanup -unset($default_server); - - -if (! defined('PMA_MINIMUM_COMMON')) { - /** - * Lookup server by name - * (see FAQ 4.8) - */ - if (! empty($_REQUEST['server']) - && is_string($_REQUEST['server']) - && ! is_numeric($_REQUEST['server']) - ) { - foreach ($cfg['Servers'] as $i => $server) { - $verboseToLower = mb_strtolower($server['verbose']); - $serverToLower = mb_strtolower($_REQUEST['server']); - if ($server['host'] == $_REQUEST['server'] - || $server['verbose'] == $_REQUEST['server'] - || $verboseToLower == $serverToLower - || md5($verboseToLower) === $serverToLower - ) { - $_REQUEST['server'] = $i; - break; - } - } - if (is_string($_REQUEST['server'])) { - unset($_REQUEST['server']); - } - unset($i); - } -} - -/** - * If no server is selected, make sure that $cfg['Server'] is empty (so - * that nothing will work), and skip server authentication. - * We do NOT exit here, but continue on without logging into any server. - * This way, the welcome page will still come up (with no server info) and - * present a choice of servers in the case that there are multiple servers - * and '$cfg['ServerDefault'] = 0' is set. - */ - -if (isset($_REQUEST['server']) - && (is_string($_REQUEST['server']) || is_numeric($_REQUEST['server'])) - && ! empty($_REQUEST['server']) - && ! empty($cfg['Servers'][$_REQUEST['server']]) -) { - $GLOBALS['server'] = $_REQUEST['server']; - $cfg['Server'] = $cfg['Servers'][$GLOBALS['server']]; -} else { - if (!empty($cfg['Servers'][$cfg['ServerDefault']])) { - $GLOBALS['server'] = $cfg['ServerDefault']; - $cfg['Server'] = $cfg['Servers'][$GLOBALS['server']]; - } else { - $GLOBALS['server'] = 0; - $cfg['Server'] = array(); - } -} +$GLOBALS['server'] = $GLOBALS['PMA_Config']->selectServer(); $GLOBALS['url_params']['server'] = $GLOBALS['server']; +/** + * BC - enable backward compatibility + * exports all configuration settings into $GLOBALS ($GLOBALS['cfg']) + */ +$GLOBALS['PMA_Config']->enableBc(); + /******************************************************************************/ /* setup themes LABEL_theme_setup */ diff --git a/test/classes/ConfigTest.php b/test/classes/ConfigTest.php index ca4cce4cde..39cd267b7b 100644 --- a/test/classes/ConfigTest.php +++ b/test/classes/ConfigTest.php @@ -930,4 +930,117 @@ class ConfigTest extends PmaTestCase $this->object->isGitRevision() ); } + + /** + * Test for checkServers + * + * @return void + * + * @dataProvider serverSettingsProvider + */ + public function testCheckServers($settings, $expected, $error = false) + { + if ($error) { + $this->setExpectedException('PHPUnit_Framework_Error'); + } + + $this->object->settings['Servers'] = $settings; + $this->object->checkServers(); + if (is_null($expected)) { + $expected = $this->object->default_server; + } else { + $expected = array_merge($this->object->default_server, $expected); + } + $this->assertEquals($expected, $this->object->settings['Servers'][1]); + } + + /** + * Data provider for checkServers test + * + * @return array + */ + public function serverSettingsProvider() + { + return [ + 'empty' => [ + [], + [], + ], + 'only_host' => [ + [1 => ['host' => '127.0.0.1']], + ['host' => '127.0.0.1'], + ], + 'empty_host' => [ + [1 => ['host' => '']], + ['verbose' => 'Server 1', 'host' => ''], + ], + 'invalid' => [ + ['invalid' => ['host' => '127.0.0.1']], + ['host' => '127.0.0.1'], + true + ], + ]; + } + + /** + * Test for selectServer + * + * @return void + * + * @dataProvider selectServerProvider + * @depends testCheckServers + */ + public function testSelectServer($settings, $request, $expected) + { + $this->object->settings['Servers'] = $settings; + $this->object->checkServers(); + $_REQUEST['server'] = $request; + $this->assertEquals($expected, $this->object->selectServer()); + } + + /** + * Data provider for selectServer test + * + * @return array + */ + public function selectServerProvider() + { + return [ + 'zero' => [ + [], + '0', + 1, + ], + 'number' => [ + [1 => []], + '1', + 1, + ], + 'host' => [ + [2 => ['host' => '127.0.0.1']], + '127.0.0.1', + 2, + ], + 'verbose' => [ + [1 => ['verbose' => 'Server 1', 'host' => '']], + 'Server 1', + 1 + ], + 'md5' => [ + [66 => ['verbose' => 'Server 1', 'host' => '']], + '753f173bd4ac8a45eae0fe9a4fbe0fc0', + 66 + ], + 'nonexisting_string' => [ + [1 => []], + 'invalid', + 1, + ], + 'nonexisting' => [ + [1 => []], + '100', + 1, + ], + ]; + } }