~stewart/drizzle/embedded-innodb-create-select-transaction-arrgh

« back to all changes in this revision

Viewing changes to tests/grant.pl

  • Committer: brian
  • Date: 2008-06-25 05:29:13 UTC
  • Revision ID: brian@localhost.localdomain-20080625052913-6upwo0jsrl4lnapl
clean slate

Show diffs side-by-side

added added

removed removed

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