diff options
Diffstat (limited to 'tests/grant.pl')
-rw-r--r-- | tests/grant.pl | 545 |
1 files changed, 545 insertions, 0 deletions
diff --git a/tests/grant.pl b/tests/grant.pl new file mode 100644 index 00000000000..a34a2909897 --- /dev/null +++ b/tests/grant.pl @@ -0,0 +1,545 @@ +#!/usr/bin/perl +# +# Testing of grants. +# Note that this will delete all table and column grants ! +# + +use DBI; +use Getopt::Long; +use strict; + +use vars qw($dbh $user_dbh $opt_help $opt_Information $opt_force $opt_debug + $opt_verbose $opt_server $opt_root_user $opt_password $opt_user + $opt_database $opt_host $version $user $tables_cols $columns_cols); + +$version="1.0"; +$opt_help=$opt_Information=$opt_force=$opt_debug=$opt_verbose=0; +$opt_host="localhost", +$opt_server="mysql"; +$opt_root_user="root"; +$opt_password=""; +$opt_user="grant_user"; +$opt_database="grant_test"; + +GetOptions("Information","help","server=s","root-user=s","password=s","user","database=s","force","host=s","debug","verbose") || usage(); +usage() if ($opt_help || $opt_Information); + +$user="$opt_user\@$opt_host"; + +if (!$opt_force) +{ + print_info() +} + +$|=1; + +$tables_cols="Host, Db, User, Table_name, Grantor, Table_priv, Column_priv"; +$columns_cols="Host, Db, User, Table_name, Column_name, Column_priv"; + +# +# clear grant tables +# + +$dbh = DBI->connect("DBI:mysql:mysql:$opt_host;mysql_read_default_group=perl", + $opt_root_user,$opt_password, + { PrintError => 0}) || die "Can't connect to mysql server: $DBI::errstr\n"; + +safe_query("delete from user where user='$opt_user' or user='${opt_user}2'"); +safe_query("delete from db where user='$opt_user'"); +safe_query("delete from tables_priv"); +safe_query("delete from columns_priv"); +safe_query("lock tables mysql.user write"); # Test lock tables +safe_query("flush privileges"); +safe_query("unlock tables"); # should already be unlocked +safe_query("drop database $opt_database",2); +safe_query("create database $opt_database"); + +# check that the user can't login yet + +user_connect(1); +#goto test; + +# +# Test grants on user level +# + +safe_query("grant select on *.* to $user"); +safe_query("set password FOR ${opt_user}2\@$opt_host = password('test')",1); +safe_query("set password FOR $opt_user=password('test')"); +user_connect(1); +safe_query("set password FOR $opt_user=''"); +user_connect(0); +user_query("select * from mysql.user where user = '$opt_user'"); +user_query("select * from mysql.db where user = '$opt_user'"); +safe_query("grant select on *.* to $user,$user"); + +# The following should fail +user_query("insert into mysql.user (host,user) values ('error','$opt_user')",1); +user_query("update mysql.user set host='error' WHERE user='$opt_user'",1); +user_query("create table $opt_database.test (a int,b int)",1); +user_query("grant select on *.* to ${opt_user}2\@$opt_host",1); +safe_query("revoke select on $opt_database.test from $opt_user\@opt_host",1); +safe_query("revoke select on $opt_database.* from $opt_user\@opt_host",1); +safe_query("revoke select on *.* from $opt_user",1); +safe_query("grant select on $opt_database.not_exists to $opt_user",1); +safe_query("grant FILE on $opt_database.test to $opt_user",1); +safe_query("grant select on *.* to wrong___________user_name",1); +safe_query("grant select on $opt_database.* to wrong___________user_name",1); +user_query("grant select on $opt_database.test to $opt_user with grant option",1); +safe_query("set password FOR ''\@''=''",1); +user_query("set password FOR root\@$opt_host = password('test')",1); + +# Change privileges for user +safe_query("revoke select on *.* from $user"); +safe_query("grant create on *.* to $user"); +user_connect(0); +user_query("create table $opt_database.test (a int,b int)"); + +safe_query("grant select(c) on $opt_database.test to $user",1); +safe_query("revoke select(c) on $opt_database.test from $user",1); +safe_query("grant select on $opt_database.test to wrong___________user_name",1); +user_query("INSERT INTO $opt_database.test values (2,0)",1); + +safe_query("grant ALL PRIVILEGES on *.* to $user"); +safe_query("REVOKE INSERT on *.* from $user"); +user_connect(0); +user_query("INSERT INTO $opt_database.test values (1,0)",1); +safe_query("grant INSERT on *.* to $user"); +user_connect(0); +user_query("INSERT INTO $opt_database.test values (2,0)"); +user_query("select count(*) from $opt_database.test"); +safe_query("revoke SELECT on *.* from $user"); +user_connect(0); +user_query("select count(*) from $opt_database.test",1); +user_query("INSERT INTO $opt_database.test values (3,0)"); +safe_query("grant SELECT on *.* to $user"); +user_connect(0); +user_query("select count(*) from $opt_database.test"); +safe_query("revoke ALL PRIVILEGES on *.* from $user"); +user_connect(1); +safe_query("delete from user where user='$opt_user'"); +safe_query("flush privileges"); +if (0) # Only if no anonymous user on localhost. +{ + safe_query("grant select on *.* to $opt_user"); + user_connect(0); + safe_query("revoke select on *.* from $opt_user"); + user_connect(1); +} +safe_query("delete from user where user='$opt_user'"); +safe_query("flush privileges"); + +# +# Test grants on database level +# +safe_query("grant select on $opt_database.* to $user"); +safe_query("select * from mysql.user where user = '$opt_user'"); +safe_query("select * from mysql.db where user = '$opt_user'"); +user_connect(0); +user_query("select count(*) from $opt_database.test"); +# The following should fail +user_query("select * from mysql.user where user = '$opt_user'",1); +user_query("insert into $opt_database.test values (4,0)",1); +user_query("update $opt_database.test set a=1",1); +user_query("delete from $opt_database.test",1); +user_query("create table $opt_database.test2 (a int)",1); +user_query("ALTER TABLE $opt_database.test add c int",1); +user_query("CREATE INDEX dummy ON $opt_database.test (a)",1); +user_query("drop table $opt_database.test",1); +user_query("grant ALL PRIVILEGES on $opt_database.* to ${opt_user}2\@$opt_host",1); + +# Change privileges for user +safe_query("grant ALL PRIVILEGES on $opt_database.* to $user WITH GRANT OPTION"); +user_connect(0); +user_query("insert into $opt_database.test values (5,0)"); +safe_query("REVOKE ALL PRIVILEGES on * from $user",1); +safe_query("REVOKE ALL PRIVILEGES on *.* from $user"); +safe_query("REVOKE ALL PRIVILEGES on $opt_database.* from $user"); +safe_query("REVOKE ALL PRIVILEGES on $opt_database.* from $user"); +user_connect(0); +user_query("insert into $opt_database.test values (6,0)",1); +safe_query("REVOKE GRANT OPTION on $opt_database.* from $user"); +user_connect(1); +safe_query("grant ALL PRIVILEGES on $opt_database.* to $user"); + +user_connect(0); +user_query("select * from mysql.user where user = '$opt_user'",1); +user_query("insert into $opt_database.test values (7,0)"); +user_query("update $opt_database.test set a=3 where a=2"); +user_query("delete from $opt_database.test where a=3"); +user_query("create table $opt_database.test2 (a int not null)"); +user_query("alter table $opt_database.test2 add b int"); +user_query("create index dummy on $opt_database.test2 (a)"); +user_query("drop table $opt_database.test2"); +user_query("show tables"); + +# These should fail +user_query("insert into mysql.user (host,user) values ('error','$opt_user',0)",1); + +# Revoke database privileges +safe_query("revoke ALL PRIVILEGES on $opt_database.* from $user"); +safe_query("select * from mysql.user where user = '$opt_user'"); +safe_query("select * from mysql.db where user = '$opt_user'"); +user_connect(1); + +# +# Test of grants on table level +# + +safe_query("grant create on $opt_database.test2 to $user"); +user_connect(0); +user_query("create table $opt_database.test2 (a int not null)"); +user_query("show tables"); # Should only show test, not test2 +user_query("show columns from test",1); +user_query("show keys from test",1); +user_query("show columns from test2"); +user_query("show keys from test2"); +user_query("select * from test",1); +safe_query("grant insert on $opt_database.test to $user"); +user_query("show tables"); +user_query("insert into $opt_database.test values (8,0)"); +user_query("update $opt_database.test set b=1",1); +safe_query("grant update on $opt_database.test to $user"); +user_query("update $opt_database.test set b=2"); +user_query("delete from $opt_database.test",1); +safe_query("grant delete on $opt_database.test to $user"); +user_query("delete from $opt_database.test where a=1",1); +user_query("update $opt_database.test set b=3 where b=1",1); +user_query("update $opt_database.test set b=b+1",1); + +# Add one privilege at a time until the user has all privileges +user_query("select * from test",1); +safe_query("grant select on $opt_database.test to $user"); +user_query("delete from $opt_database.test where a=1"); +user_query("update $opt_database.test set b=2 where b=1"); +user_query("update $opt_database.test set b=b+1"); +user_query("select count(*) from test"); + +user_query("create table $opt_database.test3 (a int)",1); +user_query("alter table $opt_database.test2 add c int",1); +safe_query("grant alter on $opt_database.test2 to $user"); +user_query("alter table $opt_database.test2 add c int"); +user_query("create index dummy ON $opt_database.test (a)",1); +safe_query("grant index on $opt_database.test2 to $user"); +user_query("create index dummy ON $opt_database.test2 (a)"); +user_query("insert into test2 SELECT a,a from test",1); +safe_query("grant insert on test2 to $user",1); # No table: mysql.test2 +safe_query("grant insert(a) on $opt_database.test2 to $user"); +user_query("insert into test2 SELECT a,a from test",1); +safe_query("grant insert(c) on $opt_database.test2 to $user"); +user_query("insert into test2 SELECT a,a from test"); +user_query("select count(*) from test2,test",1); +user_query("select count(*) from test,test2",1); +user_query("replace into test2 SELECT a from test",1); +safe_query("grant update on $opt_database.test2 to $user"); +user_query("replace into test2 SELECT a,a from test",1); +safe_query("grant DELETE on $opt_database.test2 to $user"); +user_query("replace into test2 SELECT a,a from test"); +user_query("insert into test (a) SELECT a from test2",1); + +user_query("drop table $opt_database.test2",1); +user_query("grant select on $opt_database.test2 to $user with grant option",1); +safe_query("grant drop on $opt_database.test2 to $user with grant option"); +user_query("grant drop on $opt_database.test2 to $user with grant option"); +user_query("grant select on $opt_database.test2 to $user with grant option",1); +user_query("drop table $opt_database.test2"); + +# Check that the user doesn't have some user privileges +user_query("create database $opt_database",1); +user_query("drop database $opt_database",1); +user_query("flush tables",1); +safe_query("flush privileges"); + +safe_query("select $tables_cols from mysql.tables_priv"); +safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user"); +safe_query("revoke ALL PRIVILEGES on $opt_database.test2 from $user"); +safe_query("revoke GRANT OPTION on $opt_database.test2 from $user"); +safe_query("select $tables_cols from mysql.tables_priv"); + +user_query("select count(a) from test",1); + +# +# Test some grants on column level +# + +user_query("delete from $opt_database.test where a=2",1); +user_query("delete from $opt_database.test where A=2",1); +user_query("update test set b=5 where b>0",1); +safe_query("grant update(b),delete on $opt_database.test to $user"); +safe_query("revoke update(a) on $opt_database.test from $user",1); +user_query("delete from $opt_database.test where a=2",1); +user_query("update test set b=5 where b>0",1); +safe_query("grant select(a),select(b) on $opt_database.test to $user"); +user_query("delete from $opt_database.test where a=2"); +user_query("delete from $opt_database.test where A=2"); +user_query("update test set b=5 where b>0"); +user_query("update test set a=11 where b>5",1); +user_query("select a,A from test"); + +safe_query("select $tables_cols from mysql.tables_priv"); +safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user"); +safe_query("select $tables_cols from mysql.tables_priv"); +safe_query("revoke GRANT OPTION on $opt_database.test from $user",1); +# +# Test grants on database level +# + +safe_query("grant select(a) on $opt_database.test to $user"); +user_query("show columns from test"); +safe_query("grant insert (b), update (b) on $opt_database.test to $user"); + +user_query("select count(a) from test"); +user_query("select count(skr.a) from test as skr"); +user_query("select count(a) from test where a > 5"); +user_query("insert into test (b) values (5)"); +user_query("insert into test (b) values (a)"); +user_query("update test set b=3 where a > 0"); + +user_query("select * from test",1); +user_query("select b from test",1); +user_query("select a from test where b > 0",1); +user_query("insert into test (a) values (10)",1); +user_query("insert into test (b) values (b)",1); +user_query("insert into test (a,b) values (1,5)",1); +user_query("insert into test (b) values (1),(b)",1); +user_query("update test set b=3 where b > 0",1); + +safe_query("select $tables_cols from mysql.tables_priv"); +safe_query("select $columns_cols from mysql.columns_priv"); +safe_query("revoke select(a), update (b) on $opt_database.test from $user"); +safe_query("select $tables_cols from mysql.tables_priv"); +safe_query("select $columns_cols from mysql.columns_priv"); + +user_query("select count(a) from test",1); +user_query("update test set b=4",1); + +safe_query("grant select(a,b), update (a,b) on $opt_database.test to $user"); +user_query("select count(a),count(b) from test where a+b > 0"); +user_query("insert into test (b) values (9)"); +user_query("update test set b=6 where b > 0"); + +safe_query("flush privileges"); # Test restoring privileges from disk +safe_query("select $tables_cols from mysql.tables_priv"); +safe_query("select $columns_cols from mysql.columns_priv"); + +# Try mixing of table and database privileges + +user_query("insert into test (a,b) values (12,12)",1); +safe_query("grant insert on $opt_database.* to $user"); +user_connect(0); +user_query("insert into test (a,b) values (13,13)"); + +# This grants and revokes SELECT on different levels. +safe_query("revoke select(b) on $opt_database.test from $user"); +user_query("select count(a) from test where a+b > 0",1); +user_query("update test set b=5 where a=2"); +safe_query("grant select on $opt_database.test to $user"); +user_connect(0); +user_query("select count(a) from test where a+b > 0"); +safe_query("revoke select(b) on $opt_database.test from $user"); +user_query("select count(a) from test where a+b > 0"); +safe_query("revoke select on $opt_database.test from $user"); +user_connect(0); +user_query("select count(a) from test where a+b > 0",1); +safe_query("grant select(a) on $opt_database.test to $user"); +user_query("select count(a) from test where a+b > 0",1); +safe_query("grant select on *.* to $user"); +user_connect(0); +user_query("select count(a) from test where a+b > 0"); +safe_query("revoke select on *.* from $user"); +safe_query("grant select(b) on $opt_database.test to $user"); +user_connect(0); +user_query("select count(a) from test where a+b > 0"); + + +safe_query("select * from mysql.db where user = '$opt_user'"); +safe_query("select $tables_cols from mysql.tables_priv where user = '$opt_user'"); +safe_query("select $columns_cols from mysql.columns_priv where user = '$opt_user'"); + +safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user"); +user_query("select count(a) from test",1); +user_query("select * from mysql.user",1); +safe_query("select * from mysql.db where user = '$opt_user'"); +safe_query("select $tables_cols from mysql.tables_priv where user = '$opt_user'"); +safe_query("select $columns_cols from mysql.columns_priv where user = '$opt_user'"); + +# +# Test IDENTIFIED BY +# + +safe_query("delete from user where user='$opt_user'"); +safe_query("flush privileges"); +safe_query("grant ALL PRIVILEGES on $opt_database.test to $user identified by 'dummy', ${opt_user}\@127.0.0.1 identified by 'dummy2'"); +user_connect(0,"dummy"); +safe_query("grant SELECT on $opt_database.* to $user identified by ''"); +user_connect(0); + +# +# Clean up things +# + +safe_query("drop database $opt_database"); +safe_query("delete from user where user='$opt_user'"); +safe_query("delete from db where user='$opt_user'"); +safe_query("delete from tables_priv"); +safe_query("delete from columns_priv"); +safe_query("flush privileges"); + +print "end of test\n"; +exit 0; + +sub usage +{ + print <<EOF; +$0 Ver $version + +This program tests that the GRANT commands works by creating a temporary +database ($opt_database) and user ($opt_user). + +Options: + +--database (Default $opt_database) + In which database the test tables are created. + +--force + Don''t ask any question before starting this test. + +--host='host name' (Default $opt_host) + Host name where the database server is located. + +--Information +--help + Print this help + +--password + Password for root-user. + +--server='server name' (Default $opt_server) + Run the test on the given SQL server. + +--user (Default $opt_user) + A non-existing user on which we will test the GRANT commands. + +--verbose + Write all queries when we are execute them. + +--root-user='user name' (Default $opt_root_user) + User with privileges to modify the 'mysql' database. +EOF + exit(0); +} + + +sub print_info +{ + my $tmp; + print <<EOF; +This test will clear your table and column grant table and recreate the +$opt_database database ! All privileges for $user will be destroyed ! + +Don\'t run this test if you have done any GRANT commands that you want to keep! +EOF + for (;;) + { + print "Start test (yes/no) ? "; + $tmp=<STDIN>; chomp($tmp); $tmp=lc($tmp); + last if ($tmp =~ /^yes$/i); + exit 1 if ($tmp =~ /^n/i); + print "\n"; + } +} + + +sub user_connect +{ + my ($ignore_error,$password)=@_; + $password="" if (!defined($password)); + + print "Connecting $opt_user\n" if ($opt_verbose); + $user_dbh->disconnect if (defined($user_dbh)); + + $user_dbh=DBI->connect("DBI:mysql:$opt_database:$opt_host",$opt_user, + $password, { PrintError => 0}); + if (!$user_dbh) + { + print "$DBI::errstr\n"; + if (!$ignore_error) + { + die "The above should not have failed!"; + } + } + elsif ($ignore_error) + { + die "Connect succeeded when it shouldn't have !\n"; + } +} + +sub safe_query +{ + my ($query,$ignore_error)=@_; + if (do_query($dbh,$query)) + { + if (!defined($ignore_error)) + { + die "The above should not have failed!"; + } + } + elsif (defined($ignore_error) && $ignore_error == 1) + { + die "Query '$query' succeeded when it shouldn't have !\n"; + } +} + + +sub user_query +{ + my ($query,$ignore_error)=@_; + if (do_query($user_dbh,$query)) + { + if (!defined($ignore_error)) + { + die "The above should not have failed!"; + } + } + elsif (defined($ignore_error) && $ignore_error == 1) + { + die "Query '$query' succeeded when it shouldn't have !\n"; + } +} + + +sub do_query +{ + my ($my_dbh, $query)=@_; + my ($sth,$row,$tab,$col,$found); + + print "$query\n" if ($opt_debug || $opt_verbose); + if (!($sth= $my_dbh->prepare($query))) + { + print "Error in prepare: $DBI::errstr\n"; + return 1; + } + if (!$sth->execute) + { + print "Error in execute: $DBI::errstr\n"; + die if ($DBI::errstr =~ /parse error/); + $sth->finish; + return 1; + } + $found=0; + while (($row=$sth->fetchrow_arrayref)) + { + $found=1; + $tab=""; + foreach $col (@$row) + { + print $tab; + print defined($col) ? $col : "NULL"; + $tab="\t"; + } + print "\n"; + } + print "\n" if ($found); + $sth->finish; + return 0; +} |