92 lines
2.1 KiB
PL/PgSQL
92 lines
2.1 KiB
PL/PgSQL
set check_function_bodies = off;
|
|
|
|
CREATE OR REPLACE FUNCTION public.grp_admins()
|
|
RETURNS grp
|
|
LANGUAGE sql
|
|
STABLE
|
|
AS $function$select * from public.grp where tag = public.grp_tag_of_string('admins')$function$
|
|
;
|
|
|
|
CREATE OR REPLACE FUNCTION public.usr_root()
|
|
RETURNS usr
|
|
LANGUAGE sql
|
|
STABLE
|
|
AS $function$select * from public.usr where tag = public.usr_tag_of_string('root')$function$
|
|
;
|
|
|
|
CREATE OR REPLACE FUNCTION public.do_insert_usr_perm()
|
|
RETURNS trigger
|
|
LANGUAGE plpgsql
|
|
AS $function$
|
|
declare
|
|
admins int;
|
|
begin
|
|
admins := public.grp_admins();
|
|
|
|
insert into public.perm
|
|
(path, owner_user, owner_group, owner_user_mode, owner_group_mode, everyone_mode)
|
|
values
|
|
('/users/' || NEW.id || '/tag', NEW.id, admins, 'w', 'w', 'r')
|
|
, ('/users/' || NEW.id || '/email', NEW.id, admins, 'w', 'w', '-')
|
|
, ('/users/' || NEW.id || '/deleted', NEW.id, admins, 'w', 'w', '-')
|
|
, ('/users/' || NEW.id || '/password', NEW.id, admins, 'w', 'w', '-')
|
|
;
|
|
|
|
return new;
|
|
end;
|
|
$function$
|
|
;
|
|
|
|
CREATE OR REPLACE FUNCTION public.do_usr_create_default_grp()
|
|
RETURNS trigger
|
|
LANGUAGE plpgsql
|
|
AS $function$
|
|
declare
|
|
new_grp int;
|
|
begin
|
|
insert into public.grp (tag)
|
|
values (grp_tag_of_string('usr_' || new.uid))
|
|
returning id into new_grp;
|
|
|
|
perform public.grp_add_member(to_grp => new_grp, add_usr => new.id);
|
|
|
|
update public.perm
|
|
set owner_user = public.usr_root()
|
|
, owner_group = public.grp_admins()
|
|
where path = '/groups/' || new_grp || '/members'
|
|
or path = '/groups/' || new_grp || '/tag';
|
|
|
|
return null;
|
|
end;
|
|
$function$
|
|
;
|
|
|
|
CREATE OR REPLACE FUNCTION public.get_acting_usr()
|
|
RETURNS usr
|
|
LANGUAGE plpgsql
|
|
AS $function$
|
|
declare
|
|
uid text;
|
|
acting_usr public.usr;
|
|
begin
|
|
if nullif(current_setting('dnim.usr_uid', true), '') is null then
|
|
acting_usr := public.usr_root();
|
|
else
|
|
select u.*
|
|
from public.usr u
|
|
where u.uid = current_setting('dnim.usr_uid', true) :: uuid
|
|
into acting_usr;
|
|
end if;
|
|
|
|
return acting_usr;
|
|
end;
|
|
$function$
|
|
;
|
|
|
|
CREATE OR REPLACE FUNCTION public.grp_members_admins()
|
|
RETURNS SETOF usr
|
|
LANGUAGE sql
|
|
STABLE
|
|
AS $function$select * from public.grp_members((public.grp_admins()).id)$function$
|
|
;
|