home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win.exe / DATA1.CAB / Examples / examples / tests / grant.pl < prev    next >
Perl Script  |  2000-11-22  |  19KB  |  546 lines

  1. #!/my/gnu/bin/perl
  2. #
  3. # Testing of grants.
  4. # Note that this will delete all table and column grants !
  5. #
  6.  
  7. use DBI;
  8. use Getopt::Long;
  9. use strict;
  10.  
  11. use vars qw($dbh $user_dbh $opt_help $opt_Information $opt_force $opt_debug 
  12.         $opt_verbose $opt_server $opt_root_user $opt_password $opt_user 
  13.         $opt_database $opt_host $version $user $tables_cols $columns_cols);
  14.  
  15. $version="1.0";
  16. $opt_help=$opt_Information=$opt_force=$opt_debug=$opt_verbose=0;
  17. $opt_host="localhost",
  18. $opt_server="mysql";
  19. $opt_root_user="root";
  20. $opt_password="";
  21. $opt_user="grant_user";
  22. $opt_database="grant_test";
  23.  
  24. GetOptions("Information","help","server=s","root-user=s","password=s","user","database=s","force","host=s","debug","verbose") || usage();
  25. usage() if ($opt_help || $opt_Information);
  26.  
  27. $user="$opt_user\@$opt_host";
  28.  
  29. if (!$opt_force)
  30. {
  31.   print_info()
  32. }
  33.  
  34. $|=1;
  35.  
  36. $tables_cols="Host, Db, User, Table_name, Grantor, Table_priv, Column_priv";
  37. $columns_cols="Host, Db, User, Table_name, Column_name, Column_priv";
  38.  
  39. #
  40. # clear grant tables
  41. #
  42.  
  43. $dbh = DBI->connect("DBI:mysql:mysql:$opt_host;mysql_read_default_group=perl",
  44.             $opt_root_user,$opt_password,
  45.             { PrintError => 0}) || die "Can't connect to mysql server: $DBI::errstr\n";
  46.  
  47. safe_query("delete from user where user='$opt_user' or user='${opt_user}2'");
  48. safe_query("delete from db where user='$opt_user'");
  49. safe_query("delete from tables_priv");
  50. safe_query("delete from columns_priv");
  51. safe_query("lock tables mysql.user write"); # Test lock tables
  52. safe_query("flush privileges");
  53. safe_query("unlock tables");         # should already be unlocked
  54. safe_query("drop database $opt_database",2);
  55. safe_query("create database $opt_database");
  56.  
  57. # check that the user can't login yet
  58.  
  59. user_connect(1);
  60. #goto test;
  61.  
  62. #
  63. # Test grants on user level
  64. #
  65.  
  66. safe_query("grant select on *.* to $user");
  67. safe_query("set password FOR ${opt_user}2\@$opt_host = password('test')",1);
  68. safe_query("set password FOR $opt_user=password('test')");
  69. user_connect(1);
  70. safe_query("set password FOR $opt_user=''");
  71. user_connect(0);
  72. user_query("select * from mysql.user where user = '$opt_user'");
  73. user_query("select * from mysql.db where user = '$opt_user'");
  74. safe_query("grant select on *.* to $user,$user");
  75.  
  76. # The following should fail
  77. user_query("insert into mysql.user (host,user) values ('error','$opt_user')",1);
  78. user_query("update mysql.user set host='error' WHERE user='$opt_user'",1);
  79. user_query("create table $opt_database.test (a int,b int)",1);
  80. user_query("grant select on *.* to ${opt_user}2\@$opt_host",1);
  81. safe_query("revoke select on $opt_database.test from $opt_user\@opt_host",1);
  82. safe_query("revoke select on $opt_database.* from $opt_user\@opt_host",1);
  83. safe_query("revoke select on *.* from $opt_user",1);
  84. safe_query("grant select on $opt_database.not_exists to $opt_user",1);
  85. safe_query("grant FILE on $opt_database.test to $opt_user",1);
  86. safe_query("grant select on *.* to wrong___________user_name",1);
  87. safe_query("grant select on $opt_database.* to wrong___________user_name",1);
  88. user_query("grant select on $opt_database.test to $opt_user with grant option",1);
  89. safe_query("set password FOR ''\@''=''",1);
  90. user_query("set password FOR root\@$opt_host = password('test')",1);
  91.  
  92. # Change privileges for user
  93. safe_query("revoke select on *.* from $user");
  94. safe_query("grant create on *.* to $user");
  95. user_connect(0);
  96. user_query("create table $opt_database.test (a int,b int)");
  97.  
  98. safe_query("grant select(c) on $opt_database.test to $user",1);
  99. safe_query("revoke select(c) on $opt_database.test from $user",1);
  100. safe_query("grant select on $opt_database.test to wrong___________user_name",1);
  101. user_query("INSERT INTO $opt_database.test values (2,0)",1);
  102.  
  103. safe_query("grant ALL PRIVILEGES on *.* to $user");
  104. safe_query("REVOKE INSERT on *.* from $user");
  105. user_connect(0);
  106. user_query("INSERT INTO $opt_database.test values (1,0)",1);
  107. safe_query("grant INSERT on *.* to $user");
  108. user_connect(0);
  109. user_query("INSERT INTO $opt_database.test values (2,0)");
  110. user_query("select count(*) from $opt_database.test");
  111. safe_query("revoke SELECT on *.* from $user");
  112. user_connect(0);
  113. user_query("select count(*) from $opt_database.test",1);
  114. user_query("INSERT INTO $opt_database.test values (3,0)");
  115. safe_query("grant SELECT on *.* to $user");
  116. user_connect(0);
  117. user_query("select count(*) from $opt_database.test");
  118. safe_query("revoke ALL PRIVILEGES on *.* from $user");
  119. user_connect(1);
  120. safe_query("delete from user where user='$opt_user'");
  121. safe_query("flush privileges");
  122. if (0)                # Only if no anonymous user on localhost.
  123. {
  124.   safe_query("grant select on *.* to $opt_user");
  125.   user_connect(0);
  126.   safe_query("revoke select on *.* from $opt_user");
  127.   user_connect(1);
  128. }
  129. safe_query("delete from user where user='$opt_user'");
  130. safe_query("flush privileges");
  131.  
  132. #
  133. # Test grants on database level
  134. #
  135. safe_query("grant select on $opt_database.* to $user");
  136. safe_query("select * from mysql.user where user = '$opt_user'");
  137. safe_query("select * from mysql.db where user = '$opt_user'");
  138. user_connect(0);
  139. user_query("select count(*) from $opt_database.test");
  140. # The following should fail
  141. user_query("select * from mysql.user where user = '$opt_user'",1);
  142. user_query("insert into $opt_database.test values (4,0)",1);
  143. user_query("update $opt_database.test set a=1",1); 
  144. user_query("delete from $opt_database.test",1); 
  145. user_query("create table $opt_database.test2 (a int)",1);
  146. user_query("ALTER TABLE $opt_database.test add c int",1);
  147. user_query("CREATE INDEX dummy ON $opt_database.test (a)",1);
  148. user_query("drop table $opt_database.test",1);
  149. user_query("grant ALL PRIVILEGES on $opt_database.* to ${opt_user}2\@$opt_host",1);
  150.  
  151. # Change privileges for user
  152. safe_query("grant ALL PRIVILEGES on $opt_database.* to $user WITH GRANT OPTION");
  153. user_connect(0);
  154. user_query("insert into $opt_database.test values (5,0)");
  155. safe_query("REVOKE ALL PRIVILEGES on * from $user",1);
  156. safe_query("REVOKE ALL PRIVILEGES on *.* from $user");
  157. safe_query("REVOKE ALL PRIVILEGES on $opt_database.* from $user");
  158. safe_query("REVOKE ALL PRIVILEGES on $opt_database.* from $user");
  159. user_connect(0);
  160. user_query("insert into $opt_database.test values (6,0)",1);
  161. safe_query("REVOKE GRANT OPTION on $opt_database.* from $user");
  162. user_connect(1);
  163. safe_query("grant ALL PRIVILEGES on $opt_database.* to $user");
  164.  
  165. user_connect(0);
  166. user_query("select * from mysql.user where user = '$opt_user'",1);
  167. user_query("insert into $opt_database.test values (7,0)");
  168. user_query("update $opt_database.test set a=3 where a=2"); 
  169. user_query("delete from $opt_database.test where a=3"); 
  170. user_query("create table $opt_database.test2 (a int not null)");
  171. user_query("alter table $opt_database.test2 add b int");
  172. user_query("create index dummy on $opt_database.test2 (a)");
  173. user_query("drop table $opt_database.test2");
  174. user_query("show tables");
  175.  
  176. # These should fail
  177. user_query("insert into mysql.user (host,user) values ('error','$opt_user',0)",1);
  178.  
  179. # Revoke database privileges
  180. safe_query("revoke ALL PRIVILEGES on $opt_database.* from $user");
  181. safe_query("select * from mysql.user where user = '$opt_user'");
  182. safe_query("select * from mysql.db where user = '$opt_user'");
  183. user_connect(1);
  184.  
  185. #
  186. # Test of grants on table level
  187. #
  188.  
  189. safe_query("grant create on $opt_database.test2 to $user");
  190. user_connect(0);
  191. user_query("create table $opt_database.test2 (a int not null)");
  192. user_query("show tables");    # Should only show test, not test2
  193. user_query("show columns from test",1);
  194. user_query("show keys from test",1);
  195. user_query("show columns from test2");
  196. user_query("show keys from test2");
  197. user_query("select * from test",1);
  198. safe_query("grant insert on $opt_database.test to $user");
  199. user_query("show tables");
  200. user_query("insert into $opt_database.test values (8,0)");
  201. user_query("update $opt_database.test set b=1",1);
  202. safe_query("grant update on $opt_database.test to $user");
  203. user_query("update $opt_database.test set b=2");
  204. user_query("delete from $opt_database.test",1);
  205. safe_query("grant delete on $opt_database.test to $user");
  206. user_query("delete from $opt_database.test where a=1",1);
  207. user_query("update $opt_database.test set b=3 where b=1",1);
  208. user_query("update $opt_database.test set b=b+1",1);
  209.  
  210. # Add one privilege at a time until the user has all privileges
  211. user_query("select * from test",1);
  212. safe_query("grant select on $opt_database.test to $user");
  213. user_query("delete from $opt_database.test where a=1");
  214. user_query("update $opt_database.test set b=2 where b=1");
  215. user_query("update $opt_database.test set b=b+1");
  216. user_query("select count(*) from test");
  217.  
  218. user_query("create table $opt_database.test3 (a int)",1);
  219. user_query("alter table $opt_database.test2 add c int",1);
  220. safe_query("grant alter on $opt_database.test2 to $user");
  221. user_query("alter table $opt_database.test2 add c int");
  222. user_query("create index dummy ON $opt_database.test (a)",1);
  223. safe_query("grant index on $opt_database.test2 to $user");
  224. user_query("create index dummy ON $opt_database.test2 (a)");
  225. user_query("insert into test2 SELECT a,a from test",1);
  226. safe_query("grant insert on test2 to $user",1);    # No table: mysql.test2
  227. safe_query("grant insert(a) on $opt_database.test2 to $user");
  228. user_query("insert into test2 SELECT a,a from test",1);
  229. safe_query("grant insert(c) on $opt_database.test2 to $user");
  230. user_query("insert into test2 SELECT a,a from test");
  231. user_query("select count(*) from test2,test",1);
  232. user_query("select count(*) from test,test2",1);
  233. user_query("replace into test2 SELECT a from test",1);
  234. safe_query("grant update on $opt_database.test2 to $user");
  235. user_query("replace into test2 SELECT a,a from test",1);
  236. safe_query("grant DELETE on $opt_database.test2 to $user");
  237. user_query("replace into test2 SELECT a,a from test");
  238. user_query("insert into test (a) SELECT a from test2",1);
  239.  
  240. user_query("drop table $opt_database.test2",1);
  241. user_query("grant select on $opt_database.test2 to $user with grant option",1);
  242. safe_query("grant drop on $opt_database.test2 to $user with grant option");
  243. user_query("grant drop on $opt_database.test2 to $user with grant option");
  244. user_query("grant select on $opt_database.test2 to $user with grant option",1);
  245. user_query("drop table $opt_database.test2");
  246.  
  247. # Check that the user doesn't have some user privileges
  248. user_query("create database $opt_database",1);
  249. user_query("drop database $opt_database",1);
  250. user_query("flush tables",1);
  251. safe_query("flush privileges");
  252.  
  253. safe_query("select $tables_cols from mysql.tables_priv");
  254. safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user");
  255. safe_query("revoke ALL PRIVILEGES on $opt_database.test2 from $user");
  256. safe_query("revoke GRANT OPTION on $opt_database.test2 from $user");
  257. safe_query("select $tables_cols from mysql.tables_priv");
  258.  
  259. user_query("select count(a) from test",1);
  260.  
  261. #
  262. # Test some grants on column level
  263. #
  264.  
  265. user_query("delete from $opt_database.test where a=2",1);
  266. user_query("delete from $opt_database.test where A=2",1);
  267. user_query("update test set b=5 where b>0",1);
  268. safe_query("grant update(b),delete on $opt_database.test to $user");
  269. safe_query("revoke update(a) on $opt_database.test from $user",1);
  270. user_query("delete from $opt_database.test where a=2",1);
  271. user_query("update test set b=5 where b>0",1);
  272. safe_query("grant select(a),select(b) on $opt_database.test to $user");
  273. user_query("delete from $opt_database.test where a=2");
  274. user_query("delete from $opt_database.test where A=2");
  275. user_query("update test set b=5 where b>0");
  276. user_query("update test set a=11 where b>5",1);
  277. user_query("select a,A from test");
  278.  
  279. safe_query("select $tables_cols from mysql.tables_priv");
  280. safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user");
  281. safe_query("select $tables_cols from mysql.tables_priv");
  282. safe_query("revoke GRANT OPTION on $opt_database.test from $user",1);
  283. #
  284. # Test grants on database level
  285. #
  286.  
  287. safe_query("grant select(a) on $opt_database.test to $user");
  288. user_query("show columns from test");
  289. safe_query("grant insert (b), update (b) on $opt_database.test to $user");
  290.  
  291. user_query("select count(a) from test");
  292. user_query("select count(skr.a) from test as skr");
  293. user_query("select count(a) from test where a > 5");
  294. user_query("insert into test (b) values (5)");
  295. user_query("insert into test (b) values (a)");
  296. user_query("update test set b=3 where a > 0");
  297.  
  298. user_query("select * from test",1);
  299. user_query("select b from test",1);
  300. user_query("select a from test where b > 0",1);
  301. user_query("insert into test (a) values (10)",1);
  302. user_query("insert into test (b) values (b)",1);
  303. user_query("insert into test (a,b) values (1,5)",1);
  304. user_query("insert into test (b) values (1),(b)",1);
  305. user_query("update test set b=3 where b > 0",1);
  306.  
  307. safe_query("select $tables_cols from mysql.tables_priv");
  308. safe_query("select $columns_cols from mysql.columns_priv");
  309. safe_query("revoke select(a), update (b) on $opt_database.test from $user");
  310. safe_query("select $tables_cols from mysql.tables_priv");
  311. safe_query("select $columns_cols from mysql.columns_priv");
  312.  
  313. user_query("select count(a) from test",1);
  314. user_query("update test set b=4",1);
  315.  
  316. safe_query("grant select(a,b), update (a,b) on $opt_database.test to $user");
  317. user_query("select count(a),count(b) from test where a+b > 0");
  318. user_query("insert into test (b) values (9)");
  319. user_query("update test set b=6 where b > 0");
  320.  
  321. safe_query("flush privileges");    # Test restoring privileges from disk
  322. safe_query("select $tables_cols from mysql.tables_priv");
  323. safe_query("select $columns_cols from mysql.columns_priv");
  324.  
  325. # Try mixing of table and database privileges
  326.  
  327. user_query("insert into test (a,b) values (12,12)",1);
  328. safe_query("grant insert on $opt_database.* to $user");
  329. user_connect(0);
  330. user_query("insert into test (a,b) values (13,13)");
  331.  
  332. # This grants and revokes SELECT on different levels.
  333. safe_query("revoke select(b) on $opt_database.test from $user");
  334. user_query("select count(a) from test where a+b > 0",1);
  335. user_query("update test set b=5 where a=2");
  336. safe_query("grant select on $opt_database.test to $user");
  337. user_connect(0);
  338. user_query("select count(a) from test where a+b > 0");
  339. safe_query("revoke select(b) on $opt_database.test from $user");
  340. user_query("select count(a) from test where a+b > 0");
  341. safe_query("revoke select on $opt_database.test from $user");
  342. user_connect(0);
  343. user_query("select count(a) from test where a+b > 0",1);
  344. safe_query("grant select(a) on $opt_database.test to $user");
  345. user_query("select count(a) from test where a+b > 0",1);
  346. safe_query("grant select on *.* to $user");
  347. user_connect(0);
  348. user_query("select count(a) from test where a+b > 0");
  349. safe_query("revoke select on *.* from $user");
  350. safe_query("grant select(b) on $opt_database.test to $user");
  351. user_connect(0);
  352. user_query("select count(a) from test where a+b > 0");
  353.  
  354.  
  355. safe_query("select * from mysql.db where user = '$opt_user'");
  356. safe_query("select $tables_cols from mysql.tables_priv where user = '$opt_user'");
  357. safe_query("select $columns_cols from mysql.columns_priv where user = '$opt_user'");
  358.  
  359. safe_query("revoke ALL PRIVILEGES on $opt_database.test from $user");
  360. user_query("select count(a) from test",1);
  361. user_query("select * from mysql.user",1);
  362. safe_query("select * from mysql.db where user = '$opt_user'");
  363. safe_query("select $tables_cols from mysql.tables_priv where user = '$opt_user'");
  364. safe_query("select $columns_cols from mysql.columns_priv where user = '$opt_user'");
  365.  
  366. #
  367. # Test IDENTIFIED BY
  368. #
  369.  
  370. safe_query("delete from user where user='$opt_user'");
  371. safe_query("flush privileges");
  372. safe_query("grant ALL PRIVILEGES on $opt_database.test to $user identified by 'dummy',  ${opt_user}\@127.0.0.1 identified by 'dummy2'");
  373. user_connect(0,"dummy");
  374. safe_query("grant SELECT on $opt_database.* to $user identified by ''");
  375. user_connect(0);
  376.  
  377. #
  378. # Clean up things
  379. #
  380.  
  381. safe_query("drop database $opt_database");
  382. safe_query("delete from user where user='$opt_user'");
  383. safe_query("delete from db where user='$opt_user'");
  384. safe_query("delete from tables_priv");
  385. safe_query("delete from columns_priv");
  386. safe_query("flush privileges");
  387.  
  388. print "end of test\n";
  389. exit 0;
  390.  
  391. sub usage
  392. {
  393.     print <<EOF;
  394. $0  Ver $version
  395.  
  396. This program tests that the GRANT commands works by creating a temporary
  397. database ($opt_database) and user ($opt_user).
  398.  
  399. Options:
  400.  
  401. --database (Default $opt_database)
  402.   In which database the test tables are created.
  403.  
  404. --force
  405.   Don''t ask any question before starting this test.
  406.  
  407. --host='host name' (Default $opt_host)
  408.   Host name where the database server is located.
  409.  
  410. --Information
  411. --help
  412.   Print this help
  413.  
  414. --password
  415.   Password for root-user.
  416.  
  417. --server='server name'  (Default $opt_server)
  418.   Run the test on the given SQL server.
  419.  
  420. --user  (Default $opt_user)
  421.   A non-existing user on which we will test the GRANT commands.
  422.  
  423. --verbose
  424.   Write all queries when we are execute them.
  425.  
  426. --root-user='user name' (Default $opt_root_user)
  427.   User with privileges to modify the 'mysql' database.
  428. EOF
  429.   exit(0);
  430. }
  431.  
  432.  
  433. sub print_info
  434. {
  435.   my $tmp;
  436.   print <<EOF;
  437. This test will clear your table and column grant table and recreate the
  438. $opt_database database !  All privileges for $user will be destroyed !
  439.  
  440. Don\'t run this test if you have done any GRANT commands that you want to keep!
  441. EOF
  442.  for (;;)
  443.   {
  444.     print "Start test (yes/no) ? ";
  445.     $tmp=<STDIN>; chomp($tmp); $tmp=lc($tmp);
  446.     last if ($tmp =~ /^yes$/i);
  447.     exit 1 if ($tmp =~ /^n/i);
  448.     print "\n";
  449.   }
  450. }
  451.  
  452.  
  453. sub user_connect
  454. {
  455.   my ($ignore_error,$password)=@_;
  456.   $password="" if (!defined($password));
  457.  
  458.   print "Connecting $opt_user\n" if ($opt_verbose);
  459.   $user_dbh->disconnect if (defined($user_dbh));
  460.  
  461.   $user_dbh=DBI->connect("DBI:mysql:$opt_database:$opt_host",$opt_user,
  462.              $password, { PrintError => 0});
  463.   if (!$user_dbh)
  464.   {
  465.     print "$DBI::errstr\n";
  466.     if (!$ignore_error)
  467.     {
  468.       die "The above should not have failed!";
  469.     }
  470.   }
  471.   elsif ($ignore_error)
  472.   {
  473.     die "Connect succeeded when it shouldn't have !\n";
  474.   }
  475. }
  476.  
  477. sub safe_query
  478. {
  479.   my ($query,$ignore_error)=@_;
  480.   if (do_query($dbh,$query))
  481.   {
  482.     if (!defined($ignore_error))
  483.     {
  484.       die "The above should not have failed!";
  485.     }
  486.   }
  487.   elsif (defined($ignore_error) && $ignore_error == 1)
  488.   {
  489.     die "Query '$query' succeeded when it shouldn't have !\n";
  490.   }
  491. }
  492.  
  493.  
  494. sub user_query
  495. {
  496.   my ($query,$ignore_error)=@_;
  497.   if (do_query($user_dbh,$query))
  498.   {
  499.     if (!defined($ignore_error))
  500.     {
  501.       die "The above should not have failed!";
  502.     }
  503.   }
  504.   elsif (defined($ignore_error) && $ignore_error == 1)
  505.   {
  506.     die "Query '$query' succeeded when it shouldn't have !\n";
  507.   }
  508. }
  509.  
  510.  
  511. sub do_query
  512. {
  513.   my ($my_dbh, $query)=@_;
  514.   my ($sth,$row,$tab,$col,$found);
  515.  
  516.   print "$query\n" if ($opt_debug || $opt_verbose);
  517.   if (!($sth= $my_dbh->prepare($query)))
  518.   {
  519.     print "Error in prepare: $DBI::errstr\n";
  520.     return 1;
  521.   }
  522.   if (!$sth->execute)
  523.   {
  524.     print "Error in execute: $DBI::errstr\n";
  525.     die if ($DBI::errstr =~ /parse error/);
  526.     $sth->finish;
  527.     return 1;
  528.   }
  529.   $found=0;
  530.   while (($row=$sth->fetchrow_arrayref))
  531.   {
  532.     $found=1;
  533.     $tab="";
  534.     foreach $col (@$row)
  535.     {
  536.       print $tab;
  537.       print defined($col) ? $col : "NULL";
  538.       $tab="\t";
  539.     }
  540.     print "\n";
  541.   }
  542.   print "\n" if ($found);
  543.   $sth->finish;
  544.   return 0;
  545. }
  546.