Merge pull request #11858 from devenbansod/add_check_priv_tests

Refactor check_user_privileges.lib.php and add test cases for 2 functions
This commit is contained in:
Deven Bansod 2016-01-15 15:52:05 +05:30
commit 62c4bb451d
2 changed files with 347 additions and 31 deletions

View File

@ -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,

View File

@ -0,0 +1,301 @@
<?php
/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
* tests for check_user_privileges.lib.php
*
* @package PhpMyAdmin-test
*/
/*
* Include to test.
*/
$GLOBALS['server'] = 1;
$GLOBALS['cfg']['Server']['DisableIS'] = false;
require_once 'libraries/Util.php';
require_once 'libraries/Tracker.php';
require_once 'libraries/database_interface.inc.php';
require_once 'libraries/check_user_privileges.lib.php';
/**
* tests for check_user_privileges.lib.php
*
* @package PhpMyAdmin-test
*/
class PMA_CheckUserPrivileges_Test extends PHPUnit_Framework_TestCase
{
/**
* prepares environment for tests
*
* @return void
*/
public function setUp()
{
$GLOBALS['col_priv'] = false;
$GLOBALS['db_priv'] = false;
$GLOBALS['proc_priv'] = false;
$GLOBALS['table_priv'] = false;
$GLOBALS['is_reload_priv'] = false;
}
public function testPMA_getItemsFromShowGrantsRow()
{
// 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
);
$this->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']
);
}
}