Merge remote-tracking branch 'origin/master'

This commit is contained in:
Weblate 2017-10-03 20:16:38 +02:00
commit 583e287b21
3 changed files with 219 additions and 105 deletions

View File

@ -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')) {

View File

@ -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 */

View File

@ -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,
],
];
}
}