aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-11-03 15:41:32 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2020-11-03 15:41:32 -0500
commit501035a0ac7f711ee2f899cb08acb2a4237d7f4d (patch)
treee7d85febe93489959d561f35f343741f3c8a64ef /src/backend/commands
parentf28b089cbd3541a6df05a7e2907e40b5e516a063 (diff)
downloadpostgresql-501035a0ac7f711ee2f899cb08acb2a4237d7f4d.tar.gz
postgresql-501035a0ac7f711ee2f899cb08acb2a4237d7f4d.zip
Allow users with BYPASSRLS to alter their own passwords.
The intention in commit 491c029db was to require superuserness to change the BYPASSRLS property, but the actual effect of the coding in AlterRole() was to require superuserness to change anything at all about a BYPASSRLS role. Other properties of a BYPASSRLS role should be changeable under the same rules as for a normal role, though. Fix that, and also take care of some documentation omissions related to BYPASSRLS and REPLICATION role properties. Tom Lane and Stephen Frost, per bug report from Wolfgang Walther. Back-patch to all supported branches. Discussion: https://postgr.es/m/a5548a9f-89ee-3167-129d-162b5985fcf8@technowledgy.de
Diffstat (limited to 'src/backend/commands')
-rw-r--r--src/backend/commands/user.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c
index 1cdd2bf542c..c6b3bce85d9 100644
--- a/src/backend/commands/user.c
+++ b/src/backend/commands/user.c
@@ -694,8 +694,10 @@ AlterRole(AlterRoleStmt *stmt)
roleid = HeapTupleGetOid(tuple);
/*
- * To mess with a superuser you gotta be superuser; else you need
- * createrole, or just want to change your own password
+ * To mess with a superuser or replication role in any way you gotta be
+ * superuser. We also insist on superuser to change the BYPASSRLS
+ * property. Otherwise, if you don't have createrole, you're only allowed
+ * to change your own password.
*/
if (authform->rolsuper || issuper >= 0)
{
@@ -711,7 +713,7 @@ AlterRole(AlterRoleStmt *stmt)
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
errmsg("must be superuser to alter replication users")));
}
- else if (authform->rolbypassrls || bypassrls >= 0)
+ else if (bypassrls >= 0)
{
if (!superuser())
ereport(ERROR,
@@ -720,11 +722,11 @@ AlterRole(AlterRoleStmt *stmt)
}
else if (!have_createrole_privilege())
{
+ /* We already checked issuper, isreplication, and bypassrls */
if (!(inherit < 0 &&
createrole < 0 &&
createdb < 0 &&
canlogin < 0 &&
- isreplication < 0 &&
!dconnlimit &&
!rolemembers &&
!validUntil &&