On 8/27/14 8:02 AM, Michael Paquier wrote: > In a couple of code paths we do the following to check permissions on an > object: > if (pg_class_aclcheck(relid, userid, ACL_USAGE) != ACLCHECK_OK && > pg_class_aclcheck(relid, userid, ACL_UPDATE) != ACLCHECK_OK) > ereport(ERROR, blah); > > Wouldn't it be better to simplify that with a single call of > pg_class_aclcheck, gathering together the modes that need to be checked?
Yes, it's probably just an oversight. While looking at this, I wrote a few tests cases for sequence privileges, because that was not covered at all. That patch is attached. That led me to discover this issue: http://www.postgresql.org/message-id/5446b819.1020...@gmx.net I'll wait for the resolution of that and then commit this.
diff --git a/src/test/regress/expected/sequence.out b/src/test/regress/expected/sequence.out index a27b5fd..8783ca6 100644 --- a/src/test/regress/expected/sequence.out +++ b/src/test/regress/expected/sequence.out @@ -367,6 +367,41 @@ DROP SEQUENCE seq2; SELECT lastval(); ERROR: lastval is not yet defined in this session CREATE USER seq_user; +-- privileges tests +-- nextval +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM seq_user; +GRANT SELECT ON seq3 TO seq_user; +SELECT nextval('seq3'); +ERROR: permission denied for sequence seq3 +ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM seq_user; +GRANT UPDATE ON seq3 TO seq_user; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM seq_user; +GRANT USAGE ON seq3 TO seq_user; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +ROLLBACK; +-- currval BEGIN; SET LOCAL SESSION AUTHORIZATION seq_user; CREATE SEQUENCE seq3; @@ -377,9 +412,97 @@ SELECT nextval('seq3'); (1 row) REVOKE ALL ON seq3 FROM seq_user; +GRANT SELECT ON seq3 TO seq_user; +SELECT currval('seq3'); + currval +--------- + 1 +(1 row) + +ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +REVOKE ALL ON seq3 FROM seq_user; +GRANT UPDATE ON seq3 TO seq_user; +SELECT currval('seq3'); +ERROR: permission denied for sequence seq3 +ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +REVOKE ALL ON seq3 FROM seq_user; +GRANT USAGE ON seq3 TO seq_user; +SELECT currval('seq3'); + currval +--------- + 1 +(1 row) + +ROLLBACK; +-- lastval +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +REVOKE ALL ON seq3 FROM seq_user; +GRANT SELECT ON seq3 TO seq_user; +SELECT lastval(); + lastval +--------- + 1 +(1 row) + +ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +REVOKE ALL ON seq3 FROM seq_user; +GRANT UPDATE ON seq3 TO seq_user; SELECT lastval(); ERROR: permission denied for sequence seq3 ROLLBACK; +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); + nextval +--------- + 1 +(1 row) + +REVOKE ALL ON seq3 FROM seq_user; +GRANT USAGE ON seq3 TO seq_user; +SELECT lastval(); + lastval +--------- + 1 +(1 row) + +ROLLBACK; -- Sequences should get wiped out as well: DROP TABLE serialTest, serialTest2; -- Make sure sequences are gone: diff --git a/src/test/regress/sql/sequence.sql b/src/test/regress/sql/sequence.sql index 8d3b700..0dd653d 100644 --- a/src/test/regress/sql/sequence.sql +++ b/src/test/regress/sql/sequence.sql @@ -168,11 +168,86 @@ CREATE SEQUENCE seq2; CREATE USER seq_user; +-- privileges tests + +-- nextval +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM seq_user; +GRANT SELECT ON seq3 TO seq_user; +SELECT nextval('seq3'); +ROLLBACK; + +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM seq_user; +GRANT UPDATE ON seq3 TO seq_user; +SELECT nextval('seq3'); +ROLLBACK; + +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +REVOKE ALL ON seq3 FROM seq_user; +GRANT USAGE ON seq3 TO seq_user; +SELECT nextval('seq3'); +ROLLBACK; + +-- currval +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); +REVOKE ALL ON seq3 FROM seq_user; +GRANT SELECT ON seq3 TO seq_user; +SELECT currval('seq3'); +ROLLBACK; + +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); +REVOKE ALL ON seq3 FROM seq_user; +GRANT UPDATE ON seq3 TO seq_user; +SELECT currval('seq3'); +ROLLBACK; + +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); +REVOKE ALL ON seq3 FROM seq_user; +GRANT USAGE ON seq3 TO seq_user; +SELECT currval('seq3'); +ROLLBACK; + +-- lastval +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); +REVOKE ALL ON seq3 FROM seq_user; +GRANT SELECT ON seq3 TO seq_user; +SELECT lastval(); +ROLLBACK; + +BEGIN; +SET LOCAL SESSION AUTHORIZATION seq_user; +CREATE SEQUENCE seq3; +SELECT nextval('seq3'); +REVOKE ALL ON seq3 FROM seq_user; +GRANT UPDATE ON seq3 TO seq_user; +SELECT lastval(); +ROLLBACK; + BEGIN; SET LOCAL SESSION AUTHORIZATION seq_user; CREATE SEQUENCE seq3; SELECT nextval('seq3'); REVOKE ALL ON seq3 FROM seq_user; +GRANT USAGE ON seq3 TO seq_user; SELECT lastval(); ROLLBACK;
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers