grant.pl
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:20k
源码类别:

MySQL数据库

开发平台:

Visual C++

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