« Application error: a server-side exception has occurred », digest 2117999835,
sur /backend/adherents : l'action levait `Error("Un compte existe déjà avec cet
e-mail.")`. Next masque le message d'une exception de server action en
production et remplace la page entière par son écran d'erreur — un e-mail déjà
pris, cas de saisie parfaitement ordinaire, mettait donc la page par terre.
Ces échecs attendus sont désormais **renvoyés** (`ActionError`) au lieu d'être
jetés, dans `addMember`, `inviteAdmin` et `approveMembershipRequest` :
- Le formulaire affiche la vraie raison, l'e-mail en cause inclus.
- `AddMemberPanel` réinjecte la saisie : React vide un formulaire non contrôlé
après chaque action, il fallait sinon tout retaper.
- `InviteAdminForm` avait un rattrapage, mais devait deviner le motif faute de
message ; il affiche maintenant celui de l'action. Son `catch` ne couvre plus
que l'imprévu.
- `ApproveRequestForm` n'en avait aucun et tombait de la même façon.
Le `throw` reste réservé aux violations d'accès.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QXNXRC4j5VLfKvpyyisrnb
Audit de sécurité complet de l'application, puis correctifs du lot A validés :
- Seed : plus aucun compte de démonstration (mot de passe « changeme123 »)
sans SEED_DEMO=true. L'administrateur initial reçoit un mot de passe
aléatoire affiché une fois dans les journaux (ou SEED_ADMIN_PASSWORD) et
doit le changer à la première connexion. docker-compose ne fournit plus de
mot de passe par défaut.
- Mots de passe temporaires : la colonne users.temp_password (en clair) est
supprimée (migration 0011). Création d'adhérent, réinitialisation,
rattrapage des comptes manquants, approbation de demande et invitation
staff renvoient les identifiants, affichés une seule fois par le composant
OneTimeCredentials, sans redirection. L'invitation staff, qui ne
communiquait jamais le mot de passe, redevient utilisable et impose le
changement à la première connexion.
- Sessions JWT limitées à 7 jours (30 auparavant).
- En-têtes : Strict-Transport-Security ajouté, X-Powered-By supprimé.
- docker-compose : port Postgres publié sur 127.0.0.1 uniquement.
- Image Docker sur node:22 (Node 20 en fin de vie).
- Dépendances : next 15.5.25, pg 8.23, nanoid 3.3.18 (avis GHSA-2v37-7h3g-55p8).
Vérifié en local : tests, typage, build de production, migration + seed sur
un Postgres 16, et parcours navigateur complet (première connexion, changement
forcé, création / réinitialisation / invitation avec affichage unique, cookie
de session à 7 jours).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RAQsCp4nnZbwexCg7NDBHE