Skip to content

Commit 3fca18b

Browse files
committed
fix: do all revokes before doing grants
Otherwise circular memberships can occur
1 parent e18b038 commit 3fca18b

File tree

1 file changed

+15
-18
lines changed
  • ansible/files/admin_api_scripts/pg_upgrade_scripts

1 file changed

+15
-18
lines changed

ansible/files/admin_api_scripts/pg_upgrade_scripts/common.sh

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@ $$;
107107
108108
do $$
109109
declare
110+
role_grants jsonb[] := (
111+
select coalesce(array_agg(jsonb_build_object('role', r.rolname, 'member', m.rolname, 'grantor', g.rolname, 'admin_option', am.admin_option)), '{}')
112+
from pg_auth_members am
113+
join pg_authid r on r.oid = am.roleid
114+
join pg_authid m on m.oid = am.member
115+
join pg_authid g on g.oid = am.grantor
116+
);
110117
postgres_rolpassword text := (select rolpassword from pg_authid where rolname = 'postgres');
111118
supabase_admin_rolpassword text := (select rolpassword from pg_authid where rolname = 'supabase_admin');
112119
role_settings jsonb[] := (
@@ -216,27 +223,18 @@ begin
216223
select * from pg_auth_members
217224
loop
218225
execute(format('revoke %s from %s;', rec.roleid::regrole, rec.member::regrole));
226+
end loop;
227+
for obj in array role_grants
228+
loop
219229
execute(format(
220-
'grant %s to %s %s granted by %s;',
221-
case
222-
when rec.roleid = 'postgres'::regrole then 'supabase_admin'
223-
when rec.roleid = 'supabase_admin'::regrole then 'postgres'
224-
else rec.roleid::regrole
225-
end,
230+
'grant %I to %I %s granted by %I;',
231+
obj->>'role',
232+
obj->>'member',
226233
case
227-
when rec.member = 'postgres'::regrole then 'supabase_admin'
228-
when rec.member = 'supabase_admin'::regrole then 'postgres'
229-
else rec.member::regrole
230-
end,
231-
case
232-
when rec.admin_option then 'with admin option'
234+
when obj->>'admin_option' = 'true' then 'with admin option'
233235
else ''
234236
end,
235-
case
236-
when rec.grantor = 'postgres'::regrole then 'supabase_admin'
237-
when rec.grantor = 'supabase_admin'::regrole then 'postgres'
238-
else rec.grantor::regrole
239-
end
237+
obj->>'grantor'
240238
));
241239
end loop;
242240
@@ -362,7 +360,6 @@ begin
362360
end if;
363361
end loop;
364362
end loop;
365-
366363
foreach obj in array default_acls
367364
loop
368365
for rec in

0 commit comments

Comments
 (0)