74 lines
2.3 KiB
SQL
74 lines
2.3 KiB
SQL
-- ==========================================
|
||
-- FIX CRITIQUE : RLS sur organization_details
|
||
-- ==========================================
|
||
-- PROBLÈME: RLS désactivé sur table contenant IBAN, BIC, emails, SIRET
|
||
-- IMPACT: Exposition de 40+ colonnes de données bancaires et personnelles
|
||
-- PRIORITÉ: CRITIQUE (violation RGPD)
|
||
-- ==========================================
|
||
|
||
-- 1️⃣ ACTIVER RLS
|
||
ALTER TABLE organization_details ENABLE ROW LEVEL SECURITY;
|
||
|
||
-- 2️⃣ POLITIQUE SELECT : Les membres peuvent voir leur organisation
|
||
CREATE POLICY "select_by_org_or_staff"
|
||
ON organization_details
|
||
FOR SELECT
|
||
USING (is_member_of_org(org_id));
|
||
|
||
-- 3️⃣ POLITIQUE UPDATE : Les membres peuvent modifier leur organisation
|
||
-- Note: Dans le code, org_id est exclu des UPDATE via .update({ ...orgData, org_id: undefined })
|
||
CREATE POLICY "update_by_org_or_staff"
|
||
ON organization_details
|
||
FOR UPDATE
|
||
USING (is_member_of_org(org_id))
|
||
WITH CHECK (is_member_of_org(org_id));
|
||
|
||
-- 4️⃣ POLITIQUE INSERT : Les membres peuvent créer leur organisation
|
||
-- Note: Utilisé lors de la création initiale d'une organisation
|
||
CREATE POLICY "insert_by_org_or_staff"
|
||
ON organization_details
|
||
FOR INSERT
|
||
WITH CHECK (is_member_of_org(org_id));
|
||
|
||
-- 5️⃣ POLITIQUE DELETE : Protection supplémentaire (normalement pas utilisé)
|
||
CREATE POLICY "delete_by_org_or_staff"
|
||
ON organization_details
|
||
FOR DELETE
|
||
USING (is_member_of_org(org_id));
|
||
|
||
-- ==========================================
|
||
-- VÉRIFICATION POST-FIX
|
||
-- ==========================================
|
||
|
||
-- Vérifier que RLS est activé
|
||
SELECT
|
||
tablename,
|
||
rowsecurity AS rls_enabled
|
||
FROM pg_tables
|
||
WHERE tablename = 'organization_details';
|
||
|
||
-- Vérifier les politiques créées (devrait retourner 4 lignes)
|
||
SELECT
|
||
policyname,
|
||
cmd,
|
||
qual,
|
||
with_check
|
||
FROM pg_policies
|
||
WHERE tablename = 'organization_details'
|
||
ORDER BY cmd;
|
||
|
||
-- Vérifier les index existants (devrait retourner 3 index sur org_id)
|
||
SELECT
|
||
indexname,
|
||
indexdef
|
||
FROM pg_indexes
|
||
WHERE tablename = 'organization_details'
|
||
AND indexdef ILIKE '%org_id%';
|
||
|
||
-- ==========================================
|
||
-- RÉSULTAT ATTENDU
|
||
-- ==========================================
|
||
-- ✅ RLS activé: true
|
||
-- ✅ 4 politiques créées: SELECT, INSERT, UPDATE, DELETE
|
||
-- ✅ 3 index existants sur org_id (performance garantie)
|
||
-- ==========================================
|