ajoute les pages légales, la purge RGPD et sert polices et scripts depuis le portail
Pages /legal et /confidentialite réécrites d'après le système réel, purge des classes archivées depuis 90 jours (prouvée par Pest), archivage côté prof. Polices, xterm.js et CodeMirror ne sont plus chargés depuis Google ni jsDelivr. Pages d'aperçu signalées, sans vrais établissements ni faux chiffres. Journaux Laravel gardés 14 jours. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
0a5df89201
commit
e4a6aaebb1
62 changed files with 822 additions and 238 deletions
41
docs/runbooks/rgpd.md
Normal file
41
docs/runbooks/rgpd.md
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
# Runbook — Données personnelles (RGPD)
|
||||
|
||||
Politique publique : `https://syllabuslab.fr/confidentialite`
|
||||
(`portail/resources/views/confidentialite.blade.php`). **Toute nouvelle donnée
|
||||
collectée, tout nouveau service tiers ou toute nouvelle durée de conservation
|
||||
doit d'abord y être décrit.** La page affirme seulement ce qui a été vérifié.
|
||||
|
||||
## Où sont les données
|
||||
|
||||
| Donnée | Où | Durée |
|
||||
|---|---|---|
|
||||
| Comptes profs, classes, élèves, séances, sessions, corrections | MariaDB du portail (`portail_mariadb`) | jusqu'à 90 jours après l'archivage de la classe |
|
||||
| VM des élèves (disques) | OpenStack, une stack par session | fin de session (45 min par défaut) |
|
||||
| Journaux Nginx (IP, pages) | `/var/log/nginx/` | 14 jours (logrotate) |
|
||||
| Journaux Laravel | `storage/logs/laravel-AAAA-MM-JJ.log` | 14 jours (`LOG_STACK=daily`, `LOG_DAILY_DAYS=14`) |
|
||||
| Sauvegardes chiffrées | Dedibackup (Scaleway, France) | 7 quotidiennes + 4 hebdomadaires (≤ 5 semaines) |
|
||||
|
||||
## Purge automatique
|
||||
|
||||
- Le prof archive sa classe (page de la classe, « Archiver la classe ») : plus de séance possible ; la date de suppression est affichée.
|
||||
- `classes:purger-archivees` (chaque nuit à 02:30 UTC) supprime les classes archivées depuis 90 jours, et en cascade leurs élèves, séances, sessions, machines et corrections. Le compte du prof reste. Le journal ne garde que l'identifiant de la classe et le nombre d'élèves.
|
||||
- Une classe avec un lab encore en cours est reportée (anomalie : un lab expire en 45 min) et signalée dans le journal.
|
||||
- Preuve : `portail/tests/Feature/PurgeRgpdTest.php`.
|
||||
|
||||
```
|
||||
ssh paillasse "cd /var/www/portail && sudo -u www-data HOME=/tmp php8.3 artisan classes:purger-archivees"
|
||||
```
|
||||
|
||||
## Répondre à une demande d'exercice des droits
|
||||
|
||||
Contact public : adam@belkacemi.me. Pour un élève, la demande passe normalement par son établissement (responsable du traitement).
|
||||
|
||||
- **Accès / portabilité (élève)** : prénom, nom, identifiant, classe, sessions et corrections ; extraire avec `artisan tinker` (`App\Models\Eleve::with('labSessions.corrections')->where('identifiant', '…')->first()->toArray()`), sans le code secret (haché, inutile).
|
||||
- **Effacement d'un élève** : `App\Models\Eleve::where('identifiant', '…')->first()->delete()` — cascade sur ses sessions et corrections.
|
||||
- **Effacement d'un compte prof** : supprimer d'abord ses classes (ou les archiver), puis `App\Models\User::where('email', '…')->first()->delete()`.
|
||||
- Noter la demande et sa date de traitement (hors du dépôt : le registre contient des données personnelles).
|
||||
- Rappeler que les sauvegardes chiffrées contenant la donnée expirent d'elles-mêmes sous 5 semaines.
|
||||
|
||||
## Interdits sur le site (prompt de déploiement, étape 14)
|
||||
|
||||
Pas de logo Marianne ou ministère, de drapeau de l'UE, de faux « logo RGPD », de chiffres inventés ni de faux clients. Formulations autorisées : « Hébergé en France », « Conforme au RGPD » avec un lien vers `/confidentialite`. Les pages d'aperçu (fonctions pas encore construites) portent le bandeau `partials/apercu` et n'affichent que des noms fictifs (`PagesLegalesTest`).
|
||||
Loading…
Add table
Add a link
Reference in a new issue