chore(release): v0.7.12

Ajoute wgsecure-helper, un service Windows privilégié (LocalSystem)
qui installe/désinstalle le tunnel et pose/retire les règles NRPT
sans invite d'authentification répétée. L'ACL du service WireGuard
(v0.7.6) ne délègue que démarrer/arrêter un tunnel déjà installé,
jamais le créer/supprimer, ce que WGSecure fait pourtant à chaque
connexion/déconnexion — d'où les prompts qui persistaient malgré
v0.7.6-v0.7.11. Corrige aussi le handshake, qui échouait pour la même
raison (wg show sans élévation complète).

Purement additif : l'app retombe sur son chemin élevé existant si le
service est absent (composant optionnel dans l'installeur).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 18:15:08 +02:00
co-authored by Claude Sonnet 5
parent 9dca066239
commit 7beb6deb7a
11 changed files with 546 additions and 16 deletions
+31 -8
View File
@@ -24,6 +24,7 @@ import os
import shutil
import socket
from app.utils.helper_ipc import call_helper
from app.utils.platform_utils import is_windows, run_command, run_privileged
# Domaine utilisé pour vérifier que la résolution DNS fonctionne encore.
@@ -282,22 +283,35 @@ def setup_split_dns(cfg: Config) -> tuple[bool, str]:
if is_windows():
rule_name = f"{_SPLIT_DNS_RULE_PREFIX}{name}"
# Délègue à wgsecure-helper (service SYSTEM) s'il est installé : la
# règle NRPT est posée sans invite d'authentification. `None` =
# service absent/indisponible, on retombe sur le chemin élevé.
resp = call_helper({
"cmd": "set_split_dns", "server": server,
"domains": domains, "rule_name": rule_name,
})
if resp is not None:
if resp.get("ok"):
return True, f"Règle split-DNS (NRPT) configurée pour {server} (domaines: {', '.join(domains)})"
return False, f"Échec de la configuration split-DNS (NRPT): {resp.get('message') or 'Erreur inconnue'}"
script = _nrpt_add_split_dns_ps(server, domains, rule_name)
if not script:
return True, "Aucun domaine à configurer"
# Exécuter avec élévation (nécessite admin pour modifier les règles NRPT)
code, out, err = run_privileged(
["powershell", "-NoProfile", "-NonInteractive", "-Command", script],
timeout=15
)
if code == 0:
return True, f"Règle split-DNS (NRPT) configurée pour {server} (domaines: {', '.join(domains)})"
else:
return False, f"Échec de la configuration split-DNS (NRPT): {err or out or 'Erreur inconnue'}"
else:
# Linux : utiliser systemd-resolved
return _setup_split_dns_linux(server, domains, name)
@@ -331,15 +345,24 @@ def cleanup_split_dns(cfg: Config) -> tuple[bool, str]:
if is_windows():
name = cfg.wg.get("interface_name", "wgs0")
rule_name = f"{_SPLIT_DNS_RULE_PREFIX}{name}"
resp = call_helper({"cmd": "clear_split_dns", "rule_name": rule_name})
if resp is not None:
if resp.get("ok"):
return True, "Règle split-DNS (NRPT) supprimée"
msg = resp.get("message") or ""
if "cannot find" in msg.lower() or "not found" in msg.lower():
return True, ""
return False, f"Échec de la suppression split-DNS (NRPT): {msg or 'Erreur inconnue'}"
script = _nrpt_remove_split_dns_ps(rule_name)
# Exécuter avec élévation
code, out, err = run_privileged(
["powershell", "-NoProfile", "-NonInteractive", "-Command", script],
timeout=15
)
if code == 0:
return True, "Règle split-DNS (NRPT) supprimée"
else:
@@ -347,7 +370,7 @@ def cleanup_split_dns(cfg: Config) -> tuple[bool, str]:
if "cannot find" in (err or out or "").lower() or "not found" in (err or out or "").lower():
return True, ""
return False, f"Échec de la suppression split-DNS (NRPT): {err or out or 'Erreur inconnue'}"
else:
# Linux : supprimer le fichier de config systemd-resolved
name = cfg.wg.get("interface_name", "wgs0")