Aller au contenu

PD-251 — Revue de Code

Resume

Critere Statut
Patterns NestJS ⚠️
Qualite code ⚠️
Gestion erreurs ⚠️
Maintenabilite ⚠️
Preuve contractuelle guards d'acces

Verdict : ❌ NON_CONFORME

Points positifs

  • Separation globale correcte controller/service/processor, avec DI NestJS propre et modules bien decoupes (src/modules/integrity/integrity.module.ts).
  • Bon usage de primitives crypto natives sur les comparaisons sensibles (timingSafeEqual) dans les composants critiques (src/modules/integrity/services/archive-chain-verifier.service.ts, src/modules/integrity/services/restoration.service.ts, src/modules/integrity/services/double-verification.service.ts).
  • Machine a etats explicite, avec transitions centralisees et blocage des etats terminaux (src/modules/integrity/services/archive-state-machine.service.ts).
  • Configuration contractuelle plutot robuste (bornes reject/clamp + validation somme des poids) (src/modules/integrity/config/integrity.config.ts).

Points a ameliorer

ID Description Fichier Gravite
R-01 Preuve contractuelle guard incomplete (MAJEUR) : les tests de rejet du guard n'assertent pas le code HTTP exact, ni l'absence de body, ni l'appel audit trail. Les assertions actuelles se limitent a rejects.toThrow(...). src/modules/integrity/guards/archive-access.guard.spec.ts MAJEUR
R-02 INV-251-06 non prouve en integration endpoint : le guard ArchiveAccessGuard n'est pas branche sur les endpoints publics documents attendus (ex. download). L'endpoint existant utilise OidcJwtAuthGuard + DocumentAccessGuard, pas ArchiveAccessGuard. src/modules/documents/download/download.controller.ts, src/modules/integrity/guards/archive-access.guard.ts MAJEUR
R-03 Migration contractuelle absente : le fichier de migration "CreateIntegritySchema" est vide, donc absence de preuve executable des triggers/index/DDL attendus (append-only, schema, contraintes). src/database/migrations/1740800000000-PD-251-CreateIntegritySchema.ts MAJEUR
R-04 INV-251-12 partiellement implemente : le JSON est signe HSM, mais le PDF n'est pas signe cryptographiquement (seulement generation + texte de signature). src/modules/integrity/services/incident-report.service.ts MAJEUR
R-05 INV-251-17 incomplet : restauration "reussie" cree un UUID et un lien, mais ne cree pas explicitement la nouvelle version archivee avec chaine probatoire complete ni ancrage blockchain verifiable. src/modules/integrity/services/restoration.service.ts MAJEUR
R-06 Risque d'erreur silencieuse run : en timeout/panne partielle des jobs de verification, l'orchestrateur agrège seulement les tentatives presentes (attemptNo=1) sans marquer explicitement le run en PARTIAL/FAILED sur manque de completude attendue. src/modules/integrity/processors/periodic-run.processor.ts MAJEUR
R-07 SEC-02 non visible cote API : absence de ThrottlerGuard explicite sur POST /integrity/runs (et endpoints restore/reconciliation non exposes ici), alors que le contrat mentionne un scope userId+IP. src/modules/integrity/controllers/integrity.controller.ts MAJEUR
R-08 Usage d'erreurs generiques Error plutot qu'exception metier structuree sur la config (ERR_INTEG_CONFIG_INVALID) : diagnostiquer est possible mais moins uniforme avec le reste du module. src/modules/integrity/config/integrity.config.ts MINEUR
R-09 IntegrityMetricsService garde des compteurs en memoire uniquement (reset au restart) : acceptable MVP, mais faible pour observabilite long-terme et multi-instance. src/modules/integrity/services/integrity-metrics.service.ts MINEUR
R-10 Checklist Decision Trace : le fichier de contracts ne contient pas de section architectural_decisions explicite, donc traçabilite de decisions limitee pour audit. docs/epics/legal-compliance/PD-251-verification-integrite-periodique/PD-251-code-contracts.yaml MINEUR

Axe obligatoire — preuve contractuelle des guards d'acces

Endpoints/decorateurs identifies

  • @UseGuards(JwtAuthGuard) au niveau classe du controller integrity (src/modules/integrity/controllers/integrity.controller.ts).
  • Guard d'acces metier ArchiveAccessGuard (src/modules/integrity/guards/archive-access.guard.ts), cense proteger les endpoints documents publics selon INV-251-06.

Verification des 3 assertions obligatoires

Endpoint/Guard HTTP status exact Body vide en rejet Audit trail appele Resultat
ArchiveAccessGuard (tests unitaires) ❌ (pas d'assertion HTTP, seulement exception) MAJEUR
Endpoints IntegrityController sous JwtAuthGuard ❌ (pas de test e2e guard reject) MAJEUR
Endpoints documents publics cibles INV-251-06 (download/export/content/preview) ❌ (integration non visible avec ArchiveAccessGuard) MAJEUR

Conclusion axe guards: preuve contractuelle incomplète.

Detail par fichier

src/modules/integrity/controllers/integrity.controller.ts

  • Controller reste relativement thin et lisible.
  • Pas de throttling explicite sur POST /integrity/runs (contrat SEC-02 attendu).
  • Couverture de tests uniquement unitaire/mocks, pas de preuve HTTP contractuelle des rejets guard.

src/modules/integrity/guards/archive-access.guard.ts

  • Bonne logique fail-closed DB et whitelist investigator/admin.
  • Manque de trace d'audit metier sur refus d'acces (journal/audit service).
  • Pas de preuve e2e que le rejet retourne 403 + body vide + audit appele.

src/modules/integrity/guards/archive-access.guard.spec.ts

  • Cas metiers utiles (SUSPECT/CORRUPTED, investigator, fail-closed).
  • Mais contrat PD-250 §10.1 non prouve : pas d'assertions HTTP ni audit trail.

src/modules/integrity/processors/periodic-run.processor.ts

  • Lock distribue correct (SET NX PX + release compare-and-delete).
  • Le mecanisme d'attente par polling peut finir sans completude totale et sans statut degrade explicite.

src/modules/integrity/services/incident-report.service.ts

  • Canonicalisation RFC 8785 + signature HSM du JSON conformes.
  • Signature PDF probatoire non implementee cryptographiquement (ecart INV-251-12/CA-251-09).

src/modules/integrity/services/restoration.service.ts

  • Retries/backoff et comparaison timing-safe bien implementes.
  • Invariant de versionnement probatoire complet (nouvelle version + chainage + ancrage) non completement demontre.

src/database/migrations/1740800000000-PD-251-CreateIntegritySchema.ts

  • Fichier vide : pas de preuve executable des objets SQL contractuels (schema/tables/index/triggers).

Recommandations prioritaires

  1. Ajouter des tests e2e contractuels guards (403 exact, body vide, audit trail appele) sur les endpoints reellement proteges.
  2. Brancher explicitement ArchiveAccessGuard sur les routes documents cibles INV-251-06 (download/export/content/preview).
  3. Implementer et versionner la migration DDL complete PD-251 (schema, contraintes, triggers append-only).
  4. Completer la signature PDF et la traçabilite probatoire de restauration (nouvelle version + ancrage verifiable).