969 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			969 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | # | ||
|  | # Testing SQL SECURITY of stored procedures | ||
|  | # | ||
|  | 
 | ||
|  | # Can't test with embedded server that doesn't support grants | ||
|  | -- source include/not_embedded.inc | ||
|  | 
 | ||
|  | # Save the initial number of concurrent sessions | ||
|  | --source include/count_sessions.inc | ||
|  | 
 | ||
|  | connect (con1root,localhost,root,,); | ||
|  | 
 | ||
|  | connection con1root; | ||
|  | use test; | ||
|  | 
 | ||
|  | # Create user user1 with no particular access rights | ||
|  | grant usage on *.* to user1@localhost; | ||
|  | flush privileges; | ||
|  | 
 | ||
|  | --disable_warnings | ||
|  | drop table if exists t1; | ||
|  | drop database if exists db1_secret; | ||
|  | --enable_warnings | ||
|  | # Create our secret database | ||
|  | create database db1_secret; | ||
|  | 
 | ||
|  | # Can create a procedure in other db | ||
|  | create procedure db1_secret.dummy() begin end; | ||
|  | drop procedure db1_secret.dummy; | ||
|  | 
 | ||
|  | use db1_secret; | ||
|  | 
 | ||
|  | create table t1 ( u varchar(64), i int ); | ||
|  | insert into t1 values('test', 0); | ||
|  | 
 | ||
|  | # A test procedure and function | ||
|  | create procedure stamp(i int) | ||
|  |   insert into db1_secret.t1 values (user(), i); | ||
|  | --replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00' | ||
|  | show procedure status like 'stamp'; | ||
|  | 
 | ||
|  | delimiter |; | ||
|  | create function db() returns varchar(64) | ||
|  | begin | ||
|  |   declare v varchar(64); | ||
|  | 
 | ||
|  |   select u into v from t1 limit 1; | ||
|  | 
 | ||
|  |   return v; | ||
|  | end| | ||
|  | delimiter ;| | ||
|  | --replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00' | ||
|  | show function status like 'db'; | ||
|  | 
 | ||
|  | # root can, of course | ||
|  | call stamp(1); | ||
|  | select * from t1; | ||
|  | select db(); | ||
|  | 
 | ||
|  | grant execute on procedure db1_secret.stamp to user1@'%'; | ||
|  | grant execute on function db1_secret.db to user1@'%'; | ||
|  | grant execute on procedure db1_secret.stamp to ''@'%'; | ||
|  | grant execute on function db1_secret.db to ''@'%'; | ||
|  | 
 | ||
|  | connect (con2user1,localhost,user1,,); | ||
|  | connect (con3anon,localhost,anon,,); | ||
|  | 
 | ||
|  | 
 | ||
|  | # | ||
|  | # User1 can | ||
|  | # | ||
|  | connection con2user1; | ||
|  | 
 | ||
|  | # This should work... | ||
|  | call db1_secret.stamp(2); | ||
|  | select db1_secret.db(); | ||
|  | 
 | ||
|  | # ...but not this | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | select * from db1_secret.t1; | ||
|  | 
 | ||
|  | # ...and not this | ||
|  | --error ER_DBACCESS_DENIED_ERROR | ||
|  | create procedure db1_secret.dummy() begin end; | ||
|  | --error ER_SP_DOES_NOT_EXIST | ||
|  | drop procedure db1_secret.dummy; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | drop procedure db1_secret.stamp; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | drop function db1_secret.db; | ||
|  | 
 | ||
|  | 
 | ||
|  | # | ||
|  | # Anonymous can | ||
|  | # | ||
|  | connection con3anon; | ||
|  | 
 | ||
|  | # This should work... | ||
|  | call db1_secret.stamp(3); | ||
|  | select db1_secret.db(); | ||
|  | 
 | ||
|  | # ...but not this | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | select * from db1_secret.t1; | ||
|  | 
 | ||
|  | # ...and not this | ||
|  | --error ER_DBACCESS_DENIED_ERROR | ||
|  | create procedure db1_secret.dummy() begin end; | ||
|  | --error ER_SP_DOES_NOT_EXIST | ||
|  | drop procedure db1_secret.dummy; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | drop procedure db1_secret.stamp; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | drop function db1_secret.db; | ||
|  | 
 | ||
|  | 
 | ||
|  | # | ||
|  | # Check it out | ||
|  | # | ||
|  | connection con1root; | ||
|  | select * from t1; | ||
|  | 
 | ||
|  | # | ||
|  | # Change to invoker's rights | ||
|  | # | ||
|  | alter procedure stamp sql security invoker; | ||
|  | --replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00' | ||
|  | show procedure status like 'stamp'; | ||
|  | 
 | ||
|  | alter function db sql security invoker; | ||
|  | --replace_column 5 '0000-00-00 00:00:00' 6 '0000-00-00 00:00:00' | ||
|  | show function status like 'db'; | ||
|  | 
 | ||
|  | # root still can | ||
|  | call stamp(4); | ||
|  | select * from t1; | ||
|  | select db(); | ||
|  | 
 | ||
