diff options
author | Maurício Meneghini Fauth <mauricio@fauth.dev> | 2022-08-30 00:19:38 +0300 |
---|---|---|
committer | Maurício Meneghini Fauth <mauricio@fauth.dev> | 2022-08-30 00:19:38 +0300 |
commit | d3a267fdfc6aa4b113d0052c3340867776a75aab (patch) | |
tree | 45e01d9e7d8db47c8240feabc97d3a74a267e589 /libraries/classes | |
parent | 183f1930841d8daf6b47b6f799e54e21a9b3f755 (diff) |
Refactor DbiMysqli::connect to use Server value object
Signed-off-by: Maurício Meneghini Fauth <mauricio@fauth.dev>
Diffstat (limited to 'libraries/classes')
-rw-r--r-- | libraries/classes/Config/Settings/Server.php | 11 | ||||
-rw-r--r-- | libraries/classes/DatabaseInterface.php | 7 | ||||
-rw-r--r-- | libraries/classes/Dbal/DbiExtension.php | 16 | ||||
-rw-r--r-- | libraries/classes/Dbal/DbiMysqli.php | 68 |
4 files changed, 51 insertions, 51 deletions
diff --git a/libraries/classes/Config/Settings/Server.php b/libraries/classes/Config/Settings/Server.php index a38ed58f56..e1c1cd3057 100644 --- a/libraries/classes/Config/Settings/Server.php +++ b/libraries/classes/Config/Settings/Server.php @@ -576,6 +576,17 @@ final class Server } /** + * @return static + */ + public function withSSL(bool $ssl): Server + { + $clone = clone $this; + $clone->ssl = $ssl; + + return $clone; + } + + /** * @param array<int|string, mixed> $server */ private function setHost(array $server): string diff --git a/libraries/classes/DatabaseInterface.php b/libraries/classes/DatabaseInterface.php index df74bdbe13..dffa2d285a 100644 --- a/libraries/classes/DatabaseInterface.php +++ b/libraries/classes/DatabaseInterface.php @@ -7,6 +7,7 @@ declare(strict_types=1); namespace PhpMyAdmin; +use PhpMyAdmin\Config\Settings\Server; use PhpMyAdmin\ConfigStorage\Relation; use PhpMyAdmin\Database\DatabaseList; use PhpMyAdmin\Dbal\DatabaseName; @@ -1860,7 +1861,7 @@ class DatabaseInterface implements DbalInterface $target = $mode; } - if ($user === null || $password === null) { + if ($user === null || $password === null || ! is_array($server)) { trigger_error( __('Missing connection parameters!'), E_USER_WARNING @@ -1869,9 +1870,11 @@ class DatabaseInterface implements DbalInterface return false; } + $server['host'] = ! is_string($server['host']) || $server['host'] === '' ? 'localhost' : $server['host']; + // Do not show location and backtrace for connection errors $GLOBALS['errorHandler']->setHideLocation(true); - $result = $this->extension->connect($user, $password, $server); + $result = $this->extension->connect($user, $password, new Server($server)); $GLOBALS['errorHandler']->setHideLocation(false); if ($result) { diff --git a/libraries/classes/Dbal/DbiExtension.php b/libraries/classes/Dbal/DbiExtension.php index 1061d026ce..ebe8dd95fc 100644 --- a/libraries/classes/Dbal/DbiExtension.php +++ b/libraries/classes/Dbal/DbiExtension.php @@ -7,25 +7,19 @@ declare(strict_types=1); namespace PhpMyAdmin\Dbal; +use PhpMyAdmin\Config\Settings\Server; + /** * Contract for every database extension supported by phpMyAdmin */ interface DbiExtension { /** - * connects to the database server - * - * @param string $user user name - * @param string $password user password - * @param array $server host/port/socket/persistent + * Connects to the database server. * - * @return mixed false on error or a connection object on success + * @return object|bool A connection object on success or false on failure. */ - public function connect( - $user, - $password, - array $server - ); + public function connect(string $user, string $password, Server $server); /** * selects given database diff --git a/libraries/classes/Dbal/DbiMysqli.php b/libraries/classes/Dbal/DbiMysqli.php index 4cd02ba4dc..9a2769dc6c 100644 --- a/libraries/classes/Dbal/DbiMysqli.php +++ b/libraries/classes/Dbal/DbiMysqli.php @@ -10,6 +10,7 @@ namespace PhpMyAdmin\Dbal; use mysqli; use mysqli_sql_exception; use mysqli_stmt; +use PhpMyAdmin\Config\Settings\Server; use PhpMyAdmin\DatabaseInterface; use PhpMyAdmin\Query\Utilities; @@ -43,22 +44,12 @@ use const MYSQLI_USE_RESULT; class DbiMysqli implements DbiExtension { /** - * connects to the database server + * Connects to the database server. * - * @param string $user mysql user name - * @param string $password mysql user password - * @param array $server host/port/socket/persistent - * - * @return mysqli|bool false on error or a mysqli object on success + * @return object|bool A connection object on success or false on failure. */ - public function connect($user, $password, array $server) + public function connect(string $user, string $password, Server $server) { - if ($server) { - $server['host'] = empty($server['host']) - ? 'localhost' - : $server['host']; - } - mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $mysqli = mysqli_init(); @@ -70,44 +61,46 @@ class DbiMysqli implements DbiExtension $client_flags = 0; /* Optionally compress connection */ - if ($server['compress'] && defined('MYSQLI_CLIENT_COMPRESS')) { + if ($server->compress && defined('MYSQLI_CLIENT_COMPRESS')) { $client_flags |= MYSQLI_CLIENT_COMPRESS; } + // phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps /* Optionally enable SSL */ - if ($server['ssl']) { + if ($server->ssl) { $client_flags |= MYSQLI_CLIENT_SSL; if ( - ! empty($server['ssl_key']) || - ! empty($server['ssl_cert']) || - ! empty($server['ssl_ca']) || - ! empty($server['ssl_ca_path']) || - ! empty($server['ssl_ciphers']) + $server->ssl_key !== null && $server->ssl_key !== '' || + $server->ssl_cert !== null && $server->ssl_cert !== '' || + $server->ssl_ca !== null && $server->ssl_ca !== '' || + $server->ssl_ca_path !== null && $server->ssl_ca_path !== '' || + $server->ssl_ciphers !== null && $server->ssl_ciphers !== '' ) { $mysqli->ssl_set( - $server['ssl_key'] ?? '', - $server['ssl_cert'] ?? '', - $server['ssl_ca'] ?? '', - $server['ssl_ca_path'] ?? '', - $server['ssl_ciphers'] ?? '' + $server->ssl_key ?? '', + $server->ssl_cert ?? '', + $server->ssl_ca ?? '', + $server->ssl_ca_path ?? '', + $server->ssl_ciphers ?? '' ); } - /* + /** * disables SSL certificate validation on mysqlnd for MySQL 5.6 or later + * * @link https://bugs.php.net/bug.php?id=68344 * @link https://github.com/phpmyadmin/phpmyadmin/pull/11838 */ - if (! $server['ssl_verify']) { - $mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, (int) $server['ssl_verify']); + if (! $server->ssl_verify) { + $mysqli->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, (int) $server->ssl_verify); $client_flags |= MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT; } } if ($GLOBALS['cfg']['PersistentConnections']) { - $host = 'p:' . $server['host']; + $host = 'p:' . $server->host; } else { - $host = $server['host']; + $host = $server->host; } try { @@ -116,8 +109,8 @@ class DbiMysqli implements DbiExtension $user, $password, '', - $server['port'], - (string) $server['socket'], + (int) $server->port, + $server->socket, $client_flags ); } catch (mysqli_sql_exception $exception) { @@ -129,12 +122,10 @@ class DbiMysqli implements DbiExtension * - #2001 - SSL Connection is required. Please specify SSL options and retry. * - #9002 - SSL connection is required. Please specify SSL options and retry. */ - // phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps $error_number = $mysqli->connect_errno; $error_message = $mysqli->connect_error; - // phpcs:enable if ( - ! $server['ssl'] + ! $server->ssl && ($error_number == 3159 || (($error_number == 2001 || $error_number == 9002) && stripos($error_message, 'SSL Connection is required') !== false)) @@ -143,12 +134,11 @@ class DbiMysqli implements DbiExtension __('SSL connection enforced by server, automatically enabling it.'), E_USER_WARNING ); - $server['ssl'] = true; - return self::connect($user, $password, $server); + return self::connect($user, $password, $server->withSSL(true)); } - if ($error_number === 1045 && $server['hide_connection_errors']) { + if ($error_number === 1045 && $server->hide_connection_errors) { trigger_error( sprintf( __( @@ -169,6 +159,8 @@ class DbiMysqli implements DbiExtension return false; } + // phpcs:enable + $mysqli->options(MYSQLI_OPT_LOCAL_INFILE, (int) defined('PMA_ENABLE_LDI')); mysqli_report(MYSQLI_REPORT_OFF); |