Skip to content

Commit a7a65e8

Browse files
author
Tatjana Azundris Nuernberg
committed
"service pack" for SQL statement rewriting module (sql_rewrite.cc):
More comments, more tests, some whitespace clean-up.
1 parent 85bcd04 commit a7a65e8

File tree

3 files changed

+77
-9
lines changed

3 files changed

+77
-9
lines changed

mysql-test/r/rewrite_general_log.result

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,29 @@ set charset default,@dummy='A';
1111
set names 'latin1',@dummy='B';
1212
set names 'latin1' collate 'latin1_german2_ci';
1313
set names default,@dummy='c';
14-
GRANT ALL on *.* TO test_user1 IDENTIFIED BY 'azundris1';
14+
CREATE TABLE t1(f1 INT, f2 INT, f3 INT, f4 INT);
15+
CREATE PROCEDURE proc_rewrite_1() INSERT INTO test.t1 VALUES ("hocus pocus");
16+
CREATE FUNCTION func_rewrite_1(i INT) RETURNS INT DETERMINISTIC RETURN i+1;
17+
GRANT SELECT(f2), INSERT(f3), INDEX, UPDATE(f1,f3, f2, f4), ALTER
18+
on test.t1 TO test_user1 IDENTIFIED BY 'azundris1';
19+
GRANT ALL ON PROCEDURE test.proc_rewrite_1 TO test_user1;
20+
GRANT EXECUTE ON FUNCTION test.func_rewrite_1 TO test_user1;
21+
GRANT USAGE ON TABLE test.* TO test_user3@localhost REQUIRE SSL;
22+
GRANT SELECT,USAGE ON test.* TO test_user3@localhost REQUIRE X509 WITH
23+
MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 2
24+
MAX_CONNECTIONS_PER_HOUR 3 MAX_USER_CONNECTIONS 4;
25+
GRANT SELECT ON test.* TO test_user3@localhost REQUIRE NONE
26+
WITH GRANT OPTION;
27+
DROP PROCEDURE proc_rewrite_1;
28+
DROP FUNCTION func_rewrite_1;
29+
DROP TABLE t1;
1530
CREATE USER test_user2 IDENTIFIED BY 'azundris2';
1631
CHANGE MASTER TO MASTER_PASSWORD='azundris3';
1732
CREATE USER 'test_user4'@'localhost';
1833
SET PASSWORD FOR 'test_user4'@'localhost' = PASSWORD('azundris4');
1934
SET GLOBAL general_log= 'OFF';
2035
DROP USER 'test_user4'@'localhost';
36+
DROP USER 'test_user3'@'localhost';
2137
DROP USER test_user2;
2238
DROP USER test_user1;
2339
CREATE TABLE test_log (argument TEXT);
@@ -32,14 +48,14 @@ Show that we logged stuff at all:
3248
------ from file ------
3349
SELECT TRIM(LEADING '\t' FROM MID(argument,LOCATE('Query',argument)+5)) FROM test_log WHERE argument LIKE '%PASSWORD %';
3450
TRIM(LEADING '\t' FROM MID(argument,LOCATE('Query',argument)+5))
35-
GRANT ALL PRIVILEGES ON *.* TO 'test_user1'@'%' IDENTIFIED BY PASSWORD '*8D15E74BC850D11573A52BE84B504DD0BA40C1E3'
51+
GRANT SELECT (f2), INSERT (f3), UPDATE (f2, f3, f1, f4), INDEX, ALTER ON `test`.`t1` TO 'test_user1'@'%' IDENTIFIED BY PASSWORD '*8D15E74BC850D11573A52BE84B504DD0BA40C1E3'
3652
CREATE USER 'test_user2'@'%' IDENTIFIED BY PASSWORD '*A142844DBF024D282D88FE19CB4D3FA13B1E96E0'
3753
CHANGE MASTER TO MASTER_PASSWORD = <secret>
3854
SET PASSWORD FOR `test_user4`@`localhost`=<secret>
3955
------ from table ------
4056
SELECT argument FROM mysql.general_log WHERE argument LIKE '%PASSWORD %';
4157
argument
42-
GRANT ALL PRIVILEGES ON *.* TO 'test_user1'@'%' IDENTIFIED BY PASSWORD '*8D15E74BC850D11573A52BE84B504DD0BA40C1E3'
58+
GRANT SELECT (f2), INSERT (f3), UPDATE (f2, f3, f1, f4), INDEX, ALTER ON `test`.`t1` TO 'test_user1'@'%' IDENTIFIED BY PASSWORD '*8D15E74BC850D11573A52BE84B504DD0BA40C1E3'
4359
CREATE USER 'test_user2'@'%' IDENTIFIED BY PASSWORD '*A142844DBF024D282D88FE19CB4D3FA13B1E96E0'
4460
CHANGE MASTER TO MASTER_PASSWORD = <secret>
4561
SET PASSWORD FOR `test_user4`@`localhost`=<secret>
@@ -54,6 +70,14 @@ argument
5470
SET NAMES 'latin1',@dummy:='B'
5571
SET NAMES 'latin1' COLLATE 'latin1_german2_ci'
5672
SET NAMES DEFAULT,@dummy:='c'
73+
SELECT argument FROM mysql.general_log WHERE argument LIKE 'GRANT %';
74+
argument
75+
GRANT SELECT (f2), INSERT (f3), UPDATE (f2, f3, f1, f4), INDEX, ALTER ON `test`.`t1` TO 'test_user1'@'%' IDENTIFIED BY PASSWORD '*8D15E74BC850D11573A52BE84B504DD0BA40C1E3'
76+
GRANT ALL PRIVILEGES ON PROCEDURE `test`.`proc_rewrite_1` TO 'test_user1'@'%'
77+
GRANT EXECUTE ON FUNCTION `test`.`func_rewrite_1` TO 'test_user1'@'%'
78+
GRANT USAGE ON `test`.* TO 'test_user3'@'localhost' REQUIRE SSL
79+
GRANT SELECT ON `test`.* TO 'test_user3'@'localhost' REQUIRE X509 WITH MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 2 MAX_CONNECTIONS_PER_HOUR 3 MAX_USER_CONNECTIONS 4
80+
GRANT SELECT ON `test`.* TO 'test_user3'@'localhost' REQUIRE NONE WITH GRANT OPTION
5781
------ done ------ see log_tables.test for more proof! :)
5882
Bug#13958454 -- show we print SET @a:=5, but SELECT (@a:=5)
5983
EXPLAIN EXTENDED SELECT @a=5,@b:=10,@c:=20,@d:=40+5,(@e:=80)+5;