|  | # | ||
|  | # User1 cannot | ||
|  | # | ||
|  | connection con2user1; | ||
|  | 
 | ||
|  | # This should not work | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | call db1_secret.stamp(5); | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | select db1_secret.db(); | ||
|  | 
 | ||
|  | # | ||
|  | # Anonymous cannot | ||
|  | # | ||
|  | connection con3anon; | ||
|  | 
 | ||
|  | # This should not work | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | call db1_secret.stamp(6); | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | select db1_secret.db(); | ||
|  | 
 | ||
|  | # | ||
|  | # Bug#2777 Stored procedure doesn't observe definer's rights | ||
|  | # | ||
|  | 
 | ||
|  | connection con1root; | ||
|  | --disable_warnings | ||
|  | drop database if exists db2; | ||
|  | --enable_warnings | ||
|  | create database db2; | ||
|  | 
 | ||
|  | use db2; | ||
|  | 
 | ||
|  | create table t2 (s1 int); | ||
|  | insert into t2 values (0); | ||
|  | 
 | ||
|  | grant usage on db2.* to user1@localhost; | ||
|  | grant select on db2.* to user1@localhost; | ||
|  | grant usage on db2.* to user2@localhost; | ||
|  | grant select,insert,update,delete,create routine on db2.* to user2@localhost; | ||
|  | grant create routine on db2.* to user1@localhost; | ||
|  | flush privileges; | ||
|  | 
 | ||
|  | connection con2user1; | ||
|  | use db2; | ||
|  | 
 | ||
|  | create procedure p () insert into t2 values (1); | ||
|  | 
 | ||
|  | # Check that this doesn't work. | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | call p(); | ||
|  | 
 | ||
|  | connect (con4user2,localhost,user2,,); | ||
|  | 
 | ||
|  | connection con4user2; | ||
|  | use db2; | ||
|  | 
 | ||
|  | # This should not work, since p is executed with definer's (user1's) rights. | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | call p(); | ||
|  | select * from t2; | ||
|  | 
 | ||
|  | create procedure q () insert into t2 values (2); | ||
|  | 
 | ||
|  | call q(); | ||
|  | select * from t2; | ||
|  | 
 | ||
|  | connection con1root; | ||
|  | grant usage on procedure db2.q to user2@localhost with grant option; | ||
|  | 
 | ||
|  | connection con4user2; | ||
|  | grant execute on procedure db2.q to user1@localhost; | ||
|  | 
 | ||
|  | connection con2user1; | ||
|  | use db2; | ||
|  | 
 | ||
|  | # This should work | ||
|  | call q(); | ||
|  | select * from t2; | ||
|  | 
 | ||
|  | # | ||
|  | # Bug#6030 Stored procedure has no appropriate DROP privilege | ||
|  | # (or ALTER for that matter) | ||
|  | 
 | ||
|  | # still connection con2user1 in db2 | ||
|  | 
 | ||
|  | # This should work: | ||
|  | alter procedure p modifies sql data; | ||
|  | drop procedure p; | ||
|  | 
 | ||
|  | # This should NOT work | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | alter procedure q modifies sql data; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | drop procedure q; | ||
|  | 
 | ||
|  | connection con1root; | ||
|  | use db2; | ||
|  | # But root always can | ||
|  | alter procedure q modifies sql data; | ||
|  | drop procedure q; | ||
|  | 
 | ||
|  | 
 | ||
|  | # Clean up | ||
|  | #Still connection con1root; | ||
|  | disconnect con2user1; | ||
|  | disconnect con3anon; | ||
|  | disconnect con4user2; | ||
|  | use test; | ||
|  | select type,db,name from mysql.proc where db like 'db%'; | ||
|  | drop database db1_secret; | ||
|  | drop database db2; | ||
|  | # Make sure the routines are gone | ||
|  | select type,db,name from mysql.proc where db like 'db%'; | ||
|  | # Get rid of the users | ||
|  | delete from mysql.user where user='user1' or user='user2'; | ||
|  | delete from mysql.user where user='' and host='%'; | ||
|  | # And any routine privileges | ||
|  | delete from mysql.procs_priv where user='user1' or user='user2'; | ||
|  | # Delete the grants to user ''@'%' that was created above | ||
|  | delete from mysql.procs_priv where user='' and host='%'; | ||
|  | delete from mysql.db where user='user2'; | ||
|  | flush privileges; | ||
|  | # | ||
|  | # Test the new security acls | ||
|  | # | ||
|  | grant usage on *.* to usera@localhost; | ||
|  | grant usage on *.* to userb@localhost; | ||
|  | grant usage on *.* to userc@localhost; | ||
|  | create database sptest; | ||
|  | create table t1 ( u varchar(64), i int ); | ||
|  | create procedure sptest.p1(i int) insert into test.t1 values (user(), i); | ||
|  | grant insert on t1 to usera@localhost; | ||
|  | grant execute on procedure sptest.p1 to usera@localhost; | ||
|  | show grants for usera@localhost; | ||
|  | grant execute on procedure sptest.p1 to userc@localhost with grant option; | ||
|  | show grants for userc@localhost; | ||
|  | 
 | ||
