1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-04 12:42:24 +03:00

Test "options=-crole=" and "ALTER DATABASE SET role".

Commit 7b88529f4363994450bd4cd3c172006a8a77e222 fixed a regression
spanning these features, but it didn't test them.  It did test code
paths sufficient for their present implementations, so no back-patch.

Reported by Matthew Woodcraft.

Discussion: https://postgr.es/m/87iksnsbhx.fsf@golux.woodcraft.me.uk
This commit is contained in:
Noah Misch 2024-11-24 12:49:53 -08:00
parent ae4569161a
commit 5de08f136a
4 changed files with 128 additions and 7 deletions

View File

@ -2,6 +2,8 @@
REGRESS = rolenames setconfig alter_system_table guc_privs REGRESS = rolenames setconfig alter_system_table guc_privs
REGRESS_OPTS = \ REGRESS_OPTS = \
--create-role=regress_authenticated_user_db_sr \
--create-role=regress_authenticated_user_db_ssa \
--create-role=regress_authenticated_user_sr \ --create-role=regress_authenticated_user_sr \
--create-role=regress_authenticated_user_ssa --create-role=regress_authenticated_user_ssa

View File

@ -1,24 +1,92 @@
-- This is borderline unsafe in that an additional login-capable user exists -- This is borderline unsafe in that an additional login-capable user exists
-- during the test run. Under installcheck, a too-permissive pg_hba.conf -- during the test run. Under installcheck, a too-permissive pg_hba.conf
-- might allow unwanted logins as regress_authenticated_user_ssa. -- might allow unwanted logins as regress_authenticated_user_ssa.
-- Setup catalog state.
ALTER USER regress_authenticated_user_db_ssa superuser;
ALTER USER regress_authenticated_user_ssa superuser; ALTER USER regress_authenticated_user_ssa superuser;
CREATE ROLE regress_session_user; CREATE ROLE regress_session_user;
CREATE ROLE regress_current_user; CREATE ROLE regress_current_user;
GRANT regress_current_user TO regress_authenticated_user_db_sr;
GRANT regress_current_user TO regress_authenticated_user_sr; GRANT regress_current_user TO regress_authenticated_user_sr;
GRANT regress_session_user TO regress_authenticated_user_db_ssa;
GRANT regress_session_user TO regress_authenticated_user_ssa; GRANT regress_session_user TO regress_authenticated_user_ssa;
DO $$BEGIN EXECUTE format(
'ALTER DATABASE %I SET session_authorization = regress_session_user',
current_catalog); END$$;
ALTER ROLE regress_authenticated_user_ssa ALTER ROLE regress_authenticated_user_ssa
SET session_authorization = regress_session_user; SET session_authorization = regress_session_user;
ALTER ROLE regress_authenticated_user_sr SET ROLE = regress_current_user; ALTER ROLE regress_authenticated_user_sr SET ROLE = regress_current_user;
\c - regress_authenticated_user_sr -- Test ALTER DATABASE consequences
-- The longstanding historical behavior is that session_authorization in
-- setconfig has no effect. Hence, session_user remains
-- regress_authenticated_user_ssa. See comment in InitializeSessionUserId().
\c - regress_authenticated_user_db_ssa
SELECT current_user, session_user;
current_user | session_user
-----------------------------------+-----------------------------------
regress_authenticated_user_db_ssa | regress_authenticated_user_db_ssa
(1 row)
-- We document "The DEFAULT and RESET forms reset the session and current user
-- identifiers to be the originally authenticated user name." If we let
-- session_authorization in setconfig have an effect, we'll need to decide
-- whether to make RESET differ from DEFAULT.
RESET SESSION AUTHORIZATION;
SELECT current_user, session_user;
current_user | session_user
-----------------------------------+-----------------------------------
regress_authenticated_user_db_ssa | regress_authenticated_user_db_ssa
(1 row)
DO $$BEGIN
EXECUTE format(
'ALTER DATABASE %I RESET session_authorization', current_catalog);
EXECUTE format(
'ALTER DATABASE %I SET role = regress_current_user', current_catalog);
END$$;
\c - regress_authenticated_user_db_sr
SELECT current_user, session_user;
current_user | session_user
----------------------+----------------------------------
regress_current_user | regress_authenticated_user_db_sr
(1 row)
-- Back to superuser, to reverse ALTER DATABASE
\c - regress_authenticated_user_db_ssa
SELECT current_user, session_user;
current_user | session_user
----------------------+-----------------------------------
regress_current_user | regress_authenticated_user_db_ssa
(1 row)
SET ROLE NONE;
DO $$BEGIN EXECUTE format(
'ALTER DATABASE %I RESET role', current_catalog); END$$;
-- Test connection string options
\c -reuse-previous=on "user=regress_authenticated_user_db_sr options=-crole=regress_current_user"
SELECT current_user, session_user;
current_user | session_user
----------------------+----------------------------------
regress_current_user | regress_authenticated_user_db_sr
(1 row)
-- As above, session_authorization has no effect.
\c -reuse-previous=on "user=regress_authenticated_user_db_ssa options=-csession_authorization=regress_session_user"
SELECT current_user, session_user;
current_user | session_user
-----------------------------------+-----------------------------------
regress_authenticated_user_db_ssa | regress_authenticated_user_db_ssa
(1 row)
-- Test ALTER ROLE consequences
\c -reuse-previous=on "user=regress_authenticated_user_sr options="
SELECT current_user, session_user; SELECT current_user, session_user;
current_user | session_user current_user | session_user
----------------------+------------------------------- ----------------------+-------------------------------
regress_current_user | regress_authenticated_user_sr regress_current_user | regress_authenticated_user_sr
(1 row) (1 row)
-- The longstanding historical behavior is that session_authorization in -- As above, session_authorization has no effect.
-- setconfig has no effect. Hence, session_user remains
-- regress_authenticated_user_ssa. See comment in InitializeSessionUserId().
\c - regress_authenticated_user_ssa \c - regress_authenticated_user_ssa
SELECT current_user, session_user; SELECT current_user, session_user;
current_user | session_user current_user | session_user

