Skip to content

feat(kiosk): l'écran client ne peut plus quitter l'application, et le poste s'en aperçoit - #40

Merged
lostmind84 merged 1 commit into
mainfrom
feat/rester-dans-l-application
Aug 1, 2026
Merged

lostmind84 merged 1 commit into
mainfrom
feat/rester-dans-l-application

Conversation

@lostmind84

Copy link
Copy Markdown
Owner

Sur un poste en service : clic droit, « Rechercher sur le web », et la fenêtre du kiosque part sur un moteur de recherche. --kiosk ne donne ni barre d'adresse ni bouton retour. Les seize contrôles de doctor restaient verts — le processus tournait, /healthz répondait 200, la fenêtre était en plein écran — et le poste ne vendait rien.

Le menu contextuel est bloqué depuis L6 sur l'écran client (web/src/main.ts). Il reste deux surfaces volontairement ouvertes : l'administration, qui vit dans la même fenêtre et où « Copier » sert au téléphone (§14.1) ; la page de secours, un file:// sans script par conception (§15.2). Les fermer coûterait le dépannage. ADR-056 pose deux couches par-dessus.

1. Le kiosque pose les stratégies de son navigateur

URLBlocklist = *, URLAllowlist = l'adresse de ce poste et file://*, plus neuf valeurs — dont DefaultSearchProviderEnabled = 0, qui retire l'entrée du menu contextuel au lieu de la laisser cliquer puis refuser, et AllowFileSelectionDialogs = 0 pour Ctrl+O.

  • HKCU et jamais HKLM : le compte du poste est le seul à enfermer, un technicien connecté sur ce PC garde un navigateur qui marche.
  • C'est le kiosque qui écrit, pas install.ps1 : New-LocalUser crée un compte et pas un profil, donc au moment de l'installation il n'y a aucune ruche à charger. Écrites à chaque ouverture de session, les clés reviennent seules quand quelqu'un les efface.
  • file://* dans la liste blanche n'est pas décoratif : sans lui, la page de secours devient « Bloqué par votre administrateur » sur le seul écran dont c'est le métier d'être lisible quand rien ne marche.

2. Le superviseur surveille l'écran ATTACHÉ, pas le processus

GET /api/v1/screens dit combien d'écrans clients tiennent le flux d'état. Le superviseur le demande une fois par seconde sur l'écran client ; quinze secondes sans aucun écran valent une relance, non comptée comme un plantage — une reprise comptée comme une panne finirait par afficher ERR-KSK-02 sur un poste qui s'est réparé tout seul.

Écrit pour se tromper dans un seul sens : il ne se déclenche que sur un écran vu attaché pendant ce lancement — comptées depuis le démarrage du navigateur, ces quinze secondes tueraient le navigateur d'un poste lent, puis recommenceraient — et « le poste ne répond pas » ne vaut jamais « aucun écran ». Le prix est nommé : un portable qui lit /admin sur le réseau du magasin tient un flux et masque un kiosque parti. Un chien de garde qui n'aboie pas, jamais un qui mord un écran qui travaille.

3. Dix-septième contrôle de doctor

Il relit URLBlocklist dans la ruche du compte qui exécute le kiosque, jamais dans la sienne : le contrôle est tapé par quelqu'un connecté sous un autre nom, et lire son propre HKCU rendrait vert un poste grand ouvert. C'est mot pour mot la faute corrigée en #35 sur le principal de la tâche planifiée. Une ruche non montée — compte sans session ouverte — répond orange et jamais rouge : la couche 2 tient pendant ce temps, et un diagnostic ne monte pas le registre de quelqu'un d'autre. Nouveau code ERR-KSK-03.

La désinstallation retire les clés du compte qu'elle conserve par défaut : les laisser, c'est laisser un compte Windows dont le navigateur ne peut plus ouvrir qu'une adresse que plus rien ne sert.

Ce qui reste dehors, et qui est dit

