-- 006_alias_aware_rls.sql -- Oppdaterer RLS-policies til å håndtere alias-basert created_by. -- -- Når en bruker opererer via et alias (oppgave 8.2), settes created_by -- til alias-noden i stedet for brukerens hovednode. RLS-policies må -- da gjenkjenne at brukeren eier sine aliaser og dermed har tilgang -- til noder/edges opprettet av aliaset. -- -- Ref: docs/primitiver/nodes.md (created_by), docs/primitiver/edges.md (alias) BEGIN; -- ============================================================================= -- Hjelpefunksjon: henter brukerens alias-IDer -- ============================================================================= CREATE OR REPLACE FUNCTION current_node_alias_ids() RETURNS SETOF UUID AS $$ BEGIN RETURN QUERY SELECT target_id FROM edges WHERE source_id = current_node_id() AND edge_type = 'alias' AND system = true; END; $$ LANGUAGE plpgsql STABLE; GRANT EXECUTE ON FUNCTION current_node_alias_ids() TO synops_reader; -- ============================================================================= -- Oppdatert RLS på nodes — inkluderer alias-eierskap -- ============================================================================= DROP POLICY IF EXISTS node_select ON nodes; CREATE POLICY node_select ON nodes FOR SELECT TO synops_reader USING ( -- Egne noder (direkte created_by) created_by = current_node_id() -- Noder opprettet av et av brukerens aliaser OR created_by IN (SELECT current_node_alias_ids()) -- Eksplisitt tilgang via node_access OR id IN ( SELECT object_id FROM node_access WHERE subject_id = current_node_id() ) -- Offentlig synlige noder OR visibility >= 'discoverable' ); -- ============================================================================= -- Oppdatert RLS på edges — inkluderer alias-eierskap -- ============================================================================= DROP POLICY IF EXISTS edge_select ON edges; CREATE POLICY edge_select ON edges FOR SELECT TO synops_reader USING ( -- Ikke vis system-edges til andre enn eieren (NOT system OR source_id = current_node_id()) AND ( -- Bruker opprettet edgen (direkte eller via alias) created_by = current_node_id() OR created_by IN (SELECT current_node_alias_ids()) -- Bruker er source eller target OR source_id = current_node_id() OR target_id = current_node_id() -- Bruker har tilgang til source- eller target-noden OR source_id IN ( SELECT object_id FROM node_access WHERE subject_id = current_node_id() ) OR target_id IN ( SELECT object_id FROM node_access WHERE subject_id = current_node_id() ) ) ); COMMIT;