From 47aec3093464be0f0929cfda1033f73d41330ffc Mon Sep 17 00:00:00 2001 From: r-zakarya <82443831+r-zakarya@users.noreply.github.com> Date: Mon, 20 Jul 2026 05:36:36 +0100 Subject: [PATCH] =?UTF-8?q?docs(audit):=20sync=206c=20status=20=E2=80=94?= =?UTF-8?q?=206c-1/2/3/9=20done,=206c-4=20moot,=20order=20table=20+=20verd?= =?UTF-8?q?ict?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- CODE_AUDIT.md | 48 ++++++++++++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/CODE_AUDIT.md b/CODE_AUDIT.md index 6764f22..213d722 100644 --- a/CODE_AUDIT.md +++ b/CODE_AUDIT.md @@ -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 `created_at`. -> ⚠️ **MAJ 2026-07-16 — « Tout est désormais UTC » était inexact.** La passe de -> substitution a couvert les sites d'écriture *d'entries/attachments*, mais a -> raté **`PM.Session.CreateSession`** (`FormatDateTime(..., IncHour(Now, 24))`, -> heure locale), qui reste à ce jour le dernier `FormatDateTime(..., Now)` du -> backend. Conséquence réelle sur les fuseaux négatifs. Détail + correctif en -> **§6c-2**. +> ⚠️ **MAJ 2026-07-16 — « Tout est désormais UTC » était inexact, puis corrigé.** +> La passe de substitution avait raté **`PM.Session.CreateSession`** +> (`FormatDateTime(..., IncHour(Now, 24))`, heure locale). ✅ **Corrigé en +> §6c-2** (`IncHour(NowUTC, 24)` + `Authenticate` sur `NowUTC`). C'était le +> dernier `FormatDateTime(..., Now)` du backend → §2.2 est maintenant réellement +> clos. ### 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) +> ⛔ **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)) 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 @@ -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é -| # | 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-2** | 🟠 | Trivial | 2 lignes. Ferme aussi le trou de §2.2. | -| **6c-3** | 🟡 | Faible | Signature inchangée, aucun call-site touché. | -| **6c-9** | ❓ | Trivial | 1 ligne, correcte dans tous les cas. | -| **6c-4** | 🟡 | Trivial | 4 lignes, garde local. | -| **6c-5** | 🔵 | Trivial | 5 lignes × 2 endroits. | -| **6c-6/7/8** | 🔵 | Faible | Cohérence / hygiène, aucune urgence. | +| **6c-1** | 🔴 | — | ✅ **Fait** — chemin migrate-kdf désactivé (option ultra) au lieu de réparé. | +| **6c-2** | 🟠 | — | ✅ **Fait** — `expires_at` en UTC. Ferme §2.2. | +| **6c-3** | 🟡 | — | ✅ **Fait** — CSRF lié à la session présentée (token_hash). | +| **6c-9** | ❓ | — | ✅ **Fait** — `ForeignKeys=On` explicite. | +| **6c-4** | 🟡 | — | ⛔ **Sans objet** — l'endpoint migrate-kdf est inatteignable depuis 6c-1. | +| **6c-5** | 🔵 | Trivial | À faire — 5 lignes × 2 endroits (fail-fast params Argon2). | +| **6c-6/7/8** | 🔵 | Faible | À faire — cohérence / hygiène, aucune urgence. | Rappel build : tout edit JS impose `delphi-backend\assets\BuildAssets.cmd` **puis** 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 verdict sur le **durcissement** — aucune injection, autorisation scopée partout, -routes non authentifiées correctes, crypto saine. Elle sort en revanche un -**🔴 de perte de données** resté invisible parce qu'il ne vit sur aucun des axes -suivis : `/migrate-kdf` change la clé AES mais ne re-chiffre qu'un blob sur huit -(**§6c-1**) — nouvelle instance de la classe §3.3, sur un call-site que la -checklist « Entry payload » du CLAUDE.md ne liste pas. Elle corrige aussi une -affirmation de **§2.2** (« Tout est désormais UTC ») : `PM.Session` avait été -raté par la substitution (**§6c-2**). À traiter avant de considérer §2.2 comme -clos. +routes non authentifiées correctes, crypto saine. Le **🔴 de perte de données** +(`/migrate-kdf` re-chiffrait 1 blob sur 8, **§6c-1**) est **traité** : chemin +désactivé (les 2 comptes étaient déjà à 600k, jamais mordu). Faits aussi : +expiry session UTC (**§6c-2**, clôt §2.2), CSRF lié à la bonne session +(**§6c-3**), `foreign_keys` explicite (**§6c-9**). Reste du confort/hygiène +(**§6c-5/6/7/8**), sans urgence.