Skip to content

feat(ra-console): registre des opérateurs dans le navigateur (étape 6e) - #73

Open
PhilippeVienne wants to merge 3 commits into
feat/ra-console-frontend-revokefrom
feat/ra-console-frontend-operators
Open

PhilippeVienne wants to merge 3 commits into
feat/ra-console-frontend-revokefrom
feat/ra-console-frontend-operators

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Objet

docs/WEBUI.md §10 et §15 étape 6, tranche 6e : un administrateur gère le registre des opérateurs depuis la console. Base : #72 (feat/ra-console-frontend-revoke). Cette branche contient aussi la fusion de #69 (routes de registre, écrites en parallèle sur #67) : merger #69 avant cette PR ; au rebase sur dev, le commit de fusion disparaît. Deux conflits résolus à la fusion (ajouts en fin de action_challenge.rs et de docs/RA-CONSOLE.md, les deux côtés conservés).

  • API : GET /api/v1/operators — opérateurs, clés, clés en attente, en lecture seule sur les tables de ca-server. L'empreinte d'une clé en attente est recalculée avec oe_actions::key_fingerprint, la fonction même de ca-server : l'administrateur la compare hors bande avec celle que l'invité a reçue (§10) ; une console qui afficherait une autre empreinte ferait échouer la confirmation, pas passer une autre clé.
  • Écran des opérateurs :
    • invitation — le jeton s'affiche une seule fois, à transmettre par un canal distinct ; il n'est conservé nulle part ;
    • confirmation d'une clé en attente, après avoir déclaré (case à cocher) avoir comparé l'empreinte avec l'invité ;
    • révocation d'une clé (motif obligatoire) ;
    • changement de rôle (le rôle admin exige un second administrateur : AWAITING_QUORUM, co-signature en salle de quorum de feat(ra-console): révocation et salle de quorum dans le navigateur (étape 6c) #72).
    • Pour les non-administrateurs, ces boutons sont désactivés — affichage seulement, ca-server juge.

Limites

  • La confirmation de clé n'est pas couverte par Playwright : l'enregistrement d'une clé par l'authentificateur virtuel serait refusé par la liste blanche d'attestation. Elle l'est par le test Rust de feat(ra-console): gestion du registre des opérateurs depuis la console #69, complété ici (empreinte affichée = empreinte remise à l'invitée, clé en attente disparue après confirmation).
  • Libre-service sur ses propres clés (ajout/retrait avec réassertion) : non fait.

Vérifications

  • Rust : an_admin_invites_and_confirms_an_operator_through_the_console étendu (lecture du registre, empreinte identique, 401 sans session) ; les 14 tests de action_challenge.rs passent après la fusion.
  • Playwright 10/10 en local sur trois passes : invitation (jeton affiché une fois, frank apparaît), changement de rôle de dave (vérifié côté serveur), révocation de sa clé ; consultation seule pour un non-administrateur. Mutation : forcer l'affichage « administrateur » fait échouer ce dernier parcours.
  • cargo fmt --check, cargo clippy --workspace --all-targets -- -D warnings (1.97 et 1.98.1), cargo test --workspace avec PostgreSQL, cargo audit --ignore RUSTSEC-2023-0071, npm run typecheck : verts.

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

PhilippeVienne and others added 3 commits September 27, 2026 12:23
docs/WEBUI.md §5, §10 : ra-console relaie, sur le schéma des étapes 3 et
4 (challenge puis exécution, cible contrôlée par ca-server), les actions
de registre qu'oe_actions exécute déjà : invite_operator, confirm_key,
revoke_key, set_role.

- Routes (module registry_routes) : POST /api/v1/operators,
  POST /api/v1/credentials/{credential_id}/confirm et /revoke,
  POST /api/v1/operators/{name}/role. Le jeton d'invitation n'existe que
  dans result.invite_token de la réponse, jamais journalisé.
- oe_actions::Expect gagne credential_id et operator ; le contrôle de
  cible devient générique (une cible d'un autre type est refusée), avant
  toute consommation de la cérémonie. Une invitation n'a pas de cible.
- Élever au rôle admin ou changer celui d'un administrateur : deux
  administrateurs, co-signature par /api/v1/quorum/{id}/sign (la route
  de signature joint désormais la cible des actions de registre).
- Tests de bout en bout : invitation puis enregistrement puis
  confirmation, jeton absent du journal de la console ; révocation de
  clé et changement de rôle où seule la cible distingue ; élévation admin
  à deux. Cinq mutations tuées.

Co-authored-by: Claude <noreply@anthropic.com>
…' into feat/ra-console-frontend-operators

# Conflicts:
#	bin/ra-console/tests/action_challenge.rs
#	docs/RA-CONSOLE.md
docs/WEBUI.md §10, §15 étape 6 : un administrateur gère le registre
depuis la console, chaque écriture étant une action signée que ca-server
juge (routes de #69, fusionnées dans cette branche).

- `GET /api/v1/operators` : opérateurs, clés, clés en attente, en lecture
  seule ; l'empreinte d'une clé en attente est recalculée avec
  oe_actions::key_fingerprint, la fonction même de ca-server (test Rust :
  identique à celle remise à l'invitée).
- Écran des opérateurs : invitation (jeton affiché une seule fois),
  confirmation d'une clé en attente après déclaration de comparaison de
  l'empreinte hors bande, révocation de clé (motif obligatoire),
  changement de rôle (admin : second administrateur en salle de quorum).
  Boutons désactivés pour les non-administrateurs (affichage seulement).
- Harnais e2e : un administrateur et un opérateur de test. Parcours :
  invitation, changement de rôle, révocation de clé ; consultation seule
  pour un non-administrateur (mutation tuée).

Co-authored-by: Claude <noreply@anthropic.com>
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