mysql-test/t/rewrite_general_log.test

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,33 @@ SET GLOBAL log_output = 'FILE,TABLE';
1919
SET GLOBAL general_log= 'ON';
2020

2121
# SET NAMES / SET CHARSET
22-
# keep these in lower case we can tell them from the upper case rewrites!
22+
# keep these in lower case so we can tell them from the upper case rewrites!
2323
set character set 'hebrew';
2424
set charset default,@dummy='A';
2525
set names 'latin1',@dummy='B';
2626
set names 'latin1' collate 'latin1_german2_ci';
2727
set names default,@dummy='c';
2828

2929
# 1.1.1.1
30-
GRANT ALL on *.* TO test_user1 IDENTIFIED BY 'azundris1';
30+
31+
CREATE TABLE t1(f1 INT, f2 INT, f3 INT, f4 INT);
32+
CREATE PROCEDURE proc_rewrite_1() INSERT INTO test.t1 VALUES ("hocus pocus");
33+
CREATE FUNCTION func_rewrite_1(i INT) RETURNS INT DETERMINISTIC RETURN i+1;
34+
35+
GRANT SELECT(f2), INSERT(f3), INDEX, UPDATE(f1,f3, f2, f4), ALTER
36+
on test.t1 TO test_user1 IDENTIFIED BY 'azundris1';
37+
GRANT ALL ON PROCEDURE test.proc_rewrite_1 TO test_user1;
38+
GRANT EXECUTE ON FUNCTION test.func_rewrite_1 TO test_user1;
39+
GRANT USAGE ON TABLE test.* TO test_user3@localhost REQUIRE SSL;
40+
GRANT SELECT,USAGE ON test.* TO test_user3@localhost REQUIRE X509 WITH
41+
MAX_QUERIES_PER_HOUR 1 MAX_UPDATES_PER_HOUR 2
42+
MAX_CONNECTIONS_PER_HOUR 3 MAX_USER_CONNECTIONS 4;
43+
GRANT SELECT ON test.* TO test_user3@localhost REQUIRE NONE
44+
WITH GRANT OPTION;
45+
46+
DROP PROCEDURE proc_rewrite_1;
47+
DROP FUNCTION func_rewrite_1;
48+
DROP TABLE t1;
3149

