serverPrivileges = new Privileges( new Template(), $GLOBALS['dbi'], $relation, new RelationCleanup($GLOBALS['dbi'], $relation), new Plugins($GLOBALS['dbi']) ); $_POST['pred_password'] = 'none'; $_SESSION['relation'] = []; $_SESSION['relation'][$GLOBALS['server']] = RelationParameters::fromArray([ 'db' => 'pmadb', 'users' => 'users', 'usergroups' => 'usergroups', 'menuswork' => true, 'trackingwork' => true, 'tracking' => 'tracking', ])->toArray(); $pmaconfig = $this->getMockBuilder(Config::class) ->disableOriginalConstructor() ->getMock(); $GLOBALS['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)); $resultStub = $this->createMock(DummyResult::class); $dbi->expects($this->any())->method('tryQuery') ->will($this->returnValue($resultStub)); $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); // Multiselect database - pred unset($_POST['pred_tablename'], $_REQUEST['tablename'], $_REQUEST['dbname']); $_POST['pred_dbname'] = ['PMA\_pred\_dbname', 'PMADbname2']; [,, $dbname, $tablename,, $db_and_table, $dbname_is_wildcard, ] = $this->serverPrivileges->getDataForDBInfo(); $this->assertEquals(['PMA\_pred\_dbname', 'PMADbname2'], $dbname); $this->assertEquals(null, $tablename); $this->assertEquals(['PMA\_pred\_dbname.*', 'PMADbname2.*'], $db_and_table); $this->assertEquals(false, $dbname_is_wildcard); // Multiselect database unset($_POST['pred_tablename'], $_REQUEST['tablename'], $_POST['pred_dbname']); $_REQUEST['dbname'] = ['PMA\_dbname', 'PMADbname2']; [,, $dbname, $tablename,, $db_and_table, $dbname_is_wildcard, ] = $this->serverPrivileges->getDataForDBInfo(); $this->assertEquals(['PMA\_dbname', 'PMADbname2'], $dbname); $this->assertEquals(null, $tablename); $this->assertEquals(['PMA\_dbname.*', 'PMADbname2.*'], $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 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 `Db` = \'' . $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('