dummyDbi = $this->createDbiDummy(); $this->dbi = $this->createDatabaseInterface($this->dummyDbi); DatabaseInterface::$instance = $this->dbi; } public function testGetDataForDBInfo(): void { $_REQUEST['username'] = 'PMA_username'; $_REQUEST['hostname'] = 'PMA_hostname'; $_REQUEST['tablename'] = 'PMA_tablename'; $_REQUEST['dbname'] = 'PMA_dbname'; $serverPrivileges = $this->getPrivileges($this->createDatabaseInterface()); [ $username, $hostname, $dbname, $tablename, $routinename, $dbnameIsWildcard, ] = $serverPrivileges->getDataForDBInfo(); $this->assertEquals('PMA_username', $username); $this->assertEquals('PMA_hostname', $hostname); $this->assertEquals('PMA_dbname', $dbname); $this->assertEquals('PMA_tablename', $tablename); $this->assertTrue($dbnameIsWildcard); //pre variable have been defined $_POST['pred_tablename'] = 'PMA_pred__tablename'; $_POST['pred_dbname'] = ['PMA_pred_dbname']; [, , $dbname, $tablename, $routinename, $dbnameIsWildcard] = $serverPrivileges->getDataForDBInfo(); $this->assertEquals('PMA_pred_dbname', $dbname); $this->assertEquals('PMA_pred__tablename', $tablename); $this->assertTrue($dbnameIsWildcard); // Escaped database $_POST['pred_tablename'] = 'PMA_pred__tablename'; $_POST['pred_dbname'] = ['PMA\_pred\_dbname']; [, , $dbname, $tablename, $routinename, $dbnameIsWildcard] = $serverPrivileges->getDataForDBInfo(); $this->assertEquals('PMA\_pred\_dbname', $dbname); $this->assertEquals('PMA_pred__tablename', $tablename); $this->assertFalse($dbnameIsWildcard); // Multiselect database - pred unset($_POST['pred_tablename'], $_REQUEST['tablename'], $_REQUEST['dbname']); $_POST['pred_dbname'] = ['PMA\_pred\_dbname', 'PMADbname2']; [, , $dbname, $tablename, , $dbnameIsWildcard] = $serverPrivileges->getDataForDBInfo(); $this->assertEquals(['PMA\_pred\_dbname', 'PMADbname2'], $dbname); $this->assertEquals(null, $tablename); $this->assertFalse($dbnameIsWildcard); // Multiselect database unset($_POST['pred_tablename'], $_REQUEST['tablename'], $_POST['pred_dbname']); $_REQUEST['dbname'] = ['PMA\_dbname', 'PMADbname2']; [, , $dbname, $tablename, , $dbnameIsWildcard] = $serverPrivileges->getDataForDBInfo(); $this->assertEquals(['PMA\_dbname', 'PMADbname2'], $dbname); $this->assertEquals(null, $tablename); $this->assertFalse($dbnameIsWildcard); } public function testWildcardEscapeForGrant(): void { $serverPrivileges = $this->getPrivileges($this->createDatabaseInterface()); $dbname = ''; $tablename = ''; $dbAndTable = $serverPrivileges->wildcardEscapeForGrant($dbname, $tablename); $this->assertEquals('*.*', $dbAndTable); $dbname = 'dbname'; $tablename = ''; $dbAndTable = $serverPrivileges->wildcardEscapeForGrant($dbname, $tablename); $this->assertEquals('`dbname`.*', $dbAndTable); $dbname = 'dbname'; $tablename = 'tablename'; $dbAndTable = $serverPrivileges->wildcardEscapeForGrant($dbname, $tablename); $this->assertEquals('`dbname`.`tablename`', $dbAndTable); } public function testRangeOfUsers(): void { $serverPrivileges = $this->getPrivileges($this->createDatabaseInterface()); $ret = $serverPrivileges->rangeOfUsers('INIT'); $this->assertEquals('WHERE `User` LIKE \'INIT%\' OR `User` LIKE \'init%\'', $ret); $ret = $serverPrivileges->rangeOfUsers('%'); $this->assertEquals('WHERE `User` LIKE \'\\\\%%\' OR `User` LIKE \'\\\\%%\'', $ret); $ret = $serverPrivileges->rangeOfUsers(''); $this->assertEquals("WHERE `User` = ''", $ret); $ret = $serverPrivileges->rangeOfUsers(); $this->assertEquals('', $ret); } public function testGetTableGrantsArray(): void { $serverPrivileges = $this->getPrivileges($this->createDatabaseInterface()); $ret = $serverPrivileges->getTableGrantsArray(); $this->assertEquals( ['Delete', 'DELETE', __('Allows deleting data.')], $ret[0], ); $this->assertEquals( ['Create', 'CREATE', __('Allows creating new tables.')], $ret[1], ); } public function testGetGrantsArray(): void { $serverPrivileges = $this->getPrivileges($this->createDatabaseInterface()); $ret = $serverPrivileges->getGrantsArray(); $this->assertEquals( ['Select_priv', 'SELECT', __('Allows reading data.')], $ret[0], ); $this->assertEquals( ['Insert_priv', 'INSERT', __('Allows inserting and replacing data.')], $ret[1], ); } public function testGetSqlQueryForDisplayPrivTable(): void { $dbi = $this->createDatabaseInterface(); $serverPrivileges = $this->getPrivileges($dbi); $username = 'pma_username'; $db = '*'; $table = 'pma_table'; $hostname = 'pma_hostname'; //$db == '*' $ret = $serverPrivileges->getSqlQueryForDisplayPrivTable($db, $table, $username, $hostname); $sql = 'SELECT * FROM `mysql`.`user`' . ' WHERE `User` = ' . $dbi->quoteString($username) . ' AND `Host` = ' . $dbi->quoteString($hostname) . ';'; $this->assertEquals($sql, $ret); //$table == '*' $db = 'pma_db'; $table = '*'; $ret = $serverPrivileges->getSqlQueryForDisplayPrivTable($db, $table, $username, $hostname); $sql = 'SELECT * FROM `mysql`.`db`' . ' WHERE `User` = ' . $dbi->quoteString($username) . ' AND `Host` = ' . $dbi->quoteString($hostname) . ' AND `Db` = \'' . $db . '\''; $this->assertEquals($sql, $ret); //$table == 'pma_table' $db = 'pma_db'; $table = 'pma_table'; $ret = $serverPrivileges->getSqlQueryForDisplayPrivTable($db, $table, $username, $hostname); $sql = 'SELECT `Table_priv`' . ' FROM `mysql`.`tables_priv`' . ' WHERE `User` = ' . $dbi->quoteString($username) . ' AND `Host` = ' . $dbi->quoteString($hostname) . " AND `Db` = '" . $serverPrivileges->unescapeGrantWildcards($db) . "'" . ' AND `Table_name` = ' . $dbi->quoteString($table) . ';'; $this->assertEquals($sql, $ret); // SQL escaping $db = "db' AND"; $table = 'pma_table'; $ret = $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, ); } public function testGetDataForChangeOrCopyUser(): void { $GLOBALS['lang'] = 'en'; $dummyDbi = $this->createDbiDummy(); // phpcs:disable Generic.Files.LineLength.TooLong $dummyDbi->addResult( 'SELECT * FROM `mysql`.`user` WHERE `User` = \'PMA_old_username\' AND `Host` = \'PMA_old_hostname\';', [ ['PMA_old_hostname', 'PMA_old_username', 'pma_password', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', '0', '0', '0', '0', 'mysql_native_password', 'pma_password', 'N', 'N', '', '0.000000'], ], ['Host', 'User', 'Password', 'Select_priv', 'Insert_priv', 'Update_priv', 'Delete_priv', 'Create_priv', 'Drop_priv', 'Reload_priv', 'Shutdown_priv', 'Process_priv', 'File_priv', 'Grant_priv', 'References_priv', 'Index_priv', 'Alter_priv', 'Show_db_priv', 'Super_priv', 'Create_tmp_table_priv', 'Lock_tables_priv', 'Execute_priv', 'Repl_slave_priv', 'Repl_client_priv', 'Create_view_priv', 'Show_view_priv', 'Create_routine_priv', 'Alter_routine_priv', 'Create_user_priv', 'Event_priv', 'Trigger_priv', 'Create_tablespace_priv', 'Delete_history_priv', 'ssl_type', 'ssl_cipher', 'x509_issuer', 'x509_subject', 'max_questions', 'max_updates', 'max_connections', 'max_user_connections', 'plugin', 'authentication_string', 'password_expired', 'is_role', 'default_role', 'max_statement_time'], ); // phpcs:enable $serverPrivileges = $this->getPrivileges($this->createDatabaseInterface($dummyDbi)); //$_POST['change_copy'] not set $password = $serverPrivileges->getDataForChangeOrCopyUser('', ''); //$_POST['change_copy'] is set $_POST['change_copy'] = true; $password = $serverPrivileges->getDataForChangeOrCopyUser('PMA_old_username', 'PMA_old_hostname'); $this->assertEquals('pma_password', $password); unset($_POST['change_copy']); } public function testGetExportUserDefinitionTextarea(): void { $dummyDbi = $this->createDbiDummy(); $dummyDbi->addResult( 'SHOW GRANTS FOR \'PMA_username\'@\'PMA_hostname\'', [['grant user2 delete'], ['grant user1 select']], ['Grants for PMA_username@PMA_hostname'], ); $serverPrivileges = $this->getPrivileges($this->createDatabaseInterface($dummyDbi)); $username = 'PMA_username'; $hostname = 'PMA_hostname'; $export = $serverPrivileges->getExportUserDefinitionTextarea($username, $hostname, null); $this->assertStringContainsString('grant user2 delete', $export); $this->assertStringContainsString('grant user1 select', $export); $this->assertStringContainsString('