49 lines
1.2 KiB
Bash
49 lines
1.2 KiB
Bash
#!/bin/sh
|
|
|
|
set -eu
|
|
|
|
|
|
role_status="$(
|
|
psql \
|
|
--no-psqlrc \
|
|
--set ON_ERROR_STOP=1 \
|
|
--tuples-only \
|
|
--no-align \
|
|
--username "$POSTGRES_USER" \
|
|
--dbname "$POSTGRES_DB" <<'SQL'
|
|
\getenv app_user APP_DB_USER
|
|
|
|
SELECT CASE
|
|
WHEN :'app_user' <> current_user
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM pg_catalog.pg_roles
|
|
WHERE rolname = :'app_user'
|
|
AND rolcanlogin
|
|
AND NOT rolsuper
|
|
AND NOT rolcreatedb
|
|
AND NOT rolcreaterole
|
|
AND rolinherit
|
|
AND NOT rolreplication
|
|
AND NOT rolbypassrls
|
|
)
|
|
AND pg_catalog.pg_get_userbyid((
|
|
SELECT datdba
|
|
FROM pg_catalog.pg_database
|
|
WHERE datname = current_database()
|
|
)) = :'app_user'
|
|
AND NOT EXISTS (
|
|
SELECT 1
|
|
FROM pg_catalog.pg_auth_members AS membership
|
|
JOIN pg_catalog.pg_roles AS member_role
|
|
ON member_role.oid = membership.member
|
|
WHERE member_role.rolname = :'app_user'
|
|
)
|
|
THEN 1
|
|
ELSE 0
|
|
END;
|
|
SQL
|
|
)"
|
|
|
|
test "$role_status" = "1"
|