|  | connect (con2usera,localhost,usera,,); | ||
|  | connect (con3userb,localhost,userb,,); | ||
|  | connect (con4userc,localhost,userc,,); | ||
|  | 
 | ||
|  | connection con2usera; | ||
|  | call sptest.p1(1); | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | grant execute on procedure sptest.p1 to userb@localhost; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | drop procedure sptest.p1; | ||
|  | 
 | ||
|  | connection con3userb; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | call sptest.p1(2); | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | grant execute on procedure sptest.p1 to userb@localhost; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | drop procedure sptest.p1; | ||
|  | 
 | ||
|  | connection con4userc; | ||
|  | call sptest.p1(3); | ||
|  | grant execute on procedure sptest.p1 to userb@localhost; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | drop procedure sptest.p1; | ||
|  | 
 | ||
|  | connection con3userb; | ||
|  | call sptest.p1(4); | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | grant execute on procedure sptest.p1 to userb@localhost; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | drop procedure sptest.p1; | ||
|  | 
 | ||
|  | connection con1root; | ||
|  | select * from t1; | ||
|  | 
 | ||
|  | grant all privileges on procedure sptest.p1 to userc@localhost; | ||
|  | show grants for userc@localhost; | ||
|  | show grants for userb@localhost; | ||
|  | 
 | ||
|  | connection con4userc; | ||
|  | revoke all privileges on procedure sptest.p1 from userb@localhost; | ||
|  | 
 | ||
|  | connection con1root; | ||
|  | show grants for userb@localhost; | ||
|  | 
 | ||
|  | #cleanup | ||
|  | disconnect con4userc; | ||
|  | disconnect con3userb; | ||
|  | disconnect con2usera; | ||
|  | use test; | ||
|  | drop database sptest; | ||
|  | delete from mysql.user where user='usera' or user='userb' or user='userc'; | ||
|  | delete from mysql.procs_priv where user='usera' or user='userb' or user='userc'; | ||
|  | delete from mysql.tables_priv where user='usera'; | ||
|  | flush privileges; | ||
|  | drop table t1; | ||
|  | 
 | ||
|  | # | ||
|  | # Bug#9503 reseting correct parameters of thread after error in SP function | ||
|  | # | ||
|  | connect (root,localhost,root,,test); | ||
|  | connection root; | ||
|  | 
 | ||
|  | --disable_warnings | ||
|  | drop function if exists bug_9503; | ||
|  | --enable_warnings | ||
|  | delimiter //; | ||
|  | create database mysqltest// | ||
|  | use mysqltest// | ||
|  | create table t1 (s1 int)// | ||
|  | grant select on t1 to user1@localhost// | ||
|  | create function bug_9503 () returns int sql security invoker begin declare v int; | ||
|  | select min(s1) into v from t1; return v; end// | ||
|  | delimiter ;// | ||
|  | 
 | ||
|  | connect (user1,localhost,user1,,test); | ||
|  | connection user1; | ||
|  | use mysqltest; | ||
|  | -- error ER_PROCACCESS_DENIED_ERROR | ||
|  | select bug_9503(); | ||
|  | 
 | ||
|  | connection root; | ||
|  | grant execute on function bug_9503 to user1@localhost; | ||
|  | 
 | ||
|  | connection user1; | ||
|  | do 1; | ||
|  | use test; | ||
|  | 
 | ||
|  | disconnect user1; | ||
|  | connection root; | ||
|  | REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1@localhost; | ||
|  | drop function bug_9503; | ||
|  | use test; | ||
|  | drop database mysqltest; | ||
|  | connection default; | ||
|  | disconnect root; | ||
|  | 
 | ||
|  | # | ||
|  | # correct value from current_user() in function run from "security definer" | ||
|  | # (Bug#7291 Stored procedures: wrong CURRENT_USER value) | ||
|  | # | ||
|  | connection con1root; | ||
|  | use test; | ||
|  | 
 | ||
|  | select current_user(); | ||
|  | select user(); | ||
|  | create procedure bug7291_0 () sql security invoker select current_user(), user(); | ||
|  | create procedure bug7291_1 () sql security definer call bug7291_0(); | ||
|  | create procedure bug7291_2 () sql security invoker call bug7291_0(); | ||
|  | grant execute on procedure bug7291_0 to user1@localhost; | ||
|  | grant execute on procedure bug7291_1 to user1@localhost; | ||
|  | grant execute on procedure bug7291_2 to user1@localhost; | ||
|  | 
 | ||
|  | connect (user1,localhost,user1,,); | ||
|  | connection user1; | ||
|  | 
 | ||
|  | call bug7291_2(); | ||
|  | call bug7291_1(); | ||
|  | 
 | ||
