123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932 |
- # Copyright Materialize, Inc. and contributors. All rights reserved.
- #
- # Use of this software is governed by the Business Source License
- # included in the LICENSE file at the root of this repository.
- #
- # As of the Change Date specified in that file, in accordance with
- # the Business Source License, use of this software will be governed
- # by the Apache License, Version 2.0.
- mode cockroach
- reset-server
- # Give materialize the CREATEROLE system privilege.
- simple conn=mz_system,user=mz_system
- GRANT CREATEROLE ON SYSTEM TO materialize;
- ----
- COMPLETE 0
- statement ok
- CREATE VIEW role_members AS
- SELECT
- role.name AS role,
- member.name AS member,
- grantor.name AS grantor
- FROM mz_role_members membership
- LEFT JOIN mz_roles role ON membership.role_id = role.id
- LEFT JOIN mz_roles member ON membership.member = member.id
- LEFT JOIN mz_roles grantor ON membership.grantor = grantor.id
- statement ok
- CREATE ROLE joe
- statement ok
- CREATE ROLE group1
- query TTT rowsort
- SELECT * FROM role_members
- ----
- query B rowsort
- SELECT pg_has_role('joe', 'group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('joe', 'group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT pg_has_role((SELECT oid FROM mz_roles WHERE name = 'joe'), 'group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role((SELECT oid FROM mz_roles WHERE name = 'joe'), 'group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT pg_has_role('joe', (SELECT oid FROM mz_roles WHERE name = 'group1'), 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('joe', (SELECT oid FROM mz_roles WHERE name = 'group1'), 'USAGE')
- ----
- false
- query B rowsort
- SELECT pg_has_role((SELECT oid FROM mz_roles WHERE name = 'joe'), (SELECT oid FROM mz_roles WHERE name = 'group1'), 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role((SELECT oid FROM mz_roles WHERE name = 'joe'), (SELECT oid FROM mz_roles WHERE name = 'group1'), 'USAGE')
- ----
- false
- statement ok
- GRANT group1 TO joe
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group1 joe mz_system
- query B rowsort
- SELECT pg_has_role('joe', 'group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('joe', 'group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role((SELECT oid FROM mz_roles WHERE name = 'joe'), 'group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role((SELECT oid FROM mz_roles WHERE name = 'joe'), 'group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role('joe', (SELECT oid FROM mz_roles WHERE name = 'group1'), 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('joe', (SELECT oid FROM mz_roles WHERE name = 'group1'), 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role((SELECT oid FROM mz_roles WHERE name = 'joe'), (SELECT oid FROM mz_roles WHERE name = 'group1'), 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role((SELECT oid FROM mz_roles WHERE name = 'joe'), (SELECT oid FROM mz_roles WHERE name = 'group1'), 'USAGE')
- ----
- true
- # Dropping a role also removes it from role_members
- simple conn=mz_system,user=mz_system
- DROP ROLE group1
- ----
- COMPLETE 0
- query TTT rowsort
- SELECT * FROM mz_role_members
- ----
- statement ok
- CREATE ROLE group1
- query B rowsort
- SELECT pg_has_role('joe', 'group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('joe', 'group1', 'USAGE')
- ----
- false
- statement ok
- GRANT group1 TO joe
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group1 joe mz_system
- query B rowsort
- SELECT pg_has_role('joe', 'group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('joe', 'group1', 'USAGE')
- ----
- true
- # Dropped roles have their membership revoked
- simple conn=mz_system,user=mz_system
- DROP ROLE joe
- ----
- COMPLETE 0
- query TTT rowsort
- SELECT * FROM mz_role_members
- ----
- statement ok
- CREATE ROLE joe
- statement ok
- GRANT group1 TO joe
- statement ok
- CREATE ROLE group2
- simple conn=mz_system,user=mz_system
- GRANT group2 TO joe
- ----
- COMPLETE 0
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group1 joe mz_system
- group2 joe mz_system
- query B rowsort
- SELECT pg_has_role('joe', 'group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('joe', 'group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role('joe', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('joe', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role('group1', 'group2', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('group1', 'group2', 'USAGE')
- ----
- false
- statement ok
- GRANT group2 TO group1
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group1 joe mz_system
- group2 joe mz_system
- group2 group1 mz_system
- query B rowsort
- SELECT pg_has_role('joe', 'group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('joe', 'group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role('joe', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('joe', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role('group1', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('group1', 'group2', 'USAGE')
- ----
- true
- # Redundant grants don't error or show up multiple times in mz_role_membership or change the grantor
- simple conn=mz_system,user=mz_system
- GRANT group1 TO joe
- ----
- COMPLETE 0
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group1 joe mz_system
- group2 joe mz_system
- group2 group1 mz_system
- # Test circular membership errors
- statement error role "joe" is a member of role "joe"
- GRANT joe TO joe
- statement error role "joe" is a member of role "group1"
- GRANT joe TO group1
- statement ok
- REVOKE group1 FROM joe
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group2 joe mz_system
- group2 group1 mz_system
- query B rowsort
- SELECT pg_has_role('joe', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('joe', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role('joe', 'group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('joe', 'group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT pg_has_role('group1', 'joe', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('group1', 'joe', 'USAGE')
- ----
- false
- query B rowsort
- SELECT pg_has_role('group1', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('group1', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role('group2', 'joe', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('group2', 'joe', 'USAGE')
- ----
- false
- query B rowsort
- SELECT pg_has_role('group2', 'group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('group2', 'group1', 'USAGE')
- ----
- false
- # Redundant revokes don't error
- statement ok
- REVOKE group1 FROM joe
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group2 joe mz_system
- group2 group1 mz_system
- # Dropped roles are revoked from all members
- statement ok
- DROP ROLE group2
- query TTT rowsort
- SELECT * FROM mz_role_members
- ----
- query TTT rowsort
- SELECT * FROM role_members
- ----
- # Dropped roles have their membership revoked
- statement ok
- DROP ROLE joe
- query TTT rowsort
- SELECT * FROM role_members
- ----
- statement ok
- CREATE ROLE joe
- # Cannot grant or revoke system role
- statement error db error: ERROR: role name "mz_system" cannot be granted
- GRANT mz_system TO joe
- statement error role name "mz_system" is reserved
- GRANT joe TO mz_system
- statement error db error: ERROR: role name "mz_system" cannot be granted
- REVOKE mz_system FROM joe
- statement error role name "mz_system" is reserved
- REVOKE joe FROM mz_system
- # Prevent granting and revoking to/from PUBLIC role
- statement error role name "public" is reserved
- GRANT group1 TO public
- statement error db error: ERROR: role name "public" cannot be granted
- GRANT public TO group1
- statement error role name "public" is reserved
- REVOKE group1 FROM public
- statement error db error: ERROR: role name "public" cannot be granted
- REVOKE public FROM group1
- statement ok
- DROP ROLE group1
- statement ok
- DROP ROLE joe
- # SHOW ROLES/USERS
- query TT rowsort
- show roles
- ----
- materialize (empty)
- query TT rowsort
- show users
- ----
- materialize (empty)
- # Test grant/revoke multiple roles
- statement ok
- CREATE ROLE joe
- statement ok
- CREATE ROLE group1
- statement ok
- CREATE ROLE group2
- statement ok
- CREATE ROLE group3
- statement error unknown role 'bob'
- GRANT group3 TO joe, group1, bob
- query TTT rowsort
- SELECT * FROM role_members
- ----
- statement error role name "mz_system" is reserved
- GRANT group3 TO joe, group1, mz_system
- query TTT rowsort
- SELECT * FROM role_members
- ----
- statement ok
- GRANT group3 TO joe, group1
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group3 joe mz_system
- group3 group1 mz_system
- statement error role "joe" is a member of role "group3"
- GRANT joe TO group1, group3
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group3 joe mz_system
- group3 group1 mz_system
- statement ok
- GRANT group3 TO group1, group2
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group3 joe mz_system
- group3 group1 mz_system
- group3 group2 mz_system
- statement error unknown role 'bob'
- REVOKE group3 FROM joe, group1, bob
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group3 joe mz_system
- group3 group1 mz_system
- group3 group2 mz_system
- statement error role name "mz_system" is reserved
- REVOKE group3 FROM joe, group1, mz_system
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group3 joe mz_system
- group3 group1 mz_system
- group3 group2 mz_system
- statement ok
- REVOKE group3 FROM joe, group1
- query TTT rowsort
- SELECT * FROM role_members
- ----
- group3 group2 mz_system
- statement ok
- REVOKE group3 FROM joe, group2
- query TTT rowsort
- SELECT * FROM role_members
- ----
- # Test pg_auth_members
- statement ok
- GRANT group3 TO joe, group1, group2
- statement ok
- GRANT group1 TO joe
- query I rowsort
- SELECT COUNT(*) FROM pg_auth_members
- ----
- 4
- query TTTB rowsort
- SELECT role.name, member.name, grantor.name, members.admin_option
- FROM pg_auth_members members
- LEFT JOIN mz_roles role ON members.roleid = role.oid
- LEFT JOIN mz_roles member ON members.member = member.oid
- LEFT JOIN mz_roles grantor ON members.grantor = grantor.oid
- ----
- group1 joe mz_system false
- group3 joe mz_system false
- group3 group1 mz_system false
- group3 group2 mz_system false
- statement ok
- DROP ROLE group1, group2, group3, joe
- statement ok
- CREATE ROLE joe
- statement ok
- CREATE ROLE mike
- statement ok
- CREATE ROLE group1
- statement ok
- CREATE ROLE group2
- statement ok
- GRANT group1, group2 TO joe, mike
- query TTTB rowsort
- SELECT role.name, member.name, grantor.name, members.admin_option
- FROM pg_auth_members members
- LEFT JOIN mz_roles role ON members.roleid = role.oid
- LEFT JOIN mz_roles member ON members.member = member.oid
- LEFT JOIN mz_roles grantor ON members.grantor = grantor.oid
- ----
- group1 joe mz_system false
- group2 joe mz_system false
- group1 mike mz_system false
- group2 mike mz_system false
- statement ok
- REVOKE group1, group2 FROM joe, mike
- query TTTB rowsort
- SELECT role.name, member.name, grantor.name, members.admin_option
- FROM pg_auth_members members
- LEFT JOIN mz_roles role ON members.roleid = role.oid
- LEFT JOIN mz_roles member ON members.member = member.oid
- LEFT JOIN mz_roles grantor ON members.grantor = grantor.oid
- ----
- statement ok
- DROP ROLE group1, group2, joe, mike
- # Test recursive check of pg_has_role
- simple conn=mz_system,user=mz_system
- CREATE ROLE group1;
- ----
- COMPLETE 0
- simple conn=mz_system,user=mz_system
- CREATE ROLE group2;
- ----
- COMPLETE 0
- simple conn=mz_system,user=mz_system
- CREATE ROLE joe;
- ----
- COMPLETE 0
- simple conn=mz_system,user=mz_system
- CREATE ROLE other;
- ----
- COMPLETE 0
- simple conn=mz_system,user=mz_system
- GRANT group1 to joe;
- ----
- COMPLETE 0
- simple conn=mz_system,user=mz_system
- GRANT group2 to group1;
- ----
- COMPLETE 0
- simple conn=mz_system,user=mz_system
- GRANT group1 to other;
- ----
- COMPLETE 0
- query B rowsort
- SELECT pg_has_role('joe', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('joe', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role('joe', 'group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('joe', 'group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role('group1', 'joe', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('group1', 'joe', 'USAGE')
- ----
- false
- query B rowsort
- SELECT pg_has_role('group1', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('group1', 'group2', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role('group2', 'joe', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('group2', 'joe', 'USAGE')
- ----
- false
- query B rowsort
- SELECT pg_has_role('group2', 'group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('group2', 'group1', 'USAGE')
- ----
- false
- simple conn=mz_system,user=mz_system
- DROP ROLE group1, group2, joe, other;
- ----
- COMPLETE 0
- # Test two input variant of pg_has_role.
- simple conn=mz_system,user=mz_system
- CREATE ROLE group1;
- ----
- COMPLETE 0
- query B rowsort
- SELECT pg_has_role('group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT pg_has_role('group1', 'MEMBER')
- ----
- false
- query B rowsort
- SELECT has_role('group1', 'MEMBER')
- ----
- false
- simple conn=mz_system,user=mz_system
- GRANT group1 TO materialize
- ----
- COMPLETE 0
- query B rowsort
- SELECT pg_has_role('group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT has_role('group1', 'USAGE')
- ----
- true
- query B rowsort
- SELECT pg_has_role('group1', 'MEMBER')
- ----
- true
- query B rowsort
- SELECT has_role('group1', 'MEMBER')
- ----
- true
- simple conn=mz_system,user=mz_system
- REVOKE group1 FROM materialize
- ----
- COMPLETE 0
- query B rowsort
- SELECT pg_has_role('group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('group1', 'USAGE')
- ----
- false
- query B rowsort
- SELECT pg_has_role('group1', 'MEMBER')
- ----
- false
- query B rowsort
- SELECT has_role('group1', 'MEMBER')
- ----
- false
- simple conn=mz_system,user=mz_system
- DROP ROLE group1
- ----
- COMPLETE 0
- # Test pg_has_role error scenarios.
- ## If any input is NULL then the result is NULL.
- query B rowsort
- SELECT pg_has_role(NULL, 'materialize', 'USAGE')
- ----
- NULL
- query B rowsort
- SELECT has_role(NULL, 'materialize', 'USAGE')
- ----
- NULL
- query B rowsort
- SELECT pg_has_role('materialize', NULL, 'MEMBER')
- ----
- NULL
- query B rowsort
- SELECT has_role('materialize', NULL, 'MEMBER')
- ----
- NULL
- query B rowsort
- SELECT pg_has_role('materialize', 'materialize', NULL)
- ----
- NULL
- query B rowsort
- SELECT has_role('materialize', 'materialize', NULL)
- ----
- NULL
- ## If any of the text inputs are invalid then the query should error.
- query error role "fake-role" does not exist
- SELECT pg_has_role('fake-role', 'materialize', 'USAGE')
- query error role "fake-role" does not exist
- SELECT pg_has_role('materialize', 'fake-role', 'USAGE')
- query error unrecognized privilege type: "fake privilege"
- SELECT pg_has_role('materialize', 'materialize', 'fake privilege')
- ## If any of the oid inputs are invalid then the query should be false.
- query B rowsort
- SELECT pg_has_role(((SELECT MAX(oid::int8) FROM mz_roles) + 1)::text::oid, 'materialize', 'MEMBER')
- ----
- false
- query B rowsort
- SELECT has_role(((SELECT MAX(oid::int8) FROM mz_roles) + 1)::text::oid, 'materialize', 'MEMBER')
- ----
- false
- query B rowsort
- SELECT pg_has_role('materialize', ((SELECT MAX(oid::int8) FROM mz_roles) + 1)::text::oid, 'USAGE')
- ----
- false
- query B rowsort
- SELECT has_role('materialize', ((SELECT MAX(oid::int8) FROM mz_roles) + 1)::text::oid, 'USAGE')
- ----
- false
- ## Public role isn't accepted
- query error role "public" does not exist
- SELECT pg_has_role('materialize', 'public', 'USAGE')
- query error role "public" does not exist
- SELECT pg_has_role('public', 'materialize', 'USAGE')
- # Test information_schema.applicable_roles
- statement ok
- CREATE ROLE r1
- statement ok
- CREATE ROLE r2
- statement ok
- CREATE ROLE r3
- statement ok
- CREATE ROLE r4
- statement ok
- GRANT r2 TO r1
- statement ok
- GRANT r3 TO r2
- statement ok
- GRANT r3 TO r4
- simple conn=r1,user=r1
- SELECT * FROM information_schema.applicable_roles
- ----
- r1,r2,NO
- r2,r3,NO
- COMPLETE 2
- simple conn=mz_system,user=mz_system
- SELECT * FROM information_schema.applicable_roles
- ----
- r1,r2,NO
- r2,r3,NO
- r4,r3,NO
- COMPLETE 3
- simple conn=r1,user=r1,rowsort
- SELECT * FROM information_schema.enabled_roles
- ----
- r1
- r2
- r3
- COMPLETE 3
- simple conn=mz_system,user=mz_system,rowsort
- SELECT * FROM information_schema.enabled_roles
- ----
- r1
- r2
- r3
- r4
- mz_system
- mz_monitor
- mz_support
- materialize
- mz_analytics
- mz_monitor_redacted
- COMPLETE 10
- statement ok
- DROP ROLE r1, r2, r3, r4
- # Disable RBAC checks
- simple conn=mz_system,user=mz_system
- ALTER SYSTEM SET enable_rbac_checks TO false;
- ----
- COMPLETE 0
|