grant.pl
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:27k
源码类别:

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