| From: | Peter Eisentraut <peter_e(at)gmx(dot)net> | 
|---|---|
| To: | Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us> | 
| Cc: | Jerome ALET <alet(at)unice(dot)fr>, pgsql-bugs(at)postgresql(dot)org | 
| Subject: | Re: grant/revoke bug with delete/update | 
| Date: | 2000-10-01 20:49:51 | 
| Message-ID: | Pine.LNX.4.21.0010012249280.1031-100000@peter.localdomain | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-bugs pgsql-hackers | 
Nevertheless, you should probably consider installing the patch.
Bruce Momjian writes:
> OK, this was a good point.  Were did we leave this, folks?
> 
> 
> > Hi,
> > 
> > first I'm sorry to not fill the form, I'm too lazy, and it's not platform
> > nor version dependent AFAIK.
> > 
> > I recently posted a question (on Feb 23rd) to pgsql-sql concerning the
> > fact that update and insert are considered the same thing when you modify
> > permissions with grant and revoke. (Maybe it was the wrong place to post
> > it.)
> > 
> > for example a "grant delete" also grants "update" which is completely
> > wrong. More importantly the user is not informed, and this could lead to
> > VERY IMPORTANT SECURITY PROBLEMS, like someone who should only be able to
> > update existing records, have the permission to delete all records... 
> > 
> > I've read postgresql documentation, especially the grant and revoke
> > manpages, and I've found no mention of this bug, which is IMHO a Big
> > Mistake (tm).
> > 
> > attached to this message you'll find a patch for version 6.5.2 wich
> > differentiate delete and update, because before they were considered as
> > "write". The patch only modifies .c .y and .h files, but no documentation.
> > 
> > the new acl rights look like: arRdu 
> > a for append
> > r for read
> > R for rules
> > d for delete
> > u for update
> > 
> > instead of: arwR
> > a for append
> > r for read
> > w for update AND delete
> > R for rules
> > 
> > This patch seems to work at least with what I've tested, you'll find a
> > test session at the end of this message.
> > 
> > I hope this patch will help and that it will be easy to incorporate it in
> > 7.0, which I haven't the time to do for now. 
> > 
> > And for the bug report I posted on Feb 23rd on "drop user" which keeps the
> > user's acl in the database, and the deleted user id being reused, I've not
> > done anything, but I consider this a major problem. Please consider it for
> > a next version.
> > 
> > Because I'm not an expert, I suggest you remove gram.c before applying the
> > patch, in order for this file to be generated again from gram.y, but maybe
> > this is not necessary.
> > 
> > I'd be very pleased if some people could test this more than I can,
> > because I don't use postgresql intensively with special permissions.
> > 
> > I'm not sure for some parts of the patch, especially in execMain.c
> > so if a postgresql hacker could examine it, this would be fine.
> >  
> > dump of test session:
> > ---------------------
> > 
> > ------- CUT -------
> > 
> > template1=> create database db;
> > CREATEDB
> > template1=> create user john;
> > CREATE USER
> > template1=> \connect db
> > connecting to new database: db
> > db=> create table t (id INT4, name TEXT);
> > CREATE
> > db=> \z
> > Database    = db
> >  +----------+--------------------------+
> >  | Relation | Grant/Revoke Permissions |
> >  +----------+--------------------------+
> >  | t        |                          |
> >  +----------+--------------------------+
> > db=> grant all on t to john;
> > CHANGE
> > db=> \z
> > Database    = db
> >  +----------+--------------------------+
> >  | Relation | Grant/Revoke Permissions |
> >  +----------+--------------------------+
> >  | t        | {"=","john=arduR"}       |
> >  +----------+--------------------------+
> > db=> \connect db john
> > connecting to new database: db as user: john
> > db=> insert into t (id, name) values (1, 'xxx');
> > INSERT 18560 1
> > db=> update t set name = 'yyy' where id=1;
> > UPDATE 1
> > db=> select * from t;
> > id|name
> > --+----
> >  1|yyy
> > (1 row)
> > 
> > db=> delete from t;
> > DELETE 1
> > db=> select * from t;
> > id|name
> > --+----
> > (0 rows)
> > 
> > db=> insert into t (id, name) values (1, 'xxx');
> > INSERT 18561 1
> > db=> \connect db postgres
> > connecting to new database: db as user: postgres
> > db=> revoke update on t from john;
> > CHANGE
> > db=> \z
> > Database    = db
> >  +----------+--------------------------+
> >  | Relation | Grant/Revoke Permissions |
> >  +----------+--------------------------+
> >  | t        | {"=","john=ardR"}        |
> >  +----------+--------------------------+
> > db=> \connect db john;
> > connecting to new database: db as user: john
> > db=> insert into t (id, name) values (2, 'yyy');
> > INSERT 18592 1
> > db=> update t set name='modified by john' where id=2;
> > ERROR:  t: Permission denied.
> > db=> delete from t where id=2;
> > DELETE 1
> > db=> select * from t;
> > id|name
> > --+----
> >  1|xxx
> > (1 row)
> > 
> > db=> \connect db postgres
> > connecting to new database: db as user: postgres
> > db=> revoke insert on t from john;
> > CHANGE
> > db=> \connect db john;
> > connecting to new database: db as user: john
> > db=> \z
> > Database    = db
> >  +----------+--------------------------+
> >  | Relation | Grant/Revoke Permissions |
> >  +----------+--------------------------+
> >  | t        | {"=","john=rdR"}         |
> >  +----------+--------------------------+
> > db=> insert into t (id, name) values (3, 'I try to insert something');
> > ERROR:  t: Permission denied.
> > db=> delete from t;
> > DELETE 1
> > db=> select * from t;
> > id|name
> > --+----
> > (0 rows)
> > 
> > db=> \connect db postgres
> > connecting to new database: db as user: postgres
> > db=> insert into t (id, name) values (1, 'xxx');
> > INSERT 18624 1
> > db=> \connect db john;
> > connecting to new database: db as user: john
> > db=> update t set name='john' where id =1;
> > ERROR:  t: Permission denied.
> > db=> \connect db postgres
> > connecting to new database: db as user: postgres
> > db=> revoke delete on t from john;
> > CHANGE
> > db=> grant update on t to john;
> > CHANGE
> > db=> \connect db john;
> > connecting to new database: db as user: john
> > db=> delete from t;
> > ERROR:  t: Permission denied.
> > db=> update t set name='john' where id=1;
> > UPDATE 1
> > db=> select * from t;
> > id|name
> > --+----
> >  1|john
> > (1 row)
> > 
> > ------- CUT -------
> >  
> > Thank you for reading.
> > 
> > bye,
> > 
> > Jerome ALET - alet(at)unice(dot)fr - http://cortex.unice.fr/~jerome
> > Faculte de Medecine de Nice - http://noe.unice.fr - Tel: 04 93 37 76 30 
> > 28 Avenue de Valombrose - 06107 NICE Cedex 2 - FRANCE
> Content-Description: the 6.5.2 patch
> 
> > diff -urbw postgresql-6.5.2/src/backend/catalog/aclchk.c postgresql-6.5.2-patched/src/backend/catalog/aclchk.c
> > --- postgresql-6.5.2/src/backend/catalog/aclchk.c	Mon Aug  2 07:56:53 1999
> > +++ postgresql-6.5.2-patched/src/backend/catalog/aclchk.c	Wed Mar  1 16:39:44 2000
> > @@ -381,7 +381,7 @@
> >  		 * pg_database table, there is still additional permissions
> >  		 * checking in dbcommands.c
> >  		 */
> > -		if ((mode & ACL_WR) || (mode & ACL_AP))
> > +		if (mode & ACL_AP)
> >  			return ACLCHECK_OK;
> >  	}
> >  
> > @@ -390,7 +390,7 @@
> >  	 * pg_shadow.usecatupd is set.	(This is to let superusers protect
> >  	 * themselves from themselves.)
> >  	 */
> > -	if (((mode & ACL_WR) || (mode & ACL_AP)) &&
> > +	if ((mode & ACL_AP) &&
> >  		!allowSystemTableMods && IsSystemRelationName(relname) &&
> >  		!((Form_pg_shadow) GETSTRUCT(tuple))->usecatupd)
> >  	{
> > diff -urbw postgresql-6.5.2/src/backend/commands/command.c postgresql-6.5.2-patched/src/backend/commands/command.c
> > --- postgresql-6.5.2/src/backend/commands/command.c	Mon Aug  2 07:56:57 1999
> > +++ postgresql-6.5.2-patched/src/backend/commands/command.c	Wed Mar  1 16:30:23 2000
> > @@ -524,7 +524,9 @@
> >  	if (lockstmt->mode == AccessShareLock)
> >  		aclresult = pg_aclcheck(lockstmt->relname, GetPgUserName(), ACL_RD);
> >  	else
> > -		aclresult = pg_aclcheck(lockstmt->relname, GetPgUserName(), ACL_WR);
> > +		/* do we really need to have all these permissions at the same time ? */
> > +		/* shouldn't we test lockstmt->mode first ? */
> > +		aclresult = pg_aclcheck(lockstmt->relname, GetPgUserName(), (ACL_AP | ACL_DE | ACL_UP));
> >  
> >  	if (aclresult != ACLCHECK_OK)
> >  		elog(ERROR, "LOCK TABLE: permission denied");
> > diff -urbw postgresql-6.5.2/src/backend/commands/copy.c postgresql-6.5.2-patched/src/backend/commands/copy.c
> > --- postgresql-6.5.2/src/backend/commands/copy.c	Sat Jul  3 02:32:39 1999
> > +++ postgresql-6.5.2-patched/src/backend/commands/copy.c	Wed Mar  1 16:30:35 2000
> > @@ -242,7 +242,8 @@
> >  	FILE	   *fp;
> >  	Relation	rel;
> >  	extern char *UserName;		/* defined in global.c */
> > -	const AclMode required_access = from ? ACL_WR : ACL_RD;
> > +	/* why should we need other permissions than APPEND ? */
> > +	const AclMode required_access = from ? ACL_AP : ACL_RD;
> >  	int			result;
> >  
> >  	rel = heap_openr(relname);
> > diff -urbw postgresql-6.5.2/src/backend/commands/sequence.c postgresql-6.5.2-patched/src/backend/commands/sequence.c
> > --- postgresql-6.5.2/src/backend/commands/sequence.c	Mon Aug  2 07:56:59 1999
> > +++ postgresql-6.5.2-patched/src/backend/commands/sequence.c	Wed Mar  1 16:31:05 2000
> > @@ -314,7 +314,8 @@
> >  	Form_pg_sequence seq;
> >  
> >  #ifndef NO_SECURITY
> > -	if (pg_aclcheck(seqname, getpgusername(), ACL_WR) != ACLCHECK_OK)
> > +	/* why should we need more than UPDATE permission ? */
> > +	if (pg_aclcheck(seqname, getpgusername(), ACL_UP) != ACLCHECK_OK)
> >  		elog(ERROR, "%s.setval: you don't have permissions to set sequence %s",
> >  			 seqname, seqname);
> >  #endif
> > diff -urbw postgresql-6.5.2/src/backend/commands/user.c postgresql-6.5.2-patched/src/backend/commands/user.c
> > --- postgresql-6.5.2/src/backend/commands/user.c	Mon Aug  2 07:56:59 1999
> > +++ postgresql-6.5.2-patched/src/backend/commands/user.c	Wed Mar  1 16:31:38 2000
> > @@ -115,7 +115,7 @@
> >  	 * pg_shadow relation.
> >  	 */
> >  	pg_shadow = GetPgUserName();
> > -	if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_WR | ACL_AP) != ACLCHECK_OK)
> > +	if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_AP | ACL_DE | ACL_UP) != ACLCHECK_OK)
> >  	{
> >  		UserAbortTransactionBlock();
> >  		elog(ERROR, "defineUser: user \"%s\" does not have SELECT and INSERT privilege for \"%s\"",
> > @@ -227,7 +227,8 @@
> >  	 * pg_shadow relation.
> >  	 */
> >  	pg_shadow = GetPgUserName();
> > -	if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_WR) != ACLCHECK_OK)
> > +	/* why should we need more than UPDATE ? */
> > +	if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_UP) != ACLCHECK_OK)
> >  	{
> >  		UserAbortTransactionBlock();
> >  		elog(ERROR, "alterUser: user \"%s\" does not have SELECT and UPDATE privilege for \"%s\"",
> > @@ -329,11 +330,12 @@
> >  		BeginTransactionBlock();
> >  
> >  	/*
> > -	 * Make sure the user attempting to create a user can delete from the
> > +	 * Make sure the user attempting to delete a user can delete from the
> >  	 * pg_shadow relation.
> >  	 */
> >  	pg_shadow = GetPgUserName();
> > -	if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_WR) != ACLCHECK_OK)
> > +	/* why should we need more than DELETE ? */
> > +	if (pg_aclcheck(ShadowRelationName, pg_shadow, ACL_RD | ACL_DE) != ACLCHECK_OK)
> >  	{
> >  		UserAbortTransactionBlock();
> >  		elog(ERROR, "removeUser: user \"%s\" does not have SELECT and DELETE privilege for \"%s\"",
> > diff -urbw postgresql-6.5.2/src/backend/executor/execMain.c postgresql-6.5.2-patched/src/backend/executor/execMain.c
> > --- postgresql-6.5.2/src/backend/executor/execMain.c	Thu Jun 17 17:15:49 1999
> > +++ postgresql-6.5.2-patched/src/backend/executor/execMain.c	Wed Mar  1 18:31:31 2000
> > @@ -464,14 +464,16 @@
> >  			switch (operation)
> >  			{
> >  				case CMD_INSERT:
> > -					ok = ((aclcheck_result = CHECK(ACL_AP)) == ACLCHECK_OK) ||
> > -						((aclcheck_result = CHECK(ACL_WR)) == ACLCHECK_OK);
> > +					ok = ((aclcheck_result = CHECK(ACL_AP)) == ACLCHECK_OK);
> >  					opstr = "append";
> >  					break;
> >  				case CMD_DELETE:
> > +					ok = ((aclcheck_result = CHECK(ACL_DE)) == ACLCHECK_OK);
> > +					opstr = "delete";
> > +					break;
> >  				case CMD_UPDATE:
> > -					ok = ((aclcheck_result = CHECK(ACL_WR)) == ACLCHECK_OK);
> > -					opstr = "write";
> > +					ok = ((aclcheck_result = CHECK(ACL_UP)) == ACLCHECK_OK);
> > +					opstr = "update";
> >  					break;
> >  				default:
> >  					elog(ERROR, "ExecCheckPerms: bogus operation %d",
> > @@ -508,8 +510,9 @@
> >  			StrNCpy(rname.data,
> >  					((Form_pg_class) GETSTRUCT(htup))->relname.data,
> >  					NAMEDATALEN);
> > -			ok = ((aclcheck_result = CHECK(ACL_WR)) == ACLCHECK_OK);
> > -			opstr = "write";
> > +			/* is it the right thing to do ? */
> > +			ok = ((aclcheck_result = CHECK((ACL_AP | ACL_DE | ACL_UP))) == ACLCHECK_OK);
> > +			opstr = "write";	/* unused ? */
> >  			if (!ok)
> >  				elog(ERROR, "%s: %s", rname.data, aclcheck_error_strings[aclcheck_result]);
> >  		}
> > diff -urbw postgresql-6.5.2/src/backend/parser/gram.y postgresql-6.5.2-patched/src/backend/parser/gram.y
> > --- postgresql-6.5.2/src/backend/parser/gram.y	Tue Sep 14 08:07:35 1999
> > +++ postgresql-6.5.2-patched/src/backend/parser/gram.y	Wed Mar  1 16:33:34 2000
> > @@ -1694,11 +1694,11 @@
> >  
> >  privileges:  ALL PRIVILEGES
> >  				{
> > -				 $$ = aclmakepriv("rwaR",0);
> > +				 $$ = aclmakepriv("raduR",0);
> >  				}
> >  		| ALL
> >  				{
> > -				 $$ = aclmakepriv("rwaR",0);
> > +				 $$ = aclmakepriv("raduR",0);
> >  				}
> >  		| operation_commalist
> >  				{
> > @@ -1726,11 +1726,11 @@
> >  				}
> >  		| UPDATE
> >  				{
> > -						$$ = ACL_MODE_WR_CHR;
> > +						$$ = ACL_MODE_UP_CHR;
> >  				}
> >  		| DELETE
> >  				{
> > -						$$ = ACL_MODE_WR_CHR;
> > +						$$ = ACL_MODE_DE_CHR;
> >  				}
> >  		| RULE
> >  				{
> > diff -urbw postgresql-6.5.2/src/backend/parser/parse.h postgresql-6.5.2-patched/src/backend/parser/parse.h
> > --- postgresql-6.5.2/src/backend/parser/parse.h	Thu Sep 16 02:23:39 1999
> > +++ postgresql-6.5.2-patched/src/backend/parser/parse.h	Wed Mar  1 18:34:46 2000
> > @@ -29,236 +29,236 @@
> >  	RuleStmt			*rstmt;
> >  	InsertStmt			*astmt;
> >  } YYSTYPE;
> > -#define	ABSOLUTE	257
> > -#define	ACTION	258
> > -#define	ADD	259
> > -#define	ALL	260
> > -#define	ALTER	261
> > -#define	AND	262
> > -#define	ANY	263
> > -#define	AS	264
> > -#define	ASC	265
> > -#define	BEGIN_TRANS	266
> > -#define	BETWEEN	267
> > -#define	BOTH	268
> > -#define	BY	269
> > -#define	CASCADE	270
> > -#define	CASE	271
> > -#define	CAST	272
> > -#define	CHAR	273
> > -#define	CHARACTER	274
> > -#define	CHECK	275
> > -#define	CLOSE	276
> > -#define	COALESCE	277
> > -#define	COLLATE	278
> > -#define	COLUMN	279
> > -#define	COMMIT	280
> > -#define	CONSTRAINT	281
> > -#define	CREATE	282
> > -#define	CROSS	283
> > -#define	CURRENT	284
> > -#define	CURRENT_DATE	285
> > -#define	CURRENT_TIME	286
> > -#define	CURRENT_TIMESTAMP	287
> > -#define	CURRENT_USER	288
> > -#define	CURSOR	289
> > -#define	DAY_P	290
> > -#define	DECIMAL	291
> > -#define	DECLARE	292
> > -#define	DEFAULT	293
> > -#define	DELETE	294
> > -#define	DESC	295
> > -#define	DISTINCT	296
> > -#define	DOUBLE	297
> > -#define	DROP	298
> > -#define	ELSE	299
> > -#define	END_TRANS	300
> > -#define	EXCEPT	301
> > -#define	EXECUTE	302
> > -#define	EXISTS	303
> > -#define	EXTRACT	304
> > -#define	FALSE_P	305
> > -#define	FETCH	306
> > -#define	FLOAT	307
> > -#define	FOR	308
> > -#define	FOREIGN	309
> > -#define	FROM	310
> > -#define	FULL	311
> > -#define	GLOBAL	312
> > -#define	GRANT	313
> > -#define	GROUP	314
> > -#define	HAVING	315
> > -#define	HOUR_P	316
> > -#define	IN	317
> > -#define	INNER_P	318
> > -#define	INSENSITIVE	319
> > -#define	INSERT	320
> > -#define	INTERSECT	321
> > -#define	INTERVAL	322
> > -#define	INTO	323
> > -#define	IS	324
> > -#define	ISOLATION	325
> > -#define	JOIN	326
> > -#define	KEY	327
> > -#define	LANGUAGE	328
> > -#define	LEADING	329
> > -#define	LEFT	330
> > -#define	LEVEL	331
> > -#define	LIKE	332
> > -#define	LOCAL	333
> > -#define	MATCH	334
> > -#define	MINUTE_P	335
> > -#define	MONTH_P	336
> > -#define	NAMES	337
> > -#define	NATIONAL	338
> > -#define	NATURAL	339
> > -#define	NCHAR	340
> > -#define	NEXT	341
> > -#define	NO	342
> > -#define	NOT	343
> > -#define	NULLIF	344
> > -#define	NULL_P	345
> > -#define	NUMERIC	346
> > -#define	OF	347
> > -#define	ON	348
> > -#define	ONLY	349
> > -#define	OPTION	350
> > -#define	OR	351
> > -#define	ORDER	352
> > -#define	OUTER_P	353
> > -#define	PARTIAL	354
> > -#define	POSITION	355
> > -#define	PRECISION	356
> > -#define	PRIMARY	357
> > -#define	PRIOR	358
> > -#define	PRIVILEGES	359
> > -#define	PROCEDURE	360
> > -#define	PUBLIC	361
> > -#define	READ	362
> > -#define	REFERENCES	363
> > -#define	RELATIVE	364
> > -#define	REVOKE	365
> > -#define	RIGHT	366
> > -#define	ROLLBACK	367
> > -#define	SCROLL	368
> > -#define	SECOND_P	369
> > -#define	SELECT	370
> > -#define	SET	371
> > -#define	SUBSTRING	372
> > -#define	TABLE	373
> > -#define	TEMP	374
> > -#define	TEMPORARY	375
> > -#define	THEN	376
> > -#define	TIME	377
> > -#define	TIMESTAMP	378
> > -#define	TIMEZONE_HOUR	379
> > -#define	TIMEZONE_MINUTE	380
> > -#define	TO	381
> > -#define	TRAILING	382
> > -#define	TRANSACTION	383
> > -#define	TRIM	384
> > -#define	TRUE_P	385
> > -#define	UNION	386
> > -#define	UNIQUE	387
> > -#define	UPDATE	388
> > -#define	USER	389
> > -#define	USING	390
> > -#define	VALUES	391
> > -#define	VARCHAR	392
> > -#define	VARYING	393
> > -#define	VIEW	394
> > -#define	WHEN	395
> > -#define	WHERE	396
> > -#define	WITH	397
> > -#define	WORK	398
> > -#define	YEAR_P	399
> > -#define	ZONE	400
> > -#define	TRIGGER	401
> > -#define	COMMITTED	402
> > -#define	SERIALIZABLE	403
> > -#define	TYPE_P	404
> > -#define	ABORT_TRANS	405
> > -#define	ACCESS	406
> > -#define	AFTER	407
> > -#define	AGGREGATE	408
> > -#define	ANALYZE	409
> > -#define	BACKWARD	410
> > -#define	BEFORE	411
> > -#define	BINARY	412
> > -#define	CACHE	413
> > -#define	CLUSTER	414
> > -#define	COPY	415
> > -#define	CREATEDB	416
> > -#define	CREATEUSER	417
> > -#define	CYCLE	418
> > -#define	DATABASE	419
> > -#define	DELIMITERS	420
> > -#define	DO	421
> > -#define	EACH	422
> > -#define	ENCODING	423
> > -#define	EXCLUSIVE	424
> > -#define	EXPLAIN	425
> > -#define	EXTEND	426
> > -#define	FORWARD	427
> > -#define	FUNCTION	428
> > -#define	HANDLER	429
> > -#define	INCREMENT	430
> > -#define	INDEX	431
> > -#define	INHERITS	432
> > -#define	INSTEAD	433
> > -#define	ISNULL	434
> > -#define	LANCOMPILER	435
> > -#define	LIMIT	436
> > -#define	LISTEN	437
> > -#define	LOAD	438
> > -#define	LOCATION	439
> > -#define	LOCK_P	440
> > -#define	MAXVALUE	441
> > -#define	MINVALUE	442
> > -#define	MODE	443
> > -#define	MOVE	444
> > -#define	NEW	445
> > -#define	NOCREATEDB	446
> > -#define	NOCREATEUSER	447
> > -#define	NONE	448
> > -#define	NOTHING	449
> > -#define	NOTIFY	450
> > -#define	NOTNULL	451
> > -#define	OFFSET	452
> > -#define	OIDS	453
> > -#define	OPERATOR	454
> > -#define	PASSWORD	455
> > -#define	PROCEDURAL	456
> > -#define	RENAME	457
> > -#define	RESET	458
> > -#define	RETURNS	459
> > -#define	ROW	460
> > -#define	RULE	461
> > -#define	SEQUENCE	462
> > -#define	SERIAL	463
> > -#define	SETOF	464
> > -#define	SHARE	465
> > -#define	SHOW	466
> > -#define	START	467
> > -#define	STATEMENT	468
> > -#define	STDIN	469
> > -#define	STDOUT	470
> > -#define	TRUSTED	471
> > -#define	UNLISTEN	472
> > -#define	UNTIL	473
> > -#define	VACUUM	474
> > -#define	VALID	475
> > -#define	VERBOSE	476
> > -#define	VERSION	477
> > -#define	IDENT	478
> > -#define	SCONST	479
> > -#define	Op	480
> > -#define	ICONST	481
> > -#define	PARAM	482
> > -#define	FCONST	483
> > -#define	OP	484
> > -#define	UMINUS	485
> > -#define	TYPECAST	486
> > +#define	ABSOLUTE	258
> > +#define	ACTION	259
> > +#define	ADD	260
> > +#define	ALL	261
> > +#define	ALTER	262
> > +#define	AND	263
> > +#define	ANY	264
> > +#define	AS	265
> > +#define	ASC	266
> > +#define	BEGIN_TRANS	267
> > +#define	BETWEEN	268
> > +#define	BOTH	269
> > +#define	BY	270
> > +#define	CASCADE	271
> > +#define	CASE	272
> > +#define	CAST	273
> > +#define	CHAR	274
> > +#define	CHARACTER	275
> > +#define	CHECK	276
> > +#define	CLOSE	277
> > +#define	COALESCE	278
> > +#define	COLLATE	279
> > +#define	COLUMN	280
> > +#define	COMMIT	281
> > +#define	CONSTRAINT	282
> > +#define	CREATE	283
> > +#define	CROSS	284
> > +#define	CURRENT	285
> > +#define	CURRENT_DATE	286
> > +#define	CURRENT_TIME	287
> > +#define	CURRENT_TIMESTAMP	288
> > +#define	CURRENT_USER	289
> > +#define	CURSOR	290
> > +#define	DAY_P	291
> > +#define	DECIMAL	292
> > +#define	DECLARE	293
> > +#define	DEFAULT	294
> > +#define	DELETE	295
> > +#define	DESC	296
> > +#define	DISTINCT	297
> > +#define	DOUBLE	298
> > +#define	DROP	299
> > +#define	ELSE	300
> > +#define	END_TRANS	301
> > +#define	EXCEPT	302
> > +#define	EXECUTE	303
> > +#define	EXISTS	304
> > +#define	EXTRACT	305
> > +#define	FALSE_P	306
> > +#define	FETCH	307
> > +#define	FLOAT	308
> > +#define	FOR	309
> > +#define	FOREIGN	310
> > +#define	FROM	311
> > +#define	FULL	312
> > +#define	GLOBAL	313
> > +#define	GRANT	314
> > +#define	GROUP	315
> > +#define	HAVING	316
> > +#define	HOUR_P	317
> > +#define	IN	318
> > +#define	INNER_P	319
> > +#define	INSENSITIVE	320
> > +#define	INSERT	321
> > +#define	INTERSECT	322
> > +#define	INTERVAL	323
> > +#define	INTO	324
> > +#define	IS	325
> > +#define	ISOLATION	326
> > +#define	JOIN	327
> > +#define	KEY	328
> > +#define	LANGUAGE	329
> > +#define	LEADING	330
> > +#define	LEFT	331
> > +#define	LEVEL	332
> > +#define	LIKE	333
> > +#define	LOCAL	334
> > +#define	MATCH	335
> > +#define	MINUTE_P	336
> > +#define	MONTH_P	337
> > +#define	NAMES	338
> > +#define	NATIONAL	339
> > +#define	NATURAL	340
> > +#define	NCHAR	341
> > +#define	NEXT	342
> > +#define	NO	343
> > +#define	NOT	344
> > +#define	NULLIF	345
> > +#define	NULL_P	346
> > +#define	NUMERIC	347
> > +#define	OF	348
> > +#define	ON	349
> > +#define	ONLY	350
> > +#define	OPTION	351
> > +#define	OR	352
> > +#define	ORDER	353
> > +#define	OUTER_P	354
> > +#define	PARTIAL	355
> > +#define	POSITION	356
> > +#define	PRECISION	357
> > +#define	PRIMARY	358
> > +#define	PRIOR	359
> > +#define	PRIVILEGES	360
> > +#define	PROCEDURE	361
> > +#define	PUBLIC	362
> > +#define	READ	363
> > +#define	REFERENCES	364
> > +#define	RELATIVE	365
> > +#define	REVOKE	366
> > +#define	RIGHT	367
> > +#define	ROLLBACK	368
> > +#define	SCROLL	369
> > +#define	SECOND_P	370
> > +#define	SELECT	371
> > +#define	SET	372
> > +#define	SUBSTRING	373
> > +#define	TABLE	374
> > +#define	TEMP	375
> > +#define	TEMPORARY	376
> > +#define	THEN	377
> > +#define	TIME	378
> > +#define	TIMESTAMP	379
> > +#define	TIMEZONE_HOUR	380
> > +#define	TIMEZONE_MINUTE	381
> > +#define	TO	382
> > +#define	TRAILING	383
> > +#define	TRANSACTION	384
> > +#define	TRIM	385
> > +#define	TRUE_P	386
> > +#define	UNION	387
> > +#define	UNIQUE	388
> > +#define	UPDATE	389
> > +#define	USER	390
> > +#define	USING	391
> > +#define	VALUES	392
> > +#define	VARCHAR	393
> > +#define	VARYING	394
> > +#define	VIEW	395
> > +#define	WHEN	396
> > +#define	WHERE	397
> > +#define	WITH	398
> > +#define	WORK	399
> > +#define	YEAR_P	400
> > +#define	ZONE	401
> > +#define	TRIGGER	402
> > +#define	COMMITTED	403
> > +#define	SERIALIZABLE	404
> > +#define	TYPE_P	405
> > +#define	ABORT_TRANS	406
> > +#define	ACCESS	407
> > +#define	AFTER	408
> > +#define	AGGREGATE	409
> > +#define	ANALYZE	410
> > +#define	BACKWARD	411
> > +#define	BEFORE	412
> > +#define	BINARY	413
> > +#define	CACHE	414
> > +#define	CLUSTER	415
> > +#define	COPY	416
> > +#define	CREATEDB	417
> > +#define	CREATEUSER	418
> > +#define	CYCLE	419
> > +#define	DATABASE	420
> > +#define	DELIMITERS	421
> > +#define	DO	422
> > +#define	EACH	423
> > +#define	ENCODING	424
> > +#define	EXCLUSIVE	425
> > +#define	EXPLAIN	426
> > +#define	EXTEND	427
> > +#define	FORWARD	428
> > +#define	FUNCTION	429
> > +#define	HANDLER	430
> > +#define	INCREMENT	431
> > +#define	INDEX	432
> > +#define	INHERITS	433
> > +#define	INSTEAD	434
> > +#define	ISNULL	435
> > +#define	LANCOMPILER	436
> > +#define	LIMIT	437
> > +#define	LISTEN	438
> > +#define	LOAD	439
> > +#define	LOCATION	440
> > +#define	LOCK_P	441
> > +#define	MAXVALUE	442
> > +#define	MINVALUE	443
> > +#define	MODE	444
> > +#define	MOVE	445
> > +#define	NEW	446
> > +#define	NOCREATEDB	447
> > +#define	NOCREATEUSER	448
> > +#define	NONE	449
> > +#define	NOTHING	450
> > +#define	NOTIFY	451
> > +#define	NOTNULL	452
> > +#define	OFFSET	453
> > +#define	OIDS	454
> > +#define	OPERATOR	455
> > +#define	PASSWORD	456
> > +#define	PROCEDURAL	457
> > +#define	RENAME	458
> > +#define	RESET	459
> > +#define	RETURNS	460
> > +#define	ROW	461
> > +#define	RULE	462
> > +#define	SEQUENCE	463
> > +#define	SERIAL	464
> > +#define	SETOF	465
> > +#define	SHARE	466
> > +#define	SHOW	467
> > +#define	START	468
> > +#define	STATEMENT	469
> > +#define	STDIN	470
> > +#define	STDOUT	471
> > +#define	TRUSTED	472
> > +#define	UNLISTEN	473
> > +#define	UNTIL	474
> > +#define	VACUUM	475
> > +#define	VALID	476
> > +#define	VERBOSE	477
> > +#define	VERSION	478
> > +#define	IDENT	479
> > +#define	SCONST	480
> > +#define	Op	481
> > +#define	ICONST	482
> > +#define	PARAM	483
> > +#define	FCONST	484
> > +#define	OP	485
> > +#define	UMINUS	486
> > +#define	TYPECAST	487
> >  
> >  
> >  extern YYSTYPE yylval;
> > diff -urbw postgresql-6.5.2/src/backend/parser/parse_func.c postgresql-6.5.2-patched/src/backend/parser/parse_func.c
> > --- postgresql-6.5.2/src/backend/parser/parse_func.c	Fri Jun 18 00:21:40 1999
> > +++ postgresql-6.5.2-patched/src/backend/parser/parse_func.c	Wed Mar  1 16:33:53 2000
> > @@ -601,7 +601,8 @@
> >  
> >  		if ((aclcheck_result = pg_aclcheck(seqrel, GetPgUserName(),
> >  					   (((funcid == F_NEXTVAL) || (funcid == F_SETVAL)) ?
> > -						ACL_WR : ACL_RD)))
> > +						/* if nextval and setval are atomic, which I don't know, update should be enough */
> > +						ACL_UP : ACL_RD)))
> >  			!= ACLCHECK_OK)
> >  			elog(ERROR, "%s.%s: %s",
> >  			  seqrel, funcname, aclcheck_error_strings[aclcheck_result]);
> > diff -urbw postgresql-6.5.2/src/backend/rewrite/locks.c postgresql-6.5.2-patched/src/backend/rewrite/locks.c
> > --- postgresql-6.5.2/src/backend/rewrite/locks.c	Sun Feb 14 00:17:44 1999
> > +++ postgresql-6.5.2-patched/src/backend/rewrite/locks.c	Wed Mar  1 16:34:20 2000
> > @@ -228,8 +228,15 @@
> >  						case CMD_INSERT:
> >  							reqperm = ACL_AP;
> >  							break;
> > +						case CMD_DELETE:
> > +							reqperm = ACL_DE;
> > +							break;
> > +						case CMD_UPDATE:
> > +							reqperm = ACL_UP;
> > +							break;
> >  						default:
> > -							reqperm = ACL_WR;
> > +							/* is it The Right Thing To Do (tm) ? */
> > +							reqperm = ACL_AP | ACL_DE | ACL_UP;
> >  							break;
> >  					}
> >  				else
> > diff -urbw postgresql-6.5.2/src/backend/rewrite/rewriteHandler.c postgresql-6.5.2-patched/src/backend/rewrite/rewriteHandler.c
> > --- postgresql-6.5.2/src/backend/rewrite/rewriteHandler.c	Sun Jul 11 19:54:30 1999
> > +++ postgresql-6.5.2-patched/src/backend/rewrite/rewriteHandler.c	Wed Mar  1 16:35:01 2000
> > @@ -2282,8 +2282,15 @@
> >  				case CMD_INSERT:
> >  					reqperm = ACL_AP;
> >  					break;
> > +				case CMD_DELETE:
> > +					reqperm = ACL_DE;
> > +					break;
> > +				case CMD_UPDATE:
> > +					reqperm = ACL_UP;
> > +					break;
> >  				default:
> > -					reqperm = ACL_WR;
> > +					/* is it The Right Thing To Do (tm) ? */
> > +					reqperm = ACL_AP | ACL_DE | ACL_UP;
> >  					break;
> >  			}
> >  
> > diff -urbw postgresql-6.5.2/src/backend/storage/file/fd.c postgresql-6.5.2-patched/src/backend/storage/file/fd.c
> > diff -urbw postgresql-6.5.2/src/backend/utils/adt/acl.c postgresql-6.5.2-patched/src/backend/utils/adt/acl.c
> > --- postgresql-6.5.2/src/backend/utils/adt/acl.c	Mon Aug  2 07:24:49 1999
> > +++ postgresql-6.5.2-patched/src/backend/utils/adt/acl.c	Wed Mar  1 16:35:53 2000
> > @@ -154,8 +154,11 @@
> >  			case ACL_MODE_RD_CHR:
> >  				aip->ai_mode |= ACL_RD;
> >  				break;
> > -			case ACL_MODE_WR_CHR:
> > -				aip->ai_mode |= ACL_WR;
> > +			case ACL_MODE_DE_CHR:
> > +				aip->ai_mode |= ACL_DE;
> > +				break;
> > +			case ACL_MODE_UP_CHR:
> > +				aip->ai_mode |= ACL_UP;
> >  				break;
> >  			case ACL_MODE_RU_CHR:
> >  				aip->ai_mode |= ACL_RU;
> > @@ -272,7 +275,7 @@
> >  	if (!aip)
> >  		aip = &default_aclitem;
> >  
> > -	p = out = palloc(strlen("group =arwR ") + 1 + NAMEDATALEN);
> > +	p = out = palloc(strlen("group =arRdu ") + 1 + NAMEDATALEN);
> >  	if (!out)
> >  		elog(ERROR, "aclitemout: palloc failed");
> >  	*p = '\0';
> > @@ -605,9 +608,8 @@
> >  	int			i;
> >  	int			l;
> >  
> > -	Assert(strlen(old_privlist) < 5);
> > -	priv = palloc(5); /* at most "rwaR" */ ;
> > -
> > +	Assert(strlen(old_privlist) < 6);
> > +	priv = palloc(6); /* at most "arduR" */ ;
> >  	if (old_privlist == NULL || old_privlist[0] == '\0')
> >  	{
> >  		priv[0] = new_priv;
> > @@ -619,7 +621,7 @@
> >  
> >  	l = strlen(old_privlist);
> >  
> > -	if (l == 4)
> > +	if (l == 5)
> >  	{							/* can't add any more privileges */
> >  		return priv;
> >  	}
> > diff -urbw postgresql-6.5.2/src/include/utils/acl.h postgresql-6.5.2-patched/src/include/utils/acl.h
> > --- postgresql-6.5.2/src/include/utils/acl.h	Fri Jul 30 19:07:22 1999
> > +++ postgresql-6.5.2-patched/src/include/utils/acl.h	Wed Mar  1 16:40:50 2000
> > @@ -54,9 +54,10 @@
> >  #define ACL_NO			0		/* no permissions */
> >  #define ACL_AP			(1<<0)	/* append */
> >  #define ACL_RD			(1<<1)	/* read */
> > -#define ACL_WR			(1<<2)	/* write (append/delete/replace) */
> > -#define ACL_RU			(1<<3)	/* place rules */
> > -#define N_ACL_MODES		4
> > +#define ACL_DE			(1<<2)	/* delete */
> > +#define ACL_UP			(1<<3)	/* update/replace */
> > +#define ACL_RU			(1<<4)	/* place rules */
> > +#define N_ACL_MODES		5
> >  
> >  #define ACL_MODECHG_ADD			1
> >  #define ACL_MODECHG_DEL			2
> > @@ -65,7 +66,8 @@
> >  /* change this line if you want to set the default acl permission  */
> >  #define ACL_WORLD_DEFAULT		(ACL_NO)
> >  /* #define		ACL_WORLD_DEFAULT		(ACL_RD|ACL_WR|ACL_AP|ACL_RU) */
> > -#define ACL_OWNER_DEFAULT		(ACL_RD|ACL_WR|ACL_AP|ACL_RU)
> > +
> > +#define ACL_OWNER_DEFAULT		(ACL_AP|ACL_RD|ACL_RU|ACL_DE|ACL_UP)
> >  
> >  /*
> >   * AclItem
> > @@ -118,10 +120,12 @@
> >  #define ACL_MODECHG_ADD_CHR		'+'
> >  #define ACL_MODECHG_DEL_CHR		'-'
> >  #define ACL_MODECHG_EQL_CHR		'='
> > -#define ACL_MODE_STR			"arwR"	/* list of valid characters */
> > +
> > +#define ACL_MODE_STR			"arduR"	 /* list of valid characters */
> >  #define ACL_MODE_AP_CHR			'a'
> >  #define ACL_MODE_RD_CHR			'r'
> > -#define ACL_MODE_WR_CHR			'w'
> > +#define ACL_MODE_DE_CHR			'd'
> > +#define ACL_MODE_UP_CHR			'u'
> >  #define ACL_MODE_RU_CHR			'R'
> >  
> >  /* result codes for pg_aclcheck */
> > 
> 
> 
> 
-- 
Peter Eisentraut      peter_e(at)gmx(dot)net       http://yi.org/peter-e/
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Stuart Peters | 2000-10-02 17:15:03 | Regular expression not working [^xyz] | 
| Previous Message | Peter Eisentraut | 2000-09-30 11:03:31 | Re: grant/revoke bug with delete/update | 
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Peter Eisentraut | 2000-10-01 21:05:14 | Re: Solution for RI permission problem | 
| Previous Message | Peter Eisentraut | 2000-10-01 20:39:54 | Re: On the subject of yacc... |