Skip to content

feat(ra-console): frontend, socle (étape 6a) - #70

Open
PhilippeVienne wants to merge 1 commit into
feat/ra-console-quorumfrom
feat/ra-console-frontend
Open

PhilippeVienne wants to merge 1 commit into
feat/ra-console-quorumfrom
feat/ra-console-frontend

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Objet

docs/WEBUI.md §15 étape 6 (frontend), tranche 6a (socle), selon docs/UI-UX.md. Choix de l'utilisateur : TypeScript + esbuild, Playwright en CI. Empilée sur #67 (feat/ra-console-quorum, tête 4525c07), comme #68 (déploiement) et #69 (registre), qui lui sont parallèles.

Ce qui est servi

  • Assets embarqués dans le binaire (include_bytes!, bin/ra-console/src/web.rs) depuis bin/ra-console/web/dist/, versionné : compiler ra-console n'exige pas Node, et l'image n'embarque ni Node ni node_modules. La CI vérifie que dist/ correspond aux sources (build reproductible, vérifié).
  • En-têtes de sécurité sur toutes les réponses, API comprise (UI-UX §6.3) : la CSP d'UI-UX à l'identique (aucun unsafe-*, rien hors origine, frame-ancestors 'none'), X-Frame-Options: DENY, nosniff, Referrer-Policy: no-referrer, COOP, Permissions-Policy, Cache-Control: no-store. http::app compose l'API, le frontend et ces en-têtes ; main et le harnais e2e l'utilisent.
  • Écrans : bannière d'environnement sur tous les écrans (OPENEIDAS_RA_ENVIRONMENT, production/staging/demo ; « ENVIRONNEMENT NON DÉCLARÉ » à défaut, via GET /api/v1/console sans session) ; connexion par nom et clé FIDO2 ; poste de travail (barre de sécurité avec identité et rôle relus sur le serveur, compteurs des files) ; déconnexion ; verrouillage après 15 min d'inactivité (avertissement à 14), session révoquée côté serveur. Aucun innerHTML : tout contenu de l'API est inséré comme texte.
  • Styles tirés des design tokens d'UI-UX §4 (thème sombre, rôles, focus). Les maquettes de docs/mockups/ (antigravity) ne sont ni modifiées ni copiées : seules leurs valeurs de tokens sont reprises.

Tests

  • bin/ra-console/tests/web.rs (cargo, sans navigateur) : en-têtes sur toutes les réponses, types et contenu des assets, environnement annoncé.
  • Playwright (bin/ra-console/web/e2e/) contre une console réelle (examples/e2e_console.rs : http::app sur PostgreSQL). L'attestation de l'authentificateur virtuel serait refusée par la liste blanche : l'opérateur est donc enregistré avec le SoftToken des tests Rust, et sa clé est confiée à l'authentificateur WebAuthn virtuel de Chromium (CDP WebAuthn.addCredential). Parcours : en-têtes et absence de script/style en ligne ; connexion FIDO2 → poste → déconnexion (session réellement révoquée, aucune erreur ni violation de CSP dans la page) ; verrouillage à 15 min (horloge simulée).
  • Mutation : sans la couche d'en-têtes, every_response_carries_the_security_headers échoue (et le test Playwright des en-têtes aussi).
  • Job CI frontend : npm ci, typage strict (navigateur et Node séparés), dist/ conforme, Chromium de Playwright, parcours e2e ; rapport en artefact en cas d'échec.

Limites et suites

Vérifications

  • npm run typecheck, npm run build (reproductible), Playwright 3/3 en local sur trois passes consécutives (Chrome installé, PW_CHANNEL=chrome).
  • 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, cargo deny check licenses : verts.
  • À confirmer par la CI : le job frontend (installation de Chromium par Playwright sur le runner).

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

docs/WEBUI.md §15 étape 6, docs/UI-UX.md : la console sert son interface,
en TypeScript compilé par esbuild (choix de l'utilisateur), sans
framework ni dépendance d'exécution.

- Assets embarqués dans le binaire (include_bytes!, src/web.rs) depuis
  web/dist, versionné : compiler ra-console n'exige pas Node.
- En-têtes de sécurité sur toutes les réponses, API comprise (UI-UX
  §6.3) : CSP stricte sans unsafe-inline ni CDN, frame-ancestors 'none',
  X-Frame-Options DENY, nosniff, Referrer-Policy, Cache-Control no-store.
  `http::app` compose l'API, le frontend et ces en-têtes.
- Bannière d'environnement (OPENEIDAS_RA_ENVIRONMENT, « non déclaré » à
  défaut), connexion par nom et clé FIDO2, poste de travail (identité et
  rôle relus sur le serveur, compteurs des files), déconnexion,
  verrouillage après 15 min d'inactivité (avertissement à 14). Aucun
  innerHTML : le contenu de l'API est inséré en texte.
- Tests : tests/web.rs (en-têtes et assets, sans navigateur) ; Playwright
  contre une console réelle (examples/e2e_console.rs, PostgreSQL), clé du
  SoftToken confiée à l'authentificateur WebAuthn virtuel de Chromium.
- CI : job frontend (typage strict, dist/ conforme aux sources, parcours
  de bout en bout). Dépendances npm de développement seulement (esbuild
  MIT, TypeScript et Playwright Apache-2.0), jamais dans l'image.

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