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:
@@ -0,0 +1,110 @@
|
||||
# language: fr
|
||||
|
||||
@privacy @rgpd @security
|
||||
Fonctionnalité: Sécurité des données (Article 32 RGPD)
|
||||
En tant que responsable de traitement
|
||||
Je veux garantir la sécurité des données personnelles
|
||||
Afin de prévenir les violations et fuites
|
||||
|
||||
# Chiffrement transport
|
||||
@encryption @tls
|
||||
Scénario: TLS 1.3 obligatoire pour toutes les communications
|
||||
Quand un client tente de se connecter à l'API
|
||||
Alors la connexion utilise TLS 1.3 uniquement
|
||||
Et les protocoles TLS 1.0, 1.1, 1.2 sont refusés
|
||||
Et le certificat est valide et à jour
|
||||
|
||||
# Chiffrement stockage
|
||||
@encryption @database
|
||||
Scénario: Encryption at rest pour la base de données
|
||||
Étant donné que PostgreSQL stocke des données utilisateurs
|
||||
Alors le chiffrement AES-256 at rest est activé
|
||||
Et les backups sont également chiffrés AES-256
|
||||
Et les backups sont stockés offsite (règle 3-2-1)
|
||||
|
||||
# Tokens JWT sécurisés
|
||||
@encryption @jwt
|
||||
Scénario: Rotation des clés JWT tous les 90 jours
|
||||
Étant donné que l'API utilise des tokens JWT RS256
|
||||
Quand 90 jours se sont écoulés depuis la dernière rotation
|
||||
Alors une nouvelle paire de clés RSA est générée
|
||||
Et l'ancienne clé reste valide 7 jours (overlap)
|
||||
Et tous les tokens sont progressivement re-signés
|
||||
|
||||
# CDN avec signed URLs
|
||||
@cdn @signed-urls
|
||||
Scénario: URLs signées expirables pour les fichiers audio
|
||||
Quand un utilisateur demande à écouter un contenu
|
||||
Alors l'API génère une signed URL valide 1 heure
|
||||
Et l'URL contient un token HMAC
|
||||
Et après expiration, l'URL retourne 403 Forbidden
|
||||
|
||||
# Détection breach
|
||||
@breach @monitoring
|
||||
Scénario: Alerte immédiate si erreurs critiques backend
|
||||
Quand une erreur critique survient dans l'API (500, crash)
|
||||
Alors Sentry déclenche une alerte Discord/Slack immédiate
|
||||
Et l'équipe est notifiée en temps réel
|
||||
Et les logs sont consultables dans Grafana
|
||||
|
||||
@breach @monitoring
|
||||
Scénario: Alerte si pic de requêtes anormal (potentiel DDoS)
|
||||
Étant donné que le trafic habituel est ~1000 req/min
|
||||
Quand le trafic atteint 10000 req/min
|
||||
Alors Grafana déclenche une alerte email
|
||||
Et l'équipe vérifie s'il s'agit d'une attaque
|
||||
|
||||
@breach @monitoring
|
||||
Scénario: Alerte si accès DB non autorisé
|
||||
Quand une connexion PostgreSQL provient d'une IP non whitelistée
|
||||
Alors PostgreSQL bloque la connexion
|
||||
Et un SMS est envoyé au fondateur
|
||||
Et l'IP est loggée pour investigation
|
||||
|
||||
# Procédure breach 72h CNIL
|
||||
@breach @procedure
|
||||
Scénario: Notification CNIL si violation de données sous 72h
|
||||
Étant donné qu'une violation de données est détectée
|
||||
Et que des données GPS utilisateurs ont fuité
|
||||
Quand l'équipe évalue la gravité
|
||||
Alors le runbook "docs/rgpd/procedure-breach.md" est suivi:
|
||||
| Étape | Délai | Action |
|
||||
| 1 | H+0 | Détection et confinement |
|
||||
| 2 | H+24 | Évaluation gravité et impact |
|
||||
| 3 | H+48 | Notification CNIL si risque |
|
||||
| 4 | H+72 | Notification utilisateurs si élevé|
|
||||
Et un email pré-rédigé est envoyé à la CNIL
|
||||
Et le formulaire en ligne CNIL est rempli
|
||||
|
||||
# Mesures organisationnelles
|
||||
@security @access-control
|
||||
Scénario: Accès DB uniquement via VPN et whitelist IP
|
||||
Étant donné que je suis un développeur
|
||||
Quand je tente d'accéder à la DB de production
|
||||
Alors je dois être connecté au VPN OVH
|
||||
Et mon IP doit être dans la whitelist
|
||||
Sinon la connexion est refusée
|
||||
|
||||
@security @2fa
|
||||
Scénario: 2FA obligatoire pour les comptes administrateurs
|
||||
Étant donné que je suis un administrateur
|
||||
Quand je me connecte à Zitadel admin
|
||||
Alors le 2FA (TOTP) est obligatoire
|
||||
Et je ne peux pas désactiver le 2FA
|
||||
Et chaque connexion est loggée avec IP et timestamp
|
||||
|
||||
@security @logs
|
||||
Scénario: Anonymisation des IP dans les logs (rotation 90j)
|
||||
Quand un utilisateur fait une requête API
|
||||
Alors son IP est loggée pour debug
|
||||
Mais les 2 derniers octets sont masqués (ex: 192.168.x.x)
|
||||
Et les logs sont automatiquement supprimés après 90 jours
|
||||
|
||||
# Tests de sécurité
|
||||
@security @pentest
|
||||
Scénario: Pentest annuel obligatoire
|
||||
Étant donné que l'application est en production
|
||||
Quand une année s'est écoulée depuis le dernier pentest
|
||||
Alors un pentest externe est planifié
|
||||
Et les vulnérabilités découvertes sont corrigées sous 30 jours
|
||||
Et un rapport est produit pour audit
|
||||
@@ -0,0 +1,112 @@
|
||||
# language: fr
|
||||
|
||||
@privacy @rgpd @minors @parental-consent
|
||||
Fonctionnalité: Protection des mineurs et consentement parental (Article 8 RGPD)
|
||||
En tant que plateforme responsable
|
||||
Je veux protéger les mineurs avec consentement parental
|
||||
Afin de respecter l'Article 8 RGPD (13-15 ans)
|
||||
|
||||
Contexte:
|
||||
Étant donné que je suis sur la page d'inscription
|
||||
|
||||
Scénario: Blocage inscription si moins de 13 ans
|
||||
Quand je saisis ma date de naissance "15/03/2014"
|
||||
Et que je valide le formulaire
|
||||
Alors je vois le message "RoadWave est réservé aux personnes de 13 ans et plus"
|
||||
Et je vois un lien vers "RoadWave Kids"
|
||||
Et mon inscription est bloquée
|
||||
|
||||
Scénario: Inscription directe si 16 ans ou plus
|
||||
Quand je saisis ma date de naissance "10/01/2008"
|
||||
Et que je valide le formulaire
|
||||
Alors mon compte est créé immédiatement
|
||||
Et aucun consentement parental n'est requis
|
||||
Et j'ai accès à toutes les fonctionnalités
|
||||
|
||||
Plan du Scénario: Workflow consentement parental pour 13-15 ans
|
||||
Quand je saisis ma date de naissance "<date_naissance>"
|
||||
Et que je saisis l'email de mon parent "parent@example.com"
|
||||
Et que je valide le formulaire
|
||||
Alors un email est envoyé à "parent@example.com"
|
||||
Et le lien de validation expire dans 7 jours
|
||||
Et mon compte est créé mais inactif
|
||||
Et je vois "En attente validation parentale"
|
||||
|
||||
Exemples:
|
||||
| date_naissance | âge |
|
||||
| 15/03/2011 | 13 |
|
||||
| 20/06/2010 | 14 |
|
||||
| 01/12/2009 | 15 |
|
||||
|
||||
Scénario: Validation du consentement parental
|
||||
Étant donné que je suis un mineur de 14 ans avec compte inactif
|
||||
Et que mon parent a reçu l'email de validation
|
||||
Quand mon parent clique sur le lien de validation
|
||||
Alors il voit une page avec:
|
||||
| Section |
|
||||
| Résumé données collectées |
|
||||
| Paramètres contrôle parental|
|
||||
| Checkbox consentement |
|
||||
Et quand il coche "J'autorise mon enfant" et valide
|
||||
Alors mon compte est activé
|
||||
Et je reçois un email "Compte activé par ton parent"
|
||||
Et les restrictions 13-15 ans sont appliquées
|
||||
|
||||
Scénario: Restrictions pour comptes 13-15 ans
|
||||
Étant donné que je suis un utilisateur de 14 ans avec compte validé
|
||||
Alors je peux écouter des contenus autorisés
|
||||
Mais je NE peux PAS:
|
||||
| Restriction |
|
||||
| Activer le GPS précis sans accord parent |
|
||||
| Utiliser la messagerie privée |
|
||||
| Voir les contenus marqués +16 |
|
||||
| Afficher ma ville précise sur le profil |
|
||||
|
||||
Scénario: Dashboard parent - Visualisation activité enfant
|
||||
Étant donné que je suis un parent avec enfant de 14 ans
|
||||
Quand je me connecte à "roadwave.fr/parent/[child_id]"
|
||||
Alors je vois:
|
||||
| Information |
|
||||
| Historique d'écoute |
|
||||
| Temps d'écoute hebdomadaire |
|
||||
| Dernière connexion |
|
||||
Et je peux:
|
||||
| Action |
|
||||
| Activer/désactiver GPS précis |
|
||||
| Activer/désactiver messagerie |
|
||||
| Révoquer le consentement |
|
||||
|
||||
Scénario: Révocation du consentement parental
|
||||
Étant donné que je suis un parent
|
||||
Et que mon enfant de 14 ans a un compte actif
|
||||
Quand je clique sur "Révoquer le consentement"
|
||||
Alors le compte de mon enfant est immédiatement désactivé
|
||||
Et il ne peut plus se connecter
|
||||
Et je reçois un email de confirmation
|
||||
|
||||
@roadwave-kids
|
||||
Scénario: RoadWave Kids - Inscription via compte parent
|
||||
Étant donné que je suis un parent avec compte RoadWave actif
|
||||
Quand je vais dans "Mon compte > Ajouter un profil enfant"
|
||||
Et que je saisis:
|
||||
| Champ | Valeur |
|
||||
| Pseudo enfant | "Emma" |
|
||||
| Date naissance | "12/08/2016" |
|
||||
Alors un profil Kids est créé
|
||||
Et je reçois un QR code pour l'app RoadWave Kids
|
||||
Et l'enfant ne peut écouter que les contenus whitelist
|
||||
|
||||
@roadwave-kids
|
||||
Scénario: RoadWave Kids - Restrictions strictes
|
||||
Étant donné que je suis connecté sur l'app RoadWave Kids
|
||||
Alors je peux uniquement:
|
||||
| Fonctionnalité |
|
||||
| Écouter contenus présélectionnés |
|
||||
| Voir ma position ville (GeoIP) |
|
||||
Mais je NE peux PAS:
|
||||
| Restriction |
|
||||
| Activer le GPS précis |
|
||||
| Créer du contenu |
|
||||
| Avoir un profil public |
|
||||
| Utiliser la messagerie |
|
||||
| Voir du contenu UGC |
|
||||
@@ -0,0 +1,99 @@
|
||||
# language: fr
|
||||
|
||||
@privacy @rgpd @transparency
|
||||
Fonctionnalité: Politique de confidentialité et transparence (Articles 13-14 RGPD)
|
||||
En tant qu'utilisateur
|
||||
Je veux comprendre comment mes données sont utilisées
|
||||
Afin de donner un consentement éclairé
|
||||
|
||||
Contexte:
|
||||
Étant donné que l'application RoadWave est disponible
|
||||
|
||||
# Popup première connexion
|
||||
@first-launch
|
||||
Scénario: Affichage de la politique de confidentialité à l'inscription
|
||||
Quand je m'inscris pour la première fois
|
||||
Alors une popup s'affiche avec la politique de confidentialité
|
||||
Et je dois scroller jusqu'en bas pour activer le bouton "J'accepte"
|
||||
Et je dois cocher "J'ai lu et j'accepte la politique de confidentialité"
|
||||
Et je ne peux pas créer de compte sans accepter
|
||||
|
||||
# Contenu obligatoire
|
||||
@content
|
||||
Scénario: Vérification du contenu de la politique de confidentialité
|
||||
Quand je consulte la page "roadwave.fr/confidentialite"
|
||||
Alors je vois les informations suivantes:
|
||||
| Section |
|
||||
| Identité responsable traitement + DPO |
|
||||
| Finalités détaillées par traitement |
|
||||
| Base légale (consentement/contrat/intérêt)|
|
||||
| Destinataires données (CDN, Matomo, etc.) |
|
||||
| Durées de conservation |
|
||||
| Droits utilisateurs (accès, rectif, etc.) |
|
||||
| Droit réclamation CNIL |
|
||||
| Transferts hors UE (aucun) |
|
||||
|
||||
# Versioning
|
||||
@versioning
|
||||
Scénario: Versioning de la politique avec Git et DB
|
||||
Étant donné que la politique de confidentialité est modifiée
|
||||
Quand l'équipe commit les changements
|
||||
Alors le fichier "docs/legal/politique-confidentialite.md" est versionné Git
|
||||
Et une entrée est créée dans "privacy_policy_versions"
|
||||
Avec les champs:
|
||||
| Champ | Valeur |
|
||||
| version | "2.0" |
|
||||
| effective_date| "2026-03-01" |
|
||||
| major_change | true |
|
||||
| changelog | "Ajout tracking..." |
|
||||
|
||||
@versioning
|
||||
Scénario: Notification utilisateurs si changement majeur
|
||||
Étant donné qu'une nouvelle version majeure de la politique est publiée
|
||||
Quand un utilisateur se connecte
|
||||
Alors une popup s'affiche "Politique de confidentialité mise à jour"
|
||||
Et il doit l'accepter à nouveau pour continuer
|
||||
Et s'il refuse, son compte est gelé (accès lecture seule)
|
||||
|
||||
# Transparence algorithme
|
||||
@algorithm-transparency
|
||||
Scénario: Explication simplifiée de l'algorithme de recommandation
|
||||
Quand je vais sur "roadwave.fr/comment-ca-marche"
|
||||
Alors je vois une page "Comment fonctionne la recommandation ?"
|
||||
Avec les explications suivantes:
|
||||
| Critère | Explication |
|
||||
| Distance géographique | Contenus près de vous en priorité |
|
||||
| Centres d'intérêt | Jauges automatiques selon écoutes |
|
||||
| Popularité | Contenus les plus écoutés |
|
||||
Et je peux désactiver la personnalisation (mode anonyme)
|
||||
|
||||
# Contact DPO
|
||||
@dpo-contact
|
||||
Scénario: Accès facile au contact DPO
|
||||
Quand je vais dans "Paramètres > Confidentialité et données"
|
||||
Alors je vois un bouton "Contacter le DPO"
|
||||
Et le lien email "dpo@roadwave.fr" est cliquable
|
||||
Et je vois "Délai de réponse : 1 mois maximum"
|
||||
|
||||
# Profilage et décisions automatisées
|
||||
@profiling
|
||||
Scénario: Information sur le profilage et opposition possible
|
||||
Quand je consulte la politique de confidentialité
|
||||
Alors je vois une section "Profilage et décisions automatisées"
|
||||
Qui explique:
|
||||
| Type décision | Impact | Opposition possible |
|
||||
| Recommandations | Faible | Oui (mode anonyme) |
|
||||
| Modération automatique| Élevé | Oui (contestation) |
|
||||
Et je peux activer le mode anonyme à tout moment
|
||||
|
||||
# Sous-traitants
|
||||
@subprocessors
|
||||
Scénario: Liste transparente des sous-traitants
|
||||
Quand je consulte "roadwave.fr/confidentialite#sous-traitants"
|
||||
Alors je vois la liste complète:
|
||||
| Service | Finalité | Localisation | DPA |
|
||||
| OVH | Hébergement | France | ✅ |
|
||||
| Bunny.net | CDN audio | UE | ✅ |
|
||||
| Brevo | Emails | France | ✅ |
|
||||
| Mangopay | Paiements | Luxembourg | ✅ |
|
||||
Et je vois "Aucun transfert hors UE"
|
||||
@@ -0,0 +1,77 @@
|
||||
# language: fr
|
||||
|
||||
@privacy @rgpd @user-rights
|
||||
Fonctionnalité: Exercice des droits utilisateurs RGPD
|
||||
En tant qu'utilisateur
|
||||
Je veux exercer mes droits RGPD facilement
|
||||
Afin de contrôler mes données personnelles
|
||||
|
||||
Contexte:
|
||||
Étant donné que je suis connecté à mon compte
|
||||
|
||||
# Article 16 - Droit de rectification
|
||||
@rectification
|
||||
Scénario: Modification du pseudo (limite 1/30j)
|
||||
Quand je vais dans "Paramètres > Mon profil"
|
||||
Et que je modifie mon pseudo de "Alice123" à "AliceM"
|
||||
Alors le changement est immédiat
|
||||
Et je ne peux plus modifier mon pseudo pendant 30 jours
|
||||
Et l'historique est enregistré dans "user_profile_history"
|
||||
|
||||
@rectification
|
||||
Scénario: Modification de l'email avec re-vérification
|
||||
Quand je modifie mon email de "old@example.com" à "new@example.com"
|
||||
Alors je reçois un email de vérification sur "new@example.com"
|
||||
Et je dois cliquer sur le lien dans les 24h
|
||||
Et mon ancien email reste actif jusqu'à validation
|
||||
|
||||
# Article 21 - Droit d'opposition
|
||||
@opposition
|
||||
Scénario: Opposition au marketing par email
|
||||
Quand je vais dans "Paramètres > Notifications"
|
||||
Et que je décoche "Recevoir les emails marketing"
|
||||
Alors je ne reçois plus d'emails promotionnels
|
||||
Mais je reçois toujours les emails transactionnels
|
||||
|
||||
@opposition @anonymous-mode
|
||||
Scénario: Activation du mode anonyme (recommandations génériques)
|
||||
Quand je vais dans "Paramètres > Confidentialité"
|
||||
Et que j'active "Mode anonyme"
|
||||
Alors mes jauges d'intérêt sont ignorées
|
||||
Et je reçois uniquement les top contenus de ma zone géographique
|
||||
Et mon historique d'écoute n'est pas utilisé pour les recommandations
|
||||
Et je vois un badge "Mode anonyme actif"
|
||||
|
||||
# Article 18 - Droit à la limitation du traitement
|
||||
@limitation
|
||||
Scénario: Gel temporaire du compte
|
||||
Quand je vais dans "Paramètres > Gestion du compte"
|
||||
Et que je clique sur "Mettre en pause mon compte"
|
||||
Alors mon compte est gelé immédiatement
|
||||
Et mes contenus sont cachés (non diffusés)
|
||||
Et mon profil est invisible
|
||||
Mais je peux toujours me connecter en lecture seule
|
||||
Et je peux réactiver à tout moment
|
||||
|
||||
@limitation
|
||||
Scénario: Réactivation compte gelé
|
||||
Étant donné que mon compte est gelé depuis 15 jours
|
||||
Quand je me connecte
|
||||
Et que je clique sur "Réactiver mon compte"
|
||||
Alors mon compte redevient actif immédiatement
|
||||
Et mes contenus sont à nouveau visibles
|
||||
|
||||
# Article 12 - Délai de réponse 1 mois max
|
||||
@response-time
|
||||
Scénario: Demande d'accès aux données (délai 48h)
|
||||
Quand je demande un export de mes données
|
||||
Alors je reçois un email sous 48h maximum
|
||||
Avec un lien de téléchargement valide 7 jours
|
||||
|
||||
@response-time
|
||||
Scénario: Contestation d'une décision automatisée (délai 24h)
|
||||
Étant donné que mon contenu a été bloqué par la modération automatique
|
||||
Quand je clique sur "Contester cette décision"
|
||||
Alors un humain examine mon cas sous 24h
|
||||
Et je reçois une réponse motivée
|
||||
Et mon contenu est rétabli si la décision était erronée
|
||||
Reference in New Issue
Block a user