View File

@ -11,7 +11,9 @@ tests += {
'alter_system_table', 'alter_system_table',
'guc_privs', 'guc_privs',
], ],
'regress_args': ['--create-role=regress_authenticated_user_sr', 'regress_args': ['--create-role=regress_authenticated_user_db_sr',
'--create-role=regress_authenticated_user_db_ssa',
'--create-role=regress_authenticated_user_sr',
'--create-role=regress_authenticated_user_ssa'], '--create-role=regress_authenticated_user_ssa'],
'runningcheck': false, 'runningcheck': false,
}, },

View File

@ -2,21 +2,70 @@
-- during the test run. Under installcheck, a too-permissive pg_hba.conf -- during the test run. Under installcheck, a too-permissive pg_hba.conf
-- might allow unwanted logins as regress_authenticated_user_ssa. -- might allow unwanted logins as regress_authenticated_user_ssa.
-- Setup catalog state.
ALTER USER regress_authenticated_user_db_ssa superuser;
ALTER USER regress_authenticated_user_ssa superuser; ALTER USER regress_authenticated_user_ssa superuser;
CREATE ROLE regress_session_user; CREATE ROLE regress_session_user;
CREATE ROLE regress_current_user; CREATE ROLE regress_current_user;
GRANT regress_current_user TO regress_authenticated_user_db_sr;
GRANT regress_current_user TO regress_authenticated_user_sr; GRANT regress_current_user TO regress_authenticated_user_sr;
GRANT regress_session_user TO regress_authenticated_user_db_ssa;
GRANT regress_session_user TO regress_authenticated_user_ssa; GRANT regress_session_user TO regress_authenticated_user_ssa;
DO $$BEGIN EXECUTE format(
'ALTER DATABASE %I SET session_authorization = regress_session_user',
current_catalog); END$$;
ALTER ROLE regress_authenticated_user_ssa ALTER ROLE regress_authenticated_user_ssa
SET session_authorization = regress_session_user; SET session_authorization = regress_session_user;
ALTER ROLE regress_authenticated_user_sr SET ROLE = regress_current_user; ALTER ROLE regress_authenticated_user_sr SET ROLE = regress_current_user;
\c - regress_authenticated_user_sr
SELECT current_user, session_user; -- Test ALTER DATABASE consequences
-- The longstanding historical behavior is that session_authorization in -- The longstanding historical behavior is that session_authorization in
-- setconfig has no effect. Hence, session_user remains -- setconfig has no effect. Hence, session_user remains
-- regress_authenticated_user_ssa. See comment in InitializeSessionUserId(). -- regress_authenticated_user_ssa. See comment in InitializeSessionUserId().
\c - regress_authenticated_user_db_ssa
SELECT current_user, session_user;
-- We document "The DEFAULT and RESET forms reset the session and current user
-- identifiers to be the originally authenticated user name." If we let
-- session_authorization in setconfig have an effect, we'll need to decide
-- whether to make RESET differ from DEFAULT.
RESET SESSION AUTHORIZATION;
SELECT current_user, session_user;
DO $$BEGIN
EXECUTE format(
'ALTER DATABASE %I RESET session_authorization', current_catalog);
EXECUTE format(
'ALTER DATABASE %I SET role = regress_current_user', current_catalog);
END$$;
\c - regress_authenticated_user_db_sr
SELECT current_user, session_user;
-- Back to superuser, to reverse ALTER DATABASE
\c - regress_authenticated_user_db_ssa
SELECT current_user, session_user;
SET ROLE NONE;
DO $$BEGIN EXECUTE format(
'ALTER DATABASE %I RESET role', current_catalog); END$$;
-- Test connection string options
\c -reuse-previous=on "user=regress_authenticated_user_db_sr options=-crole=regress_current_user"
SELECT current_user, session_user;
-- As above, session_authorization has no effect.
\c -reuse-previous=on "user=regress_authenticated_user_db_ssa options=-csession_authorization=regress_session_user"
SELECT current_user, session_user;
-- Test ALTER ROLE consequences
\c -reuse-previous=on "user=regress_authenticated_user_sr options="
SELECT current_user, session_user;
-- As above, session_authorization has no effect.
\c - regress_authenticated_user_ssa \c - regress_authenticated_user_ssa
SELECT current_user, session_user; SELECT current_user, session_user;
RESET SESSION AUTHORIZATION; RESET SESSION AUTHORIZATION;