3250
# 1.1.1.2
3351
CREATE USER test_user2 IDENTIFIED BY 'azundris2';
@@ -45,6 +63,7 @@ SET PASSWORD FOR 'test_user4'@'localhost' = PASSWORD('azundris4');
4563
SET GLOBAL general_log= 'OFF';
4664

4765
DROP USER 'test_user4'@'localhost';
66+
DROP USER 'test_user3'@'localhost';
4867
DROP USER test_user2;
4968
DROP USER test_user1;
5069

@@ -72,6 +91,7 @@ SELECT argument FROM mysql.general_log WHERE argument LIKE '%PASSWORD %';
7291
--echo ------ rewrite ------
7392
SELECT argument FROM mysql.general_log WHERE argument LIKE 'SET CHARACTER SET %';
7493
SELECT argument FROM mysql.general_log WHERE argument LIKE 'SET NAMES %';
94+
SELECT argument FROM mysql.general_log WHERE argument LIKE 'GRANT %';
7595
--echo ------ done ------ see log_tables.test for more proof! :)
7696

7797
--echo Bug#13958454 -- show we print SET @a:=5, but SELECT (@a:=5)

sql/sql_rewrite.cc

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,22 @@
1616
02110-1301 USA */
1717

1818

19+
/*
20+
In here, we rewrite queries (to obfuscate passwords etc.) that need it
21+
before we log them.
22+
23+
Stored procedures may also rewrite their statements (to show the actual
24+
values of their variables etc.). There is currently no scenario where
25+
a statement can be eligible for both rewrites. (see sp_instr.cc)
26+
Special consideration will need to be taken if this assertion is changed.
27+
28+
We also do not intersect with query cache at this time, as QC only
29+
caches SELECTs (which we don't rewrite). If and when QC becomes more
30+
general, it should probably cache the rewritten query along with the
31+
user-submitted one. (see sql_parse.cc)
32+
*/
33+
34+
1935
#include "sql_acl.h" // append_user
2036
#include "sql_parse.h" // get_current_user
2137
#include "sql_show.h" // append_identifier
@@ -39,7 +55,7 @@ static void mysql_rewrite_grant(THD *thd, String *rlb)
3955
{
4056
ulong priv;
4157

42-
for (c= 0, priv = SELECT_ACL; priv <= GLOBAL_ACLS; c++, priv <<= 1)
58+
for (c= 0, priv= SELECT_ACL; priv <= GLOBAL_ACLS; c++, priv <<= 1)
4359
{
4460
if (priv == GRANT_ACL)
4561
continue;
@@ -54,7 +70,13 @@ static void mysql_rewrite_grant(THD *thd, String *rlb)
5470
cols.length(0);
5571
cols.append(STRING_WITH_LEN(" ("));
5672

57-
while ((column = column_iter++))
73+
/*
74+
If the statement was GRANT SELECT(f2), INSERT(f3), UPDATE(f1,f3, f2),
75+
our list cols will contain the order f2, f3, f1, and thus that's
76+
the order we'll recreate the privilege: UPDATE (f2, f3, f1)
77+
*/
78+
79+
while ((column= column_iter++))
5880
{
5981
if (column->rights & priv)
6082
{
@@ -95,12 +117,14 @@ static void mysql_rewrite_grant(THD *thd, String *rlb)
95117
{
96118
append_identifier(thd, rlb, first_table->db, strlen(first_table->db));
97119
rlb->append(STRING_WITH_LEN("."));
98-
append_identifier(thd, rlb, first_table->table_name, strlen(first_table->table_name));
120+
append_identifier(thd, rlb, first_table->table_name,
121+
strlen(first_table->table_name));
99122
}
100123
else
101124
{
102125
if (lex->current_select->db)
103-
append_identifier(thd, rlb, lex->current_select->db, strlen(lex->current_select->db));
126+
append_identifier(thd, rlb, lex->current_select->db,
127+
strlen(lex->current_select->db));
104128
else
105129
rlb->append("*");
106130
rlb->append(STRING_WITH_LEN(".*"));

0 commit comments

Comments
 (0)