Skip to content

feat(ra-console): GET /api/v1/audit/search, lecture et vérification des deux journaux - #78

Merged
PhilippeVienne merged 1 commit into
devfrom
feat/ra-console-audit-search
Sep 30, 2026
Merged

PhilippeVienne merged 1 commit into
devfrom
feat/ra-console-audit-search

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Remplace #51, fermée par GitHub à la suppression de sa branche de base (pile) après la fusion de #50. Même contenu, rebasé sur dev ; base : dev.

Objet

Étape 2b-D du plan WEBUI (docs/WEBUI.md §7, §15), dernière lettre du
découpage A→D : GET /api/v1/audit/search relit et vérifie intégralement
les deux journaux chaînés — celui de ca-server (fait foi pour la PKI) et
celui de ra-console — depuis le stockage S3 commun, avant de répondre.
Jamais un index qui pourrait avoir divergé des fichiers source.

Contrat déjà fixé par docs/WEBUI.md §7 (pas de nouvelle décision de
conception à valider) : filtres serial/from/to, réponse
{chain_verified, entries_checked, results}, chaque résultat marqué de son
journal d'origine, entries_checked sur l'intégralité relue.

Empilée sur #50 (2b-C) : réutilise le champ S3Config qu'elle étend
(OPENEIDAS_S3_CA_KEY, nouvelle variable, défaut ca-server/audit.log) et
AppState.s3. Base : feat/ra-console-audit-s3 (#50), pas dev.

Deux décisions explicites de cette tranche :

  • Chaîne rompue → blocage total (chain_verified: false, results
    vide), même si l'autre chaîne est saine : personne ne doit pouvoir
    l'ignorer par inattention (cohérent avec §7).
  • S3 non configuré → 503 : ra-console n'a aucun accès local au
    journal de ca-server, la route refuse plutôt que de ne vérifier qu'une
    moitié des deux chaînes.
  • Une panne S3 (503, indisponibilité) est distinguée d'une chaîne rompue
    (200, chain_verified: false) : l'appelant ne doit jamais confondre
    « je n'ai pas pu vérifier » avec « j'ai vérifié, et c'est rompu ».

Vérifications

  • cargo fmt --check : silencieux.
  • cargo clippy --workspace --all-targets -- -D warnings : silencieux, sur
    toolchain 1.97 (local) et 1.98.1 (CI).
  • cargo test -p ra-console (avec OE_CASTORE_TEST_DSN) : tout au vert,
    tests/no_pkcs11.rs compris.
  • cargo test --workspace : tout au vert.
  • cargo audit --ignore RUSTSEC-2023-0071 : aucune vulnérabilité.
  • bin/ra-console/tests/audit_search.rs (nouveau), contre un serveur HTTP
    qui se comporte comme un service S3-compatible (pas d'image MinIO
    accessible dans cet environnement) : fusion et tri des deux journaux,
    filtre par série, panne S3 distinguée d'une chaîne rompue, et surtout —
    une chaîne rompue bloque tout l'affichage.
  • Mutation : en retirant le blocage sur chaîne rompue, le test dédié échoue
    bien ; restauré ensuite.

Revue humaine obligatoire

Voir PROVENANCE.md. Chaque case est cochée par le
contributeur humain qui valide la PR, après l'avoir fait lui-même.

  • Revue d'architecture validée par l'humain
  • Code relu et tests unitaires/intégration vérifiés localement
  • Absence de dépendances tierces incompatibles avec la double licence EUPL-1.2 / AGPL-3.0 (make licenses)
  • Validation de l'apport intellectuel et de la paternité humaine sur la modification

Assistance par IA

  • Cette PR a été produite avec l'assistance de Claude Code : les commits concernés portent la remorque Co-authored-by: Claude <noreply@anthropic.com>, auteur et committer restent humains, et scripts/provenance.py archive a été lancé
  • Cette PR a été écrite sans assistance par IA

…es deux journaux

Étape 2b-D du plan WEBUI (docs/WEBUI.md §7, §15) : la route relit et vérifie
intégralement les deux journaux chaînés (celui de ca-server, qui fait foi
pour la PKI, et celui de ra-console) depuis le stockage S3 commun, avant de
répondre — jamais un index qui pourrait avoir divergé des fichiers source.

Contrat déjà fixé par docs/WEBUI.md §7 : filtres serial/from/to, réponse
{chain_verified, entries_checked, results}, chaque résultat marqué de son
journal d'origine. entries_checked porte sur l'intégralité de ce qui a été
relu, pas seulement sur les entrées retournées.

Décision explicite pour cette tranche : un journal rompu ou illisible
(l'un des deux, ou les deux) bloque tout l'affichage (chain_verified: false,
results vide) plutôt que de montrer une moitié de la vérité à côté d'une
alerte. Sans stockage S3 configuré, la route refuse (503) : ra-console n'a
aucun accès local au journal de ca-server, seul S3 les met en commun
(nouvelle variable OPENEIDAS_S3_CA_KEY, même bucket que OPENEIDAS_S3_* de
2b-C, clé distincte par défaut "ca-server/audit.log").

Une panne S3 (indisponibilité) et une chaîne rompue (constat d'intégrité)
sont deux échecs distincts : la première répond 503, la seconde répond 200
avec chain_verified: false — l'appelant ne doit jamais confondre « je n'ai
pas pu vérifier » avec « j'ai vérifié, et c'est rompu ».

- audit_search.rs (nouveau module) : search() fait tout le travail, testable
  sans HTTP ni PostgreSQL.
- tests/audit_search.rs : contre un serveur HTTP qui se comporte comme un
  service S3-compatible (MinIO indisponible dans cet environnement) —
  fusion et tri des deux journaux, filtre par série, chaîne rompue bloque
  tout (testé par mutation : sans le blocage, ce test échoue), panne S3
  distinguée d'une chaîne rompue.

Co-authored-by: Claude <noreply@anthropic.com>
@PhilippeVienne
PhilippeVienne force-pushed the feat/ra-console-audit-search branch from d3edde8 to 36620e9 Compare September 30, 2026 19:31
@PhilippeVienne

Copy link
Copy Markdown
Contributor Author

Rebasée sur dev après le merge de #91 (3a0b4b5) ; la branche a été repoussée et la PR rouverte, pas de nouvelle PR nécessaire.

@PhilippeVienne
PhilippeVienne merged commit f636e6d into dev Sep 30, 2026
16 checks passed
@PhilippeVienne
PhilippeVienne deleted the feat/ra-console-audit-search branch September 30, 2026 19:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant