Skip to content

Commit 090c413

Browse files
committed
sql: fix rolbypassrls global in pg_roles and pg_authid tables
This change adds coverage for global bypassrl via `GRANT SYSTEM BYPASSRLS TO user_name;`. Fixes: #146228 Epic: CRDB-48807 Release note: None
1 parent 8086823 commit 090c413

File tree

6 files changed

+166
-57
lines changed

6 files changed

+166
-57
lines changed

pkg/cli/clisqlshell/testdata/describe

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1966,10 +1966,10 @@ SELECT rolname AS "Role name",
19661966
memberof AS "Member of"
19671967
FROM roles
19681968
Role name,Attributes,Member of
1969-
myuser,"Superuser, Create role, Create DB",{admin}
1970-
root,"Superuser, Create role, Create DB",{admin}
1971-
admin,"Superuser, Create role, Create DB",{}
1972-
node,"Superuser, Create role, Create DB, Cannot login",{}
1969+
myuser,"Superuser, Create role, Create DB, Bypass RLS",{admin}
1970+
root,"Superuser, Create role, Create DB, Bypass RLS",{admin}
1971+
admin,"Superuser, Create role, Create DB, Bypass RLS",{}
1972+
node,"Superuser, Create role, Create DB, Cannot login, Bypass RLS",{}
19731973

19741974
cli
19751975
\du myuser
@@ -2008,7 +2008,7 @@ SELECT rolname AS "Role name",
20082008
memberof AS "Member of"
20092009
FROM roles
20102010
Role name,Attributes,Member of
2011-
myuser,"Superuser, Create role, Create DB",{admin}
2011+
myuser,"Superuser, Create role, Create DB, Bypass RLS",{admin}
20122012

20132013
subtest end
20142014

pkg/sql/information_schema.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2925,16 +2925,6 @@ func (r roleOptions) createDB() (tree.DBool, error) {
29252925
return tree.DBool(createDB), err
29262926
}
29272927

2928-
func (r roleOptions) createRole() (tree.DBool, error) {
2929-
createRole, err := r.Exists("CREATEROLE")
2930-
return tree.DBool(createRole), err
2931-
}
2932-
2933-
func (r roleOptions) bypassRLS() (tree.DBool, error) {
2934-
bypassRLS, err := r.Exists("BYPASSRLS")
2935-
return tree.DBool(bypassRLS), err
2936-
}
2937-
29382928
// forEachRoleAtCacheReadTS reads from system.users and related tables using a
29392929
// timestamp based on when the role membership cache was refreshed.
29402930
func forEachRoleAtCacheReadTS(

pkg/sql/logictest/testdata/logic_test/pg_catalog

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2761,9 +2761,9 @@ FROM pg_catalog.pg_roles
27612761
ORDER BY rolname
27622762
----
27632763
oid rolname rolconnlimit rolpassword rolvaliduntil rolbypassrls rolconfig
2764-
2310524507 admin -1 ******** NULL false NULL
2765-
3233629770 node -1 ******** NULL false NULL
2766-
1546506610 root -1 ******** NULL false NULL
2764+
2310524507 admin -1 ******** NULL true NULL
2765+
3233629770 node -1 ******** NULL true NULL
2766+
1546506610 root -1 ******** NULL true NULL
27672767
2264919399 testuser -1 ******** NULL false NULL
27682768

27692769
# Regression test for https://github.com/cockroachdb/cockroach/issues/136230.
@@ -4800,7 +4800,7 @@ ORDER BY rolname
48004800
----
48014801
rolname rolcreatedb rolconfig rolinherit rolcanlogin rolvaliduntil
48024802
testrole1 false NULL true false NULL
4803-
testuser1 false NULL true true NULL
4803+
testuser1 true NULL true true NULL
48044804
testuser2 false NULL true true NULL
48054805

48064806
query TBBBBT colnames
@@ -4812,8 +4812,8 @@ ORDER BY rolname
48124812
rolname rolcreatedb rolcreaterole rolinherit rolcanlogin rolvaliduntil
48134813
root true true true true NULL
48144814
testrole1 false false true false NULL
4815-
testuser1 false false true true NULL
4816-
testuser2 false false true true NULL
4815+
testuser1 true false true true NULL
4816+
testuser2 false true true true NULL
48174817

48184818
# Testing users that have admin role
48194819

pkg/sql/logictest/testdata/logic_test/row_level_security

Lines changed: 106 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5331,20 +5331,28 @@ CREATE ROLE can_bypassrls WITH BYPASSRLS;
53315331
statement ok
53325332
CREATE ROLE cannot_bypassrls;
53335333

5334+
statement ok
5335+
CREATE ROLE can_bypassrls_global;
5336+
5337+
statement ok
5338+
GRANT SYSTEM BYPASSRLS TO can_bypassrls_global;
5339+
53345340
query B
5335-
SELECT rolbypassrls FROM pg_authid WHERE rolname = 'can_bypassrls';
5341+
SELECT rolbypassrls FROM pg_authid WHERE rolname = 'can_bypassrls' OR rolname = 'can_bypassrls_global';
53365342
----
53375343
true
5344+
true
53385345

53395346
query B
53405347
SELECT rolbypassrls FROM pg_authid WHERE rolname = 'cannot_bypassrls';
53415348
----
53425349
false
53435350

53445351
query B
5345-
SELECT rolbypassrls FROM pg_roles WHERE rolname = 'can_bypassrls';
5352+
SELECT rolbypassrls FROM pg_roles WHERE rolname = 'can_bypassrls' OR rolname = 'can_bypassrls_global';
53465353
----
53475354
true
5355+
true
53485356

53495357

53505358
query B
@@ -5359,4 +5367,100 @@ DROP ROLE can_bypassrls;
53595367
statement ok
53605368
DROP ROLE cannot_bypassrls;
53615369

5370+
subtest createrole_pg_roles_pg_authid
5371+
5372+
statement ok
5373+
CREATE ROLE can_createrole WITH CREATEROLE;
5374+
5375+
statement ok
5376+
CREATE ROLE cannot_createrole;
5377+
5378+
statement ok
5379+
CREATE ROLE can_createrole_global;
5380+
5381+
statement ok
5382+
GRANT SYSTEM CREATEROLE TO can_createrole_global;
5383+
5384+
query B
5385+
SELECT rolcreaterole FROM pg_authid WHERE rolname = 'can_createrole' OR rolname = 'can_createrole_global';
5386+
----
5387+
true
5388+
true
5389+
5390+
query B
5391+
SELECT rolcreaterole FROM pg_authid WHERE rolname = 'cannot_createrole';
5392+
----
5393+
false
5394+
5395+
query B
5396+
SELECT rolcreaterole FROM pg_roles WHERE rolname = 'can_createrole' OR rolname = 'can_createrole_global';
5397+
----
5398+
true
5399+
true
5400+
5401+
query B
5402+
SELECT rolcreaterole FROM pg_roles WHERE rolname = 'cannot_createrole';
5403+
----
5404+
false
5405+
5406+
statement ok
5407+
DROP ROLE can_createrole;
5408+
5409+
statement ok
5410+
DROP ROLE cannot_createrole;
5411+
5412+
statement ok
5413+
REVOKE SYSTEM CREATEROLE FROM can_createrole_global;
5414+
5415+
statement ok
5416+
DROP ROLE can_createrole_global;
5417+
5418+
subtest createdb_pg_roles_pg_authid
5419+
5420+
statement ok
5421+
CREATE ROLE can_createdb WITH CREATEDB;
5422+
5423+
statement ok
5424+
CREATE ROLE cannot_createdb;
5425+
5426+
statement ok
5427+
CREATE ROLE can_createdb_global;
5428+
5429+
statement ok
5430+
GRANT SYSTEM CREATEDB TO can_createdb_global;
5431+
5432+
query B
5433+
SELECT rolcreatedb FROM pg_authid WHERE rolname = 'can_createdb' OR rolname = 'can_createdb_global';
5434+
----
5435+
true
5436+
true
5437+
5438+
query B
5439+
SELECT rolcreatedb FROM pg_authid WHERE rolname = 'cannot_createdb';
5440+
----
5441+
false
5442+
5443+
query B
5444+
SELECT rolcreatedb FROM pg_roles WHERE rolname = 'can_createdb' OR rolname = 'can_createdb_global';
5445+
----
5446+
true
5447+
true
5448+
5449+
query B
5450+
SELECT rolcreatedb FROM pg_roles WHERE rolname = 'cannot_createdb';
5451+
----
5452+
false
5453+
5454+
statement ok
5455+
DROP ROLE can_createdb;
5456+
5457+
statement ok
5458+
DROP ROLE cannot_createdb;
5459+
5460+
statement ok
5461+
REVOKE SYSTEM CREATEDB FROM can_createdb_global;
5462+
5463+
statement ok
5464+
DROP ROLE can_createdb_global;
5465+
53625466
subtest end

pkg/sql/logictest/testdata/logic_test/synthetic_privileges

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,12 +320,20 @@ SELECT has_table_privilege('testuser4', 'crdb_internal.feature_usage', 'SELECT')
320320
----
321321
false
322322

323+
# Cleanup the privilege that was added.
324+
statement ok
325+
REVOKE SYSTEM MODIFYCLUSTERSETTING FROM testuser
326+
323327
# This subtest makes sure that an unknown privilege in the system.privileges
324328
# table does not break code that is trying to look up other privileges.
325329
# This situation can happen if a new synthetic privilege is backported to an
326330
# older branch.
327331
subtest unknown_privilege
328332

333+
# Add an arbitrary privilege so that we can test manually overriding it.
334+
statement ok
335+
GRANT SYSTEM CREATEDB TO testuser
336+
329337
statement ok
330338
INSERT INTO system.users VALUES ('node', NULL, true, 0);
331339

pkg/sql/pg_catalog.go

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -625,19 +625,22 @@ https://www.postgresql.org/docs/9.5/catalog-pg-authid.html`,
625625
return err
626626
}
627627
roleCanLogin := !noLogin
628-
createDB, err := options.createDB()
628+
rolValidUntil, err := options.validUntil(p)
629629
if err != nil {
630630
return err
631631
}
632-
rolValidUntil, err := options.validUntil(p)
632+
633+
bypassRLS, err := p.UserHasGlobalPrivilegeOrRoleOption(ctx, privilege.BYPASSRLS, userName)
633634
if err != nil {
634635
return err
635636
}
636-
createRole, err := options.createRole()
637+
638+
createRole, err := p.UserHasGlobalPrivilegeOrRoleOption(ctx, privilege.CREATEROLE, userName)
637639
if err != nil {
638640
return err
639641
}
640-
bypassRLS, err := options.bypassRLS()
642+
643+
createDB, err := p.UserHasGlobalPrivilegeOrRoleOption(ctx, privilege.CREATEDB, userName)
641644
if err != nil {
642645
return err
643646
}
@@ -648,18 +651,18 @@ https://www.postgresql.org/docs/9.5/catalog-pg-authid.html`,
648651
}
649652

