-- ============================================================================= -- Migration: 20260419000005_restrict_intake_rpc -- A#20 — Restringe create_patient_intake_request_v2 a service_role. -- -- Antes: anon (e PUBLIC) podia chamar direto. Bot bypassava qualquer -- proteção do front (Turnstile etc). -- Agora: edge function `submit-patient-intake` valida CAPTCHA e chama -- a RPC com service_role. Anon não chama mais a RPC direto. -- ============================================================================= -- Revoga PUBLIC (DEFAULT) e anon REVOKE EXECUTE ON FUNCTION public.create_patient_intake_request_v2(text, jsonb) FROM PUBLIC, anon; REVOKE EXECUTE ON FUNCTION public.create_patient_intake_request_v2(text, jsonb, text) FROM PUBLIC, anon; -- Mantém grants explícitos pra authenticated (uso interno futuro) e service_role (edge function) GRANT EXECUTE ON FUNCTION public.create_patient_intake_request_v2(text, jsonb) TO authenticated, service_role; GRANT EXECUTE ON FUNCTION public.create_patient_intake_request_v2(text, jsonb, text) TO authenticated, service_role; -- Mesma proteção para RPC v1 legada (caso ainda exista) DO $$ BEGIN IF EXISTS ( SELECT 1 FROM pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname = 'public' AND p.proname = 'create_patient_intake_request' ) THEN EXECUTE 'REVOKE EXECUTE ON FUNCTION public.create_patient_intake_request(text, text, text, text, text, boolean) FROM PUBLIC, anon'; EXECUTE 'GRANT EXECUTE ON FUNCTION public.create_patient_intake_request(text, text, text, text, text, boolean) TO authenticated, service_role'; END IF; END$$;