DANKE HMI // SOURCE // UNIVERSAL CORE 1.7.0
OPEN
THE HOOD
Architecture du projet et correctif précis de l'appairage en 1.7.0.
01 // ARCHITECTURE
CORE +
PLUGINS.
DANKE-HMI-MOBILE-DECK-1.7.0
├── install.sh install · update · repair (une seule commande)
└── app
├── bin/ danke-hmi-open · -repair · -uninstall · -pair · -doctor
├── server/ FastAPI + websocket
│ ├── session_env retrouve Wayland / Hyprland / D-Bus
│ ├── actions chaînes de candidats + diagnostic
│ ├── keys clavier virtuel, liste blanche stricte
│ ├── input_bridge souris + clavier via /dev/uinput
│ └── auth code rotatif · verrouillage · jetons
├── web/
│ ├── index.html le Mobile Deck (téléphone)
│ └── setup.html la fenêtre DANKE HMI (PC, locale uniquement)
└── PLUGINS Docker · Home Assistant · n8n · Ollama · …02 // 1.7.0 FIX
STALE TOKEN.
SILENT LOOP.
Deux bugs empilés qui donnaient exactement « je suis sur la page mais le code ne marche pas ».
EXACT COMPONENT
ws_endpoint · server/main.py
# avant : fermé AVANT d'accepter = refus HTTP 403.
# Le navigateur ne voit que 1006, le téléphone ne sait
# jamais que son jeton est mort et se reconnecte à l'infini.
if not valid_token(token):
await ws.close(code=4401); return
await ws.accept()
# après : accepter, puis fermer avec 4401.
# Le téléphone efface le jeton et revient à l'écran d'appairage.
await ws.accept()
if not valid_token(token):
await ws.close(code=4401); returnEXACT COMPONENT
boot() · web/app.js
// avant : un QR scanné était ignoré si un vieux jeton existait
if (code && /^\d{6}$/.test(code) && !token()) { pair(code) }
// après : un QR scanné gagne toujours
if (code && /^\d{6}$/.test(code)) {
localStorage.removeItem("danke_hmi_token"); pair(code)
}03 // SECURITY
WHITELIST
EVERYTHING.
FENÊTRE PC
/setup ne répond qu'au PC lui-même : connexion locale + en-tête Host local (contre le DNS rebinding) + en-tête spécial sur les écritures (contre les requêtes d'autres sites).
TÉLÉPHONE
Chaque action est une entrée de liste blanche côté serveur. Pas de ligne de commande, pas de chemin, pas de touche libre.
APPAIRAGE
Code à 6 chiffres, comparé en temps constant, changé après chaque appairage. 5 erreurs = 60 s de pause.
INSTALLEUR
Archive vérifiée par SHA-256, pare-feu ouvert au réseau local seulement, refuse de tourner en root.