enableBc(); $GLOBALS['cfg']['Server']['DisableIS'] = false; $GLOBALS['cfgRelation'] = []; $GLOBALS['cfgRelation']['menuswork'] = false; $GLOBALS['table'] = 'table'; $GLOBALS['server'] = 1; $GLOBALS['db'] = 'db'; $GLOBALS['hostname'] = 'hostname'; $GLOBALS['username'] = 'username'; $relation = new Relation($GLOBALS['dbi']); $this->serverPrivileges = new Privileges( new Template(), $GLOBALS['dbi'], $relation, new RelationCleanup($GLOBALS['dbi'], $relation) ); //$_POST $_POST['pred_password'] = 'none'; //$_SESSION $_SESSION['relation'][$GLOBALS['server']] = [ 'PMA_VERSION' => PMA_VERSION, 'db' => 'pmadb', 'users' => 'users', 'usergroups' => 'usergroups', 'menuswork' => true, 'trackingwork' => true, 'tracking' => 'tracking', ]; $pmaconfig = $this->getMockBuilder(Config::class) ->disableOriginalConstructor() ->getMock(); $GLOBALS['PMA_Config'] = $pmaconfig; //Mock DBI $dbi = $this->getMockBuilder(DatabaseInterface::class) ->disableOriginalConstructor() ->getMock(); $dbi->expects($this->any()) ->method('fetchResult') ->will( $this->returnValue( [ 'grant user1 select', 'grant user2 delete', ] ) ); $fetchSingleRow = [ 'password' => 'pma_password', 'Table_priv' => 'pri1, pri2', 'Type' => 'Type', '@@old_passwords' => 0, ]; $dbi->expects($this->any())->method('fetchSingleRow') ->will($this->returnValue($fetchSingleRow)); $fetchValue = ['key1' => 'value1']; $dbi->expects($this->any())->method('fetchValue') ->will($this->returnValue($fetchValue)); $dbi->expects($this->any())->method('tryQuery') ->will($this->returnValue(true)); $dbi->expects($this->any())->method('escapeString') ->will($this->returnArgument(0)); $dbi->expects($this->any())->method('isCreateUser') ->will($this->returnValue(true)); $dbi->expects($this->any())->method('isGrantUser') ->will($this->returnValue(true)); $GLOBALS['dbi'] = $dbi; $this->serverPrivileges->dbi = $dbi; $this->serverPrivileges->relation->dbi = $dbi; $GLOBALS['is_reload_priv'] = true; } /** * Test for getDataForDBInfo */ public function testGetDataForDBInfo(): void { $_REQUEST['username'] = 'PMA_username'; $_REQUEST['hostname'] = 'PMA_hostname'; $_REQUEST['tablename'] = 'PMA_tablename'; $_REQUEST['dbname'] = 'PMA_dbname'; [ $username, $hostname, $dbname, $tablename, $routinename, $db_and_table, $dbname_is_wildcard, ] = $this->serverPrivileges->getDataForDBInfo(); $this->assertEquals( 'PMA_username', $username ); $this->assertEquals( 'PMA_hostname', $hostname ); $this->assertEquals( 'PMA_dbname', $dbname ); $this->assertEquals( 'PMA_tablename', $tablename ); $this->assertEquals( '`PMA_dbname`.`PMA_tablename`', $db_and_table ); $this->assertTrue( $dbname_is_wildcard ); //pre variable have been defined $_POST['pred_tablename'] = 'PMA_pred__tablename'; $_POST['pred_dbname'] = ['PMA_pred_dbname']; [,, $dbname, $tablename, $routinename, $db_and_table, $dbname_is_wildcard, ] = $this->serverPrivileges->getDataForDBInfo(); $this->assertEquals( 'PMA_pred_dbname', $dbname ); $this->assertEquals( 'PMA_pred__tablename', $tablename ); $this->assertEquals( '`PMA_pred_dbname`.`PMA_pred__tablename`', $db_and_table ); $this->assertTrue( $dbname_is_wildcard ); // Escaped database $_POST['pred_tablename'] = 'PMA_pred__tablename'; $_POST['pred_dbname'] = ['PMA\_pred\_dbname']; [,, $dbname, $tablename, $routinename, $db_and_table, $dbname_is_wildcard, ] = $this->serverPrivileges->getDataForDBInfo(); $this->assertEquals( 'PMA_pred_dbname', $dbname ); $this->assertEquals( 'PMA_pred__tablename', $tablename ); $this->assertEquals( '`PMA_pred_dbname`.`PMA_pred__tablename`', $db_and_table ); $this->assertEquals( false, $dbname_is_wildcard ); } /** * Test for wildcardEscapeForGrant */ public function testWildcardEscapeForGrant(): void { $dbname = ''; $tablename = ''; $db_and_table = $this->serverPrivileges->wildcardEscapeForGrant($dbname, $tablename); $this->assertEquals( '*.*', $db_and_table ); $dbname = 'dbname'; $tablename = ''; $db_and_table = $this->serverPrivileges->wildcardEscapeForGrant($dbname, $tablename); $this->assertEquals( '`dbname`.*', $db_and_table ); $dbname = 'dbname'; $tablename = 'tablename'; $db_and_table = $this->serverPrivileges->wildcardEscapeForGrant($dbname, $tablename); $this->assertEquals( '`dbname`.`tablename`', $db_and_table ); } /** * Test for rangeOfUsers */ public function testRangeOfUsers(): void { $ret = $this->serverPrivileges->rangeOfUsers('INIT'); $this->assertEquals( " WHERE `User` LIKE 'INIT%' OR `User` LIKE 'init%'", $ret ); $ret = $this->serverPrivileges->rangeOfUsers(); $this->assertEquals( '', $ret ); } /** * Test for getTableGrantsArray */ public function testGetTableGrantsArray(): void { $ret = $this->serverPrivileges->getTableGrantsArray(); $this->assertEquals( [ 'Delete', 'DELETE', __('Allows deleting data.'), ], $ret[0] ); $this->assertEquals( [ 'Create', 'CREATE', __('Allows creating new tables.'), ], $ret[1] ); } /** * Test for getGrantsArray */ public function testGetGrantsArray(): void { $ret = $this->serverPrivileges->getGrantsArray(); $this->assertEquals( [ 'Select_priv', 'SELECT', __('Allows reading data.'), ], $ret[0] ); $this->assertEquals( [ 'Insert_priv', 'INSERT', __('Allows inserting and replacing data.'), ], $ret[1] ); } /** * Test for getHtmlToChooseUserGroup */ public function testGetHtmlToChooseUserGroup(): void { $username = 'pma_username'; $html = $this->serverPrivileges->getHtmlToChooseUserGroup($username); $this->assertStringContainsString( '
$username]; $html_output = Url::getHiddenInputs($params); $this->assertStringContainsString( $html_output, $html ); //__('User group') $this->assertStringContainsString( __('User group'), $html ); } /** * Test for getSqlQueryForDisplayPrivTable */ public function testGetSqlQueryForDisplayPrivTable(): void { $username = 'pma_username'; $db = '*'; $table = 'pma_table'; $hostname = 'pma_hostname'; //$db == '*' $ret = $this->serverPrivileges->getSqlQueryForDisplayPrivTable( $db, $table, $username, $hostname ); $sql = 'SELECT * FROM `mysql`.`user`' . " WHERE `User` = '" . $GLOBALS['dbi']->escapeString($username) . "'" . " AND `Host` = '" . $GLOBALS['dbi']->escapeString($hostname) . "';"; $this->assertEquals( $sql, $ret ); //$table == '*' $db = 'pma_db'; $table = '*'; $ret = $this->serverPrivileges->getSqlQueryForDisplayPrivTable( $db, $table, $username, $hostname ); $sql = 'SELECT * FROM `mysql`.`db`' . " WHERE `User` = '" . $GLOBALS['dbi']->escapeString($username) . "'" . " AND `Host` = '" . $GLOBALS['dbi']->escapeString($hostname) . "'" . " AND '" . Util::unescapeMysqlWildcards($db) . "'" . ' LIKE `Db`;'; $this->assertEquals( $sql, $ret ); //$table == 'pma_table' $db = 'pma_db'; $table = 'pma_table'; $ret = $this->serverPrivileges->getSqlQueryForDisplayPrivTable( $db, $table, $username, $hostname ); $sql = 'SELECT `Table_priv`' . ' FROM `mysql`.`tables_priv`' . " WHERE `User` = '" . $GLOBALS['dbi']->escapeString($username) . "'" . " AND `Host` = '" . $GLOBALS['dbi']->escapeString($hostname) . "'" . " AND `Db` = '" . Util::unescapeMysqlWildcards($db) . "'" . " AND `Table_name` = '" . $GLOBALS['dbi']->escapeString($table) . "';"; $this->assertEquals( $sql, $ret ); // SQL escaping $db = "db' AND"; $table = 'pma_table'; $ret = $this->serverPrivileges->getSqlQueryForDisplayPrivTable( $db, $table, $username, $hostname ); $this->assertEquals( 'SELECT `Table_priv` FROM `mysql`.`tables_priv` ' . "WHERE `User` = 'pma_username' AND " . "`Host` = 'pma_hostname' AND `Db` = 'db' AND' AND " . "`Table_name` = 'pma_table';", $ret ); } /** * Test for getDataForChangeOrCopyUser */ public function testGetDataForChangeOrCopyUser(): void { //$_POST['change_copy'] not set [$queries, $password] = $this->serverPrivileges->getDataForChangeOrCopyUser(); $this->assertEquals( null, $queries ); $this->assertEquals( null, $queries ); //$_POST['change_copy'] is set $_POST['change_copy'] = true; $_POST['old_username'] = 'PMA_old_username'; $_POST['old_hostname'] = 'PMA_old_hostname'; [$queries, $password] = $this->serverPrivileges->getDataForChangeOrCopyUser(); $this->assertEquals( 'pma_password', $password ); $this->assertEquals( [], $queries ); unset($_POST['change_copy']); } /** * Test for getListForExportUserDefinition */ public function testGetHtmlForExportUserDefinition(): void { $username = 'PMA_username'; $hostname = 'PMA_hostname'; [$title, $export] = $this->serverPrivileges->getListForExportUserDefinition($username, $hostname); //validate 1: $export $this->assertStringContainsString( 'grant user2 delete', $export ); $this->assertStringContainsString( 'grant user1 select', $export ); $this->assertStringContainsString( '