Skip to content

Commit e0c0a5e

Browse files
committed
Allow usage on schema for mdb_read_all_data (#23)
1 parent ee23105 commit e0c0a5e

3 files changed

Lines changed: 37 additions & 0 deletions

File tree

src/backend/catalog/aclchk.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4561,6 +4561,7 @@ pg_namespace_aclmask(Oid nsp_oid, Oid roleid,
45614561
bool isNull;
45624562
Acl *acl;
45634563
Oid ownerId;
4564+
Oid mdb_read_all_data_oid;
45644565

45654566
/* Superusers bypass all permission checking. */
45664567
if (superuser_arg(roleid))
@@ -4605,6 +4606,8 @@ pg_namespace_aclmask(Oid nsp_oid, Oid roleid,
46054606

46064607
ownerId = ((Form_pg_namespace) GETSTRUCT(tuple))->nspowner;
46074608

4609+
mdb_read_all_data_oid = get_role_oid("mdb_read_all_data", true);
4610+
46084611
aclDatum = SysCacheGetAttr(NAMESPACEOID, tuple, Anum_pg_namespace_nspacl,
46094612
&isNull);
46104613
if (isNull)
@@ -4637,6 +4640,13 @@ pg_namespace_aclmask(Oid nsp_oid, Oid roleid,
46374640
(has_privs_of_role(roleid, ROLE_PG_READ_ALL_DATA) ||
46384641
has_privs_of_role(roleid, ROLE_PG_WRITE_ALL_DATA)))
46394642
result |= ACL_USAGE;
4643+
4644+
4645+
if (mask & ACL_USAGE && !(result & ACL_USAGE) &&
4646+
has_privs_of_role(roleid, mdb_read_all_data_oid) &&
4647+
!has_privs_of_unwanted_system_role(ownerId, true))
4648+
result |= ACL_USAGE;
4649+
46404650
return result;
46414651
}
46424652

src/test/regress/expected/mdb_read_write_roles.out

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ SET ROLE pg_write_all_data;
1818
CREATE TABLE regress_pgrwd_table();
1919
SET ROLE regress_mdb_superuser_user1;
2020
CREATE TABLE regress_mdbsu_table();
21+
CREATE SCHEMA regress_schema CREATE TABLE regress_mdbsu_table();
2122
SET ROLE regress_mdb_superuser_user2;
2223
CREATE TABLE regress_mdbsu_table2();
24+
CREATE SCHEMA regress_schema2 CREATE TABLE regress_mdbsu_table2();
2325
SET ROLE mdb_read_all_data;
2426
-- cannot read all data (fail)
2527
TABLE pg_authid;
@@ -45,6 +47,15 @@ TABLE regress_mdbsu_table2;
4547
--
4648
(0 rows)
4749

50+
-- check USAGE of schema
51+
TABLE regress_schema.regress_mdbsu_table;
52+
--
53+
(0 rows)
54+
55+
TABLE regress_schema2.regress_mdbsu_table2;
56+
--
57+
(0 rows)
58+
4859
SET ROLE mdb_write_all_data;
4960
CREATE TABLE regress_tt_dat();
5061
-- cannot read all data (fail)
@@ -73,6 +84,10 @@ DROP TABLE regress_pgrad_table;
7384
DROP TABLE regress_pgrwd_table;
7485
DROP TABLE regress_mdbsu_table;
7586
DROP TABLE regress_mdbsu_table2;
87+
DROP TABLE regress_schema.regress_mdbsu_table;
88+
DROP TABLE regress_schema2.regress_mdbsu_table2;
89+
DROP SCHEMA regress_schema;
90+
DROP SCHEMA regress_schema2;
7691
DROP TABLE regress_superuser_table;
7792
REVOKE CREATE ON DATABASE regression FROM regress_mdb_superuser_user2;
7893
REVOKE CREATE ON DATABASE regression FROM regress_mdb_superuser_user3;

src/test/regress/sql/mdb_read_write_roles.sql

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@ CREATE TABLE regress_pgrwd_table();
2828

2929
SET ROLE regress_mdb_superuser_user1;
3030
CREATE TABLE regress_mdbsu_table();
31+
CREATE SCHEMA regress_schema CREATE TABLE regress_mdbsu_table();
3132

3233
SET ROLE regress_mdb_superuser_user2;
3334
CREATE TABLE regress_mdbsu_table2();
35+
CREATE SCHEMA regress_schema2 CREATE TABLE regress_mdbsu_table2();
3436

3537
SET ROLE mdb_read_all_data;
3638
-- cannot read all data (fail)
@@ -48,6 +50,9 @@ TABLE regress_pgwsf_table;
4850
TABLE regress_mdbsu_table;
4951
TABLE regress_mdbsu_table2;
5052

53+
-- check USAGE of schema
54+
TABLE regress_schema.regress_mdbsu_table;
55+
TABLE regress_schema2.regress_mdbsu_table2;
5156

5257
SET ROLE mdb_write_all_data;
5358
CREATE TABLE regress_tt_dat();
@@ -78,6 +83,13 @@ DROP TABLE regress_pgrwd_table;
7883

7984
DROP TABLE regress_mdbsu_table;
8085
DROP TABLE regress_mdbsu_table2;
86+
87+
DROP TABLE regress_schema.regress_mdbsu_table;
88+
DROP TABLE regress_schema2.regress_mdbsu_table2;
89+
90+
DROP SCHEMA regress_schema;
91+
DROP SCHEMA regress_schema2;
92+
8193
DROP TABLE regress_superuser_table;
8294

8395
REVOKE CREATE ON DATABASE regression FROM regress_mdb_superuser_user2;

0 commit comments

Comments
 (0)