diff --git a/adminer/drivers/mysql.inc.php b/adminer/drivers/mysql.inc.php index 8fa8e344..01ca386d 100644 --- a/adminer/drivers/mysql.inc.php +++ b/adminer/drivers/mysql.inc.php @@ -14,15 +14,21 @@ if (!defined("DRIVER")) { } function connect($server = "", $username = "", $password = "", $database = null, $port = null, $socket = null) { + global $adminer; mysqli_report(MYSQLI_REPORT_OFF); // stays between requests, not required since PHP 5.3.4 list($host, $port) = explode(":", $server, 2); // part after : is used for port or socket + $ssl = $adminer->connectSsl(); + if ($ssl) { + $this->ssl_set($ssl['key'], $ssl['cert'], $ssl['ca'], '', ''); + } $return = @$this->real_connect( ($server != "" ? $host : ini_get("mysqli.default_host")), ($server . $username != "" ? $username : ini_get("mysqli.default_user")), ($server . $username . $password != "" ? $password : ini_get("mysqli.default_pw")), $database, (is_numeric($port) ? $port : ini_get("mysqli.default_port")), - (!is_numeric($port) ? $port : $socket) + (!is_numeric($port) ? $port : $socket), + ($ssl ? 64 : 0) // 64 - MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT (not available before PHP 5.6.16) ); return $return; } @@ -223,7 +229,22 @@ if (!defined("DRIVER")) { var $extension = "PDO_MySQL"; function connect($server, $username, $password) { - $this->dsn("mysql:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\\d)~', ';port=\\1', $server)), $username, $password); + global $adminer; + $options = array(); + $ssl = $adminer->connectSsl(); + if ($ssl) { + $options = array( + PDO::MYSQL_ATTR_SSL_KEY => $ssl['key'], + PDO::MYSQL_ATTR_SSL_CERT => $ssl['cert'], + PDO::MYSQL_ATTR_SSL_CA => $ssl['ca'], + ); + } + $this->dsn( + "mysql:charset=utf8;host=" . str_replace(":", ";unix_socket=", preg_replace('~:(\\d)~', ';port=\\1', $server)), + $username, + $password, + $options + ); return true; } diff --git a/adminer/include/adminer.inc.php b/adminer/include/adminer.inc.php index 44dae5c9..78fc2a67 100644 --- a/adminer/include/adminer.inc.php +++ b/adminer/include/adminer.inc.php @@ -19,6 +19,12 @@ class Adminer { return array(SERVER, $_GET["username"], get_password()); } + /** Get SSL connection options + * @return array array("key" => filename, "cert" => filename, "ca" => filename) or null + */ + function connectSsl() { + } + /** Get key used for permanent login * @param bool * @return string cryptic string which gets combined with password or false in case of an error diff --git a/adminer/include/pdo.inc.php b/adminer/include/pdo.inc.php index 5aef6a5d..f5d2d34e 100644 --- a/adminer/include/pdo.inc.php +++ b/adminer/include/pdo.inc.php @@ -12,9 +12,9 @@ if (extension_loaded('pdo')) { } } - function dsn($dsn, $username, $password) { + function dsn($dsn, $username, $password, $options = array()) { try { - parent::__construct($dsn, $username, $password); + parent::__construct($dsn, $username, $password, $options); } catch (Exception $ex) { auth_error(h($ex->getMessage())); } diff --git a/changes.txt b/changes.txt index 87a03f32..626b3dd1 100644 --- a/changes.txt +++ b/changes.txt @@ -6,6 +6,7 @@ PostgreSQL: Cast to string when searching using LIKE (bug #325) PostgreSQL: Don't treat interval type as number (bug #474) PostgreSQL: Fix condition for selecting no rows PostgreSQL: Support TRUNCATE+INSERT export +Customization: Support connecting to MySQL via SSL Adminer 4.6.0 (released 2018-02-05): Fix counting selected rows after going back to select page diff --git a/editor/include/adminer.inc.php b/editor/include/adminer.inc.php index d6966788..e96c879a 100644 --- a/editor/include/adminer.inc.php +++ b/editor/include/adminer.inc.php @@ -13,6 +13,9 @@ class Adminer { return array(SERVER, $_GET["username"], get_password()); } + function connectSsl() { + } + function permanentLogin($create = false) { return password_file($create); } diff --git a/plugins/login-ssl.php b/plugins/login-ssl.php new file mode 100644 index 00000000..0114965f --- /dev/null +++ b/plugins/login-ssl.php @@ -0,0 +1,24 @@ + filename, "cert" => filename, "ca" => filename) + */ + function __construct($ssl) { + $this->ssl = $ssl; + } + + function connectSsl() { + return $this->ssl; + } + +} diff --git a/plugins/plugin.php b/plugins/plugin.php index fec581e3..de34a014 100644 --- a/plugins/plugin.php +++ b/plugins/plugin.php @@ -97,6 +97,11 @@ class AdminerPlugin extends Adminer { return $this->_applyPlugin(__FUNCTION__, $args); } + function connectSsl() { + $args = func_get_args(); + return $this->_applyPlugin(__FUNCTION__, $args); + } + function permanentLogin($create = false) { $args = func_get_args(); return $this->_applyPlugin(__FUNCTION__, $args);