BAGSHITTERCORP™ // DANKE HMI
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); return
EXACT 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.