feat: la page Santé montre la réponse complète des sondes, une console de lecture et une connexion de démonstration #180

Merged
Corentin merged 1 commit from feat/health-console into dev 2026-09-27 19:05:11 +02:00
Owner

Demande de l'auteur : dans la page Santé, voir le JSON renvoyé, et pouvoir interroger ce qui est derrière une authentification (se connecter ou prendre le jeton). Arbitrage retenu : lectures et connexion, aucune écriture depuis la page.

Ce qui change

  • Détail de chaque sonde : bouton « Détails », replié par défaut, qui montre le statut, les en-têtes utiles et le corps (JSON indenté).
  • Console d'appels en lecture : toute route GET de la carte, un champ par paramètre du chemin, appelée avec la session de la page. Toute autre méthode est refusée par le code qui construit la requête, et pas seulement par le sélecteur ; chaque paramètre est encodé. Un bouton « Ouvrir dans la console » sur chaque route GET de la carte.
  • Connexion de démonstration sur POST /admin/api/auth/login, envoyée avec credentials: 'omit' : la réponse et son csrf_token s'affichent (bouton de copie), sans remplacer le cookie de session de qui regarde la page. La page explique pourquoi le cookie de session est illisible (HttpOnly) et donne la séquence curl avec un fichier de cookies. Le mot de passe n'est ni conservé ni réaffiché, et la séquence curl porte des marqueurs à la place des identifiants.
  • Aucun fichier PHP serveur modifié hors la vue (le lien « Routes » du pied de page pointe désormais vers src/app/Core/routes.php).

Sécurité

  • Tout contenu de réponse passe par textContent. Trois tests injectent <img src=x onerror=...> dans une réponse simulée (sonde, console, connexion) et vérifient qu'aucun élément n'est créé.
  • Le seul nouvel usage de innerHTML (options du sélecteur) échappe l'étiquette, qui vient des données du serveur, et utilise un index numérique comme valeur.

Un défaut trouvé par le test navigateur, corrigé ici

Les panneaux de réponse portaient hidden, mais leur règle display: grid/flex l'emportait : ils s'affichaient vides avant tout appel. Les tests JavaScript, sur un faux DOM sans feuille de style, ne pouvaient pas le voir. Règle ciblée ajoutée, et le test navigateur vérifie désormais qu'ils sont fermés au chargement.

Preuves

  • Tests JavaScript : 428, 0 échec (399 avant, 29 ajoutés ou adaptés, écrits avant le code).
  • Nouveau test navigateur tests/e2e/admin-health-console.spec.js sur pile jetable : 5 sur 5. Il vérifie en particulier qu'après la connexion de démonstration avec le compte responsable, /admin/api/auth/me répond encore role_code: admin.
  • PHPUnit ciblé (pages HTML et santé) : 625 tests OK ; suite complète inchangée à 2352 tests (aucun PHP métier touché).
  • Audit d'accessibilité mesuré (tests/e2e/run-a11y.sh), rejoué après la correction : 19 écrans, 946 mesures de contraste, 85 combinaisons, 0 violation. Notes 04 et 06 et preuves/README.md mises à jour.
  • gitleaks v8.30.1 sur l'historique de la branche : aucune fuite.
  • Entrée de journal : docs/journal/2026-09-27--console-page-sante.md.
