1+ -- Drop existing policies that may be incorrectly configured
2+ DROP POLICY IF EXISTS " Users can create affiliates for their campaigns" ON public .affiliates ;
3+ DROP POLICY IF EXISTS " Users can delete affiliates of their campaigns" ON public .affiliates ;
4+ DROP POLICY IF EXISTS " Users can update affiliates of their campaigns" ON public .affiliates ;
5+ DROP POLICY IF EXISTS " Users can view affiliates of their campaigns" ON public .affiliates ;
6+
7+ -- Create secure RLS policies that check campaign ownership instead of direct user_id matching
8+ CREATE POLICY " Users can view affiliates of their own campaigns"
9+ ON public .affiliates
10+ FOR SELECT
11+ TO authenticated
12+ USING (
13+ EXISTS (
14+ SELECT 1 FROM public .campaigns
15+ WHERE campaigns .id = affiliates .campaign_id
16+ AND campaigns .user_id = auth .uid ()
17+ )
18+ );
19+
20+ CREATE POLICY " Users can create affiliates for their own campaigns"
21+ ON public .affiliates
22+ FOR INSERT
23+ TO authenticated
24+ WITH CHECK (
25+ EXISTS (
26+ SELECT 1 FROM public .campaigns
27+ WHERE campaigns .id = affiliates .campaign_id
28+ AND campaigns .user_id = auth .uid ()
29+ )
30+ );
31+
32+ CREATE POLICY " Users can update affiliates of their own campaigns"
33+ ON public .affiliates
34+ FOR UPDATE
35+ TO authenticated
36+ USING (
37+ EXISTS (
38+ SELECT 1 FROM public .campaigns
39+ WHERE campaigns .id = affiliates .campaign_id
40+ AND campaigns .user_id = auth .uid ()
41+ )
42+ );
43+
44+ CREATE POLICY " Users can delete affiliates of their own campaigns"
45+ ON public .affiliates
46+ FOR DELETE
47+ TO authenticated
48+ USING (
49+ EXISTS (
50+ SELECT 1 FROM public .campaigns
51+ WHERE campaigns .id = affiliates .campaign_id
52+ AND campaigns .user_id = auth .uid ()
53+ )
54+ );
55+
56+ -- Add additional security function to validate campaign ownership
57+ CREATE OR REPLACE FUNCTION public .validate_campaign_ownership(campaign_id uuid, user_id uuid DEFAULT auth .uid ())
58+ RETURNS boolean
59+ LANGUAGE plpgsql
60+ SECURITY DEFINER
61+ SET search_path = public
62+ AS $$
63+ BEGIN
64+ RETURN EXISTS (
65+ SELECT 1 FROM campaigns
66+ WHERE id = campaign_id AND campaigns .user_id = validate_campaign_ownership .user_id
67+ );
68+ END;
69+ $$;
0 commit comments