Skip to content

Commit 64bc8da

Browse files
committed
Add check for mdb_service_auth role
1 parent 470c0a4 commit 64bc8da

3 files changed

Lines changed: 18 additions & 8 deletions

File tree

src/backend/catalog/aclchk.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3392,7 +3392,7 @@ pg_class_aclmask_ext(Oid table_oid, Oid roleid, AclMode mask,
33923392
*/
33933393
if (mask & ACL_SELECT && !(result & ACL_SELECT) &&
33943394
has_privs_of_role(roleid, mdb_read_all_data_oid) &&
3395-
!has_privs_of_unwanted_system_role(ownerId))
3395+
!has_privs_of_unwanted_system_role(ownerId, true))
33963396
result |= ACL_SELECT;
33973397

33983398
/*
@@ -3417,7 +3417,7 @@ pg_class_aclmask_ext(Oid table_oid, Oid roleid, AclMode mask,
34173417
if (mask & (ACL_INSERT | ACL_UPDATE | ACL_DELETE) &&
34183418
!(result & (ACL_INSERT | ACL_UPDATE | ACL_DELETE)) &&
34193419
has_privs_of_role(roleid, mdb_write_all_data_oid) &&
3420-
!has_privs_of_unwanted_system_role(ownerId))
3420+
!has_privs_of_unwanted_system_role(ownerId, true))
34213421
result |= (mask & (ACL_INSERT | ACL_UPDATE | ACL_DELETE));
34223422

34233423
/*

src/backend/utils/adt/acl.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5337,7 +5337,9 @@ has_privs_of_role_strict_no_cache(Oid member, Oid role)
53375337
*/
53385338

53395339
bool
5340-
has_privs_of_unwanted_system_role(Oid role) {
5340+
has_privs_of_unwanted_system_role(Oid role, bool check_mdb_service_auth) {
5341+
Oid mdb_service_authoid;
5342+
53415343
if (has_privs_of_role_strict(role, ROLE_PG_READ_SERVER_FILES)) {
53425344
return true;
53435345
}
@@ -5354,6 +5356,14 @@ has_privs_of_unwanted_system_role(Oid role) {
53545356
return true;
53555357
}
53565358

5359+
if (check_mdb_service_auth) {
5360+
mdb_service_authoid = get_role_oid("mdb_service_auth", true);
5361+
5362+
if (has_privs_of_role_strict(role, mdb_service_authoid)) {
5363+
return true;
5364+
}
5365+
}
5366+
53575367
return false;
53585368
}
53595369

@@ -5400,7 +5410,7 @@ has_privs_of_role(Oid member, Oid role)
54005410
* if target role is neither superuser nor
54015411
* some dangerous system role
54025412
*/
5403-
if (!has_privs_of_unwanted_system_role(role)) {
5413+
if (!has_privs_of_unwanted_system_role(role, true)) {
54045414
return true;
54055415
}
54065416
}
@@ -5455,7 +5465,7 @@ mdb_admin_allow_bypass_owner_checks(Oid userId, Oid ownerId)
54555465
*/
54565466

54575467
/* All checks passed, hope will not be hacked here (again) */
5458-
return !has_privs_of_unwanted_system_role(ownerId);
5468+
return !has_privs_of_unwanted_system_role(ownerId, true);
54595469
}
54605470

54615471
// -- non-upstream patch end
@@ -5534,7 +5544,7 @@ check_mdb_admin_is_member_of_role(Oid member, Oid role)
55345544
GetUserNameFromId(role, false))));
55355545
}
55365546

5537-
if (has_privs_of_unwanted_system_role(role)) {
5547+
if (has_privs_of_unwanted_system_role(role, true)) {
55385548
ereport(ERROR,
55395549
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
55405550
errmsg("forbidden to transfer ownership to this system role in Cloud")));
@@ -5568,7 +5578,7 @@ bool mdb_admin_is_member_of_role(Oid member, Oid role) {
55685578
return false;
55695579
}
55705580

5571-
return !has_privs_of_unwanted_system_role(role);
5581+
return !has_privs_of_unwanted_system_role(role, true);
55725582
}
55735583

55745584
// -- mdb admin patch

src/include/utils/acl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ extern bool mdb_admin_is_member_of_role(Oid member, Oid role);
231231
extern Oid select_best_admin(Oid member, Oid role);
232232
extern Oid get_role_oid(const char *rolname, bool missing_ok);
233233
extern Oid get_role_oid_or_public(const char *rolname);
234-
extern bool has_privs_of_unwanted_system_role(Oid role);
234+
extern bool has_privs_of_unwanted_system_role(Oid role, bool check_mdb_service_auth);
235235
extern Oid get_rolespec_oid(const RoleSpec *role, bool missing_ok);
236236
extern void check_rolespec_name(const RoleSpec *role, const char *detail_msg);
237237
extern HeapTuple get_rolespec_tuple(const RoleSpec *role);

0 commit comments

Comments
 (0)