docs(audit): sync 6c status — 6c-1/2/3/9 done, 6c-4 moot, order table + verdict

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-07-20 05:36:36 +01:00
parent 2e7aebf651
commit 47aec30934
+26 -22
View File
@@ -182,12 +182,12 @@ stricte ; incohérence de **format** pré-existante (serveur `'yyyy-mm-dd
hh:nn:ss'` vs export JS `toISOString()` avec `T…Z`) sur les rares rows sans hh:nn:ss'` vs export JS `toISOString()` avec `T…Z`) sur les rares rows sans
`created_at`. `created_at`.
> ⚠️ **MAJ 2026-07-16 — « Tout est désormais UTC » était inexact.** La passe de > ⚠️ **MAJ 2026-07-16 — « Tout est désormais UTC » était inexact, puis corrigé.**
> substitution a couvert les sites d'écriture *d'entries/attachments*, mais a > La passe de substitution avait raté **`PM.Session.CreateSession`**
> raté **`PM.Session.CreateSession`** (`FormatDateTime(..., IncHour(Now, 24))`, > (`FormatDateTime(..., IncHour(Now, 24))`, heure locale). ✅ **Corrigé en
> heure locale), qui reste à ce jour le dernier `FormatDateTime(..., Now)` du > §6c-2** (`IncHour(NowUTC, 24)` + `Authenticate` sur `NowUTC`). C'était le
> backend. Conséquence réelle sur les fuseaux négatifs. Détail + correctif en > dernier `FormatDateTime(..., Now)` du backend → §2.2 est maintenant réellement
> **§6c-2**. > clos.
### 2.3 🟡 `catch (_) {}` silencieux en cascade ### 2.3 🟡 `catch (_) {}` silencieux en cascade
@@ -729,6 +729,12 @@ l'a déjà fait (et après **6c-2** les deux sont sur la même base de temps).
### 6c-4. 🟡 `/migrate-kdf` rétrograderait un compte `-v2` (verrouillage définitif) ### 6c-4. 🟡 `/migrate-kdf` rétrograderait un compte `-v2` (verrouillage définitif)
> ⛔ **SANS OBJET depuis 6c-1 (2026-07-16).** Le chemin migrate-kdf est
> désactivé côté client (fonction `runKdfMigration` supprimée, triggers
> retirés). L'endpoint reste inerte (rien ne l'appelle) → ce scénario de brick
> n'est plus atteignable. Garde à ré-ajouter uniquement si migrate-kdf revenait
> un jour.
Le garde d'idempotence ([Auth.pas:722](delphi-backend/Handlers/PM.Handler.Auth.pas:722)) Le garde d'idempotence ([Auth.pas:722](delphi-backend/Handlers/PM.Handler.Auth.pas:722))
ne court-circuite que si l'algo vaut `pbkdf2-sha256`. Un compte `argon2id-v2` ou ne court-circuite que si l'algo vaut `pbkdf2-sha256`. Un compte `argon2id-v2` ou
`pbkdf2-sha256-v2` **passe au travers** et se fait réécrire en `pbkdf2-sha256-v2` **passe au travers** et se fait réécrire en
@@ -938,15 +944,15 @@ Le second est correct **dans les deux cas** (no-op si c'était déjà le défaut
### Ordre d'application suggéré ### Ordre d'application suggéré
| # | Sévérité | Effort | Note | | # | Sévérité | Effort | État (2026-07-16) |
|---|---|---|---| |---|---|---|---|
| **6c-1** | 🔴 | Élevé | Le seul à pouvoir détruire des données. Faire l'extraction + les tests. | | **6c-1** | 🔴 | — | ✅ **Fait** — chemin migrate-kdf désactivé (option ultra) au lieu de réparé. |
| **6c-2** | 🟠 | Trivial | 2 lignes. Ferme aussi le trou de §2.2. | | **6c-2** | 🟠 | — | ✅ **Fait** — `expires_at` en UTC. Ferme §2.2. |
| **6c-3** | 🟡 | Faible | Signature inchangée, aucun call-site touché. | | **6c-3** | 🟡 | — | ✅ **Fait** — CSRF lié à la session présentée (token_hash). |
| **6c-9** | ❓ | Trivial | 1 ligne, correcte dans tous les cas. | | **6c-9** | ❓ | — | ✅ **Fait** — `ForeignKeys=On` explicite. |
| **6c-4** | 🟡 | Trivial | 4 lignes, garde local. | | **6c-4** | 🟡 | — | ⛔ **Sans objet** — l'endpoint migrate-kdf est inatteignable depuis 6c-1. |
| **6c-5** | 🔵 | Trivial | 5 lignes × 2 endroits. | | **6c-5** | 🔵 | Trivial | À faire — 5 lignes × 2 endroits (fail-fast params Argon2). |
| **6c-6/7/8** | 🔵 | Faible | Cohérence / hygiène, aucune urgence. | | **6c-6/7/8** | 🔵 | Faible | À faire — cohérence / hygiène, aucune urgence. |
Rappel build : tout edit JS impose `delphi-backend\assets\BuildAssets.cmd` **puis** Rappel build : tout edit JS impose `delphi-backend\assets\BuildAssets.cmd` **puis**
le build Delphi, sinon l'exe garde les anciens assets. le build Delphi, sinon l'exe garde les anciens assets.
@@ -971,11 +977,9 @@ fuit ».
**MAJ 2026-07-16** : la revue backend Delphi (**§6c**) ne remet pas en cause ce **MAJ 2026-07-16** : la revue backend Delphi (**§6c**) ne remet pas en cause ce
verdict sur le **durcissement** — aucune injection, autorisation scopée partout, verdict sur le **durcissement** — aucune injection, autorisation scopée partout,
routes non authentifiées correctes, crypto saine. Elle sort en revanche un routes non authentifiées correctes, crypto saine. Le **🔴 de perte de données**
**🔴 de perte de données** resté invisible parce qu'il ne vit sur aucun des axes (`/migrate-kdf` re-chiffrait 1 blob sur 8, **§6c-1**) est **traité** : chemin
suivis : `/migrate-kdf` change la clé AES mais ne re-chiffre qu'un blob sur huit désactivé (les 2 comptes étaient déjà à 600k, jamais mordu). Faits aussi :
(**§6c-1**) — nouvelle instance de la classe §3.3, sur un call-site que la expiry session UTC (**§6c-2**, clôt §2.2), CSRF lié à la bonne session
checklist « Entry payload » du CLAUDE.md ne liste pas. Elle corrige aussi une (**§6c-3**), `foreign_keys` explicite (**§6c-9**). Reste du confort/hygiène
affirmation de **§2.2** (« Tout est désormais UTC ») : `PM.Session` avait été (**§6c-5/6/7/8**), sans urgence.
raté par la substitution (**§6c-2**). À traiter avant de considérer §2.2 comme
clos.