Fix collation error when checking for grant permission

Signed-off-by: Maurício Meneghini Fauth <mauricio@mfauth.net>
This commit is contained in:
Maurício Meneghini Fauth 2025-11-07 15:15:23 -03:00
parent d6e9e653d3
commit aeb649ac6d
No known key found for this signature in database
GPG Key ID: 6A16FD38AFC89CC8
4 changed files with 18 additions and 10 deletions

View File

@ -1794,7 +1794,7 @@ class DatabaseInterface implements DbalInterface
return $hasGrantPrivilege;
}
$collation = $this->getServerCollation();
$collation = (string) $this->getVariable('collation_connection');
[$user, $host] = $this->getCurrentUserAndHost();
$query = QueryGenerator::getInformationSchemaDataForGranteeRequest($user, $host, $collation);
@ -1853,7 +1853,7 @@ class DatabaseInterface implements DbalInterface
return $hasCreatePrivilege;
}
$collation = $this->getServerCollation();
$collation = (string) $this->getVariable('collation_connection');
[$user, $host] = $this->getCurrentUserAndHost();
$query = QueryGenerator::getInformationSchemaDataForCreateRequest($user, $host, $collation);

View File

@ -39,12 +39,12 @@ class PrivilegesControllerTest extends AbstractTestCase
$PMA_PHP_SELF = 'index.php';
$dbiDummy = $this->createDbiDummy();
$dbiDummy->addResult('SELECT @@collation_server', [['utf8mb4_uca1400_ai_ci']]);
// phpcs:ignore Generic.Files.LineLength.TooLong
// phpcs:disable Generic.Files.LineLength.TooLong
$dbiDummy->addResult('SHOW SESSION VARIABLES LIKE \'collation_connection\';', [['collation_connection', 'utf8mb4_uca1400_ai_ci']]);
$dbiDummy->addResult("SELECT 1 FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES` WHERE `PRIVILEGE_TYPE` = 'CREATE USER' AND '''pma_test''@''localhost''' LIKE `GRANTEE` UNION SELECT 1 FROM mysql.user WHERE `create_user_priv` = 'Y' COLLATE utf8mb4_uca1400_ai_ci AND 'pma_test' LIKE `User` AND '' LIKE `Host` LIMIT 1", [['1']]);
$dbiDummy->addResult('SELECT @@collation_server', [['utf8mb4_uca1400_ai_ci']]);
// phpcs:ignore Generic.Files.LineLength.TooLong
$dbiDummy->addResult('SHOW SESSION VARIABLES LIKE \'collation_connection\';', [['collation_connection', 'utf8mb4_uca1400_ai_ci']]);
$dbiDummy->addResult("SELECT 1 FROM (SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`COLUMN_PRIVILEGES` UNION SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`TABLE_PRIVILEGES` UNION SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`SCHEMA_PRIVILEGES` UNION SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES`) t WHERE `IS_GRANTABLE` = 'YES' AND '''pma_test''@''localhost''' LIKE `GRANTEE` UNION SELECT 1 FROM mysql.user WHERE `create_user_priv` = 'Y' COLLATE utf8mb4_uca1400_ai_ci AND 'pma_test' LIKE `User` AND '' LIKE `Host` LIMIT 1", [['1']]);
// phpcs:enable
$dbi = $this->createDatabaseInterface($dbiDummy);
$GLOBALS['dbi'] = $dbi;
@ -62,6 +62,8 @@ class PrivilegesControllerTest extends AbstractTestCase
$dbi
))(['checkprivsdb' => $db]);
$dbiDummy->assertAllQueriesConsumed();
self::assertStringContainsString(Url::getCommon(['db' => $db], ''), $actual);
self::assertStringContainsString($db, $actual);

View File

@ -40,12 +40,12 @@ class PrivilegesControllerTest extends AbstractTestCase
$PMA_PHP_SELF = 'index.php';
$dbiDummy = $this->createDbiDummy();
$dbiDummy->addResult('SELECT @@collation_server', [['utf8mb4_general_ci']]);
// phpcs:ignore Generic.Files.LineLength.TooLong
// phpcs:disable Generic.Files.LineLength.TooLong
$dbiDummy->addResult('SHOW SESSION VARIABLES LIKE \'collation_connection\';', [['collation_connection', 'utf8mb4_general_ci']]);
$dbiDummy->addResult("SELECT 1 FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES` WHERE `PRIVILEGE_TYPE` = 'CREATE USER' AND '''pma_test''@''localhost''' LIKE `GRANTEE` UNION SELECT 1 FROM mysql.user WHERE `create_user_priv` = 'Y' COLLATE utf8mb4_general_ci AND 'pma_test' LIKE `User` AND '' LIKE `Host` LIMIT 1", [['1']]);
$dbiDummy->addResult('SELECT @@collation_server', [['utf8mb4_general_ci']]);
// phpcs:ignore Generic.Files.LineLength.TooLong
$dbiDummy->addResult('SHOW SESSION VARIABLES LIKE \'collation_connection\';', [['collation_connection', 'utf8mb4_general_ci']]);
$dbiDummy->addResult("SELECT 1 FROM (SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`COLUMN_PRIVILEGES` UNION SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`TABLE_PRIVILEGES` UNION SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`SCHEMA_PRIVILEGES` UNION SELECT `GRANTEE`, `IS_GRANTABLE` FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES`) t WHERE `IS_GRANTABLE` = 'YES' AND '''pma_test''@''localhost''' LIKE `GRANTEE` UNION SELECT 1 FROM mysql.user WHERE `create_user_priv` = 'Y' COLLATE utf8mb4_general_ci AND 'pma_test' LIKE `User` AND '' LIKE `Host` LIMIT 1", [['1']]);
// phpcs:enable
$dbi = $this->createDatabaseInterface($dbiDummy);
$GLOBALS['dbi'] = $dbi;
@ -64,6 +64,8 @@ class PrivilegesControllerTest extends AbstractTestCase
$dbi
))(['checkprivsdb' => $db, 'checkprivstable' => $table]);
$dbiDummy->assertAllQueriesConsumed();
self::assertStringContainsString($db . '.' . $table, $actual);
//validate 2: Url::getCommon

View File

@ -581,6 +581,10 @@ class DbiDummy implements DbiExtension
'query' => 'SELECT 1 FROM mysql.user LIMIT 1',
'result' => [['1']],
],
[
'query' => "SHOW SESSION VARIABLES LIKE 'collation_connection';",
'result' => [['collation_connection', 'utf8_general_ci']],
],
[
'query' => 'SELECT 1 FROM (SELECT `GRANTEE`, `IS_GRANTABLE`'
. ' FROM `INFORMATION_SCHEMA`.`COLUMN_PRIVILEGES`'