Skip to content

Commit b4e7803

Browse files
committed
MDEV-5215 post-review fixes
* "public" should work in any letter case * PUBLIC is not a valid definer * granting to public should auto-create an entry in mysql.global_priv * SHOW GRANTS should show privileges obtained via PUBLIC * LEX_USER::is_public was often uninitialized * comments, whitespaces, typos, etc
1 parent b0325bd commit b4e7803

File tree

11 files changed

+238
-288
lines changed

11 files changed

+238
-288
lines changed
Lines changed: 31 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
#
2+
# MDEV-5215 Granted to PUBLIC
3+
#
14
SHOW GRANTS FOR PUBLIC;
25
Grants for PUBLIC
36
# it is not PUBLIC but an user
@@ -7,39 +10,6 @@ create user PUBLIC@localhost;
710
GRANT SELECT on test.* to PUBLIC@localhost;
811
drop user PUBLIC@localhost;
912
drop user PUBLIC;
10-
# preinstalled PUBLIC
11-
GRANT SELECT on test.* to PUBLIC;
12-
GRANT SELECT on mysql.db to PUBLIC;
13-
select * from mysql.global_priv where user="PUBLIC" ;
14-
Host User Priv
15-
PUBLIC {"access":0,"version_id":VERSION,"is_role":true}
16-
SHOW GRANTS FOR PUBLIC;
17-
Grants for PUBLIC
18-
GRANT SELECT ON `test`.* TO `PUBLIC`
19-
GRANT SELECT ON `mysql`.`db` TO `PUBLIC`
20-
GRANT UPDATE on test.* to PUBLIC;
21-
GRANT UPDATE on mysql.db to PUBLIC;
22-
SHOW GRANTS FOR PUBLIC;
23-
Grants for PUBLIC
24-
GRANT SELECT, UPDATE ON `test`.* TO `PUBLIC`
25-
GRANT SELECT, UPDATE ON `mysql`.`db` TO `PUBLIC`
26-
REVOKE SELECT on test.* from PUBLIC;
27-
REVOKE SELECT on mysql.db from PUBLIC;
28-
SHOW GRANTS FOR PUBLIC;
29-
Grants for PUBLIC
30-
GRANT UPDATE ON `test`.* TO `PUBLIC`
31-
GRANT UPDATE ON `mysql`.`db` TO `PUBLIC`
32-
REVOKE UPDATE on test.* from PUBLIC;
33-
REVOKE UPDATE on mysql.db from PUBLIC;
34-
REVOKE UPDATE on test.* from PUBLIC;
35-
ERROR 42000: There is no such grant defined for user 'PUBLIC' on host ''
36-
REVOKE UPDATE on mysql.db from PUBLIC;
37-
ERROR 42000: There is no such grant defined for user 'PUBLIC' on host '' on table 'db'
38-
SHOW GRANTS FOR PUBLIC;
39-
Grants for PUBLIC
40-
# automaticly added PUBLIC
41-
delete from mysql.global_priv where user="PUBLIC";
42-
flush privileges;
4313
select * from mysql.global_priv where user="PUBLIC" ;
4414
Host User Priv
4515
GRANT SELECT on test.* to PUBLIC;
@@ -52,12 +22,12 @@ Grants for PUBLIC
5222
GRANT SELECT ON `test`.* TO `PUBLIC`
5323
GRANT SELECT ON `mysql`.`db` TO `PUBLIC`
5424
GRANT UPDATE on test.* to PUBLIC;
55-
GRANT UPDATE on mysql.db to PUBLIC;
56-
SHOW GRANTS FOR PUBLIC;
25+
grant update on mysql.db to public;
26+
show grants for public;
5727
Grants for PUBLIC
5828
GRANT SELECT, UPDATE ON `test`.* TO `PUBLIC`
5929
GRANT SELECT, UPDATE ON `mysql`.`db` TO `PUBLIC`
60-
REVOKE SELECT on test.* from PUBLIC;
30+
revoke select on test.* from public;
6131
REVOKE SELECT on mysql.db from PUBLIC;
6232
SHOW GRANTS FOR PUBLIC;
6333
Grants for PUBLIC
@@ -72,15 +42,15 @@ ERROR OP000: Invalid role specification `XXXXXX`
7242
# following should fail with the same error as above
7343
GRANT PUBLIC TO CURRENT_USER;
7444
ERROR OP000: Invalid role specification `PUBLIC`
75-
REVOKE XXXXXX FROM CURRENT_USER;
76-
ERROR OP000: Invalid role specification `XXXXXX`
45+
revoke xxxxxx from current_user;
46+
ERROR OP000: Invalid role specification `xxxxxx`
7747
# following should fail with the same error as above
78-
REVOKE PUBLIC FROM CURRENT_USER;
79-
ERROR OP000: Invalid role specification `PUBLIC`
48+
revoke public from current_user;
49+
ERROR OP000: Invalid role specification `public`
8050
drop role XXXXXX;
8151
ERROR HY000: Operation DROP ROLE failed for 'XXXXXX'
8252
# following should fail with the same error as above
83-
drop role PUBLIC;
53+
drop role public;
8454
ERROR HY000: Operation DROP ROLE failed for PUBLIC
8555
SET ROLE XXXXXX;
8656
ERROR OP000: Invalid role specification `XXXXXX`
@@ -92,6 +62,8 @@ ERROR OP000: Invalid role specification `XXXXXX`
9262
# following should fail with the same error as above
9363
SET DEFAULT ROLE PUBLIC;
9464
ERROR OP000: Invalid role specification `PUBLIC`
65+
set default role public;
66+
ERROR OP000: Invalid role specification `public`
9567
#
9668
# check prohibition of change security context to PUBLIC
9769
#
@@ -100,39 +72,34 @@ GRANT SELECT on test.* to PUBLIC;
10072
# try with a view
10173
create table t1( a int);
10274
create definer = PUBLIC view v1 as select * from t1;
103-
Warnings:
104-
Note 1449 The user specified as a definer ('PUBLIC'@'') does not exist
105-
show create view v1;
106-
View Create View character_set_client collation_connection
107-
v1 CREATE ALGORITHM=UNDEFINED DEFINER=`PUBLIC` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` latin1 latin1_swedish_ci
108-
Warnings:
109-
Note 1449 The user specified as a definer ('PUBLIC'@'') does not exist
110-
select * from v1;
111-
ERROR HY000: The user specified as a definer ('PUBLIC'@'') does not exist
112-
drop view v1;
75+
ERROR OP000: Invalid role specification `PUBLIC`
11376
drop table t1;
114-
# try with a view
77+
# try with a stored procedure
11578
create definer='PUBLIC' PROCEDURE p1() SELECT 1;
116-
Warnings:
117-
Note 1449 The user specified as a definer ('PUBLIC'@'') does not exist
118-
show create procedure p1;
119-
Procedure sql_mode Create Procedure character_set_client collation_connection Database Collation
120-
p1 STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION CREATE DEFINER=`PUBLIC` PROCEDURE `p1`()
121-
SELECT 1 latin1 latin1_swedish_ci latin1_swedish_ci
122-
call p1();
123-
ERROR HY000: The user specified as a definer ('PUBLIC'@'') does not exist
124-
drop procedure p1;
79+
ERROR OP000: Invalid role specification `PUBLIC`
12580
# this test cleanup
126-
REVOKE SELECT on test.* from PUBLIC;
81+
revoke select on test.* from public;
12782
#
128-
# check autocreation of PUBLIC on GRAND role TO PUBLIC
83+
# check autocreation of PUBLIC on GRANT role TO PUBLIC
12984
#
13085
# make sure that the privilege will be added automatically
13186
delete from mysql.global_priv where user="PUBLIC";
13287
flush privileges;
13388
create role roletest;
134-
GRANT roletest TO PUBLIC;
89+
grant roletest to public;
13590
drop role roletest;
91+
delete from mysql.global_priv where user="PUBLIC";
92+
flush privileges;
93+
grant select on mysql.global_priv to public;
94+
revoke select on mysql.global_priv from public;
95+
delete from mysql.global_priv where user="PUBLIC";
96+
flush privileges;
97+
grant select (user) on mysql.global_priv to public;
98+
revoke select (user) on mysql.global_priv from public;
99+
delete from mysql.global_priv where user="PUBLIC";
100+
flush privileges;
101+
grant execute on procedure mtr.add_suppression to public;
102+
revoke execute on procedure mtr.add_suppression from public;
136103
# clean up
137104
delete from mysql.global_priv where user="PUBLIC";
138105
flush privileges;

mysql-test/main/public_basic.test

Lines changed: 34 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
--source include/not_embedded.inc
2+
--echo #
3+
--echo # MDEV-5215 Granted to PUBLIC
4+
--echo #
5+
16
SHOW GRANTS FOR PUBLIC;
27

38
--echo # it is not PUBLIC but an user
@@ -8,37 +13,6 @@ GRANT SELECT on test.* to PUBLIC@localhost;
813
drop user PUBLIC@localhost;
914
drop user PUBLIC;
1015

11-
--echo # preinstalled PUBLIC
12-
GRANT SELECT on test.* to PUBLIC;
13-
GRANT SELECT on mysql.db to PUBLIC;
14-
--replace_regex /"version_id"\:[0-9]+/"version_id":VERSION/
15-
select * from mysql.global_priv where user="PUBLIC" ;
16-
17-
SHOW GRANTS FOR PUBLIC;
18-
19-
GRANT UPDATE on test.* to PUBLIC;
20-
GRANT UPDATE on mysql.db to PUBLIC;
21-
22-
SHOW GRANTS FOR PUBLIC;
23-
24-
REVOKE SELECT on test.* from PUBLIC;
25-
REVOKE SELECT on mysql.db from PUBLIC;
26-
27-
SHOW GRANTS FOR PUBLIC;
28-
29-
REVOKE UPDATE on test.* from PUBLIC;
30-
REVOKE UPDATE on mysql.db from PUBLIC;
31-
32-
--error ER_NONEXISTING_GRANT
33-
REVOKE UPDATE on test.* from PUBLIC;
34-
--error ER_NONEXISTING_TABLE_GRANT
35-
REVOKE UPDATE on mysql.db from PUBLIC;
36-
37-
SHOW GRANTS FOR PUBLIC;
38-
39-
--echo # automaticly added PUBLIC
40-
delete from mysql.global_priv where user="PUBLIC";
41-
flush privileges;
4216
select * from mysql.global_priv where user="PUBLIC" ;
4317
GRANT SELECT on test.* to PUBLIC;
4418
GRANT SELECT on mysql.db to PUBLIC;
@@ -48,11 +22,11 @@ select * from mysql.global_priv where user="PUBLIC" ;
4822
SHOW GRANTS FOR PUBLIC;
4923

5024
GRANT UPDATE on test.* to PUBLIC;
51-
GRANT UPDATE on mysql.db to PUBLIC;
25+
grant update on mysql.db to public;
5226

53-
SHOW GRANTS FOR PUBLIC;
27+
show grants for public;
5428

55-
REVOKE SELECT on test.* from PUBLIC;
29+
revoke select on test.* from public;
5630
REVOKE SELECT on mysql.db from PUBLIC;
5731

5832
SHOW GRANTS FOR PUBLIC;
@@ -69,16 +43,16 @@ GRANT XXXXXX TO CURRENT_USER;
6943
GRANT PUBLIC TO CURRENT_USER;
7044

7145
--error ER_INVALID_ROLE
72-
REVOKE XXXXXX FROM CURRENT_USER;
46+
revoke xxxxxx from current_user;
7347
--echo # following should fail with the same error as above
7448
--error ER_INVALID_ROLE
75-
REVOKE PUBLIC FROM CURRENT_USER;
76-
--error ER_CANNOT_USER
49+
revoke public from current_user;
7750

51+
--error ER_CANNOT_USER
7852
drop role XXXXXX;
7953
--echo # following should fail with the same error as above
8054
--error ER_CANNOT_USER
81-
drop role PUBLIC;
55+
drop role public;
8256

8357
--error ER_INVALID_ROLE
8458
SET ROLE XXXXXX;
@@ -91,6 +65,8 @@ SET DEFAULT ROLE XXXXXX;
9165
--echo # following should fail with the same error as above
9266
--error ER_INVALID_ROLE
9367
SET DEFAULT ROLE PUBLIC;
68+
--error ER_INVALID_ROLE
69+
set default role public;
9470

9571
--echo #
9672
--echo # check prohibition of change security context to PUBLIC
@@ -99,31 +75,39 @@ SET DEFAULT ROLE PUBLIC;
9975
GRANT SELECT on test.* to PUBLIC;
10076
--echo # try with a view
10177
create table t1( a int);
78+
--error ER_INVALID_ROLE
10279
create definer = PUBLIC view v1 as select * from t1;
103-
show create view v1;
104-
--error ER_NO_SUCH_USER
105-
select * from v1;
106-
drop view v1;
10780
drop table t1;
108-
--echo # try with a view
81+
--echo # try with a stored procedure
82+
--error ER_INVALID_ROLE
10983
create definer='PUBLIC' PROCEDURE p1() SELECT 1;
110-
show create procedure p1;
111-
--error ER_NO_SUCH_USER
112-
call p1();
113-
drop procedure p1;
11484
--echo # this test cleanup
115-
REVOKE SELECT on test.* from PUBLIC;
85+
revoke select on test.* from public;
11686

11787
--echo #
118-
--echo # check autocreation of PUBLIC on GRAND role TO PUBLIC
88+
--echo # check autocreation of PUBLIC on GRANT role TO PUBLIC
11989
--echo #
12090
--echo # make sure that the privilege will be added automatically
12191
delete from mysql.global_priv where user="PUBLIC";
12292
flush privileges;
12393
create role roletest;
124-
GRANT roletest TO PUBLIC;
94+
grant roletest to public;
12595
drop role roletest;
12696

97+
delete from mysql.global_priv where user="PUBLIC";
98+
flush privileges;
99+
grant select on mysql.global_priv to public;
100+
revoke select on mysql.global_priv from public;
101+
102+
delete from mysql.global_priv where user="PUBLIC";
103+
flush privileges;
104+
grant select (user) on mysql.global_priv to public;
105+
revoke select (user) on mysql.global_priv from public;
106+
107+
delete from mysql.global_priv where user="PUBLIC";
108+
flush privileges;
109+
grant execute on procedure mtr.add_suppression to public;
110+
revoke execute on procedure mtr.add_suppression from public;
127111

128112
-- echo # clean up
129113
delete from mysql.global_priv where user="PUBLIC";

0 commit comments

Comments
 (0)