diff --git a/libraries/check_user_privileges.lib.php b/libraries/check_user_privileges.lib.php index af899b715a..ba2d3a387f 100644 --- a/libraries/check_user_privileges.lib.php +++ b/libraries/check_user_privileges.lib.php @@ -14,6 +14,40 @@ if (! defined('PHPMYADMIN')) { */ $GLOBALS['is_superuser'] = $GLOBALS['dbi']->isSuperuser(); + +function PMA_getItemsFromShowGrantsRow($row) +{ + $db_name_offset = mb_strpos($row, ' ON ') + 4; + $show_grants_dbname = mb_substr( + $row, $db_name_offset, + mb_strpos($row, '.', $db_name_offset) - $db_name_offset + ); + + $show_grants_dbname = PMA\libraries\Util::unQuote($show_grants_dbname, '`'); + + $show_grants_str = mb_substr( + $row, + 6, + (mb_strpos($row, ' ON ') - 6) + ); + + // extrac table from GRANT sytax + $tblname_start_offset = mb_strpos($row, '.') + 1; + $tblname_end_offset = mb_strpos($row, ' TO '); + + $show_grants_tblname = mb_substr( + $row, $tblname_start_offset, + $tblname_end_offset - $tblname_start_offset + ); + $show_grants_tblname = PMA\libraries\Util::unQuote($show_grants_tblname, '`'); + + return array( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ); +} + /** * Check if user has required privileges for * performing 'Adjust privileges' operations @@ -35,7 +69,7 @@ function PMA_checkRequiredPrivilegesForAdjust( if ($show_grants_str == 'ALL' || $show_grants_str == 'ALL PRIVILEGES' || (mb_strpos( - $show_grants_str, "SELECT, INSERT, UPDATE, DELETE" + $show_grants_str, 'SELECT, INSERT, UPDATE, DELETE' ) !== false) ) { if ($show_grants_dbname == '*' @@ -57,19 +91,19 @@ function PMA_checkRequiredPrivilegesForAdjust( // Ex. '... ALL PRIVILEGES on `mysql`.`columns_priv` .. ' if ($show_grants_dbname == 'mysql') { switch ($show_grants_tblname) { - case 'columns_priv': + case "columns_priv": $GLOBALS['col_priv'] = true; break; - case 'db': + case "db": $GLOBALS['db_priv'] = true; break; - case 'procs_priv': + case "procs_priv": $GLOBALS['proc_priv'] = true; break; - case 'tables_priv': + case "tables_priv": $GLOBALS['table_priv'] = true; break; - case '*': + case "*": $GLOBALS['col_priv'] = true; $GLOBALS['db_priv'] = true; $GLOBALS['proc_priv'] = true; @@ -155,29 +189,11 @@ function PMA_analyseShowGrant() $re1 = '(^|[^\\\\])(\\\)+'; // escaped wildcards while ($row = $GLOBALS['dbi']->fetchRow($rs_usr)) { - // extract db from GRANT ... ON *.* or GRANT ... ON db.* - $db_name_offset = mb_strpos($row[0], ' ON ') + 4; - $show_grants_dbname = mb_substr( - $row[0], $db_name_offset, - mb_strpos($row[0], '.', $db_name_offset) - $db_name_offset - ); - $show_grants_dbname = PMA\libraries\Util::unQuote($show_grants_dbname, '`'); - - $show_grants_str = mb_substr( - $row[0], - 6, - (mb_strpos($row[0], ' ON ') - 6) - ); - - // extrac table from GRANT sytax - $tblname_start_offset = /*overload*/mb_strpos($row[0], '.') + 1; - $tblname_end_offset = /*overload*/mb_strpos($row[0], ' TO '); - - $show_grants_tblname = /*overload*/mb_substr( - $row[0], $tblname_start_offset, - $tblname_end_offset - $tblname_start_offset - ); - $show_grants_tblname = PMA\libraries\Util::unQuote($show_grants_tblname, '`'); + list( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ) = PMA_getItemsFromShowGrantsRow($row[0]); if ($show_grants_dbname == '*') { if ($show_grants_str != 'USAGE') { @@ -188,12 +204,11 @@ function PMA_analyseShowGrant() } if ( - /*overload*/mb_strpos($show_grants_str,'RELOAD') !== false + mb_strpos($show_grants_str,'RELOAD') !== false ) { $GLOBALS['is_reload_priv'] = true; } - // check for the required privileges for adjust PMA_checkRequiredPrivilegesForAdjust( $show_grants_str, diff --git a/test/libraries/PMA_check_user_privileges_test.php b/test/libraries/PMA_check_user_privileges_test.php new file mode 100644 index 0000000000..f631179cbc --- /dev/null +++ b/test/libraries/PMA_check_user_privileges_test.php @@ -0,0 +1,301 @@ +assertEquals( + "ALL PRIVILEGES", + $show_grants_str + ); + + $this->assertEquals( + "*", + $show_grants_dbname + ); + + $this->assertEquals( + "*", + $show_grants_tblname + ); + + // TEST CASE 2 + $show_grants_full_row = "GRANT ALL PRIVILEGES ON `mysql`.* TO " + . "'root'@'localhost' WITH GRANT OPTION"; + + list( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ) = PMA_getItemsFromShowGrantsRow( + $show_grants_full_row + ); + + $this->assertEquals( + "ALL PRIVILEGES", + $show_grants_str + ); + + $this->assertEquals( + "mysql", + $show_grants_dbname + ); + + $this->assertEquals( + "*", + $show_grants_tblname + ); + + // TEST CASE 3 + $show_grants_full_row = "GRANT SELECT, INSERT, UPDATE, DELETE " + . "ON `mysql`.`columns_priv` TO 'root'@'localhost'"; + + list( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ) = PMA_getItemsFromShowGrantsRow( + $show_grants_full_row + ); + + $this->assertEquals( + "SELECT, INSERT, UPDATE, DELETE", + $show_grants_str + ); + + $this->assertEquals( + "mysql", + $show_grants_dbname + ); + + $this->assertEquals( + "columns_priv", + $show_grants_tblname + ); + + } + + + /** + * Test for PMA_checkRequiredPrivilegesForAdjust + * + * @return void + */ + public function testPMA_checkRequiredPrivilegesForAdjust() + { + // TEST CASE 1 + $show_grants_full_row = "GRANT ALL PRIVILEGES ON *.* " + . "TO 'root'@'localhost' WITH GRANT OPTION"; + list( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ) = PMA_getItemsFromShowGrantsRow( + $show_grants_full_row + ); + + // call the to-be-tested function + PMA_checkRequiredPrivilegesForAdjust( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ); + + $this->assertEquals( + true, + $GLOBALS['col_priv'] + ); + + $this->assertEquals( + true, + $GLOBALS['db_priv'] + ); + + $this->assertEquals( + true, + $GLOBALS['proc_priv'] + ); + + $this->assertEquals( + true, + $GLOBALS['table_priv'] + ); + + // re-initialise the privileges + $this->setUp(); + + // TEST CASE 2 + $show_grants_full_row = "GRANT ALL PRIVILEGES ON `mysql`.* TO " + . "'root'@'localhost' WITH GRANT OPTION"; + list( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ) = PMA_getItemsFromShowGrantsRow( + $show_grants_full_row + ); + + // call the to-be-tested function + PMA_checkRequiredPrivilegesForAdjust( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ); + + $this->assertEquals( + true, + $GLOBALS['col_priv'] + ); + + $this->assertEquals( + true, + $GLOBALS['db_priv'] + ); + + $this->assertEquals( + true, + $GLOBALS['proc_priv'] + ); + + $this->assertEquals( + true, + $GLOBALS['table_priv'] + ); + + + // re-initialise the privileges + $this->setUp(); + + // TEST CASE 3 + $show_grants_full_row = "GRANT SELECT, INSERT, UPDATE, DELETE ON " + . "`mysql`.* TO 'root'@'localhost'"; + list( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ) = PMA_getItemsFromShowGrantsRow( + $show_grants_full_row + ); + + // call the to-be-tested function + PMA_checkRequiredPrivilegesForAdjust( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ); + + $this->assertEquals( + true, + $GLOBALS['col_priv'] + ); + + $this->assertEquals( + true, + $GLOBALS['db_priv'] + ); + + $this->assertEquals( + true, + $GLOBALS['proc_priv'] + ); + + $this->assertEquals( + true, + $GLOBALS['table_priv'] + ); + + + // re-initialise the privileges + $this->setUp(); + + // TEST CASE 4 + $show_grants_full_row = "GRANT SELECT, INSERT, UPDATE, DELETE ON " + . "`mysql`.`db` TO 'root'@'localhost'"; + list( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ) = PMA_getItemsFromShowGrantsRow( + $show_grants_full_row + ); + + // call the to-be-tested function + PMA_checkRequiredPrivilegesForAdjust( + $show_grants_str, + $show_grants_dbname, + $show_grants_tblname + ); + + $this->assertEquals( + false, + $GLOBALS['col_priv'] + ); + + $this->assertEquals( + true, + $GLOBALS['db_priv'] + ); + + $this->assertEquals( + false, + $GLOBALS['proc_priv'] + ); + + $this->assertEquals( + false, + $GLOBALS['table_priv'] + ); + } + +}