fix(ui): la saisie du code ne dépend plus du champ Identifiant VPN (v0.8.4)

Le bouton et l'entrée de systray étaient conditionnés à un champ vide par
défaut depuis son introduction en v0.8.0 : un poste tenu en quarantaine par
le serveur n'affichait donc aucun moyen d'en sortir. La saisie ne dépend
plus que de l'état du tunnel ; la fenêtre demande l'identifiant quand il
manque et ne l'enregistre qu'une fois le serveur l'ayant accepté.

L'état « Non géré par le serveur » disparaît au passage : le client
l'affirmait à partir de sa seule configuration locale, sans rien vérifier.
« Non vérifié » est la vérité tant qu'aucun code n'a été validé.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-06 19:32:27 +02:00
co-authored by Claude Opus 5
parent 1e015b5a1f
commit 9083525634
8 changed files with 103 additions and 34 deletions
+9 -4
View File
@@ -52,23 +52,28 @@ def api_base_url(cfg: Config) -> str:
return f"http://{gateway}:8000"
def authenticate(cfg: Config, code: str) -> tuple[bool, str]:
def authenticate(cfg: Config, code: str, username: str = "") -> tuple[bool, str]:
"""Valide un code TOTP auprès du serveur et ouvre l'accès réseau.
Retourne (succès, message). Un échec n'est jamais silencieux : sans
cette validation le tunnel reste monté mais ne mène nulle part, et
l'utilisateur doit comprendre pourquoi plutôt que de constater un
réseau inexplicablement muet.
`username` permet de fournir l'identifiant à la volée, quand il n'est pas
encore en configuration : la fenêtre de saisie le demande alors avec le
code, plutôt que de renvoyer l'utilisateur vers le panneau Administrateur
au moment précis où il cherche à ouvrir son accès. Il est enregistré
une fois le serveur l'ayant accepté.
"""
base = api_base_url(cfg)
if not base:
return False, ("Adresse du serveur d'authentification inconnue. "
"Renseignez-la dans le panneau Administrateur.")
username = (cfg.wg.get("vpn_username") or "").strip()
username = (username or cfg.wg.get("vpn_username") or "").strip()
if not username:
return False, ("Aucun identifiant VPN configuré. Renseignez-le dans "
"le panneau Administrateur.")
return False, "Indiquez votre identifiant VPN."
payload = json.dumps({"username": username, "code": code}).encode("utf-8")
request = urllib.request.Request(