La station Linux ne reçoit que la couche 2. Sa stratégie irait dans /etc/chromium/policies/managed, un fichier de root qu'install.sh écrirait — mais la liste blanche a besoin de l'adresse du poste, que le script devrait lire dans un JSON qu'il ne sait pas analyser. Sous cage il n'y a rien vers quoi s'échapper, et la surveillance de présence y ramène l'écran comme ailleurs. Couche manquante, pas couche impossible.

Vérification

gofmt -l .                        → (rien)
go vet ./...                      → (rien)
CGO_ENABLED=0 go test ./...       → 35 paquets, 1787 tests, 0 échec
CGO_ENABLED=1 go test ./... -race → 0 échec
go run ./tools/boundary           → les coupes vérifiables sont respectées
go run ./tools/deps               → 6 dépendances, déclarées à l'identique

Nouveaux tests : 5 sur la présence (relance, reconnexion qui ne tue pas, poste muet qui ne tue pas, navigateur qui n'a jamais attaché, reprise ≠ plantage), 8 sur les stratégies, 3 sur la route, 4 sur le contrôle 17, 2 sur la résolution du SID, 1 sur la désinstallation. Front non touché.

Sur le poste

Après la mise à jour du binaire, fermer puis rouvrir la session du poste : les stratégies se posent au lancement du kiosque. kiosk.log écrit alors « N stratégies de navigation posées sous … ».

Documentation : ADR-056, §15.2, §14.5, §15.4, SUIVI.md, TROUBLESHOOTING.md.

… poste s'en aperçoit

Sur un poste en service : clic droit, « Rechercher sur le web », et la fenêtre du
kiosque part sur un moteur de recherche. `--kiosk` ne donne ni barre d'adresse ni
bouton retour. Les seize contrôles de `doctor` restaient verts — le processus
tournait, /healthz répondait 200, la fenêtre était en plein écran — et le poste ne
vendait rien.

Le menu contextuel est bloqué depuis L6 sur l'écran client. Il reste deux surfaces
volontairement ouvertes : l'administration, qui vit dans la même fenêtre et où
« Copier » sert au téléphone, et la page de secours, un file:// sans script par
conception. ADR-056 pose deux couches par-dessus.

1. Le kiosque écrit les stratégies de son navigateur, sous SA ruche, avant de le
   lancer : URLBlocklist = *, l'adresse du poste et file://* rouvertes, plus neuf
   valeurs dont DefaultSearchProviderEnabled, qui retire l'entrée du menu au lieu
   de la refuser après le clic. HKCU et jamais HKLM : un technicien connecté sur
   ce PC garde un navigateur qui marche. C'est le kiosque et non install.ps1 parce
   qu'au moment de l'installation le compte existe et son profil n'existe pas —
   il n'y a aucune ruche à charger.

2. Le superviseur surveille l'écran ATTACHÉ et non le processus.
   GET /api/v1/screens dit combien d'écrans tiennent le flux d'état ; quinze
   secondes sans aucun écran valent une relance, non comptée comme un plantage.
   Elle ne se déclenche que sur un écran vu attaché : comptées depuis le
   lancement, ces quinze secondes tueraient le navigateur d'un poste lent, puis
   recommenceraient. « Le poste ne répond pas » ne vaut jamais « aucun écran ».

Dix-septième contrôle de doctor : il relit URLBlocklist dans la ruche du COMPTE DU
POSTE, jamais dans la sienne — lire son propre HKCU rendrait vert un poste grand
ouvert, la faute exacte corrigée sur le principal de la tâche planifiée (#35). Une
ruche non montée répond orange et jamais rouge : la couche 2 tient pendant ce temps.

La désinstallation retire les clés du compte qu'elle conserve par défaut.

La station Linux ne reçoit que la couche 2 : sa stratégie irait dans
/etc/chromium/policies/managed, et la liste blanche a besoin d'une adresse que
install.sh devrait lire dans un JSON qu'il ne sait pas analyser.
@lostmind84
lostmind84 merged commit 8046538 into main Aug 1, 2026
6 checks passed
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