|  | connection con1root; | ||
|  | drop procedure bug7291_1; | ||
|  | drop procedure bug7291_2; | ||
|  | drop procedure bug7291_0; | ||
|  | disconnect user1; | ||
|  | REVOKE ALL PRIVILEGES, GRANT OPTION FROM user1@localhost; | ||
|  | drop user user1@localhost; | ||
|  | 
 | ||
|  | # | ||
|  | # Bug#12318 Wrong error message when accessing an inaccessible stored | ||
|  | # procedure in another database when the current database is | ||
|  | # information_schema. | ||
|  | # | ||
|  | 
 | ||
|  | --disable_warnings | ||
|  | drop database if exists mysqltest_1; | ||
|  | --enable_warnings | ||
|  | 
 | ||
|  | create database mysqltest_1; | ||
|  | delimiter //; | ||
|  | create procedure mysqltest_1.p1() | ||
|  | begin | ||
|  |    select 1 from dual; | ||
|  | end// | ||
|  | delimiter ;// | ||
|  | 
 | ||
|  | grant usage on *.* to mysqltest_1@localhost; | ||
|  | 
 | ||
|  | connect (n1,localhost,mysqltest_1,,information_schema,$MASTER_MYPORT,$MASTER_MYSOCK); | ||
|  | connection n1; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | call mysqltest_1.p1(); | ||
|  | disconnect n1; | ||
|  | # Test also without a current database | ||
|  | connect (n2,localhost,mysqltest_1,,*NO-ONE*,$MASTER_MYPORT,$MASTER_MYSOCK); | ||
|  | connection n2; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | call mysqltest_1.p1(); | ||
|  | disconnect n2; | ||
|  | 
 | ||
|  | connection default; | ||
|  | 
 | ||
|  | drop procedure mysqltest_1.p1; | ||
|  | drop database mysqltest_1; | ||
|  | 
 | ||
|  | revoke usage on *.* from mysqltest_1@localhost; | ||
|  | drop user mysqltest_1@localhost; | ||
|  | 
 | ||
|  | # | ||
|  | # Bug#12812 create view calling a function works without execute right | ||
|  | #           on function | ||
|  | delimiter |; | ||
|  | --disable_warnings | ||
|  | drop function if exists bug12812| | ||
|  | --enable_warnings | ||
|  | create function bug12812() returns char(2) | ||
|  | begin | ||
|  |   return 'ok'; | ||
|  | end; | ||
|  | create user user_bug12812@localhost IDENTIFIED BY 'ABC'| | ||
|  | --replace_result $MASTER_MYPORT MYSQL_PORT $MASTER_MYSOCK MYSQL_SOCK | ||
|  | connect (test_user_12812,localhost,user_bug12812,ABC,test)| | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | SELECT test.bug12812()| | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | CREATE VIEW v1 AS SELECT test.bug12812()| | ||
|  | # Cleanup | ||
|  | connection default| | ||
|  | disconnect test_user_12812| | ||
|  | DROP USER user_bug12812@localhost| | ||
|  | drop function bug12812| | ||
|  | delimiter ;| | ||
|  | 
 | ||
|  | 
 | ||
|  | # | ||
|  | # Bug#14834 Server denies to execute Stored Procedure | ||
|  | # | ||
|  | # The problem here was with '_' in the database name. | ||
|  | # | ||
|  | create database db_bug14834; | ||
|  | 
 | ||
|  | create user user1_bug14834@localhost identified by ''; | ||
|  | # The exact name of the database (no wildcard) | ||
|  | grant all on `db\_bug14834`.* to user1_bug14834@localhost; | ||
|  | 
 | ||
|  | create user user2_bug14834@localhost identified by ''; | ||
|  | # The exact name of the database (no wildcard) | ||
|  | grant all on `db\_bug14834`.* to user2_bug14834@localhost; | ||
|  | 
 | ||
|  | create user user3_bug14834@localhost identified by ''; | ||
|  | # Wildcards in the database name | ||
|  | grant all on `db__ug14834`.* to user3_bug14834@localhost; | ||
|  | 
 | ||
|  | connect (user1_bug14834,localhost,user1_bug14834,,db_bug14834); | ||
|  | # Create the procedure and check that we can call it | ||
|  | create procedure p_bug14834() select user(), current_user(); | ||
|  | call p_bug14834(); | ||
|  | 
 | ||
|  | connect (user2_bug14834,localhost,user2_bug14834,,db_bug14834); | ||
|  | # This didn't work before | ||
|  | call p_bug14834(); | ||
|  | 
 | ||
|  | connect (user3_bug14834,localhost,user3_bug14834,,db_bug14834); | ||
|  | # Should also work | ||
|  | call p_bug14834(); | ||
|  | 
 | ||
|  | # Cleanup | ||
|  | connection default; | ||
|  | disconnect user1_bug14834; | ||
|  | disconnect user2_bug14834; | ||
|  | disconnect user3_bug14834; | ||
|  | drop user user1_bug14834@localhost; | ||
|  | drop user user2_bug14834@localhost; | ||
|  | drop user user3_bug14834@localhost; | ||
|  | drop database db_bug14834; | ||
|  | 
 | ||
