default_privileges.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. from textwrap import dedent
  10. from materialize.checks.actions import Testdrive
  11. from materialize.checks.checks import Check
  12. class DefaultPrivileges(Check):
  13. def initialize(self) -> Testdrive:
  14. return Testdrive(
  15. dedent(
  16. """
  17. > CREATE DATABASE defpriv_db
  18. > SET DATABASE = defpriv_db
  19. > CREATE SCHEMA defpriv_schema
  20. > SET SCHEMA defpriv_schema
  21. > CREATE ROLE defpriv_role1
  22. $ postgres-execute connection=postgres://mz_system@${testdrive.materialize-internal-sql-addr}
  23. GRANT CREATEDB, CREATECLUSTER ON SYSTEM TO defpriv_role1
  24. > CREATE TABLE defpriv_table1 (c int)
  25. """
  26. )
  27. )
  28. def manipulate(self) -> list[Testdrive]:
  29. return [
  30. Testdrive(dedent(s))
  31. for s in [
  32. """
  33. > SET DATABASE = defpriv_db
  34. > SET SCHEMA defpriv_schema
  35. > ALTER DEFAULT PRIVILEGES FOR ROLE materialize IN SCHEMA defpriv_db.defpriv_schema GRANT ALL PRIVILEGES ON TABLES TO defpriv_role1;
  36. > CREATE ROLE defpriv_role2
  37. $ postgres-execute connection=postgres://mz_system@${testdrive.materialize-internal-sql-addr}
  38. GRANT CREATEDB, CREATECLUSTER ON SYSTEM TO defpriv_role2
  39. > CREATE TABLE defpriv_table2 (c int)
  40. """,
  41. """
  42. > SET DATABASE = defpriv_db
  43. > SET SCHEMA defpriv_schema
  44. > ALTER DEFAULT PRIVILEGES FOR ROLE materialize IN SCHEMA defpriv_db.defpriv_schema GRANT ALL PRIVILEGES ON TABLES TO defpriv_role2;
  45. > CREATE ROLE defpriv_role3
  46. $ postgres-execute connection=postgres://mz_system@${testdrive.materialize-internal-sql-addr}
  47. GRANT CREATEDB, CREATECLUSTER ON SYSTEM TO defpriv_role3
  48. > CREATE TABLE defpriv_table3 (c int)
  49. """,
  50. ]
  51. ]
  52. def validate(self) -> Testdrive:
  53. return Testdrive(
  54. dedent(
  55. """
  56. > SET DATABASE = defpriv_db
  57. > SET SCHEMA defpriv_schema
  58. > ALTER DEFAULT PRIVILEGES FOR ROLE materialize IN SCHEMA defpriv_db.defpriv_schema GRANT ALL PRIVILEGES ON TABLES TO defpriv_role3;
  59. > SELECT
  60. (CASE defaults.role_id WHEN 'p' THEN 'PUBLIC' ELSE roles.name END) AS role_name,
  61. databases.name AS database_name,
  62. schemas.name AS schema_name,
  63. defaults.object_type AS object_type,
  64. (CASE defaults.grantee WHEN 'p' THEN 'PUBLIC' ELSE grantees.name END) AS grantee_name,
  65. defaults.privileges AS privileges
  66. FROM mz_default_privileges defaults
  67. LEFT JOIN mz_roles AS roles ON defaults.role_id = roles.id
  68. LEFT JOIN mz_roles AS grantees ON defaults.grantee = grantees.id
  69. LEFT JOIN mz_databases AS databases ON defaults.database_id = databases.id
  70. LEFT JOIN mz_schemas AS schemas ON defaults.schema_id = schemas.id
  71. ORDER BY role_name, grantee_name;
  72. PUBLIC <null> <null> cluster mz_support U
  73. PUBLIC <null> <null> database mz_support U
  74. PUBLIC <null> <null> schema mz_support U
  75. PUBLIC <null> <null> type PUBLIC U
  76. materialize defpriv_db defpriv_schema table defpriv_role1 arwd
  77. materialize defpriv_db defpriv_schema table defpriv_role2 arwd
  78. materialize defpriv_db defpriv_schema table defpriv_role3 arwd
  79. > SELECT name, unnest(privileges)::text FROM mz_tables WHERE name LIKE 'defpriv_table%'
  80. defpriv_table1 materialize=arwd/materialize
  81. defpriv_table2 defpriv_role1=arwd/materialize
  82. defpriv_table2 materialize=arwd/materialize
  83. defpriv_table3 defpriv_role1=arwd/materialize
  84. defpriv_table3 defpriv_role2=arwd/materialize
  85. defpriv_table3 materialize=arwd/materialize
  86. """
  87. )
  88. )