feat(rgpd): compléter documentation RGPD avec 12 nouvelles sections
Règles RGPD (docs/domains/_shared/rules/rgpd.md): - Ajouter sections 13.11-13.22 (droits utilisateurs, mineurs, sécurité) - Droit de rectification, opposition, limitation du traitement - Gestion des mineurs: 13 ans minimum + consentement parental 13-15 ans - Protection renforcée: RoadWave Kids pour < 13 ans - Sécurité: chiffrement multi-niveaux, procédure breach 72h CNIL - Politique de confidentialité avec versioning - Sous-traitants, DPIA, délais de réponse Entités (6 nouvelles): - PARENTAL_CONSENTS + PARENTAL_CONTROLS (workflow 13-15 ans) - PRIVACY_POLICY_VERSIONS + USER_POLICY_ACCEPTANCES - ACCOUNT_DELETIONS (grace period 30j) - BREACH_INCIDENTS + BREACH_AFFECTED_USERS - USER_PROFILE_HISTORY (audit trail rectification) - DATA_RETENTION_LOGS (purge 5 ans) Diagrammes séquences (5 nouveaux): - Consentement parental avec validation email - Anonymisation GPS automatique après 24h - Notification breach CNIL (procédure 72h) - Export données asynchrone - Suppression compte avec grace period Cycles de vie (3 nouveaux + 1 enrichi): - parental-consent-lifecycle.md - breach-incident-lifecycle.md - account-deletion-lifecycle.md - user-account-lifecycle.md (ajout états mineurs, frozen) Features BDD (4 nouvelles, 195 scénarios RGPD): - minors-protection.feature (9 scénarios) - data-security.feature (12 scénarios) - privacy-policy.feature (8 scénarios) - user-rights.feature (8 scénarios) Infrastructure: - Réorganiser docs générées: docs/bdd + output → generated/bdd + generated/pdf - Mettre à jour mkdocs.yml, Makefile, scripts Python - Ajouter /generated/ au .gitignore
This commit is contained in:
@@ -34,15 +34,7 @@
|
||||
1. Données précises conservées **24h** (recommandation personnalisée)
|
||||
2. Après 24h : conversion en geohash précision 5 (~5km²)
|
||||
3. Coordonnées originales supprimées définitivement
|
||||
|
||||
**Implémentation PostGIS** :
|
||||
```sql
|
||||
-- Job quotidien
|
||||
UPDATE location_history
|
||||
SET location = ST_SetSRID(ST_GeomFromGeoHash(ST_GeoHash(location::geography, 5)), 4326)::geography,
|
||||
anonymized = true
|
||||
WHERE created_at < NOW() - INTERVAL '24 hours' AND anonymized = false;
|
||||
```
|
||||
4. Job quotidien automatique via cron
|
||||
|
||||
**Exceptions** :
|
||||
- ✅ Historique personnel visible (liste trajets) : conservation intégrale tant que compte actif
|
||||
@@ -59,17 +51,7 @@ WHERE created_at < NOW() - INTERVAL '24 hours' AND anonymized = false;
|
||||
|
||||
**Décision** : JSON + HTML + ZIP, génération asynchrone
|
||||
|
||||
**Contenu de l'export** :
|
||||
```
|
||||
export-roadwave-[user_id]-[date].zip
|
||||
├── export.json # Machine-readable
|
||||
├── index.html # Human-readable (stylé)
|
||||
├── audio/
|
||||
│ ├── content-123.opus
|
||||
│ ├── content-456.opus
|
||||
│ └── ...
|
||||
└── README.txt # Instructions
|
||||
```
|
||||
**Format export** : Archive ZIP contenant JSON (machine-readable), HTML (human-readable), fichiers audio, README
|
||||
|
||||
**Données exportées** :
|
||||
- Profil utilisateur (email, pseudo, date inscription, bio)
|
||||
@@ -306,31 +288,283 @@ export-roadwave-[user_id]-[date].zip
|
||||
|
||||
---
|
||||
|
||||
## Récapitulatif Section 13
|
||||
### 13.11 Droit de rectification
|
||||
|
||||
| Mesure | Implémentation | Coût |
|
||||
|--------|----------------|------|
|
||||
| **Consentement** | Tarteaucitron.js + PostgreSQL | 0€ |
|
||||
| **Anonymisation GPS** | Geohash PostGIS (24h) | 0€ |
|
||||
| **Export données** | JSON+HTML+ZIP asynchrone | 0€ |
|
||||
| **Suppression compte** | Grace period 30j + anonymisation | 0€ |
|
||||
| **Mode dégradé** | GeoIP IP2Location + GPS optionnel | 0€ |
|
||||
| **Conservation** | Purge auto 5 ans inactivité | 0€ |
|
||||
| **Analytics** | Matomo self-hosted | ~5€/mois |
|
||||
| **Registre traitements** | Markdown Git | 0€ |
|
||||
| **Breach detection** | Sentry + Grafana + runbook | 0€ |
|
||||
| **DPO** | Fondateur formé CNIL | 0€ |
|
||||
**Décision** : Interface self-service + validation immédiate
|
||||
|
||||
**Coût total RGPD : ~5€/mois**
|
||||
**Données rectifiables** :
|
||||
- Email (avec re-vérification)
|
||||
- Pseudo (unique, disponibilité vérifiée)
|
||||
- Bio / description
|
||||
- Centres d'intérêt (jauges)
|
||||
- Photo de profil
|
||||
|
||||
**Processus** :
|
||||
- Changements immédiats (sauf email)
|
||||
- Email : lien vérification → validation sous 24h
|
||||
- Historique modifications conservé (audit trail)
|
||||
|
||||
**Limitations** :
|
||||
- Pseudo : max 1 changement/30j (anti-squat)
|
||||
|
||||
**Justification** : Conformité Article 16 RGPD, self-service 0€
|
||||
|
||||
---
|
||||
|
||||
## Points d'attention pour Gherkin
|
||||
### 13.12 Droit d'opposition
|
||||
|
||||
- Tester consentement géolocalisation (accept/refuse → contenus différents)
|
||||
- Tester anonymisation GPS après 24h (job cron)
|
||||
- Tester export données (génération complète + vérification contenu)
|
||||
- Tester grace period suppression (annulation possible)
|
||||
- Tester mode GeoIP (ville détectée correctement)
|
||||
- Tester purge automatique (5 ans inactivité)
|
||||
- Tester notifications avant purge (90j/30j/7j)
|
||||
**Décision** : Opt-out granulaire, effet immédiat
|
||||
|
||||
| Traitement | Toggle | Effet |
|
||||
|------------|--------|-------|
|
||||
| **Marketing email** | Paramètres | Stop emails promo |
|
||||
| **Notifications push** | Paramètres | Stop push marketing |
|
||||
| **Analytics** | Banner RGPD | Exclusion Matomo |
|
||||
| **Recommandations personnalisées** | "Mode anonyme" | Reco génériques uniquement |
|
||||
|
||||
**Mode anonyme** :
|
||||
- Désactive algorithme (jauges ignorées)
|
||||
- Recommandations = top contenus zone géo uniquement
|
||||
- Historique non utilisé
|
||||
|
||||
**Justification** : Conformité Article 21 RGPD
|
||||
|
||||
---
|
||||
|
||||
### 13.13 Droit à la limitation du traitement
|
||||
|
||||
**Décision** : "Geler mon compte" temporaire
|
||||
|
||||
**Effets** :
|
||||
- Compte gelé, contenus cachés, profil invisible
|
||||
- Connexion lecture seule OK
|
||||
- Réactivation à tout moment
|
||||
|
||||
**Justification** : Conformité Article 18 RGPD
|
||||
|
||||
---
|
||||
|
||||
### 13.14 Politique de confidentialité
|
||||
|
||||
**Décision** : Page web + popup in-app + versioning Git
|
||||
|
||||
**Emplacement** :
|
||||
- Web : `roadwave.fr/confidentialite`
|
||||
- App : page dédiée paramètres
|
||||
- Popup première connexion (scroll requis)
|
||||
|
||||
**Contenu** : Identité responsable, finalités, base légale, destinataires, durées, droits, transferts UE
|
||||
|
||||
**Versioning** : Git + DB `privacy_policy_versions`, popup si changement majeur
|
||||
|
||||
**Justification** : Conformité Articles 13-14 RGPD
|
||||
|
||||
---
|
||||
|
||||
### 13.15 Minimisation des données
|
||||
|
||||
**Décision** : Collecte strictement nécessaire
|
||||
|
||||
| Donnée | Finalité | Optionnel |
|
||||
|--------|----------|-----------|
|
||||
| Email | Authentification | ❌ |
|
||||
| Pseudo | Identité publique | ❌ |
|
||||
| GPS précis | Reco hyperlocales | ✅ (GeoIP fallback) |
|
||||
| Jauges intérêt | Reco thématiques | ✅ |
|
||||
| Date naissance | Vérifier âge minimum | ❌ (année seule) |
|
||||
|
||||
**Non collecté** : nom/prénom réels, adresse postale (sauf créateurs payés), téléphone (sauf 2FA optionnel)
|
||||
|
||||
**Justification** : Conformité Article 5.1.c RGPD
|
||||
|
||||
---
|
||||
|
||||
### 13.16 Sécurité des données
|
||||
|
||||
**Décision** : Chiffrement multi-niveaux
|
||||
|
||||
| Couche | Implémentation |
|
||||
|--------|----------------|
|
||||
| Transport | TLS 1.3 ([ADR-006](../../../adr/006-chiffrement.md)) |
|
||||
| DB | PostgreSQL encryption at rest AES-256 |
|
||||
| Tokens | JWT RS256 + rotation 90j |
|
||||
| CDN | Signed URLs expirables |
|
||||
| Backups | AES-256 + offsite |
|
||||
|
||||
**Mesures orga** : Whitelist IP, Vault secrets, logs anonymisés, 2FA admins, pentest annuel
|
||||
|
||||
**Justification** : Conformité Article 32 RGPD
|
||||
|
||||
---
|
||||
|
||||
### 13.17 Transferts hors UE
|
||||
|
||||
**Décision** : Hébergement 100% France/UE
|
||||
|
||||
| Service | Localisation | Transfert UE |
|
||||
|---------|--------------|--------------|
|
||||
| Hébergement | OVH France | ❌ |
|
||||
| Database | OVH France | ❌ |
|
||||
| CDN | Bunny.net EU | ❌ |
|
||||
| Matomo | Self-hosted France | ❌ |
|
||||
|
||||
**Si CDN global futur** : Clauses Contractuelles Types (CCE) 2021
|
||||
|
||||
**Justification** : Conformité Articles 44-50 RGPD, souveraineté données
|
||||
|
||||
---
|
||||
|
||||
### 13.18 Profilage et décisions automatisées
|
||||
|
||||
**Décision** : Transparence + droit opposition
|
||||
|
||||
| Traitement | Impact | Intervention humaine | Opposition |
|
||||
|------------|--------|---------------------|------------|
|
||||
| Recommandations | Faible | ❌ | ✅ (mode anonyme) |
|
||||
| Modération auto | Élevé | ✅ (review 24h) | ✅ (appeal) |
|
||||
|
||||
**Transparence** : Page "Comment fonctionne l'algo ?", explications simplifiées
|
||||
|
||||
**Justification** : Conformité Article 22 RGPD
|
||||
|
||||
---
|
||||
|
||||
### 13.19 Gestion des mineurs
|
||||
|
||||
**Décision** : 13 ans minimum + consentement parental 13-15 ans + RoadWave Kids
|
||||
|
||||
#### App principale (RoadWave)
|
||||
|
||||
**Âge minimum** : **13 ans** (alignement YouTube/TikTok)
|
||||
|
||||
**Processus inscription** :
|
||||
1. Saisie date naissance (JJ/MM/AAAA)
|
||||
2. **Si < 13 ans** : blocage + message redirection RoadWave Kids
|
||||
3. **Si 13-15 ans** : workflow consentement parental
|
||||
4. **Si ≥ 16 ans** : inscription directe
|
||||
|
||||
**Workflow consentement parental (13-15 ans)** :
|
||||
1. Ado saisit email parent
|
||||
2. Email automatique parent avec lien validation (expire 7j)
|
||||
3. Parent clique lien → page dédiée avec résumé données collectées, paramètres contrôle parental, checkbox consentement
|
||||
4. Validation parent → compte ado activé avec restrictions
|
||||
|
||||
**Restrictions 13-15 ans** :
|
||||
- ✅ Écoute contenus autorisés
|
||||
- ✅ Création contenus (modération renforcée)
|
||||
- ⚠️ GPS précis : consentement parental explicite requis
|
||||
- ⚠️ Messagerie privée : désactivée par défaut
|
||||
- ⚠️ Contenus sensibles : filtrés (pas de contenu +16)
|
||||
- ⚠️ Profil public limité (pas d'affichage ville précise)
|
||||
|
||||
**Contrôles parentaux** :
|
||||
- Dashboard parent : `roadwave.fr/parent/[child_id]`
|
||||
- Visualisation historique écoute
|
||||
- Activation/désactivation GPS précis
|
||||
- Activation/désactivation messagerie
|
||||
- Révocation consentement à tout moment
|
||||
- Notification hebdomadaire activité
|
||||
|
||||
**Vérification légère identité parent** :
|
||||
- Email parent ≠ email ado (vérification domaine)
|
||||
- Lien expiration 7 jours
|
||||
- Pas de vérification identité forte (MVP)
|
||||
|
||||
#### RoadWave Kids (< 13 ans)
|
||||
|
||||
**App dédiée** : Version séparée avec contrôles renforcés
|
||||
|
||||
**Caractéristiques** :
|
||||
- ❌ Pas de GPS précis (GeoIP ville uniquement)
|
||||
- ❌ Pas de création contenu
|
||||
- ❌ Pas de profil public
|
||||
- ❌ Pas de messagerie
|
||||
- ✅ Contenus présélectionnés (whitelist éditoriale)
|
||||
- ✅ Mode lecture seule
|
||||
- ✅ Contrôle parental obligatoire
|
||||
|
||||
**Contenus autorisés** :
|
||||
- Contes audio enfants
|
||||
- Guides touristiques famille
|
||||
- Podcasts éducatifs labellisés
|
||||
- Histoires locales patrimoine
|
||||
|
||||
**Workflow inscription** :
|
||||
1. Création compte parent (RoadWave standard)
|
||||
2. Ajout profil enfant dans dashboard parent
|
||||
3. App Kids : login via QR code parent
|
||||
4. Pas de compte autonome enfant
|
||||
|
||||
**Modération** :
|
||||
- 100% contenus présélectionnés par équipe éditoriale
|
||||
- Aucun UGC accessible
|
||||
- Whitelist créateurs vérifiés uniquement
|
||||
|
||||
**Justification** :
|
||||
- Conformité Article 8 RGPD (13-16 ans selon pays)
|
||||
- 13 ans France = seuil légal avec consentement parental
|
||||
- App Kids = protection renforcée < 13 ans
|
||||
- Alignement marché (YouTube 13+, YouTube Kids)
|
||||
|
||||
**Roadmap** :
|
||||
- **MVP** : App principale 16+ uniquement (simplicité)
|
||||
- **Phase 2** : Workflow 13-15 ans + consentement parental
|
||||
- **Phase 3** : RoadWave Kids (app séparée)
|
||||
|
||||
---
|
||||
|
||||
### 13.20 Sous-traitants et DPA
|
||||
|
||||
**Décision** : DPA systématique, audit annuel
|
||||
|
||||
| Service | Traitement | Localisation | DPA | Certifications |
|
||||
|---------|------------|--------------|-----|----------------|
|
||||
| OVH | Hébergement | France | ✅ | ISO 27001, HDS |
|
||||
| Bunny.net | CDN | UE | ✅ | ISO 27001 |
|
||||
| Brevo | Emailing | France | ✅ | RGPD certified |
|
||||
| Mangopay | Paiements | Luxembourg | ✅ | PCI-DSS, ACPR |
|
||||
|
||||
**Obligations DPA** : Traitement selon instructions, confidentialité, sécurité, assistance droits, suppression fin contrat
|
||||
|
||||
**Gestion** : `docs/rgpd/sous-traitants.md`, review annuelle
|
||||
|
||||
**Justification** : Conformité Article 28 RGPD
|
||||
|
||||
---
|
||||
|
||||
### 13.21 Analyse d'impact (DPIA)
|
||||
|
||||
**Décision** : DPIA obligatoire (GPS + profilage grande échelle)
|
||||
|
||||
**Raisons** :
|
||||
- Traitement grande échelle données GPS sensibles
|
||||
- Profilage automatisé recommandations
|
||||
- Surveillance zones publiques
|
||||
|
||||
**Contenu** : Description traitement, finalités, nécessité, risques (tracking, profilage, fuite), mesures atténuation (anonymisation 24h, consentement, chiffrement, mode dégradé)
|
||||
|
||||
**Fichier** : `docs/rgpd/dpia-geolocalisation.md`, review annuelle
|
||||
|
||||
**Justification** : Conformité Article 35 RGPD (critères CNIL remplis)
|
||||
|
||||
---
|
||||
|
||||
### 13.22 Délai de réponse aux demandes
|
||||
|
||||
**Décision** : 1 mois max, automatisation maximale
|
||||
|
||||
**Canaux** : Email dpo@roadwave.fr, formulaire in-app, courrier postal
|
||||
|
||||
| Droit | Délai cible | Automatisation |
|
||||
|-------|-------------|----------------|
|
||||
| Accès (export) | 48h | ✅ Worker |
|
||||
| Rectification | Immédiat | ✅ Self-service |
|
||||
| Suppression | Immédiat | ✅ Self-service |
|
||||
| Opposition | Immédiat | ✅ Toggles |
|
||||
| Limitation | Immédiat | ✅ Gel compte |
|
||||
| Portabilité | 48h | ✅ Export |
|
||||
| Contestation décision | 24h | ⚠️ Manuel |
|
||||
|
||||
**Vérification identité** : Si email vérifié = aucune vérif supplémentaire
|
||||
|
||||
**Justification** : Conformité Article 12 RGPD
|
||||
|
||||
Reference in New Issue
Block a user