|  | 
 | ||
|  | # | ||
|  | # Bug#14533 'desc tbl' in stored procedure causes error | ||
|  | # ER_TABLEACCESS_DENIED_ERROR | ||
|  | # | ||
|  | create database db_bug14533; | ||
|  | use db_bug14533; | ||
|  | create table t1 (id int); | ||
|  | create user user_bug14533@localhost identified by ''; | ||
|  | 
 | ||
|  | create procedure bug14533_1() | ||
|  |     sql security definer | ||
|  |   desc db_bug14533.t1; | ||
|  | 
 | ||
|  | create procedure bug14533_2() | ||
|  |     sql security definer | ||
|  |    select * from db_bug14533.t1; | ||
|  | 
 | ||
|  | grant execute on procedure db_bug14533.bug14533_1 to user_bug14533@localhost; | ||
|  | grant execute on procedure db_bug14533.bug14533_2 to user_bug14533@localhost; | ||
|  | 
 | ||
|  | connect (user_bug14533,localhost,user_bug14533,,test); | ||
|  | 
 | ||
|  | # These should work | ||
|  | call db_bug14533.bug14533_1(); | ||
|  | call db_bug14533.bug14533_2(); | ||
|  | 
 | ||
|  | # For reference, these should not work | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | desc db_bug14533.t1; | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | select * from db_bug14533.t1; | ||
|  | 
 | ||
|  | # Cleanup | ||
|  | connection default; | ||
|  | disconnect user_bug14533; | ||
|  | drop user user_bug14533@localhost; | ||
|  | drop database db_bug14533; | ||
|  | 
 | ||
|  | 
 | ||
|  | # | ||
|  | # WL#2897 Complete definer support in the stored routines. | ||
|  | # | ||
|  | # The following cases are tested: | ||
|  | #   1. check that if DEFINER-clause is not explicitly specified, stored routines | ||
|  | #     are created with CURRENT_USER privileges; | ||
|  | #   2. check that if DEFINER-clause specifies non-current user, SUPER privilege | ||
|  | #     is required to create a stored routine; | ||
|  | #   3. check that if DEFINER-clause specifies non-existent user, a warning is | ||
|  | #     emitted. | ||
|  | #   4. check that SHOW CREATE PROCEDURE | FUNCTION works correctly; | ||
|  | # | ||
|  | # The following cases are tested in other test suites: | ||
|  | #   - check that mysqldump dumps new attribute correctly; | ||
|  | #   - check that slave replicates CREATE-statements with explicitly specified | ||
|  | #     DEFINER correctly. | ||
|  | # | ||
|  | 
 | ||
|  | # Setup the environment. | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: root | ||
|  | --connection con1root | ||
|  | 
 | ||
|  | --disable_warnings | ||
|  | DROP DATABASE IF EXISTS mysqltest; | ||
|  | --enable_warnings | ||
|  | 
 | ||
|  | CREATE DATABASE mysqltest; | ||
|  | 
 | ||
|  | CREATE USER mysqltest_1@localhost; | ||
|  | GRANT ALL PRIVILEGES ON mysqltest.* TO mysqltest_1@localhost; | ||
|  | 
 | ||
|  | CREATE USER mysqltest_2@localhost; | ||
|  | GRANT SUPER ON *.* TO mysqltest_2@localhost; | ||
|  | GRANT ALL PRIVILEGES ON mysqltest.* TO mysqltest_2@localhost; | ||
|  | 
 | ||
|  | --connect (mysqltest_2_con,localhost,mysqltest_2,,mysqltest) | ||
|  | --connect (mysqltest_1_con,localhost,mysqltest_1,,mysqltest) | ||
|  | 
 | ||
|  | # test case (1). | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: mysqltest_2_con | ||
|  | --connection mysqltest_2_con | ||
|  | 
 | ||
|  | USE mysqltest; | ||
|  | 
 | ||
|  | CREATE PROCEDURE wl2897_p1() SELECT 1; | ||
|  | 
 | ||
|  | CREATE FUNCTION wl2897_f1() RETURNS INT RETURN 1; | ||
|  | 
 | ||
|  | # test case (2). | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: mysqltest_1_con | ||
|  | --connection mysqltest_1_con | ||
|  | 
 | ||
|  | USE mysqltest; | ||
|  | 
 | ||
|  | --error ER_SPECIFIC_ACCESS_DENIED_ERROR | ||
|  | CREATE DEFINER=root@localhost PROCEDURE wl2897_p2() SELECT 2; | ||
|  | 
 | ||
|  | --error ER_SPECIFIC_ACCESS_DENIED_ERROR | ||
|  | CREATE DEFINER=root@localhost FUNCTION wl2897_f2() RETURNS INT RETURN 2; | ||
|  | 
 | ||
|  | # test case (3). | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: mysqltest_2_con | ||
|  | --connection mysqltest_2_con | ||
|  | 
 | ||
|  | use mysqltest; | ||
|  | 
 | ||
