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:
55
docs/domains/_shared/sequences/anonymisation-gps.md
Normal file
55
docs/domains/_shared/sequences/anonymisation-gps.md
Normal file
@@ -0,0 +1,55 @@
|
||||
# Anonymisation automatique GPS après 24h
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as Utilisateur
|
||||
participant App as Application
|
||||
participant DB as Base de données (PostGIS)
|
||||
participant Cron as Job Cron Quotidien
|
||||
|
||||
Note over User,App: Écoute de contenu avec GPS
|
||||
|
||||
User->>App: Écoute contenu (GPS activé)
|
||||
App->>App: Capturer position GPS précise
|
||||
App->>DB: INSERT position (lat, lon, anonymized: false)
|
||||
Note over DB: Position précise stockée<br/>Utilisée pour recommandations
|
||||
|
||||
Note over DB,Cron: Moins de 24h : position précise conservée
|
||||
|
||||
App->>DB: SELECT positions pour recommandations
|
||||
DB->>App: Positions GPS précises (< 24h)
|
||||
App->>User: Recommandations hyperlocales
|
||||
|
||||
Note over Cron: 24h+ plus tard
|
||||
|
||||
Cron->>DB: SELECT positions WHERE created_at < NOW() - 24h AND anonymized = false
|
||||
DB->>Cron: Liste positions à anonymiser
|
||||
|
||||
loop Pour chaque position
|
||||
Cron->>DB: Convertir (lat, lon) → geohash précision 5 (~5km²)
|
||||
Cron->>DB: UPDATE position avec geohash
|
||||
Cron->>DB: Supprimer coordonnées précises
|
||||
Cron->>DB: SET anonymized = true
|
||||
end
|
||||
|
||||
Cron->>DB: Log anonymisation (nombre positions traitées)
|
||||
|
||||
Note over DB: Positions anonymisées utilisées pour analytics
|
||||
|
||||
App->>DB: SELECT positions anonymisées (analytics globales)
|
||||
DB->>App: Positions geohash uniquement
|
||||
App->>App: Générer heatmap trafic (~5km² précision)
|
||||
|
||||
Note over User: Exception : historique personnel
|
||||
|
||||
User->>App: Consulter "Mon historique d'écoute"
|
||||
App->>DB: SELECT historique personnel utilisateur
|
||||
DB->>App: Positions précises conservées (tant que compte actif)
|
||||
App->>User: Trajets détaillés
|
||||
```
|
||||
|
||||
**Légende** :
|
||||
- **< 24h** : GPS précis conservé (recommandations hyperlocales)
|
||||
- **> 24h** : Conversion automatique en geohash précision 5 (~5km²)
|
||||
- **Exception** : Historique personnel conservé intact tant que compte actif
|
||||
- **Analytics** : Uniquement positions anonymisées (geohash)
|
||||
43
docs/domains/_shared/sequences/consentement-parental.md
Normal file
43
docs/domains/_shared/sequences/consentement-parental.md
Normal file
@@ -0,0 +1,43 @@
|
||||
# Consentement parental (13-15 ans)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Ado as Adolescent (13-15 ans)
|
||||
participant App as Application
|
||||
participant DB as Base de données
|
||||
participant Email as Service Email
|
||||
participant Parent as Parent
|
||||
|
||||
Ado->>App: Inscription (date naissance 13-15 ans)
|
||||
App->>Ado: Demande email parent
|
||||
Ado->>App: Saisit email parent
|
||||
|
||||
App->>DB: Créer compte (statut: pending_parental_consent)
|
||||
App->>Email: Envoyer email validation parent
|
||||
Email->>Parent: Email avec lien (expire 7j)
|
||||
App->>Ado: "En attente validation parentale"
|
||||
|
||||
Note over Parent: Parent clique lien validation
|
||||
|
||||
Parent->>App: Accès page consentement
|
||||
App->>Parent: Afficher résumé données + contrôles
|
||||
Parent->>App: Valider consentement + paramètres
|
||||
|
||||
App->>DB: Enregistrer consentement parental
|
||||
App->>DB: Activer compte (statut: active_minor)
|
||||
App->>DB: Appliquer restrictions 13-15 ans
|
||||
|
||||
App->>Email: Notification ado (compte activé)
|
||||
Email->>Ado: Email confirmation
|
||||
|
||||
App->>Email: Notification parent (récapitulatif)
|
||||
Email->>Parent: Email + lien dashboard parental
|
||||
|
||||
Ado->>App: Connexion
|
||||
App->>Ado: Accès restreint (GPS/messagerie selon config parent)
|
||||
```
|
||||
|
||||
**Légende** :
|
||||
- Délai expiration lien : 7 jours
|
||||
- Restrictions 13-15 ans : GPS précis, messagerie, contenus +16 (configurables par parent)
|
||||
- Dashboard parent : `roadwave.fr/parent/[child_id]`
|
||||
65
docs/domains/_shared/sequences/export-donnees.md
Normal file
65
docs/domains/_shared/sequences/export-donnees.md
Normal file
@@ -0,0 +1,65 @@
|
||||
# Export de données (portabilité)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as Utilisateur
|
||||
participant App as Application
|
||||
participant DB as Base de données
|
||||
participant Queue as File d'attente
|
||||
participant Worker as Worker Background
|
||||
participant CDN as CDN (fichiers audio)
|
||||
participant Storage as Stockage temporaire
|
||||
participant Email as Service Email
|
||||
|
||||
User->>App: Demande export données
|
||||
|
||||
App->>DB: Vérifier dernière demande
|
||||
alt Dernière demande < 30 jours
|
||||
DB->>App: Demande refusée
|
||||
App->>User: "Prochain export disponible dans X jours"
|
||||
else Demande autorisée
|
||||
App->>DB: Créer demande export (statut: pending)
|
||||
App->>Queue: Ajouter job export
|
||||
App->>User: "Export en cours, email sous 48h"
|
||||
|
||||
Queue->>Worker: Job export disponible
|
||||
|
||||
Note over Worker: Génération asynchrone
|
||||
|
||||
Worker->>DB: Récupérer profil utilisateur
|
||||
Worker->>DB: Récupérer historique d'écoute
|
||||
Worker->>DB: Récupérer contenus créés (métadonnées)
|
||||
Worker->>DB: Récupérer centres d'intérêt
|
||||
Worker->>DB: Récupérer historique consentements
|
||||
|
||||
Worker->>CDN: Télécharger fichiers audio utilisateur
|
||||
CDN->>Worker: Fichiers audio (.opus)
|
||||
|
||||
Worker->>Worker: Générer export.json (machine-readable)
|
||||
Worker->>Worker: Générer index.html (human-readable)
|
||||
Worker->>Worker: Générer README.txt
|
||||
Worker->>Worker: Créer archive ZIP
|
||||
|
||||
Worker->>Storage: Stocker ZIP (expire 7j)
|
||||
Storage->>Worker: URL signée (expire 7j)
|
||||
|
||||
Worker->>DB: Mettre à jour demande (statut: completed)
|
||||
Worker->>DB: Enregistrer URL + date expiration
|
||||
|
||||
Worker->>Email: Envoyer email avec lien
|
||||
Email->>User: Email + lien téléchargement (valide 7j)
|
||||
|
||||
User->>Storage: Clic lien téléchargement
|
||||
Storage->>User: Téléchargement ZIP
|
||||
|
||||
Note over Storage: Après 7 jours
|
||||
|
||||
Storage->>Storage: Suppression automatique ZIP
|
||||
end
|
||||
```
|
||||
|
||||
**Légende** :
|
||||
- Limite : 1 export / 30 jours (anti-abus)
|
||||
- Délai génération : 48h maximum (conformité RGPD Article 20)
|
||||
- Expiration lien : 7 jours
|
||||
- Format : ZIP contenant JSON, HTML, audio, README
|
||||
63
docs/domains/_shared/sequences/notification-breach.md
Normal file
63
docs/domains/_shared/sequences/notification-breach.md
Normal file
@@ -0,0 +1,63 @@
|
||||
# Notification violation de données (breach) - Procédure 72h CNIL
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant Monitoring as Monitoring (Sentry/Grafana)
|
||||
participant Equipe as Équipe Technique
|
||||
participant DPO as DPO
|
||||
participant DB as Base de données
|
||||
participant CNIL as CNIL
|
||||
participant Users as Utilisateurs impactés
|
||||
|
||||
Note over Monitoring: H+0 - Détection
|
||||
|
||||
Monitoring->>Equipe: Alerte breach détecté
|
||||
Equipe->>Equipe: Confinement immédiat
|
||||
Equipe->>DB: Bloquer accès compromis
|
||||
Equipe->>DPO: Notification breach
|
||||
|
||||
Note over DPO,Equipe: H+0 à H+24 - Évaluation
|
||||
|
||||
DPO->>DB: Investigation périmètre
|
||||
DB->>DPO: Données compromises
|
||||
DPO->>DB: Liste utilisateurs impactés
|
||||
DB->>DPO: X utilisateurs
|
||||
|
||||
DPO->>DPO: Évaluation gravité
|
||||
Note over DPO: - Type données (GPS, email, etc.)<br/>- Nombre utilisateurs<br/>- Risque pour droits/libertés
|
||||
|
||||
alt Risque pour utilisateurs
|
||||
Note over DPO: H+24 à H+48 - Préparation notification CNIL
|
||||
|
||||
DPO->>DPO: Rédaction rapport breach
|
||||
Note over DPO: - Nature violation<br/>- Catégories/nb données<br/>- Conséquences probables<br/>- Mesures prises/envisagées
|
||||
|
||||
DPO->>CNIL: Notification sous 72h (email + formulaire en ligne)
|
||||
CNIL->>DPO: Accusé réception
|
||||
|
||||
alt Risque élevé pour utilisateurs
|
||||
Note over DPO: H+48 à H+72 - Notification utilisateurs
|
||||
|
||||
DPO->>Users: Email notification breach
|
||||
Note over Users: - Nature violation<br/>- Coordonnées DPO<br/>- Mesures prises<br/>- Recommandations (changer mdp, etc.)
|
||||
|
||||
DPO->>Users: Notification in-app
|
||||
end
|
||||
else Risque faible (mesures techniques suffisantes)
|
||||
DPO->>DPO: Documentation interne uniquement
|
||||
Note over DPO: Pas de notification CNIL requise
|
||||
end
|
||||
|
||||
Note over DPO: Post-incident
|
||||
|
||||
DPO->>Equipe: Audit sécurité complet
|
||||
DPO->>DB: Enregistrement incident (registre violations)
|
||||
DPO->>DPO: Plan correctif
|
||||
```
|
||||
|
||||
**Légende** :
|
||||
- **H+0 à H+24** : Détection, confinement, évaluation périmètre
|
||||
- **H+24 à H+48** : Évaluation gravité, préparation rapport
|
||||
- **H+48 à H+72** : Notification CNIL (si risque) + utilisateurs (si risque élevé)
|
||||
- Délai CNIL : **72h maximum** (Article 33 RGPD)
|
||||
- Notification utilisateurs obligatoire si **risque élevé** pour droits/libertés (Article 34 RGPD)
|
||||
51
docs/domains/_shared/sequences/suppression-compte.md
Normal file
51
docs/domains/_shared/sequences/suppression-compte.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# Suppression compte avec grace period
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant User as Utilisateur
|
||||
participant App as Application
|
||||
participant DB as Base de données
|
||||
participant Email as Service Email
|
||||
participant Cron as Job Cron
|
||||
|
||||
User->>App: Demande suppression compte
|
||||
App->>User: Confirmation (êtes-vous sûr ?)
|
||||
User->>App: Confirmer
|
||||
|
||||
App->>DB: Désactiver compte (statut: pending_deletion)
|
||||
App->>DB: Cacher contenus (visible: false)
|
||||
App->>DB: Révoquer sessions/tokens
|
||||
App->>DB: Enregistrer date suppression effective (J+30)
|
||||
|
||||
App->>Email: Email confirmation + lien annulation
|
||||
Email->>User: Email (lien valide 30j)
|
||||
App->>User: "Compte désactivé. Suppression dans 30 jours."
|
||||
|
||||
Note over User,App: Grace period 30 jours
|
||||
|
||||
alt Utilisateur annule
|
||||
User->>App: Clic lien annulation
|
||||
App->>DB: Réactiver compte (statut: active)
|
||||
App->>DB: Restaurer visibilité contenus
|
||||
App->>Email: Email confirmation réactivation
|
||||
Email->>User: "Compte réactivé"
|
||||
else 30 jours sans annulation
|
||||
Cron->>DB: Job quotidien (vérif comptes pending_deletion)
|
||||
DB->>Cron: Liste comptes J+30 dépassé
|
||||
|
||||
loop Pour chaque compte
|
||||
Cron->>DB: Supprimer données personnelles
|
||||
Cron->>DB: Anonymiser contenus (créateur: "Utilisateur supprimé")
|
||||
Cron->>DB: Supprimer historique GPS/écoute
|
||||
Cron->>DB: Marquer statut: deleted
|
||||
end
|
||||
|
||||
Cron->>Email: Email confirmation suppression effective
|
||||
Email->>User: "Compte définitivement supprimé"
|
||||
end
|
||||
```
|
||||
|
||||
**Légende** :
|
||||
- Grace period : 30 jours
|
||||
- Pendant grace period : compte inaccessible, contenus cachés
|
||||
- Après 30j : suppression définitive, contenus anonymisés conservés
|
||||
Reference in New Issue
Block a user