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