|  | CREATE DEFINER='a @ b @ c'@localhost PROCEDURE wl2897_p3() SELECT 3; | ||
|  | 
 | ||
|  | CREATE DEFINER='a @ b @ c'@localhost FUNCTION wl2897_f3() RETURNS INT RETURN 3; | ||
|  | 
 | ||
|  | # test case (4). | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: con1root | ||
|  | --connection con1root | ||
|  | 
 | ||
|  | USE mysqltest; | ||
|  | 
 | ||
|  | SHOW CREATE PROCEDURE wl2897_p1; | ||
|  | SHOW CREATE PROCEDURE wl2897_p3; | ||
|  | 
 | ||
|  | SHOW CREATE FUNCTION wl2897_f1; | ||
|  | SHOW CREATE FUNCTION wl2897_f3; | ||
|  | 
 | ||
|  | # Cleanup. | ||
|  | 
 | ||
|  | DROP USER mysqltest_1@localhost; | ||
|  | DROP USER mysqltest_2@localhost; | ||
|  | 
 | ||
|  | DROP DATABASE mysqltest; | ||
|  | 
 | ||
|  | --disconnect mysqltest_1_con | ||
|  | --disconnect mysqltest_2_con | ||
|  | 
 | ||
|  | 
 | ||
|  | # | ||
|  | # Bug#13198 SP executes if definer does not exist | ||
|  | # | ||
|  | 
 | ||
|  | # Prepare environment. | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: root | ||
|  | --connection con1root | ||
|  | 
 | ||
|  | --disable_warnings | ||
|  | DROP DATABASE IF EXISTS mysqltest; | ||
|  | --enable_warnings | ||
|  | 
 | ||
|  | CREATE DATABASE mysqltest; | ||
|  | 
 | ||
|  | CREATE USER mysqltest_1@localhost; | ||
|  | GRANT ALL PRIVILEGES ON mysqltest.* TO mysqltest_1@localhost; | ||
|  | 
 | ||
|  | CREATE USER mysqltest_2@localhost; | ||
|  | GRANT ALL PRIVILEGES ON mysqltest.* TO mysqltest_2@localhost; | ||
|  | 
 | ||
|  | --connect (mysqltest_1_con,localhost,mysqltest_1,,mysqltest) | ||
|  | --connect (mysqltest_2_con,localhost,mysqltest_2,,mysqltest) | ||
|  | 
 | ||
|  | # Create a procedure/function under u1. | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: mysqltest_1_con | ||
|  | --connection mysqltest_1_con | ||
|  | 
 | ||
|  | USE mysqltest; | ||
|  | 
 | ||
|  | CREATE PROCEDURE bug13198_p1() | ||
|  |   SELECT 1; | ||
|  | 
 | ||
|  | CREATE FUNCTION bug13198_f1() RETURNS INT | ||
|  |   RETURN 1; | ||
|  | 
 | ||
|  | CALL bug13198_p1(); | ||
|  | 
 | ||
|  | SELECT bug13198_f1(); | ||
|  | 
 | ||
|  | # Check that u2 can call the procedure/function. | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: mysqltest_2_con | ||
|  | --connection mysqltest_2_con | ||
|  | 
 | ||
|  | USE mysqltest; | ||
|  | 
 | ||
|  | CALL bug13198_p1(); | ||
|  | 
 | ||
|  | SELECT bug13198_f1(); | ||
|  | 
 | ||
|  | # Drop user u1 (definer of the object); | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: root | ||
|  | --connection con1root | ||
|  | 
 | ||
|  | --disconnect mysqltest_1_con | ||
|  | 
 | ||
|  | DROP USER mysqltest_1@localhost; | ||
|  | 
 | ||
|  | # Check that u2 can not call the procedure/function. | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: mysqltest_2_con | ||
|  | --connection mysqltest_2_con | ||
|  | 
 | ||
|  | USE mysqltest; | ||
|  | 
 | ||
|  | --error ER_NO_SUCH_USER | ||
|  | CALL bug13198_p1(); | ||
|  | 
 | ||
|  | --error ER_NO_SUCH_USER | ||
|  | SELECT bug13198_f1(); | ||
|  | 
 | ||
|  | # Cleanup. | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: root | ||
|  | --connection con1root | ||
|  | 
 | ||
|  | --disconnect mysqltest_2_con | ||
|  | 
 | ||
|  | DROP USER mysqltest_2@localhost; | ||
|  | 
 | ||
|  | DROP DATABASE mysqltest; | ||
|  | 
 | ||
|  | # | ||
|  | # Bug#19857 When a user with CREATE ROUTINE priv creates a routine, | ||
|  | #           it results in NULL p/w | ||
|  | # | ||
|  | 
 | ||
|  | # Can't test with embedded server that doesn't support grants | ||
|  | 
 | ||
|  | GRANT USAGE ON *.* TO user19857@localhost IDENTIFIED BY 'meow'; | ||
|  | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ROUTINE, ALTER ROUTINE ON test.* TO | ||
|  | user19857@localhost; | ||
|  | SELECT Host,User,Password FROM mysql.user WHERE User='user19857'; | ||
|  | 
 | ||
