6
6
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
7
7
* Portions Copyright (c) 1994, Regents of the University of California
8
8
*
9
- * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.152 2005/06/28 05:08:55 tgl Exp $
9
+ * $PostgreSQL: pgsql/src/backend/commands/user.c,v 1.153 2005/06/28 19:51:22 tgl Exp $
10
10
*
11
11
*-------------------------------------------------------------------------
12
12
*/
@@ -61,16 +61,17 @@ CreateRole(CreateRoleStmt *stmt)
61
61
bool createrole = false; /* Can this user create roles? */
62
62
bool createdb = false; /* Can the user create databases? */
63
63
bool canlogin = false; /* Can this user login? */
64
- List * roleElts = NIL ; /* roles the user is a member of */
65
- List * rolememElts = NIL ; /* roles which will be members of this role */
66
- char * validUntil = NULL ; /* The time the login is valid
67
- * until */
64
+ List * addroleto = NIL ; /* roles to make this a member of */
65
+ List * rolemembers = NIL ; /* roles to be members of this role */
66
+ List * adminmembers = NIL ; /* roles to be admins of this role */
67
+ char * validUntil = NULL ; /* time the login is valid until */
68
68
DefElem * dpassword = NULL ;
69
69
DefElem * dcreatedb = NULL ;
70
70
DefElem * dcreaterole = NULL ;
71
71
DefElem * dcanlogin = NULL ;
72
- DefElem * droleElts = NULL ;
73
- DefElem * drolememElts = NULL ;
72
+ DefElem * daddroleto = NULL ;
73
+ DefElem * drolemembers = NULL ;
74
+ DefElem * dadminmembers = NULL ;
74
75
DefElem * dvalidUntil = NULL ;
75
76
76
77
/* Extract options from the statement node tree */
@@ -121,21 +122,29 @@ CreateRole(CreateRoleStmt *stmt)
121
122
errmsg ("conflicting or redundant options" )));
122
123
dcanlogin = defel ;
123
124
}
124
- else if (strcmp (defel -> defname , "roleElts " ) == 0 )
125
+ else if (strcmp (defel -> defname , "addroleto " ) == 0 )
125
126
{
126
- if (droleElts )
127
+ if (daddroleto )
127
128
ereport (ERROR ,
128
129
(errcode (ERRCODE_SYNTAX_ERROR ),
129
130
errmsg ("conflicting or redundant options" )));
130
- droleElts = defel ;
131
+ daddroleto = defel ;
131
132
}
132
- else if (strcmp (defel -> defname , "rolememElts " ) == 0 )
133
+ else if (strcmp (defel -> defname , "rolemembers " ) == 0 )
133
134
{
134
- if (drolememElts )
135
+ if (drolemembers )
135
136
ereport (ERROR ,
136
137
(errcode (ERRCODE_SYNTAX_ERROR ),
137
138
errmsg ("conflicting or redundant options" )));
138
- drolememElts = defel ;
139
+ drolemembers = defel ;
140
+ }
141
+ else if (strcmp (defel -> defname , "adminmembers" ) == 0 )
142
+ {
143
+ if (dadminmembers )
144
+ ereport (ERROR ,
145
+ (errcode (ERRCODE_SYNTAX_ERROR ),
146
+ errmsg ("conflicting or redundant options" )));
147
+ dadminmembers = defel ;
139
148
}
140
149
else if (strcmp (defel -> defname , "validUntil" ) == 0 )
141
150
{
@@ -164,10 +173,12 @@ CreateRole(CreateRoleStmt *stmt)
164
173
validUntil = strVal (dvalidUntil -> arg );
165
174
if (dpassword )
166
175
password = strVal (dpassword -> arg );
167
- if (droleElts )
168
- roleElts = (List * ) droleElts -> arg ;
169
- if (drolememElts )
170
- rolememElts = (List * ) drolememElts -> arg ;
176
+ if (daddroleto )
177
+ addroleto = (List * ) daddroleto -> arg ;
178
+ if (drolemembers )
179
+ rolemembers = (List * ) drolemembers -> arg ;
180
+ if (dadminmembers )
181
+ adminmembers = (List * ) dadminmembers -> arg ;
171
182
172
183
/* Check some permissions first */
173
184
if (!superuser ())
@@ -257,7 +268,7 @@ CreateRole(CreateRoleStmt *stmt)
257
268
/*
258
269
* Add the new role to the specified existing roles.
259
270
*/
260
- foreach (item , roleElts )
271
+ foreach (item , addroleto )
261
272
{
262
273
char * oldrolename = strVal (lfirst (item ));
263
274
Oid oldroleid = get_roleid_checked (oldrolename );
@@ -269,10 +280,14 @@ CreateRole(CreateRoleStmt *stmt)
269
280
}
270
281
271
282
/*
272
- * Add the specified members to this new role.
283
+ * Add the specified members to this new role. adminmembers get the
284
+ * admin option, rolemembers don't.
273
285
*/
274
286
AddRoleMems (stmt -> role , roleid ,
275
- rolememElts , roleNamesToIds (rolememElts ),
287
+ adminmembers , roleNamesToIds (adminmembers ),
288
+ GetUserId (), true);
289
+ AddRoleMems (stmt -> role , roleid ,
290
+ rolemembers , roleNamesToIds (rolemembers ),
276
291
GetUserId (), false);
277
292
278
293
/*
@@ -309,17 +324,14 @@ AlterRole(AlterRoleStmt *stmt)
309
324
int createrole = -1 ; /* Can this user create roles? */
310
325
int createdb = -1 ; /* Can the user create databases? */
311
326
int canlogin = -1 ; /* Can this user login? */
312
- int adminopt = 0 ; /* Can this user grant this role to others? */
313
- List * rolememElts = NIL ; /* The roles which will be added/removed to this role */
314
- char * validUntil = NULL ; /* The time the login is valid
315
- * until */
327
+ List * rolemembers = NIL ; /* roles to be added/removed */
328
+ char * validUntil = NULL ; /* time the login is valid until */
316
329
DefElem * dpassword = NULL ;
317
330
DefElem * dcreatedb = NULL ;
318
331
DefElem * dcreaterole = NULL ;
319
332
DefElem * dcanlogin = NULL ;
320
- DefElem * dadminopt = NULL ;
321
333
DefElem * dvalidUntil = NULL ;
322
- DefElem * drolememElts = NULL ;
334
+ DefElem * drolemembers = NULL ;
323
335
Oid roleid ;
324
336
325
337
/* Extract options from the statement node tree */
@@ -365,14 +377,6 @@ AlterRole(AlterRoleStmt *stmt)
365
377
errmsg ("conflicting or redundant options" )));
366
378
dcanlogin = defel ;
367
379
}
368
- else if (strcmp (defel -> defname , "adminopt" ) == 0 )
369
- {
370
- if (dadminopt )
371
- ereport (ERROR ,
372
- (errcode (ERRCODE_SYNTAX_ERROR ),
373
- errmsg ("conflicting or redundant options" )));
374
- dadminopt = defel ;
375
- }
376
380
else if (strcmp (defel -> defname , "validUntil" ) == 0 )
377
381
{
378
382
if (dvalidUntil )
@@ -381,13 +385,14 @@ AlterRole(AlterRoleStmt *stmt)
381
385
errmsg ("conflicting or redundant options" )));
382
386
dvalidUntil = defel ;
383
387
}
384
- else if (strcmp (defel -> defname , "rolememElts" ) == 0 && stmt -> action != 0 )
388
+ else if (strcmp (defel -> defname , "rolemembers" ) == 0 &&
389
+ stmt -> action != 0 )
385
390
{
386
- if (drolememElts )
391
+ if (drolemembers )
387
392
ereport (ERROR ,
388
393
(errcode (ERRCODE_SYNTAX_ERROR ),
389
394
errmsg ("conflicting or redundant options" )));
390
- drolememElts = defel ;
395
+ drolemembers = defel ;
391
396
}
392
397
else
393
398
elog (ERROR , "option \"%s\" not recognized" ,
@@ -404,14 +409,12 @@ AlterRole(AlterRoleStmt *stmt)
404
409
}
405
410
if (dcanlogin )
406
411
canlogin = intVal (dcanlogin -> arg );
407
- if (dadminopt )
408
- adminopt = intVal (dadminopt -> arg );
409
412
if (dvalidUntil )
410
413
validUntil = strVal (dvalidUntil -> arg );
411
414
if (dpassword )
412
415
password = strVal (dpassword -> arg );
413
- if (drolememElts )
414
- rolememElts = (List * ) drolememElts -> arg ;
416
+ if (drolemembers )
417
+ rolemembers = (List * ) drolemembers -> arg ;
415
418
416
419
/* must be superuser or just want to change your own password */
417
420
if (!superuser () &&
@@ -420,8 +423,7 @@ AlterRole(AlterRoleStmt *stmt)
420
423
createdb < 0 &&
421
424
canlogin < 0 &&
422
425
!validUntil &&
423
- !rolememElts &&
424
- !adminopt &&
426
+ !rolemembers &&
425
427
password &&
426
428
strcmp (GetUserNameFromId (GetUserId ()), stmt -> role ) == 0 ))
427
429
ereport (ERROR ,
@@ -537,12 +539,12 @@ AlterRole(AlterRoleStmt *stmt)
537
539
538
540
if (stmt -> action == +1 ) /* add members to role */
539
541
AddRoleMems (stmt -> role , roleid ,
540
- rolememElts , roleNamesToIds (rolememElts ),
541
- GetUserId (), adminopt );
542
+ rolemembers , roleNamesToIds (rolemembers ),
543
+ GetUserId (), false );
542
544
else if (stmt -> action == -1 ) /* drop members from role */
543
545
DelRoleMems (stmt -> role , roleid ,
544
- rolememElts , roleNamesToIds (rolememElts ),
545
- adminopt );
546
+ rolemembers , roleNamesToIds (rolemembers ),
547
+ false );
546
548
547
549
/*
548
550
* Set flag to update flat auth file at commit.
0 commit comments