From d55abcd5ffa1ea8785f1217f5b7d78a8a54b8542 Mon Sep 17 00:00:00 2001 From: Deven Bansod Date: Tue, 24 Nov 2015 14:15:32 +0530 Subject: [PATCH] Fix issue 11684 Signed-off-by: Deven Bansod --- libraries/server_privileges.lib.php | 88 ++++++++++--------- test/libraries/PMA_server_privileges_test.php | 1 + user_password.php | 45 +++++++--- 3 files changed, 84 insertions(+), 50 deletions(-) diff --git a/libraries/server_privileges.lib.php b/libraries/server_privileges.lib.php index a382bdf319..e5a1d0f74b 100644 --- a/libraries/server_privileges.lib.php +++ b/libraries/server_privileges.lib.php @@ -1949,18 +1949,25 @@ function PMA_updatePassword($err_url, $username, $hostname) if (empty($message)) { $hashing_function = 'PASSWORD'; $serverType = PMA_Util::getServerType(); + $authentication_plugin = + (isset($_REQUEST['authentication_plugin']) + ? $_REQUEST['authentication_plugin'] + : PMA_getCurrentAuthenticationPlugin( + 'change', + $username, + $hostname + )); + // Use 'ALTER USER ...' syntax for MySQL 5.7.6+ if ($serverType == 'MySQL' && PMA_MYSQL_INT_VERSION >= 50706 ) { - if (isset($_REQUEST['authentication_plugin']) - && $_REQUEST['authentication_plugin'] != 'mysql_old_password' - ) { + if ($authentication_plugin != 'mysql_old_password') { $query_prefix = "ALTER USER '" . PMA_Util::sqlAddSlashes($username) . "'@'" . PMA_Util::sqlAddSlashes($hostname) . "'" . " IDENTIFIED WITH " - . $_REQUEST['authentication_plugin'] + . $authentication_plugin . " BY '"; } else { $query_prefix = "ALTER USER '" @@ -1974,20 +1981,49 @@ function PMA_updatePassword($err_url, $username, $hostname) $local_query = $query_prefix . PMA_Util::sqlAddSlashes($_POST['pma_pw']) . "'"; - } else if (($serverType == 'MySQL' - && PMA_MYSQL_INT_VERSION >= 50507) - || ($serverType == 'MariaDB' - && PMA_MYSQL_INT_VERSION >= 50200) + } else if ($serverType == 'MariaDB' + && PMA_MYSQL_INT_VERSION >= 50200 && $is_superuser ) { + // Use 'UPDATE `mysql`.`user` ...' Syntax for MariaDB 5.2+ + if ($authentication_plugin == 'mysql_native_password') { + // Set the hashing method used by PASSWORD() + // to be 'mysql_native_password' type + $GLOBALS['dbi']->tryQuery('SET old_passwords = 0;'); + + } else if ($authentication_plugin == 'sha256_password') { + // Set the hashing method used by PASSWORD() + // to be 'sha256_password' type + $GLOBALS['dbi']->tryQuery('SET `old_passwords` = 2;'); + } + + $hashedPassword = PMA_getHashedPassword($_POST['pma_pw']); + + $sql_query = 'SET PASSWORD FOR \'' + . PMA_Util::sqlAddSlashes($username) + . '\'@\'' . PMA_Util::sqlAddSlashes($hostname) . '\' = ' + . (($_POST['pma_pw'] == '') + ? '\'\'' + : $hashing_function . '(\'' + . preg_replace('@.@s', '*', $_POST['pma_pw']) . '\')'); + + $local_query = "UPDATE `mysql`.`user` SET " + . " `authentication_string` = '" . $hashedPassword + . "', `Password` = '', " + . " `plugin` = '" . $authentication_plugin . "'" + . " WHERE `User` = '" . $username . "' AND Host = '" + . $hostname . "';"; + + $GLOBALS['dbi']->tryQuery("FLUSH PRIVILEGES;"); + } else { + // USE 'SET PASSWORD ...' syntax for rest of the versions // Backup the old value, to be reset later $row = $GLOBALS['dbi']->fetchSingleRow( 'SELECT @@old_passwords;' ); $orig_value = $row['@@old_passwords']; - $update_plugin_query = "UPDATE `mysql`.`user` SET" - . " `plugin` = '" . $_REQUEST['authentication_plugin'] . "'" + . " `plugin` = '" . $authentication_plugin . "'" . " WHERE `User` = '" . $username . "' AND Host = '" . $hostname . "';"; @@ -1998,24 +2034,16 @@ function PMA_updatePassword($err_url, $username, $hostname) $update_plugin_query, false, $err_url ); - $GLOBALS['dbi']->tryQuery("FLUSH PRIVILEGES;"); - - if (isset($_REQUEST['authentication_plugin']) - && $_REQUEST['authentication_plugin'] == 'mysql_native_password' - ) { + if ($authentication_plugin == 'mysql_native_password') { // Set the hashing method used by PASSWORD() // to be 'mysql_native_password' type $GLOBALS['dbi']->tryQuery('SET old_passwords = 0;'); - - } else if (isset($_REQUEST['authentication_plugin']) - && $_REQUEST['authentication_plugin'] == 'sha256_password' - ) { + } else if ($authentication_plugin == 'sha256_password') { // Set the hashing method used by PASSWORD() // to be 'sha256_password' type $GLOBALS['dbi']->tryQuery('SET `old_passwords` = 2;'); } - $sql_query = 'SET PASSWORD FOR \'' . PMA_Util::sqlAddSlashes($username) . '\'@\'' . PMA_Util::sqlAddSlashes($hostname) . '\' = ' @@ -2023,26 +2051,6 @@ function PMA_updatePassword($err_url, $username, $hostname) ? '\'\'' : $hashing_function . '(\'' . preg_replace('@.@s', '*', $_POST['pma_pw']) . '\')'); - - $local_query = 'SET PASSWORD FOR \'' - . PMA_Util::sqlAddSlashes($username) - . '\'@\'' . PMA_Util::sqlAddSlashes($hostname) . '\' = ' - . (($_POST['pma_pw'] == '') ? '\'\'' : $hashing_function - . '(\'' . PMA_Util::sqlAddSlashes($_POST['pma_pw']) . '\')'); - } else { - if (isset($_REQUEST['authentication_plugin']) - && $_REQUEST['authentication_plugin'] == 'mysql_native_password' - ) { - $GLOBALS['dbi']->tryQuery('SET `old_passwords` = 0;'); - } - $sql_query = 'SET PASSWORD FOR \'' - . PMA_Util::sqlAddSlashes($username) - . '\'@\'' . PMA_Util::sqlAddSlashes($hostname) . '\' = ' - . (($_POST['pma_pw'] == '') - ? '\'\'' - : $hashing_function . '(\'' - . preg_replace('@.@s', '*', $_POST['pma_pw']) . '\')'); - $local_query = 'SET PASSWORD FOR \'' . PMA_Util::sqlAddSlashes($username) . '\'@\'' . PMA_Util::sqlAddSlashes($hostname) . '\' = ' diff --git a/test/libraries/PMA_server_privileges_test.php b/test/libraries/PMA_server_privileges_test.php index 85dd189da1..5570d3a07f 100644 --- a/test/libraries/PMA_server_privileges_test.php +++ b/test/libraries/PMA_server_privileges_test.php @@ -714,6 +714,7 @@ class PMA_ServerPrivileges_Test extends PHPUnit_Framework_TestCase $hostname = 'pma_hostname'; $err_url = "error.php"; $_POST['pma_pw'] = 'pma_pw'; + $_REQUEST['authentication_plugin'] = 'mysql_native_password'; $message = PMA_updatePassword( $err_url, $username, $hostname diff --git a/user_password.php b/user_password.php index 2f95ea2cdf..1c64703659 100644 --- a/user_password.php +++ b/user_password.php @@ -156,7 +156,7 @@ function PMA_changePassword($password, $message, $change_password_message) ); } - if ($serverType === 'MySQL' + if ($serverType == 'MySQL' && PMA_MYSQL_INT_VERSION >= 50706 ) { $sql_query = 'ALTER USER \'' . $username . '\'@\'' . $hostname @@ -210,25 +210,50 @@ function PMA_changePassHashingFunction() /** * Generate the error url and submit the query * - * @param string $username Username - * @param string $hostname Hostname - * @param string $password Password - * @param string $sql_query SQL query - * @param string $hashing_function Hashing function - * @param string $auth_plugin Authentication Plugin + * @param string $username Username + * @param string $hostname Hostname + * @param string $password Password + * @param string $sql_query SQL query + * @param string $hashing_function Hashing function + * @param string $orig_auth_plugin Original Authentication Plugin * * @return void */ function PMA_changePassUrlParamsAndSubmitQuery( - $username, $hostname, $password, $sql_query, $hashing_function, $auth_plugin + $username, $hostname, $password, $sql_query, $hashing_function, $orig_auth_plugin ) { $err_url = 'user_password.php' . PMA_URL_getCommon(); - if (PMA_Util::getServerType() === 'MySQL' && PMA_MYSQL_INT_VERSION >= 50706) { + $serverType = PMA_Util::getServerType(); + + if ($serverType == 'MySQL' && PMA_MYSQL_INT_VERSION >= 50706) { $local_query = 'ALTER USER \'' . $username . '\'@\'' . $hostname . '\'' - . ' IDENTIFIED with ' . $auth_plugin . ' BY ' + . ' IDENTIFIED with ' . $orig_auth_plugin . ' BY ' . (($password == '') ? '\'\'' : '\'' . PMA_Util::sqlAddSlashes($password) . '\''); + } else if ($serverType == 'MariaDB' + && PMA_MYSQL_INT_VERSION >= 50200 + ) { + if ($orig_auth_plugin == 'mysql_native_password') { + // Set the hashing method used by PASSWORD() + // to be 'mysql_native_password' type + $GLOBALS['dbi']->tryQuery('SET old_passwords = 0;'); + } else if ($orig_auth_plugin == 'sha256_password') { + // Set the hashing method used by PASSWORD() + // to be 'sha256_password' type + $GLOBALS['dbi']->tryQuery('SET `old_passwords` = 2;'); + } + + $hashedPassword = PMA_getHashedPassword($_POST['pma_pw']); + + $local_query = "UPDATE `mysql`.`user` SET" + . " `authentication_string` = '" . $hashedPassword + . "', `Password` = '', " + . " `plugin` = '" . $orig_auth_plugin . "'" + . " WHERE `User` = '" . $username . "' AND Host = '" + . $hostname . "';"; + + $GLOBALS['dbi']->tryQuery("FLUSH PRIVILEGES;"); } else { $local_query = 'SET password = ' . (($password == '') ? '\'\''