fix(auth): le serveur reconnaît le poste à son adresse, plus à un identifiant
La fenêtre de saisie réclamait l'Identifiant VPN à chaque ouverture sur un poste neuf, et l'authentification échouait. Les deux symptômes n'en faisaient qu'un : l'identifiant n'était enregistré qu'en cas d'authentification réussie, or aucune n'aboutissait, donc il était redemandé sans fin. Il n'est plus transmis du tout. `POST /api/session` désigne désormais le compte par l'adresse source de la requête, comme `GET /api/session` le fait depuis la v0.8.6. Le serveur l'a toujours su ; le poste, lui, ne faisait que répéter un renseignement qu'il pouvait taper de travers. C'est aussi plus sûr : sur WireGuard l'adresse source est garantie par le routage par clé, alors qu'un identifiant en clair permettait d'ouvrir l'accès d'un compte depuis n'importe quelle adresse. Exige la v0.3.2 du serveur, qui accepte les deux formes. Le champ disparaît de la fenêtre de saisie. Celui du panneau Administrateur reste, purement indicatif désormais, avec une infobulle qui le dit. Trois décisions d'interface se fondaient sur « un identifiant est-il configuré ? », une question que le poste ne pouvait pas trancher : proposer ou non la saisie automatique, le libellé de la ligne Accès distant, et l'aspect du bouton. Elles suivent maintenant la réponse du serveur, qui distingue « aucun pair à cette adresse » (401, nouveau) de « accès fermé, code attendu » (403). Un poste non enrôlé n'est donc plus harcelé pour un code qui n'ouvrirait rien, et la ligne affiche « Non géré par le serveur » au lieu de le supposer. Corrige aussi une régression de la v0.9.0 : `tunnel_gateway` retenait la route par défaut des IPs autorisées comme réseau de tunnel, et rendait donc 0.0.0.1 comme passerelle en tunnel intégral — sondage et validation partaient vers une adresse inexistante. Elle ne retient plus que les réseaux contenant l'adresse du client, préfère le plus spécifique, et se replie sur /24 (ou /64) faute de candidat. Le diagnostic « Pair joignable dans le tunnel » en bénéficie aussi. Enfin, `authenticate` distingue le silence du réseau d'un refus du serveur, comme `session_status` le faisait déjà. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
b3c0515244
commit
023ec81e03
@@ -45,7 +45,6 @@ class AccessCodeDialog(QDialog):
|
||||
self._worker: ValueWorker | None = None
|
||||
self._message = ""
|
||||
self._access_until = None
|
||||
self._username = ""
|
||||
self.setWindowTitle("WGSecure — Code d'accès")
|
||||
self.setFixedWidth(360)
|
||||
self.setModal(True)
|
||||
@@ -88,19 +87,11 @@ class AccessCodeDialog(QDialog):
|
||||
sep.setStyleSheet(f"color: {theme.BORDER_SOFT};")
|
||||
layout.addWidget(sep)
|
||||
|
||||
# L'identifiant n'est demandé que s'il manque encore. Le renvoyer au
|
||||
# panneau Administrateur à cet instant précis — tunnel monté, accès
|
||||
# fermé, code en main — était un cul-de-sac : il est saisi ici, puis
|
||||
# enregistré dès que le serveur l'a reconnu.
|
||||
self._user_input: QLineEdit | None = None
|
||||
if not (self._cfg.wg.get("vpn_username") or "").strip():
|
||||
self._user_input = QLineEdit()
|
||||
self._user_input.setPlaceholderText("Identifiant VPN (ex. TestB)")
|
||||
self._user_input.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
self._user_input.setStyleSheet(self._input_css(theme.BORDER_SOFT))
|
||||
self._user_input.returnPressed.connect(self._submit)
|
||||
layout.addWidget(self._user_input)
|
||||
|
||||
# Aucun identifiant n'est demandé : le serveur reconnaît le poste à
|
||||
# l'IP source de son tunnel. Ce champ existait parce que le serveur
|
||||
# exigeait l'identifiant, et il n'apportait que des ennuis — une
|
||||
# faute de frappe faisait refuser un code valide, et un poste n'ayant
|
||||
# jamais réussi à s'authentifier se le voyait redemander sans fin.
|
||||
self._code_input = QLineEdit()
|
||||
self._code_input.setPlaceholderText("000 000")
|
||||
self._code_input.setMaxLength(7)
|
||||
@@ -188,18 +179,10 @@ class AccessCodeDialog(QDialog):
|
||||
self._fail("Entrez exactement 6 chiffres.")
|
||||
return
|
||||
|
||||
self._username = ""
|
||||
if self._user_input is not None:
|
||||
self._username = self._user_input.text().strip()
|
||||
if not self._username:
|
||||
self._error_label.setText("Indiquez votre identifiant VPN.")
|
||||
self._user_input.setStyleSheet(self._input_css(theme.FAIL_TEXT))
|
||||
return
|
||||
|
||||
self._error_label.setText("")
|
||||
self._set_busy(True)
|
||||
self._worker = ValueWorker(vpn_session.authenticate, self._cfg, raw,
|
||||
self._username, parent=self)
|
||||
parent=self)
|
||||
self._worker.done.connect(self._on_reply)
|
||||
self._worker.finished.connect(self._worker.deleteLater)
|
||||
self._worker.start()
|
||||
@@ -210,15 +193,10 @@ class AccessCodeDialog(QDialog):
|
||||
# `ValueWorker` absorbe une exception imprévue en rendant None :
|
||||
# dire alors que l'échec vient d'ici, et non d'un refus serveur.
|
||||
result = vpn_session.AuthResult(
|
||||
False, "Échec inattendu de l'authentification.")
|
||||
False, "Échec inattendu de l'authentification.", None, False)
|
||||
self._message = result.message
|
||||
self._access_until = result.access_until
|
||||
if result.ok:
|
||||
# Enregistré seulement maintenant : un identifiant que le serveur
|
||||
# a refusé n'a rien à faire dans la configuration.
|
||||
if self._username:
|
||||
self._cfg.set("wg", "vpn_username", self._username)
|
||||
self._cfg.save()
|
||||
self.accept()
|
||||
return
|
||||
self._set_busy(False)
|
||||
@@ -233,8 +211,6 @@ class AccessCodeDialog(QDialog):
|
||||
self._btn_ok.setEnabled(not busy)
|
||||
self._btn_ok.setText("Vérification…" if busy else "Valider")
|
||||
self._code_input.setEnabled(not busy)
|
||||
if self._user_input is not None:
|
||||
self._user_input.setEnabled(not busy)
|
||||
# « Plus tard » est neutralisé le temps de la requête : la fermeture
|
||||
# rendait la main à l'appelant sur un refus, alors que le serveur
|
||||
# pouvait encore répondre par une acceptation. Celle-ci arrivait après
|
||||
|
||||
Reference in New Issue
Block a user