# Coaster World v1.93.0 — Sécurité / Confidentialité / Comptes V3

Base : **v1.92.1**.

## Sécurité du compte

- Nouvelle page **Sécurité et confidentialité** accessible depuis le profil et `/account/security`.
- Changement de mot de passe avec confirmation du mot de passe actuel.
- Politique de mot de passe renforcée : minimum 10 caractères, majuscule, minuscule et chiffre.
- Après changement de mot de passe, les autres sessions actives sont révoquées lorsque le pilote de session `database` est utilisé.
- Gestion des sessions : appareil/navigateur, IP, dernière activité, fermeture d'une session ou de toutes les autres sessions.
- Protection du dernier administrateur actif : il ne peut pas supprimer son propre compte tant qu'un autre administrateur actif n'existe pas.

## Mot de passe oublié

- Nouveau parcours complet :
  - `/forgot-password` ;
  - envoi du lien de récupération ;
  - `/reset-password/{token}` ;
  - choix d'un nouveau mot de passe.
- Réponse volontairement générique à la demande de récupération afin de ne pas révéler si une adresse e-mail possède un compte.
- Limitation des demandes par adresse/IP.
- Les anciennes sessions sont révoquées après une réinitialisation réussie lorsque les sessions sont en base.
- Les jetons de récupération expirés sont nettoyés périodiquement par `auth:clear-resets`.

## Vérification de l'adresse e-mail

- Le modèle utilisateur prend désormais en charge la vérification e-mail native Laravel.
- Les nouveaux comptes reçoivent l'événement Laravel `Registered`, permettant l'envoi du lien de vérification via le mailer configuré.
- État vérifié/non vérifié visible dans la page Sécurité.
- Possibilité de renvoyer le lien de vérification avec limitation de fréquence.
- Les anciens comptes non vérifiés ne sont **pas bloqués globalement** par cette version afin de conserver la compatibilité avec les comptes existants.

## Anti-abus et rate limiting

Nouveaux limiteurs nommés :

- connexion : 8 tentatives/minute par e-mail + IP ;
- inscription : 4 tentatives/minute par IP ;
- récupération de mot de passe : 3 demandes/minute par e-mail + IP ;
- opérations sensibles du compte : 6 opérations/minute par utilisateur/IP.

L'inscription ajoute également :

- champ honeypot invisible ;
- contrôle de temps minimum avant soumission ;
- politique de mot de passe renforcée.

## Confidentialité / export des données

- Nouvel export JSON depuis la page Sécurité.
- L'export contient les principales données personnelles Coaster World : profil, visites, rides, Road Trips, favoris, wishlist, progression, communauté, groupes, notifications et métadonnées de sessions.
- Sont volontairement exclus :
  - mot de passe ;
  - jetons de sécurité ;
  - payload des sessions ;
  - chemins physiques/hashes/métadonnées techniques des médias.
- Les chaînes UTF-8 historiques invalides sont substituées dans l'export plutôt que de provoquer une erreur 500.

## Suppression / anonymisation du compte

- Nouvelle suppression irréversible protégée par :
  - mot de passe actuel ;
  - saisie explicite de `DELETE`.
- Suppression des données privées/sociales personnelles, notamment :
  - rides ;
  - contenus communautaires ;
  - messages de groupe ;
  - meetups, Ride Together et challenges créés ;
  - présences/localisation ;
  - favoris/wishlist/progression ;
  - notifications/préférences ;
  - relations sociales ;
  - Road Trips, groupes et visites dont l'utilisateur est propriétaire.
- Suppression physique des fichiers de photos communautaires appartenant au compte lorsque ces fichiers existent encore.
- Les historiques système devant rester sont désolidarisés de l'identité supprimée.
- Le compte technique est conservé sous forme **définitivement anonymisée** afin de respecter les contraintes d'intégrité/références historiques du schéma existant.
- Un compte anonymisé passe au statut `deleted`, ne peut plus se connecter et ne peut pas être réactivé depuis l'administration.

## Durcissement des uploads image

- L'extension stockée est désormais dérivée du **MIME réellement détecté côté serveur**, jamais du nom de fichier envoyé par le navigateur.
- Conservation de la liste MIME autorisée et de la limite de taille existantes.
- Validation réelle des dimensions avec `getimagesize`.
- Rejet des images anormalement grandes :
  - largeur > 16 000 px ;
  - hauteur > 16 000 px ;
  - plus de 80 millions de pixels.
- Cette version ne prétend pas supprimer les métadonnées EXIF/GPS des fichiers : ce point reste séparé d'une validation de type/MIME.

## En-têtes HTTP de sécurité

Nouveau middleware global avec :

- `X-Content-Type-Options: nosniff` ;
- `X-Frame-Options: SAMEORIGIN` ;
- `Referrer-Policy: strict-origin-when-cross-origin` ;
- `Permissions-Policy` bloquant caméra/micro et autorisant la géolocalisation uniquement au même origin ;
- HSTS uniquement en production HTTPS.

La géolocalisation same-origin reste autorisée afin de ne pas casser les fonctions web existantes qui l'utilisent volontairement.

## Administration utilisateurs

- Nouveau filtre/statistique pour les comptes supprimés.
- Un compte anonymisé/supprimé est verrouillé côté administration : impossible de changer son statut ou son rôle pour le réactiver.

## Base de données

**Aucune nouvelle migration SQL.**

Les colonnes/tables nécessaires existaient déjà dans le projet : `email_verified_at`, `password_reset_tokens` et `sessions`.
