36 lines
1.5 KiB
MySQL
36 lines
1.5 KiB
MySQL
|
|
-- =====================================================================
|
||
|
|
-- TeeCup — migrasjon 008
|
||
|
|
-- E-post-basert kontosammenkobling ved innlogging (ADR-017 Beslutning B)
|
||
|
|
-- =====================================================================
|
||
|
|
-- Kjøres etter 001-007.
|
||
|
|
--
|
||
|
|
-- Kontekst: en spiller kan ha `player`-rader (organisator-opprettet eller
|
||
|
|
-- selvregistrert) i FLERE organisasjoner, uten å være MEDLEM av noen av
|
||
|
|
-- dem. Ved innlogging (magic-link -- e-postkontroll er allerede bevist)
|
||
|
|
-- skal enhver `player`-rad med matchende e-post og `user_id IS NULL`
|
||
|
|
-- kobles til den nå innloggede kontoen, uansett hvilken org den tilhører.
|
||
|
|
--
|
||
|
|
-- Samme "løs kontekst-problemet FØR RLS kan håndheve noe"-mønster som
|
||
|
|
-- `public_tournament_org()` (migrasjon 007): en vanlig org-scopet
|
||
|
|
-- UPDATE via org_connection() kan ikke krysse organisasjonsgrenser --
|
||
|
|
-- brukeren er jo nettopp IKKE nødvendigvis medlem av noen av dem.
|
||
|
|
-- SECURITY DEFINER kjører derfor med skaperens BYPASSRLS-rettigheter,
|
||
|
|
-- akkurat som i 007. `SET search_path = public` hindrer search_path-
|
||
|
|
-- kapring (samme herding).
|
||
|
|
-- =====================================================================
|
||
|
|
|
||
|
|
\set ON_ERROR_STOP on
|
||
|
|
|
||
|
|
CREATE FUNCTION link_player_by_email(p_user_id uuid, p_email text)
|
||
|
|
RETURNS void
|
||
|
|
LANGUAGE sql
|
||
|
|
SECURITY DEFINER
|
||
|
|
SET search_path = public
|
||
|
|
AS $$
|
||
|
|
UPDATE player
|
||
|
|
SET user_id = p_user_id
|
||
|
|
WHERE user_id IS NULL AND lower(email) = lower(p_email);
|
||
|
|
$$;
|
||
|
|
|
||
|
|
GRANT EXECUTE ON FUNCTION link_player_by_email(uuid, text) TO teecup_app;
|