+30
−3
apps/api/src/common/secret-box.spec.ts
0 → 100644
+49
−0
Loading
Le root peut désormais saisir serveur, port, TLS, identifiant, mot de passe et
adresse d'expédition depuis la console. Ce qui y est enregistré prime sur les
variables d'environnement : un serveur SMTP se corrige sans redéploiement. Sans
rien en base, le comportement est inchangé — aucun déploiement existant ne bouge.
L'arbitrage se fait EN BLOC, pas champ par champ. Mélanger les deux sources
produirait des combinaisons que personne n'a voulues : l'hôte de la base avec
l'identifiant de l'environnement. Dès qu'un hôte est enregistré, cette
configuration s'applique entièrement, et la console affiche laquelle est active.
Le mot de passe SMTP est un secret RÉUTILISABLE — il doit ouvrir la connexion —
donc il ne peut pas être haché comme un mot de passe de compte. Il est chiffré
(AES-256-GCM, clé dérivée par HKDF de SECRETS_KEY ou à défaut de JWT_SECRET, avec
un `info` distinct de la signature des jetons). Ce que ça protège : une copie de
la base ne suffit plus. Ce que ça ne protège pas : une compromission de l'hôte,
qui donne la clé avec le reste. C'est écrit tel quel dans SECURITY.md, sans laisser
croire à mieux.
Trois précautions qui n'allaient pas de soi :
- Le champ mot de passe étant toujours vide à l'affichage — on ne le relit jamais
— l'omettre du corps CONSERVE celui en place. Sans cette distinction, chaque
enregistrement l'aurait effacé. Effacer demande un geste explicite.
- Le journal d'audit consigne les NOMS des champs modifiés, jamais les valeurs.
- `MailerService.settings()` renvoie le mot de passe en clair : c'est nécessaire
pour le transport, et l'entête de la méthode le signale, parce que rien
n'empêcherait un futur appelant de la renvoyer dans une réponse HTTP.
Un envoi d'essai a été ajouté, et lui PROPAGE l'erreur SMTP contrairement à
`send` : tout l'objet d'un essai est de voir ce qui ne marche pas.
CORRECTION D'UNE ERREUR PRÉCÉDENTE. Le commit « Ouverture au public » affirmait
que le mot de passe ne transitait plus en clair lors d'une réinitialisation par un
administrateur. C'était faux : mon remplacement dans `users.service.ts` avait
échoué en silence et la méthode renvoyait toujours le mot de passe. C'est corrigé
ici, et l'interface distingue enfin les deux cas. J'ai revérifié les 20 autres
affirmations des quatre commits précédents contre le code : elles sont tenues.
À FAIRE côté exploitant : `.env.example` reste à compléter (fichier hors de mes
permissions, y compris en lecture). Le bloc à y coller est dans SECURITY.md.
Non vérifié : aucune chaîne Node dans cet environnement. Contrôles manuels :
équilibre des délimiteurs, balises JSX appariées, 664 clés i18n sans doublon,
aucun chemin par lequel le mot de passe rejoigne une réponse HTTP ou un journal.
Co-Authored-By:
Claude (RCA) <noreply@anthropic.com>