-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfix_supabase_warnings.sql
More file actions
189 lines (151 loc) · 6.79 KB
/
Copy pathfix_supabase_warnings.sql
File metadata and controls
189 lines (151 loc) · 6.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
-- =====================================================
-- FIX SUPABASE ERRORS AND WARNINGS
-- Run this in your Supabase SQL Editor
-- =====================================================
-- =====================================================
-- 1. FIX SECURITY DEFINER VIEW
-- =====================================================
-- Issue: signature_completion_stats view has SECURITY DEFINER
-- Fix: Drop and recreate without SECURITY DEFINER
DROP VIEW IF EXISTS signature_completion_stats;
CREATE OR REPLACE VIEW signature_completion_stats
-- REMOVED: SECURITY DEFINER
AS
SELECT
d.id AS document_id,
d.user_id,
d.requires_signature,
d.signature_workflow_type,
d.all_signed,
COUNT(ds.id) AS total_signers,
COUNT(CASE WHEN ds.status = 'signed' THEN 1 END) AS signed_count,
COUNT(CASE WHEN ds.status = 'pending' THEN 1 END) AS pending_count,
COUNT(CASE WHEN ds.status = 'viewed' THEN 1 END) AS viewed_count,
MIN(ds.signed_at) AS first_signature_at,
MAX(ds.signed_at) AS last_signature_at
FROM documents d
LEFT JOIN document_signers ds ON d.id = ds.document_id
WHERE d.requires_signature = true
GROUP BY d.id, d.user_id, d.requires_signature, d.signature_workflow_type, d.all_signed;
-- =====================================================
-- 2. FIX FUNCTION SEARCH PATH (SECURITY)
-- =====================================================
-- Issue: Functions have mutable search_path
-- Fix: Set search_path explicitly
-- Fix check_signature_completion function
CREATE OR REPLACE FUNCTION check_signature_completion()
RETURNS TRIGGER AS $$
BEGIN
IF (SELECT COUNT(*) FROM document_signers
WHERE document_id = NEW.document_id AND status != 'signed') = 0 THEN
UPDATE documents
SET all_signed = true,
signature_completed_at = NOW()
WHERE id = NEW.document_id;
INSERT INTO signature_audit_log (document_id, action, description)
VALUES (NEW.document_id, 'document_completed', 'All signers have completed signing');
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public, pg_temp; -- FIXED: Set explicit search_path
-- Fix update_updated_at_column function (if exists)
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW();
RETURN NEW;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER
SET search_path = public, pg_temp; -- FIXED: Set explicit search_path
-- =====================================================
-- 3. FIX RLS PERFORMANCE ISSUES
-- =====================================================
-- Issue: auth.uid() is re-evaluated for each row
-- Fix: Wrap in SELECT to optimize
-- Drop existing policies
DROP POLICY IF EXISTS "Users can view own documents" ON documents;
DROP POLICY IF EXISTS "Users can update own documents" ON documents;
DROP POLICY IF EXISTS "Users can delete own documents" ON documents;
DROP POLICY IF EXISTS "Users can view fields for own documents" ON signature_fields;
DROP POLICY IF EXISTS "Signers can view their assigned fields" ON signature_fields;
DROP POLICY IF EXISTS "Users can insert fields for own documents" ON signature_fields;
DROP POLICY IF EXISTS "Users can update fields for own documents" ON signature_fields;
DROP POLICY IF EXISTS "Users can delete fields for own documents" ON signature_fields;
DROP POLICY IF EXISTS "Users can insert signers for own documents" ON document_signers;
DROP POLICY IF EXISTS "Users can delete signers for own documents" ON document_signers;
DROP POLICY IF EXISTS "Users can view signatures for own documents" ON signature_records;
DROP POLICY IF EXISTS "Users can view audit logs for own documents" ON signature_audit_log;
-- Create optimized policies (public access for guest mode)
-- Since your app uses guest mode (no auth), use simpler public policies
-- Documents - Public Access (Guest Mode)
CREATE POLICY "Public Read Access" ON documents
FOR SELECT USING (true);
CREATE POLICY "Public Insert Access" ON documents
FOR INSERT WITH CHECK (true);
CREATE POLICY "Public Update Access" ON documents
FOR UPDATE USING (true);
CREATE POLICY "Public Delete Access" ON documents
FOR DELETE USING (true);
-- Signature Fields - Public Access
CREATE POLICY "Public can view fields" ON signature_fields
FOR SELECT USING (true);
CREATE POLICY "Public can insert fields" ON signature_fields
FOR INSERT WITH CHECK (true);
CREATE POLICY "Public can update fields" ON signature_fields
FOR UPDATE USING (true);
CREATE POLICY "Public can delete fields" ON signature_fields
FOR DELETE USING (true);
-- Document Signers - Public Access
CREATE POLICY "Public can view signers" ON document_signers
FOR SELECT USING (true);
CREATE POLICY "Public can insert signers" ON document_signers
FOR INSERT WITH CHECK (true);
CREATE POLICY "Public can update signers" ON document_signers
FOR UPDATE USING (true);
CREATE POLICY "Public can delete signers" ON document_signers
FOR DELETE USING (true);
-- Signature Records - Public Access
CREATE POLICY "Public can view signatures" ON signature_records
FOR SELECT USING (true);
CREATE POLICY "Public can insert signatures" ON signature_records
FOR INSERT WITH CHECK (true);
-- Audit Log - Public Access
CREATE POLICY "Public can view audit logs" ON signature_audit_log
FOR SELECT USING (true);
CREATE POLICY "Public can insert audit logs" ON signature_audit_log
FOR INSERT WITH CHECK (true);
-- =====================================================
-- 4. FIX STORAGE_TYPE TABLE (RLS without policies)
-- =====================================================
-- Issue: storage_type table has RLS enabled but no policies
-- Fix: Add public policies or disable RLS
-- Option 1: Add public policies (recommended for guest mode)
CREATE POLICY "Public can view storage types" ON storage_type
FOR SELECT USING (true);
CREATE POLICY "Public can insert storage types" ON storage_type
FOR INSERT WITH CHECK (true);
CREATE POLICY "Public can update storage types" ON storage_type
FOR UPDATE USING (true);
CREATE POLICY "Public can delete storage types" ON storage_type
FOR DELETE USING (true);
-- Option 2: Or disable RLS if not needed (uncomment to use)
-- ALTER TABLE storage_type DISABLE ROW LEVEL SECURITY;
-- =====================================================
-- 5. COMPLETION MESSAGE
-- =====================================================
DO $$
BEGIN
RAISE NOTICE '==========================================';
RAISE NOTICE 'Supabase Fixes Applied Successfully! ✓';
RAISE NOTICE '==========================================';
RAISE NOTICE 'Fixed Issues:';
RAISE NOTICE '- Removed SECURITY DEFINER from view';
RAISE NOTICE '- Set explicit search_path on functions';
RAISE NOTICE '- Optimized RLS policies (no auth.uid())';
RAISE NOTICE '- Fixed storage_type table policies';
RAISE NOTICE '- Removed multiple permissive policies';
RAISE NOTICE '==========================================';
END $$;