|  | --connect (mysqltest_2_con,localhost,user19857,meow,test) | ||
|  | --echo | ||
|  | --echo ---> connection: mysqltest_2_con | ||
|  | --connection mysqltest_2_con | ||
|  | 
 | ||
|  | USE test; | ||
|  | 
 | ||
|  | DELIMITER //; | ||
|  |   CREATE PROCEDURE sp19857() DETERMINISTIC | ||
|  |   BEGIN | ||
|  |     DECLARE a INT; | ||
|  |     SET a=1; | ||
|  |     SELECT a; | ||
|  |   END // | ||
|  | DELIMITER ;// | ||
|  | 
 | ||
|  | SHOW CREATE PROCEDURE test.sp19857; | ||
|  | 
 | ||
|  | --disconnect mysqltest_2_con | ||
|  | --connect (mysqltest_2_con,localhost,user19857,meow,test) | ||
|  | --connection mysqltest_2_con | ||
|  | 
 | ||
|  | DROP PROCEDURE IF EXISTS test.sp19857; | ||
|  | 
 | ||
|  | --echo | ||
|  | --echo ---> connection: root | ||
|  | --connection con1root | ||
|  | 
 | ||
|  | --disconnect mysqltest_2_con | ||
|  | 
 | ||
|  | SELECT Host,User,Password FROM mysql.user WHERE User='user19857'; | ||
|  | 
 | ||
|  | DROP USER user19857@localhost; | ||
|  | 
 | ||
|  | --disconnect con1root | ||
|  | --connection default | ||
|  | use test; | ||
|  | 
 | ||
|  | # | ||
|  | # Bug#18630 Arguments of suid routine calculated in wrong security context | ||
|  | # | ||
|  | # Arguments of suid routines were calculated in definer's security | ||
|  | # context instead of caller's context thus creating security hole. | ||
|  | # | ||
|  | --disable_warnings | ||
|  | DROP TABLE IF EXISTS t1; | ||
|  | DROP VIEW IF EXISTS v1; | ||
|  | DROP FUNCTION IF EXISTS f_suid; | ||
|  | DROP PROCEDURE IF EXISTS p_suid; | ||
|  | DROP FUNCTION IF EXISTS f_evil; | ||
|  | --enable_warnings | ||
|  | DELETE FROM mysql.user WHERE user LIKE 'mysqltest\_%'; | ||
|  | DELETE FROM mysql.db WHERE user LIKE 'mysqltest\_%'; | ||
|  | DELETE FROM mysql.tables_priv WHERE user LIKE 'mysqltest\_%'; | ||
|  | DELETE FROM mysql.columns_priv WHERE user LIKE 'mysqltest\_%'; | ||
|  | FLUSH PRIVILEGES; | ||
|  | 
 | ||
|  | CREATE TABLE t1 (i INT); | ||
|  | CREATE FUNCTION f_suid(i INT) RETURNS INT SQL SECURITY DEFINER RETURN 0; | ||
|  | CREATE PROCEDURE p_suid(IN i INT) SQL SECURITY DEFINER SET @c:= 0; | ||
|  | 
 | ||
|  | CREATE USER mysqltest_u1@localhost; | ||
|  | # Thanks to this grant statement privileges of anonymous users on | ||
|  | # 'test' database are not applicable for mysqltest_u1@localhost. | ||
|  | GRANT EXECUTE ON test.* TO mysqltest_u1@localhost; | ||
|  | 
 | ||
|  | delimiter |; | ||
|  | CREATE DEFINER=mysqltest_u1@localhost FUNCTION f_evil () RETURNS INT | ||
|  |   SQL SECURITY INVOKER | ||
|  | BEGIN | ||
|  |   SET @a:= CURRENT_USER(); | ||
|  |   SET @b:= (SELECT COUNT(*) FROM t1); | ||
|  |   RETURN @b; | ||
|  | END| | ||
|  | delimiter ;| | ||
|  | 
 | ||
|  | CREATE SQL SECURITY INVOKER VIEW v1 AS SELECT f_evil(); | ||
|  | 
 | ||
|  | connect (conn1, localhost, mysqltest_u1,,); | ||
|  | 
 | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | SELECT COUNT(*) FROM t1; | ||
|  | 
 | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | SELECT f_evil(); | ||
|  | SELECT @a, @b; | ||
|  | 
 | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | SELECT f_suid(f_evil()); | ||
|  | SELECT @a, @b; | ||
|  | 
 | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | CALL p_suid(f_evil()); | ||
|  | SELECT @a, @b; | ||
|  | 
 | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | SELECT * FROM v1; | ||
|  | SELECT @a, @b; | ||
|  | 
 | ||
|  | disconnect conn1; | ||
|  | connection default; | ||
|  | 
 | ||
|  | DROP VIEW v1; | ||
|  | DROP FUNCTION f_evil; | ||
|  | DROP USER mysqltest_u1@localhost; | ||
|  | DROP PROCEDURE p_suid; | ||
|  | DROP FUNCTION f_suid; | ||
|  | DROP TABLE t1; | ||
|  | 
 | ||
