feat(ra-console): exécution des décisions signées approve/reject (étape 3b) - #65
Open
PhilippeVienne wants to merge 1 commit into
Open
PhilippeVienne wants to merge 1 commit into
PhilippeVienne wants to merge 1 commit into
Conversation
…pe 3b)
docs/WEBUI.md §15 étape 3, §4 étapes 5 à 7 : `POST
/api/v1/requests/{id}/approve|reject` relaie à ca-server
(`/internal/v1/actions`) l'identifiant du challenge et l'assertion brute,
jamais de corps : ca-server exécute celui qu'il a figé.
- Lien assertion ↔ demande contrôlé par ca-server (décision de
l'utilisateur) : la console joint `expect` (action et demande du
chemin) ; oe_actions::Service::execute_expecting le compare au corps
figé avant de retirer l'état de la cérémonie, et refuse (409
action_mismatch) s'il diffère. Une signature obtenue pour une demande
ne décide jamais d'une autre, ni l'inverse de ce qui a été signé, et
l'assertion reste utilisable sur la bonne route. `expect` ne peut que
restreindre ; `execute` sans attente est inchangé.
- Réponse de la forme du §5 : `decided_by` est l'opérateur dont la clé a
signé, lu dans le registre de ca-server.
- Journal de la console : ra.action_relayed.
- Tests de bout en bout (approbation, rejet, rejeu, mauvaise cible,
corps non relayés) et unitaire d'Expect ; trois mutations tuées
(contrôle retiré, contrôle après consommation, expect non envoyé).
Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Sep 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Objet
docs/WEBUI.md§15 étape 3, tranche 3b (après 3a, #64). Schéma §4, étapes 5 à 7. Empilée sur #64 (feat/ra-console-action-challenge, tête37958f4à l'ouverture) : merger #64 d'abord, puisgit rebase --onto origin/dev 37958f4et rebrancher surdev.POST /api/v1/requests/{id}/approveet/reject(session obligatoire) :{"challenge_id", "assertion"}. La console relaie àca-server(/internal/v1/actions) l'identifiant du challenge et l'assertion brute — jamais de corps :ca-serverexécute celui qu'il a figé.ca-server(décision de l'utilisateur, conforme au §5) : la console jointexpect(action et demande du chemin) ;oe_actions::Service::execute_expectingle compare au corps figé avant de retirer l'état de la cérémonie, et refuse (409 action_mismatch) s'il diffère. Une signature obtenue pour une demande ne décide jamais d'une autre, ni l'inverse de ce qui a été signé — et l'assertion reste utilisable sur la bonne route.expectne peut que restreindre ;executesans attente (appelants existants) est inchangé./internal/v1/actionsrefuse toujours tout champbody(deny_unknown_fields).{"transaction_id", "state": "APPROVED"|"REJECTED", "decided_by", "action_id"};decided_byest l'opérateur dont la clé a signé, lu dans le registre deca-server, pas celui de la session.ra.action_relayed(opérateur de la session, action, demande,action_id, signataire selonca-server, statut).docs/RA-CONSOLE.md: la route, et ce qui reste (étape 4 et suivantes).Avec #64, l'étape 3 est complète côté API : un opérateur
ra_operateurpeut approuver ou rejeter une demande par sa clé FIDO2, de bout en bout, sans le CLI. Le frontend (étape 6) reste à faire.Vérifications
bin/ra-console/tests/action_challenge.rs, contre le vrai service d'actions deca-serveret PostgreSQL : approbation et rejet de bout en bout (decided_by= signataire, état en base) ; rejeu refusé (already_used) ; assertion présentée pour une autre demande ou pour l'autre décision refusée (action_mismatch), rien de décidé, puis la même assertion acceptée sur la bonne route ; corps non relayés (UUID invalide, assertion absente, corps d'action glissé, non-JSON, sans session). Test unitaire d'Expect.expectretiré ; contrôle déplacé après la consommation de la cérémonie (l'assertion devient inutilisable sur la bonne route) ;expectnon envoyé par la console.cargo fmt --check,cargo clippy --workspace --all-targets -- -D warnings(1.97 et 1.98.1),cargo test --workspaceavec PostgreSQL,cargo audit --ignore RUSTSEC-2023-0071: 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.
make licenses)Assistance par IA
Co-authored-by: Claude <noreply@anthropic.com>, auteur et committer restent humains, etscripts/provenance.py archivea été lancé