650653
return addRow(
651-
h.UserOid(userName), // oid
652-
tree.NewDName(userName.Normalized()), // rolname
653-
tree.MakeDBool(isRoot || isSuper), // rolsuper
654-
tree.MakeDBool(roleInherits), // rolinherit
655-
tree.MakeDBool(isRoot || createRole), // rolcreaterole
656-
tree.MakeDBool(isRoot || createDB), // rolcreatedb
657-
tree.MakeDBool(roleCanLogin), // rolcanlogin.
658-
tree.DBoolFalse, // rolreplication
659-
tree.MakeDBool(bypassRLS), // rolbypassrls
660-
negOneVal, // rolconnlimit
661-
passwdStarString, // rolpassword
662-
rolValidUntil, // rolvaliduntil
654+
h.UserOid(userName), // oid
655+
tree.NewDName(userName.Normalized()), // rolname
656+
tree.MakeDBool(isRoot || isSuper), // rolsuper
657+
tree.MakeDBool(roleInherits), // rolinherit
658+
tree.MakeDBool(isRoot || tree.DBool(createRole)), // rolcreaterole
659+
tree.MakeDBool(isRoot || tree.DBool(createDB)), // rolcreatedb
660+
tree.MakeDBool(roleCanLogin), // rolcanlogin.
661+
tree.DBoolFalse, // rolreplication
662+
tree.MakeDBool(tree.DBool(bypassRLS)), // rolbypassrls
663+
negOneVal, // rolconnlimit
664+
passwdStarString, // rolpassword
665+
rolValidUntil, // rolvaliduntil
663666
)
664667
})
665668
},
@@ -2978,42 +2981,46 @@ https://www.postgresql.org/docs/9.5/view-pg-roles.html`,
29782981
return err
29792982
}
29802983
roleCanLogin := isRoot || !noLogin
2981-
createDB, err := options.createDB()
2984+
rolValidUntil, err := options.validUntil(p)
29822985
if err != nil {
29832986
return err
29842987
}
2985-
rolValidUntil, err := options.validUntil(p)
2988+
2989+
bypassRLS, err := p.UserHasGlobalPrivilegeOrRoleOption(ctx, privilege.BYPASSRLS, userName)
29862990
if err != nil {
29872991
return err
29882992
}
2989-
createRole, err := options.createRole()
2993+
2994+
createRole, err := p.UserHasGlobalPrivilegeOrRoleOption(ctx, privilege.CREATEROLE, userName)
29902995
if err != nil {
29912996
return err
29922997
}
2993-
bypassRLS, err := options.bypassRLS()
2998+
2999+
createDB, err := p.UserHasGlobalPrivilegeOrRoleOption(ctx, privilege.CREATEDB, userName)
29943000
if err != nil {
29953001
return err
29963002
}
3003+
29973004
isSuper, err := userIsSuper(ctx, p, userName)
29983005
if err != nil {
29993006
return err
30003007
}
30013008

