ajoute le dossier WebDAV de l'élève (bloc C)

Dossier personnel de l'élève monté comme lecteur réseau : rclone
sert le dossier local, l'authentification est déléguée au portail
via auth_request Nginx (mêmes identifiants que la connexion), sans
nouveau système de comptes. Nettoyé par la purge RGPD comme les
autres données d'élève.

Corrige au passage un vrai bug d'isolation trouvé en testant avec
deux comptes jetables : rewrite injectait la variable posée par
auth_request_set, mais rewrite s'exécute dans une phase Nginx
antérieure à cette variable, donc toujours vide - un élève pouvait
lire le fichier d'un autre en devinant son nom. Corrigé par une
location à regex nommée + proxy_pass. Détails : ADR 0008.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Adam Belkacemi 2026-10-14 13:04:40 +02:00
parent cdf79d2823
commit e549f03e1b
19 changed files with 553 additions and 8 deletions

View file

@ -0,0 +1,27 @@
# Géré par Ansible (rôle portail) — ne pas modifier à la main.
# Bloc C (CLAUDE.md) : dossier de l'élève monté comme lecteur réseau.
# N'écoute qu'en local (127.0.0.1) : Nginx authentifie (délégué au portail)
# et restreint chaque élève à son sous-dossier avant de relayer ici — voir
# ansible/roles/portail/templates/nginx-portail.conf.j2 et
# App\Http\Controllers\WebdavAuthController.
[Unit]
Description=Serveur WebDAV (rclone) pour le dossier des élèves — Syllabus
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
# --dir-cache-time : sans ça, les dossiers créés par Laravel (un par élève,
# en dehors de rclone) restent invisibles jusqu'à 5 minutes (la valeur par
# défaut) — constaté le 2026-10-14, un nouveau dossier élève répondait 404
# tant que rclone ne l'avait pas découvert lui-même.
ExecStart=/usr/bin/rclone serve webdav {{ portail_dossier_app }}/storage/app/webdav --addr 127.0.0.1:{{ portail_port_webdav }} --no-modtime --vfs-cache-mode off --dir-cache-time 1s
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths={{ portail_dossier_app }}/storage/app/webdav
[Install]
WantedBy=multi-user.target