|  | --echo # | ||
|  | --echo # Bug #48872 : Privileges for stored functions ignored if function name  | ||
|  | --echo #  is mixed case | ||
|  | --echo # | ||
|  | 
 | ||
|  | CREATE DATABASE B48872; | ||
|  | USE B48872; | ||
|  | CREATE TABLE `TestTab` (id INT); | ||
|  | INSERT INTO `TestTab` VALUES (1),(2); | ||
|  | CREATE FUNCTION `f_Test`() RETURNS INT RETURN 123; | ||
|  | CREATE FUNCTION `f_Test_denied`() RETURNS INT RETURN 123; | ||
|  | CREATE USER 'tester'; | ||
|  | CREATE USER 'Tester'; | ||
|  | GRANT SELECT ON TABLE `TestTab` TO 'tester'; | ||
|  | GRANT EXECUTE ON FUNCTION `f_Test` TO 'tester'; | ||
|  | GRANT EXECUTE ON FUNCTION `f_Test_denied` TO 'Tester'; | ||
|  | 
 | ||
|  | SELECT f_Test(); | ||
|  | SELECT * FROM TestTab; | ||
|  | 
 | ||
|  | CONNECT (con_tester,localhost,tester,,B48872); | ||
|  | CONNECT (con_tester_denied,localhost,Tester,,B48872); | ||
|  | CONNECTION con_tester; | ||
|  | 
 | ||
|  | SELECT * FROM TestTab; | ||
|  | SELECT `f_Test`(); | ||
|  | SELECT `F_TEST`(); | ||
|  | SELECT f_Test(); | ||
|  | SELECT F_TEST(); | ||
|  | 
 | ||
|  | CONNECTION con_tester_denied; | ||
|  | 
 | ||
|  | --disable_result_log | ||
|  | --error ER_TABLEACCESS_DENIED_ERROR | ||
|  | SELECT * FROM TestTab; | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | SELECT `f_Test`(); | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | SELECT `F_TEST`(); | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | SELECT f_Test(); | ||
|  | --error ER_PROCACCESS_DENIED_ERROR | ||
|  | SELECT F_TEST(); | ||
|  | --enable_result_log | ||
|  | SELECT `f_Test_denied`(); | ||
|  | SELECT `F_TEST_DENIED`(); | ||
|  | 
 | ||
|  | CONNECTION default; | ||
|  | DISCONNECT con_tester; | ||
|  | DISCONNECT con_tester_denied; | ||
|  | DROP TABLE `TestTab`; | ||
|  | DROP FUNCTION `f_Test`; | ||
|  | DROP FUNCTION `f_Test_denied`; | ||
|  | 
 | ||
|  | USE test; | ||
|  | DROP USER 'tester'; | ||
|  | DROP USER 'Tester'; | ||
|  | DROP DATABASE B48872; | ||
|  | 
 | ||
|  | --echo End of 5.0 tests. | ||
|  | 
 | ||
|  | --echo # | ||
|  | --echo # Bug#11882603 SELECT_ACL ON ANY COLUMN IN MYSQL.PROC ALLOWS TO SEE | ||
|  | --echo #              DEFINITION OF ANY ROUTINE.  | ||
|  | --echo # | ||
|  | 
 | ||
|  | --disable_warnings | ||
|  | DROP DATABASE IF EXISTS db1; | ||
|  | --enable_warnings | ||
|  | 
 | ||
|  | CREATE DATABASE db1; | ||
|  | CREATE PROCEDURE db1.p1() SELECT 1; | ||
|  | CREATE USER user2@localhost IDENTIFIED BY ''; | ||
|  | GRANT SELECT(db) ON mysql.proc TO user2@localhost; | ||
|  |   | ||
|  | --echo # Connection con2 as user2 | ||
|  | connect (con2, localhost, user2); | ||
|  | --echo # The statement below before disclosed info from body_utf8 column. | ||
|  | --error ER_SP_DOES_NOT_EXIST | ||
|  | SHOW CREATE PROCEDURE db1.p1; | ||
|  | 
 | ||
|  | --echo # Check that SHOW works with SELECT grant on whole table | ||
|  | --echo # Connection default | ||
|  | connection default; | ||
|  | GRANT SELECT ON mysql.proc TO user2@localhost; | ||
|  | 
 | ||
|  | --echo # Connection con2 | ||
|  | connection con2; | ||
|  | --echo # This should work | ||
|  | SHOW CREATE PROCEDURE db1.p1; | ||
|  | 
 | ||
|  | --echo # Connection default | ||
|  | connection default; | ||
|  | disconnect con2; | ||
|  | DROP USER user2@localhost; | ||
|  | DROP DATABASE db1; | ||
|  | 
 | ||
|  | 
 | ||
|  | # Wait till all disconnects are completed | ||
|  | --source include/wait_until_count_sessions.inc | ||
|  | 
 |