feat: support split-DNS, infobulles UI et corrections Windows

- Ajout du support complet du split-DNS pour Linux (systemd-resolved) et Windows (NRPT)
- Bouton de configuration des permissions ACL pour WireGuard sous Windows
- Suppression de tous les appels à sc.exe (remplacés par PowerShell + wireguard.exe)
- UAC gérée par wireguard.exe lui-même (pas par WGSecure)
- Infobulles ajoutées sur tous les champs de configuration principaux
- Correction du blocage du handshake lié au redémarrage de systemd-resolved
- Incrémentation de la version à 0.7.3

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
2026-09-03 07:20:13 +02:00
parent e747f2a1ea
commit 38b48fc428
9 changed files with 326 additions and 11 deletions
+23 -3
View File
@@ -61,9 +61,20 @@ def build_client_config(cfg: Config) -> str:
# `wg-quick up` en plein milieu de son exécution : l'interface est déjà
# créée, le trap de nettoyage laisse un état partiel. Mieux vaut monter le
# tunnel sans toucher au DNS système.
dns_value = (wg.get("dns") or "").strip()
if dns_value and dns_util.has_dns_backend():
lines.append(f"DNS = {dns_value}")
# Split-DNS : si configuré, on ne met pas de DNS dans la config WireGuard
# car les règles NRPT (Windows) ou systemd-resolved (Linux) géreront le routage.
split_dns_server = (wg.get("split_dns_server") or "").strip()
split_dns_domains = wg.get("split_dns_domains") or []
if split_dns_server and split_dns_domains and is_windows():
# Sous Windows avec split-DNS : pas de DNS dans la config, tout sera géré par NRPT
pass
else:
# Cas normal : utiliser le DNS principal
dns_value = (wg.get("dns") or "").strip()
if dns_value and dns_util.has_dns_backend():
lines.append(f"DNS = {dns_value}")
mtu = int(wg.get("mtu") or 0)
if mtu:
lines.append(f"MTU = {mtu}")
@@ -222,6 +233,8 @@ def force_cleanup(cfg: Config) -> list[str]:
if dns_util.interface_exists(name):
cmd = [wireguard_exe(), "/uninstalltunnelservice", name]
run_command(cmd, timeout=60)
# Nettoyer les règles split-DNS
dns_util.cleanup_split_dns(cfg)
actions += dns_util.cleanup(name)
return actions
@@ -237,6 +250,9 @@ def force_cleanup(cfg: Config) -> list[str]:
# ne disparaît pas avec le lien. C'est la cause du « plus d'internet ».
# Sans effet, et sans dialogue d'authentification, si rien ne traîne.
actions += dns_util.cleanup(name)
# Nettoyer les règles split-DNS
dns_util.cleanup_split_dns(cfg)
return actions
@@ -286,6 +302,8 @@ def connect(cfg: Config) -> tuple[bool, str]:
# démarrage effectif du tunnel est asynchrone. Tester l'état
# immédiatement conclurait « échec » sur un tunnel qui monte.
if code == 0 and _wait_connected(cfg, timeout=15):
# Configurer le split-DNS si un serveur dédié est défini
dns_util.setup_split_dns(cfg)
return True, "Tunnel WireGuard activé"
force_cleanup(cfg)
return False, err or f"Échec de l'installation du tunnel (code {code})"
@@ -302,6 +320,8 @@ def connect(cfg: Config) -> tuple[bool, str]:
# Passer le nom d'interface (pas le chemin) : AppArmor autorise /etc/wireguard/ seulement
code, _, err = run_privileged(["wg-quick", "up", name], timeout=90)
if code == 0:
# Configurer le split-DNS si un serveur dédié est défini
dns_util.setup_split_dns(cfg)
return True, "Tunnel WireGuard activé"
# Échec : wg-quick a pu s'arrêter après set_dns (ou être tué par le