Demande de l'auteur : dans la page Santé, voir le JSON renvoyé, et pouvoir interroger ce qui est derrière une authentification (se connecter ou prendre le jeton). Arbitrage retenu : **lectures et connexion, aucune écriture depuis la page**. ## Ce qui change - **Détail de chaque sonde** : bouton « Détails », replié par défaut, qui montre le statut, les en-têtes utiles et le corps (JSON indenté). - **Console d'appels en lecture** : toute route `GET` de la carte, un champ par paramètre du chemin, appelée avec la session de la page. Toute autre méthode est refusée par le code qui construit la requête, et pas seulement par le sélecteur ; chaque paramètre est encodé. Un bouton « Ouvrir dans la console » sur chaque route `GET` de la carte. - **Connexion de démonstration** sur `POST /admin/api/auth/login`, envoyée avec `credentials: 'omit'` : la réponse et son `csrf_token` s'affichent (bouton de copie), sans remplacer le cookie de session de qui regarde la page. La page explique pourquoi le cookie de session est illisible (`HttpOnly`) et donne la séquence `curl` avec un fichier de cookies. Le mot de passe n'est ni conservé ni réaffiché, et la séquence `curl` porte des marqueurs à la place des identifiants. - Aucun fichier PHP serveur modifié hors la vue (le lien « Routes » du pied de page pointe désormais vers `src/app/Core/routes.php`). ## Sécurité - Tout contenu de réponse passe par `textContent`. Trois tests injectent `<img src=x onerror=...>` dans une réponse simulée (sonde, console, connexion) et vérifient qu'aucun élément n'est créé. - Le seul nouvel usage de `innerHTML` (options du sélecteur) échappe l'étiquette, qui vient des données du serveur, et utilise un index numérique comme valeur. ## Un défaut trouvé par le test navigateur, corrigé ici Les panneaux de réponse portaient `hidden`, mais leur règle `display: grid/flex` l'emportait : ils s'affichaient vides avant tout appel. Les tests JavaScript, sur un faux DOM sans feuille de style, ne pouvaient pas le voir. Règle ciblée ajoutée, et le test navigateur vérifie désormais qu'ils sont fermés au chargement. ## Preuves - Tests JavaScript : **428, 0 échec** (399 avant, 29 ajoutés ou adaptés, écrits avant le code). - Nouveau test navigateur `tests/e2e/admin-health-console.spec.js` sur pile jetable : **5 sur 5**. Il vérifie en particulier qu'après la connexion de démonstration avec le compte responsable, `/admin/api/auth/me` répond encore `role_code: admin`. - PHPUnit ciblé (pages HTML et santé) : 625 tests OK ; suite complète inchangée à 2352 tests (aucun PHP métier touché). - Audit d'accessibilité mesuré (`tests/e2e/run-a11y.sh`), rejoué après la correction : **19 écrans, 946 mesures de contraste, 85 combinaisons, 0 violation**. Notes 04 et 06 et `preuves/README.md` mises à jour. - gitleaks v8.30.1 sur l'historique de la branche : aucune fuite. - Entrée de journal : `docs/journal/2026-09-27--console-page-sante.md`.
feat: health page shows full probe responses, a read-only GET console and a demo JSON login
All checks were successful
CI / secret-scan (pull_request) Successful in 23s
CI / php-lint (pull_request) Successful in 27s
CI / static-tests (pull_request) Successful in 2m44s
CI / js-tests (pull_request) Successful in 42s
CI / shell-tests (pull_request) Successful in 7s
CI / secret-scan (push) Successful in 38s
CI / php-lint (push) Successful in 31s
CI / static-tests (push) Successful in 3m8s
CI / js-tests (push) Successful in 44s
CI / shell-tests (push) Successful in 7s
9366873edf
The health page now opens each probe's real response (status, useful headers,
indented body), offers a console over every GET route of the map with the
page's session (non-GET refused in code, path parameters encoded), and a
demo login on POST /admin/api/auth/login sent with credentials 'omit', so the
viewer's session cookie is not replaced; it shows the csrf_token with a copy
button and a curl sequence with a cookie jar. Response content is written with
textContent only (injection tests).

The browser spec admin-health-console found that the response panels showed
empty despite the hidden attribute (their display rule won); fixed with a
scoped rule. Accessibility campaign replayed: 19 screens, 946 contrast
measurements, 0 violation.
Corentin deleted branch feat/health-console 2026-09-27 19:05:11 +02:00
Sign in to join this conversation.
No reviewers
No labels
auto-merge
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
AcadeNice/corentin_wakdo!180
No description provided.