30023009
return addRow(
3003-
h.UserOid(userName), // oid
3004-
tree.NewDName(userName.Normalized()), // rolname
3005-
tree.MakeDBool(isRoot || isSuper), // rolsuper
3006-
tree.MakeDBool(roleInherits), // rolinherit
3007-
tree.MakeDBool(isSuper || createRole), // rolcreaterole
3008-
tree.MakeDBool(isSuper || createDB), // rolcreatedb
3009-
tree.DBoolFalse, // rolcatupdate
3010-
tree.MakeDBool(roleCanLogin), // rolcanlogin.
3011-
tree.DBoolFalse, // rolreplication
3012-
negOneVal, // rolconnlimit
3013-
passwdStarString, // rolpassword
3014-
rolValidUntil, // rolvaliduntil
3015-
tree.MakeDBool(bypassRLS), // rolbypassrls
3016-
settings, // rolconfig
3010+
h.UserOid(userName), // oid
3011+
tree.NewDName(userName.Normalized()), // rolname
3012+
tree.MakeDBool(isRoot || isSuper), // rolsuper
3013+
tree.MakeDBool(roleInherits), // rolinherit
3014+
tree.MakeDBool(isSuper || tree.DBool(createRole)), // rolcreaterole
3015+
tree.MakeDBool(isSuper || tree.DBool(createDB)), // rolcreatedb
3016+
tree.DBoolFalse, // rolcatupdate
3017+
tree.MakeDBool(roleCanLogin), // rolcanlogin.
3018+
tree.DBoolFalse, // rolreplication
3019+
negOneVal, // rolconnlimit
3020+
passwdStarString, // rolpassword
3021+
rolValidUntil, // rolvaliduntil
3022+
tree.MakeDBool(tree.DBool(bypassRLS)), // rolbypassrls
3023+
settings, // rolconfig
30173024
)
30183025
})
30193026
},

0 commit comments

Comments
 (0)