mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
f0a7ff8419
Problem 1: column_priv_hash uses utf8_general_ci collation for the key comparison. The key consists of user name, db name and table name. Thus user with privileges on table t1 is able to perform the same operation on T1 (the similar situation with user name & db name, see acl_cache). So collation which is used for column_priv_hash and acl_cache should be case sensitive. The fix: replace system_charset_info with my_charset_utf8_bin for column_priv_hash and acl_cache Problem 2: The same situation with proc_priv_hash, func_priv_hash, the only difference is that Routine name is case insensitive. So the fix is to use my_charset_utf8_bin for proc_priv_hash & func_priv_hash and convert routine name into lower case before writing the element into the hash and before looking up the key. Additional fix: mysql.procs_priv Routine_name field collation is changed to utf8_general_ci. It's necessary for REVOKE command (to find a field by routine hash element values). Note: It's safe for lower-case-table-names mode too because db name & table name are converted into lower case (see GRANT_NAME::GRANT_NAME). mysql-test/include/have_case_insensitive_fs.inc: test case mysql-test/r/case_insensitive_fs.require: test case mysql-test/r/grant_lowercase_fs.result: test result mysql-test/r/lowercase_fs_off.result: test result mysql-test/r/ps_grant.result: test result mysql-test/r/system_mysql_db.result: changed Routine_name field collation to case insensitive mysql-test/t/grant_lowercase_fs.test: test case mysql-test/t/lowercase_fs_off.test: test case scripts/mysql_system_tables.sql: changed Routine_name field collation to case insensitive scripts/mysql_system_tables_fix.sql: changed Routine_name field collation to case insensitive sql/sql_acl.cc: Problem 1: column_priv_hash uses utf8_general_ci collation for the key comparison. The key consists of user name, db name and table name. Thus user with privileges on table t1 is able to perform the same operation on T1 (the similar situation with user name & db name, see acl_cache). So collation which is used for column_priv_hash and acl_cache should be case sensitive. The fix: replace system_charset_info with my_charset_utf8_bin for column_priv_hash and acl_cache Problem 2: The same situation with proc_priv_hash, func_priv_hash, the only difference is that Routine name is case insensitive. So the fix is to use my_charset_utf8_bin for proc_priv_hash & func_priv_hash and convert routine name into lower case before writing the element into the hash and before looking up the key. Additional fix: mysql.procs_priv Routine_name field collation is changed to utf8_general_ci. It's necessary for REVOKE command (to find a field by routine hash element values). Note: It's safe for lower-case-table-names mode too because db name & table name are converted into lower case (see GRANT_NAME::GRANT_NAME).
184 lines
10 KiB
Text
184 lines
10 KiB
Text
drop table if exists t1,t1aa,t2aa;
|
|
show tables;
|
|
Tables_in_db
|
|
columns_priv
|
|
db
|
|
func
|
|
help_category
|
|
help_keyword
|
|
help_relation
|
|
help_topic
|
|
host
|
|
proc
|
|
procs_priv
|
|
tables_priv
|
|
time_zone
|
|
time_zone_leap_second
|
|
time_zone_name
|
|
time_zone_transition
|
|
time_zone_transition_type
|
|
user
|
|
show create table db;
|
|
Table Create Table
|
|
db CREATE TABLE `db` (
|
|
`Host` char(60) collate utf8_bin NOT NULL default '',
|
|
`Db` char(64) collate utf8_bin NOT NULL default '',
|
|
`User` char(16) collate utf8_bin NOT NULL default '',
|
|
`Select_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Insert_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Update_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Delete_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Drop_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Grant_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`References_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Index_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Alter_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_tmp_table_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Lock_tables_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Show_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Alter_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Execute_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
PRIMARY KEY (`Host`,`Db`,`User`),
|
|
KEY `User` (`User`)
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Database privileges'
|
|
show create table host;
|
|
Table Create Table
|
|
host CREATE TABLE `host` (
|
|
`Host` char(60) collate utf8_bin NOT NULL default '',
|
|
`Db` char(64) collate utf8_bin NOT NULL default '',
|
|
`Select_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Insert_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Update_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Delete_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Drop_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Grant_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`References_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Index_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Alter_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_tmp_table_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Lock_tables_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Show_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Alter_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Execute_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
PRIMARY KEY (`Host`,`Db`)
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Host privileges; Merged with database privileges'
|
|
show create table user;
|
|
Table Create Table
|
|
user CREATE TABLE `user` (
|
|
`Host` char(60) collate utf8_bin NOT NULL default '',
|
|
`User` char(16) collate utf8_bin NOT NULL default '',
|
|
`Password` char(41) character set latin1 collate latin1_bin NOT NULL default '',
|
|
`Select_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Insert_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Update_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Delete_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Drop_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Reload_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Shutdown_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Process_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`File_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Grant_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`References_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Index_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Alter_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Show_db_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Super_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_tmp_table_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Lock_tables_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Execute_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Repl_slave_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Repl_client_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Show_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Alter_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`Create_user_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
|
|
`ssl_type` enum('','ANY','X509','SPECIFIED') character set utf8 NOT NULL default '',
|
|
`ssl_cipher` blob NOT NULL,
|
|
`x509_issuer` blob NOT NULL,
|
|
`x509_subject` blob NOT NULL,
|
|
`max_questions` int(11) unsigned NOT NULL default '0',
|
|
`max_updates` int(11) unsigned NOT NULL default '0',
|
|
`max_connections` int(11) unsigned NOT NULL default '0',
|
|
`max_user_connections` int(11) unsigned NOT NULL default '0',
|
|
PRIMARY KEY (`Host`,`User`)
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges'
|
|
show create table func;
|
|
Table Create Table
|
|
func CREATE TABLE `func` (
|
|
`name` char(64) collate utf8_bin NOT NULL default '',
|
|
`ret` tinyint(1) NOT NULL default '0',
|
|
`dl` char(128) collate utf8_bin NOT NULL default '',
|
|
`type` enum('function','aggregate') character set utf8 NOT NULL,
|
|
PRIMARY KEY (`name`)
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='User defined functions'
|
|
show create table tables_priv;
|
|
Table Create Table
|
|
tables_priv CREATE TABLE `tables_priv` (
|
|
`Host` char(60) collate utf8_bin NOT NULL default '',
|
|
`Db` char(64) collate utf8_bin NOT NULL default '',
|
|
`User` char(16) collate utf8_bin NOT NULL default '',
|
|
`Table_name` char(64) collate utf8_bin NOT NULL default '',
|
|
`Grantor` char(77) collate utf8_bin NOT NULL default '',
|
|
`Timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
|
|
`Table_priv` set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view') character set utf8 NOT NULL default '',
|
|
`Column_priv` set('Select','Insert','Update','References') character set utf8 NOT NULL default '',
|
|
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`),
|
|
KEY `Grantor` (`Grantor`)
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Table privileges'
|
|
show create table columns_priv;
|
|
Table Create Table
|
|
columns_priv CREATE TABLE `columns_priv` (
|
|
`Host` char(60) collate utf8_bin NOT NULL default '',
|
|
`Db` char(64) collate utf8_bin NOT NULL default '',
|
|
`User` char(16) collate utf8_bin NOT NULL default '',
|
|
`Table_name` char(64) collate utf8_bin NOT NULL default '',
|
|
`Column_name` char(64) collate utf8_bin NOT NULL default '',
|
|
`Timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
|
|
`Column_priv` set('Select','Insert','Update','References') character set utf8 NOT NULL default '',
|
|
PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`)
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Column privileges'
|
|
show create table procs_priv;
|
|
Table Create Table
|
|
procs_priv CREATE TABLE `procs_priv` (
|
|
`Host` char(60) collate utf8_bin NOT NULL default '',
|
|
`Db` char(64) collate utf8_bin NOT NULL default '',
|
|
`User` char(16) collate utf8_bin NOT NULL default '',
|
|
`Routine_name` char(64) character set utf8 NOT NULL default '',
|
|
`Routine_type` enum('FUNCTION','PROCEDURE') collate utf8_bin NOT NULL,
|
|
`Grantor` char(77) collate utf8_bin NOT NULL default '',
|
|
`Proc_priv` set('Execute','Alter Routine','Grant') character set utf8 NOT NULL default '',
|
|
`Timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (`Host`,`Db`,`User`,`Routine_name`,`Routine_type`),
|
|
KEY `Grantor` (`Grantor`)
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Procedure privileges'
|
|
show create table proc;
|
|
Table Create Table
|
|
proc CREATE TABLE `proc` (
|
|
`db` char(64) character set utf8 collate utf8_bin NOT NULL default '',
|
|
`name` char(64) NOT NULL default '',
|
|
`type` enum('FUNCTION','PROCEDURE') NOT NULL,
|
|
`specific_name` char(64) NOT NULL default '',
|
|
`language` enum('SQL') NOT NULL default 'SQL',
|
|
`sql_data_access` enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA') NOT NULL default 'CONTAINS_SQL',
|
|
`is_deterministic` enum('YES','NO') NOT NULL default 'NO',
|
|
`security_type` enum('INVOKER','DEFINER') NOT NULL default 'DEFINER',
|
|
`param_list` blob NOT NULL,
|
|
`returns` char(64) NOT NULL default '',
|
|
`body` longblob NOT NULL,
|
|
`definer` char(77) character set utf8 collate utf8_bin NOT NULL default '',
|
|
`created` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
|
|
`modified` timestamp NOT NULL default '0000-00-00 00:00:00',
|
|
`sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE') NOT NULL default '',
|
|
`comment` char(64) character set utf8 collate utf8_bin NOT NULL default '',
|
|
PRIMARY KEY (`db`,`name`,`type`)
|
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Stored Procedures'
|
|
show tables;
|
|
Tables_in_test
|