Skip to content

Commit b911cec

Browse files
mbanck-cdCommitfest Bot
authored and
Commitfest Bot
committed
Add new pg_manage_extensions predefined role.
This allows any role that is granted this new predefined role to CREATE, UPDATE or DROP extensions, no matter whether they are trusted or not.
1 parent 105b2cb commit b911cec

File tree

3 files changed

+22
-5
lines changed

3 files changed

+22
-5
lines changed

doc/src/sgml/user-manag.sgml

+11
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,17 @@ GRANT pg_signal_backend TO admin_user;
669669
</listitem>
670670
</varlistentry>
671671

672+
<varlistentry id="predefined-role-pg-manage-extensions" xreflabel="pg_manage_extensions">
673+
<term><varname>pg_manage_extensions</varname></term>
674+
<listitem>
675+
<para>
676+
<literal>pg_manage_extensions</literal> allows creating, altering or
677+
dropping extensions, even if the extensions are untrusted or the user
678+
does not have <literal>CREATE</literal> rights on the database.
679+
</para>
680+
</listitem>
681+
</varlistentry>
682+
672683
<varlistentry id="predefined-role-pg-monitor" xreflabel="pg_monitor">
673684
<term><varname>pg_monitor</varname></term>
674685
<term><varname>pg_read_all_settings</varname></term>

src/backend/commands/extension.c

+6-5
Original file line numberDiff line numberDiff line change
@@ -1080,13 +1080,14 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control,
10801080
ListCell *lc2;
10811081

10821082
/*
1083-
* Enforce superuser-ness if appropriate. We postpone these checks until
1084-
* here so that the control flags are correctly associated with the right
1083+
* Enforce superuser-ness/membership of the pg_manage_extensions
1084+
* predefined role if appropriate. We postpone these checks until here
1085+
* so that the control flags are correctly associated with the right
10851086
* script(s) if they happen to be set in secondary control files.
10861087
*/
10871088
if (control->superuser && !superuser())
10881089
{
1089-
if (extension_is_trusted(control))
1090+
if (extension_is_trusted(control) || has_privs_of_role(GetUserId(), ROLE_PG_MANAGE_EXTENSIONS))
10901091
switch_to_superuser = true;
10911092
else if (from_version == NULL)
10921093
ereport(ERROR,
@@ -1095,15 +1096,15 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control,
10951096
control->name),
10961097
control->trusted
10971098
? errhint("Must have CREATE privilege on current database to create this extension.")
1098-
: errhint("Must be superuser to create this extension.")));
1099+
: errhint("Must be superuser or member of pg_manage_extensions to create this extension.")));
10991100
else
11001101
ereport(ERROR,
11011102
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
11021103
errmsg("permission denied to update extension \"%s\"",
11031104
control->name),
11041105
control->trusted
11051106
? errhint("Must have CREATE privilege on current database to update this extension.")
1106-
: errhint("Must be superuser to update this extension.")));
1107+
: errhint("Must be superuser or member of pg_manage_extensions to update this extension.")));
11071108
}
11081109

11091110
filename = get_extension_script_filename(control, from_version, version);

src/include/catalog/pg_authid.dat

+5
Original file line numberDiff line numberDiff line change
@@ -104,5 +104,10 @@
104104
rolcreaterole => 'f', rolcreatedb => 'f', rolcanlogin => 'f',
105105
rolreplication => 'f', rolbypassrls => 'f', rolconnlimit => '-1',
106106
rolpassword => '_null_', rolvaliduntil => '_null_' },
107+
{ oid => '8801', oid_symbol => 'ROLE_PG_MANAGE_EXTENSIONS',
108+
rolname => 'pg_manage_extensions', rolsuper => 'f', rolinherit => 't',
109+
rolcreaterole => 'f', rolcreatedb => 'f', rolcanlogin => 'f',
110+
rolreplication => 'f', rolbypassrls => 'f', rolconnlimit => '-1',
111+
rolpassword => '_null_', rolvaliduntil => '_null_' },
107112

108113
]

0 commit comments

Comments
 (0)