This is an automated email from the ASF dual-hosted git repository.

leborchuk pushed a commit to branch PG14_ARCHIVE_REBASED
in repository https://gitbox.apache.org/repos/asf/cloudberry.git

commit 87c675b61153ef4f0d4b2178b93c6d05654b833c
Author: reshke <[email protected]>
AuthorDate: Tue Sep 30 14:43:07 2025 +0500

    Role mdb_superuser: feature and regress testsing (#5)
    
    This commit introduces new mdb internal role mdb_superuser.
    
    Role is capaple of:
    
    GRANT/REVOKE any set of priviledges to/from any object in database.
    Has power of pg_database_owner in any database, including:
    DROP any object in database (except system catalog and stuff)
    
    Role is NOT capaple of:
    
    Create database, role, extension or alter other roles with such
    priviledges.
    
    Transfer ownership to /pass has_priv of roles:
    
    PG_READ_ALL_DATA
    PG_WRITE_ALL_DATA
    PG_EXECUTE_SERVER_PROGRAM
    PG_READ_SERVER_FILES
    PG_WRITE_SERVER_FILES
    PG_DATABASE_OWNER
    
    Fix configure.ac USE_MDBLOCALES option handling
    
    Apply autoreconf stuff
    
    Set missing ok parameter ito true while acquiring mdb_superuser oid
    
    In regress tests, nobody creates mdb_superuser role, so missing ok is
    fine
    
    Allow mdb_superuser to have power of pg_database_owner
    
    Allow mdb_superuser to alter objects and grant ACl to
    objects, owner by pg_database_owner. Also, when acl check,
    allow mdb_supersuer use pg_database_owner role power to pass check
---
 src/backend/commands/functioncmds.c     |  4 +--
 src/backend/utils/adt/acl.c             | 39 +++++------------------
 src/test/regress/expected/mdb_admin.out | 55 ++++++++++++++++++++++-----------
 src/test/regress/parallel_schedule      |  3 +-
 src/test/regress/sql/mdb_admin.sql      | 17 ++++++++--
 5 files changed, 62 insertions(+), 56 deletions(-)

diff --git a/src/backend/commands/functioncmds.c 
b/src/backend/commands/functioncmds.c
index 8a570fa6965..1ab3b36dd59 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -1526,7 +1526,7 @@ CreateFunction(ParseState *pstate, CreateFunctionStmt 
*stmt)
         */
        if (isLeakProof && !superuser())
        {
-               Oid role = get_role_oid("mdb_admin", true);
+               Oid role = get_role_oid("mdb_admin", true /*if nodoby created 
mdb_admin role in this database*/);
                if (!is_member_of_role(GetUserId(), role))
                        ereport(ERROR,
                                        
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
@@ -1857,7 +1857,7 @@ AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt)
                procForm->proleakproof = intVal(leakproof_item->arg);
                if (procForm->proleakproof && !superuser())
                {
-                       Oid role = get_role_oid("mdb_admin", true);
+                       Oid role = get_role_oid("mdb_admin", true /*if nodoby 
created mdb_admin role in this database*/);
                        if (!is_member_of_role(GetUserId(), role))
                                ereport(ERROR,
                                                
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c
index ae1fd5802c6..1baf148f987 100644
--- a/src/backend/utils/adt/acl.c
+++ b/src/backend/utils/adt/acl.c
@@ -5149,7 +5149,7 @@ mdb_admin_allow_bypass_owner_checks(Oid userId,  Oid 
ownerId)
                return false;
        }
 
-       mdb_admin_roleoid = get_role_oid("mdb_admin", true /* superuser 
suggested to be mdb_admin*/);
+       mdb_admin_roleoid = get_role_oid("mdb_admin", true /*if nodoby created 
mdb_admin role in this database*/);
        /* Is userId actually member of mdb admin? */
        if (!is_member_of_role(userId, mdb_admin_roleoid)) {
                /* if no, disallow. */
@@ -5162,23 +5162,11 @@ mdb_admin_allow_bypass_owner_checks(Oid userId,  Oid 
ownerId)
        *
        * For now, we check that ownerId does not have
        * priviledge to execute server program or/and
-       * read/write server files.
+       * read/write server files, or/and pg read/write all data
        */
 
-       if (has_privs_of_role(ownerId, ROLE_PG_READ_SERVER_FILES)) {
-               return false;
-       }
-
-       if (has_privs_of_role(ownerId, ROLE_PG_WRITE_SERVER_FILES)) {
-               return false;
-       }
-
-       if (has_privs_of_role(ownerId, ROLE_PG_EXECUTE_SERVER_PROGRAM)) {
-               return false;
-       }
-
        /* All checks passed, hope will not be hacked here (again) */
-       return true;
+       return !has_privs_of_unwanted_system_role(ownerId);
 }
 
 // -- non-upstream patch end
@@ -5227,7 +5215,7 @@ check_is_member_of_role(Oid member, Oid role)
  * check_mdb_admin_is_member_of_role
  *             is_member_of_role with a standard permission-violation error if 
not in usual case
  * Is case `member` in mdb_admin we check that role is neither of superuser, 
pg_read/write 
- * server files nor pg_execute_server_program
+ * server files nor pg_execute_server_program or pg_read/write all data
  */
 void
 check_mdb_admin_is_member_of_role(Oid member, Oid role)
@@ -5238,9 +5226,10 @@ check_mdb_admin_is_member_of_role(Oid member, Oid role)
                return;
        }
 
-       mdb_admin_roleoid = get_role_oid("mdb_admin", true /* superuser 
suggested to be mdb_admin*/);
+       mdb_admin_roleoid = get_role_oid("mdb_admin", true /*if nodoby created 
mdb_admin role in this database*/);
        /* Is userId actually member of mdb admin? */
        if (is_member_of_role(member, mdb_admin_roleoid)) {
+
                /* role is mdb admin */
                if (superuser_arg(role)) {
                        ereport(ERROR,
@@ -5249,22 +5238,10 @@ check_mdb_admin_is_member_of_role(Oid member, Oid role)
                                                        GetUserNameFromId(role, 
false))));
                }
 
-               if (has_privs_of_role(role, ROLE_PG_READ_SERVER_FILES)) {
-                       ereport(ERROR,
-                                       
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
-                                       errmsg("cannot transfer ownership to 
pg_read_server_files role in Cloud")));
-               }
-
-               if (has_privs_of_role(role, ROLE_PG_WRITE_SERVER_FILES)) {
-                       ereport(ERROR,
-                                       
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
-                                       errmsg("cannot transfer ownership to 
pg_write_server_files role in Cloud")));
-               }
-
-               if (has_privs_of_role(role, ROLE_PG_EXECUTE_SERVER_PROGRAM)) {
+               if (has_privs_of_unwanted_system_role(role)) {                  
                        ereport(ERROR,
                                        
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
-                                       errmsg("cannot transfer ownership to 
pg_execute_server_program role in Cloud")));
+                                       errmsg("forbidden to transfer ownership 
to this system role in Cloud")));
                }
        } else {
                /* if no, check membership transfer in usual way. */
diff --git a/src/test/regress/expected/mdb_admin.out 
b/src/test/regress/expected/mdb_admin.out
index 5fc2dab10cb..e4dfc436802 100644
--- a/src/test/regress/expected/mdb_admin.out
+++ b/src/test/regress/expected/mdb_admin.out
@@ -1,7 +1,6 @@
 CREATE ROLE regress_mdb_admin_user1;
 CREATE ROLE regress_mdb_admin_user2;
 CREATE ROLE regress_mdb_admin_user3;
-CREATE ROLE mdb_admin;
 CREATE ROLE regress_superuser WITH SUPERUSER;
 GRANT mdb_admin TO regress_mdb_admin_user1;
 GRANT CREATE ON DATABASE regression TO regress_mdb_admin_user2;
@@ -24,7 +23,7 @@ ALTER VIEW regress_mdb_admin_view OWNER TO 
regress_mdb_admin_user3;
 ALTER TABLE regress_mdb_admin_schema.regress_mdb_admin_table OWNER TO 
regress_mdb_admin_user3;
 ALTER TABLE regress_mdb_admin_table OWNER TO regress_mdb_admin_user3;
 ALTER SCHEMA regress_mdb_admin_schema OWNER TO regress_mdb_admin_user3;
--- mdb admin fails to transfer ownership to superusers and system roles
+-- mdb admin fails to transfer ownership to superusers and particular system 
roles
 ALTER FUNCTION regress_mdb_admin_add (integer, integer) OWNER TO 
regress_superuser;
 ERROR:  cannot transfer ownership to superuser "regress_superuser"
 ALTER VIEW regress_mdb_admin_view OWNER TO regress_superuser;
@@ -36,35 +35,55 @@ ERROR:  cannot transfer ownership to superuser 
"regress_superuser"
 ALTER SCHEMA regress_mdb_admin_schema OWNER TO regress_superuser;
 ERROR:  cannot transfer ownership to superuser "regress_superuser"
 ALTER FUNCTION regress_mdb_admin_add (integer, integer) OWNER TO 
pg_execute_server_program;
-ERROR:  cannot transfer ownership to pg_execute_server_program role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER VIEW regress_mdb_admin_view OWNER TO pg_execute_server_program;
-ERROR:  cannot transfer ownership to pg_execute_server_program role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER TABLE regress_mdb_admin_schema.regress_mdb_admin_table OWNER TO 
pg_execute_server_program;
-ERROR:  cannot transfer ownership to pg_execute_server_program role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER TABLE regress_mdb_admin_table OWNER TO pg_execute_server_program;
-ERROR:  cannot transfer ownership to pg_execute_server_program role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER SCHEMA regress_mdb_admin_schema OWNER TO pg_execute_server_program;
-ERROR:  cannot transfer ownership to pg_execute_server_program role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER FUNCTION regress_mdb_admin_add (integer, integer) OWNER TO 
pg_write_server_files;
-ERROR:  cannot transfer ownership to pg_write_server_files role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER VIEW regress_mdb_admin_view OWNER TO pg_write_server_files;
-ERROR:  cannot transfer ownership to pg_write_server_files role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER TABLE regress_mdb_admin_schema.regress_mdb_admin_table OWNER TO 
pg_write_server_files;
-ERROR:  cannot transfer ownership to pg_write_server_files role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER TABLE regress_mdb_admin_table OWNER TO pg_write_server_files;
-ERROR:  cannot transfer ownership to pg_write_server_files role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER SCHEMA regress_mdb_admin_schema OWNER TO pg_write_server_files;
-ERROR:  cannot transfer ownership to pg_write_server_files role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER FUNCTION regress_mdb_admin_add (integer, integer) OWNER TO 
pg_read_server_files;
-ERROR:  cannot transfer ownership to pg_read_server_files role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER VIEW regress_mdb_admin_view OWNER TO pg_read_server_files;
-ERROR:  cannot transfer ownership to pg_read_server_files role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER TABLE regress_mdb_admin_schema.regress_mdb_admin_table OWNER TO 
pg_read_server_files;
-ERROR:  cannot transfer ownership to pg_read_server_files role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER TABLE regress_mdb_admin_table OWNER TO pg_read_server_files;
-ERROR:  cannot transfer ownership to pg_read_server_files role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 ALTER SCHEMA regress_mdb_admin_schema OWNER TO pg_read_server_files;
-ERROR:  cannot transfer ownership to pg_read_server_files role in Cloud
+ERROR:  forbidden to transfer ownership to this system role in Cloud
+ALTER FUNCTION regress_mdb_admin_add (integer, integer) OWNER TO 
pg_write_all_data;
+ERROR:  forbidden to transfer ownership to this system role in Cloud
+ALTER VIEW regress_mdb_admin_view OWNER TO pg_write_all_data;
+ERROR:  forbidden to transfer ownership to this system role in Cloud
+ALTER TABLE regress_mdb_admin_schema.regress_mdb_admin_table OWNER TO 
pg_write_all_data;
+ERROR:  forbidden to transfer ownership to this system role in Cloud
+ALTER TABLE regress_mdb_admin_table OWNER TO pg_write_all_data;
+ERROR:  forbidden to transfer ownership to this system role in Cloud
+ALTER SCHEMA regress_mdb_admin_schema OWNER TO pg_write_all_data;
+ERROR:  forbidden to transfer ownership to this system role in Cloud
+ALTER FUNCTION regress_mdb_admin_add (integer, integer) OWNER TO 
pg_read_all_data;
+ERROR:  forbidden to transfer ownership to this system role in Cloud
+ALTER VIEW regress_mdb_admin_view OWNER TO pg_read_all_data;
+ERROR:  forbidden to transfer ownership to this system role in Cloud
+ALTER TABLE regress_mdb_admin_schema.regress_mdb_admin_table OWNER TO 
pg_read_all_data;
+ERROR:  forbidden to transfer ownership to this system role in Cloud
+ALTER TABLE regress_mdb_admin_table OWNER TO pg_read_all_data;
+ERROR:  forbidden to transfer ownership to this system role in Cloud
+ALTER SCHEMA regress_mdb_admin_schema OWNER TO pg_read_all_data;
+ERROR:  forbidden to transfer ownership to this system role in Cloud
 -- end tests
 RESET SESSION AUTHORIZATION;
 --
@@ -78,4 +97,4 @@ DROP SCHEMA regress_mdb_admin_schema;
 DROP ROLE regress_mdb_admin_user1;
 DROP ROLE regress_mdb_admin_user2;
 DROP ROLE regress_mdb_admin_user3;
-DROP ROLE mdb_admin;
+DROP ROLE regress_superuser;
diff --git a/src/test/regress/parallel_schedule 
b/src/test/regress/parallel_schedule
index f458be0bcd8..5adb7d9df01 100644
--- a/src/test/regress/parallel_schedule
+++ b/src/test/regress/parallel_schedule
@@ -6,8 +6,7 @@
 # ----------
 
 # mdb admin simple checks
-
-test: mdb_admin
+test: test_setup
 
 # run tablespace by itself, and first, because it forces a checkpoint;
 # we'd prefer not to have checkpoints later in the tests because that
diff --git a/src/test/regress/sql/mdb_admin.sql 
b/src/test/regress/sql/mdb_admin.sql
index 65e294769ee..b6b048e5692 100644
--- a/src/test/regress/sql/mdb_admin.sql
+++ b/src/test/regress/sql/mdb_admin.sql
@@ -1,7 +1,6 @@
 CREATE ROLE regress_mdb_admin_user1;
 CREATE ROLE regress_mdb_admin_user2;
 CREATE ROLE regress_mdb_admin_user3;
-CREATE ROLE mdb_admin;
 
 CREATE ROLE regress_superuser WITH SUPERUSER;
 
@@ -32,7 +31,7 @@ ALTER TABLE regress_mdb_admin_table OWNER TO 
regress_mdb_admin_user3;
 ALTER SCHEMA regress_mdb_admin_schema OWNER TO regress_mdb_admin_user3;
 
 
--- mdb admin fails to transfer ownership to superusers and system roles
+-- mdb admin fails to transfer ownership to superusers and particular system 
roles
 
 ALTER FUNCTION regress_mdb_admin_add (integer, integer) OWNER TO 
regress_superuser;
 ALTER VIEW regress_mdb_admin_view OWNER TO regress_superuser;
@@ -58,6 +57,18 @@ ALTER TABLE regress_mdb_admin_schema.regress_mdb_admin_table 
OWNER TO pg_read_se
 ALTER TABLE regress_mdb_admin_table OWNER TO pg_read_server_files;
 ALTER SCHEMA regress_mdb_admin_schema OWNER TO pg_read_server_files;
 
+ALTER FUNCTION regress_mdb_admin_add (integer, integer) OWNER TO 
pg_write_all_data;
+ALTER VIEW regress_mdb_admin_view OWNER TO pg_write_all_data;
+ALTER TABLE regress_mdb_admin_schema.regress_mdb_admin_table OWNER TO 
pg_write_all_data;
+ALTER TABLE regress_mdb_admin_table OWNER TO pg_write_all_data;
+ALTER SCHEMA regress_mdb_admin_schema OWNER TO pg_write_all_data;
+
+ALTER FUNCTION regress_mdb_admin_add (integer, integer) OWNER TO 
pg_read_all_data;
+ALTER VIEW regress_mdb_admin_view OWNER TO pg_read_all_data;
+ALTER TABLE regress_mdb_admin_schema.regress_mdb_admin_table OWNER TO 
pg_read_all_data;
+ALTER TABLE regress_mdb_admin_table OWNER TO pg_read_all_data;
+ALTER SCHEMA regress_mdb_admin_schema OWNER TO pg_read_all_data;
+
 -- end tests
 
 RESET SESSION AUTHORIZATION;
@@ -73,4 +84,4 @@ DROP SCHEMA regress_mdb_admin_schema;
 DROP ROLE regress_mdb_admin_user1;
 DROP ROLE regress_mdb_admin_user2;
 DROP ROLE regress_mdb_admin_user3;
-DROP ROLE mdb_admin;
+DROP ROLE regress_superuser;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to