fix(windows): suppression de sc.exe, bouton de configuration des permissions
- Supprime tous les appels à sc.exe (remplacés par PowerShell Get-Service + wireguard.exe) - wireguard.exe appelé via run_command() sous Windows (UAC gérée par son manifeste) - Supprime le double appel à uninstalltunnelservice (évite l'erreur 'service inexistant') - Ajoute un bouton dans l'onglet Élévation pour configurer les ACLs du service WireGuard (permet à un utilisateur standard de gérer ses tunnels sans UAC après configuration admin) - Incrémente la version à 0.7.2 Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
+22
-21
@@ -177,8 +177,12 @@ def is_connected(cfg: Config) -> bool:
|
||||
"""
|
||||
name = cfg.wg.get("interface_name", "wgs0")
|
||||
if is_windows():
|
||||
code, out, _ = run_command(["sc", "query", f"WireGuardTunnel${name}"])
|
||||
return code == 0 and "RUNNING" in out
|
||||
code, out, _ = run_command(
|
||||
["powershell", "-NoProfile", "-NonInteractive", "-Command",
|
||||
f"(Get-Service -Name 'WireGuardTunnel${name}' -ErrorAction SilentlyContinue).Status -eq 'Running'"],
|
||||
timeout=10
|
||||
)
|
||||
return code == 0 and "True" in out
|
||||
return dns_util.interface_is_up(name)
|
||||
|
||||
|
||||
@@ -213,16 +217,11 @@ def force_cleanup(cfg: Config) -> list[str]:
|
||||
actions: list[str] = []
|
||||
|
||||
if is_windows():
|
||||
# Le service du tunnel restaure routes et DNS en s'arrêtant ; s'il est
|
||||
# bloqué, on le supprime avant de purger les règles NRPT résiduelles.
|
||||
# Le service du tunnel restaure routes et DNS en s'arrêtant.
|
||||
# Sous Windows, wireguard.exe gère lui-même l'élévation via son manifeste UAC.
|
||||
if dns_util.interface_exists(name):
|
||||
svc = f"WireGuardTunnel${name}"
|
||||
run_privileged([wireguard_exe(), "/uninstalltunnelservice", name],
|
||||
timeout=60)
|
||||
if dns_util.interface_exists(name):
|
||||
run_privileged(["sc", "stop", svc], timeout=30)
|
||||
run_privileged(["sc", "delete", svc], timeout=30)
|
||||
actions.append(f"sc delete {svc}")
|
||||
cmd = [wireguard_exe(), "/uninstalltunnelservice", name]
|
||||
run_command(cmd, timeout=60)
|
||||
actions += dns_util.cleanup(name)
|
||||
return actions
|
||||
|
||||
@@ -276,9 +275,13 @@ def connect(cfg: Config) -> tuple[bool, str]:
|
||||
return True, "Tunnel WireGuard déjà actif"
|
||||
if dns_util.interface_exists(name):
|
||||
force_cleanup(cfg)
|
||||
code, _, err = run_privileged(
|
||||
[wireguard_exe(), "/installtunnelservice", result], timeout=90
|
||||
)
|
||||
# Sous Windows, wireguard.exe gère lui-même l'élévation via son manifeste UAC.
|
||||
# Sous Linux, wg-quick nécessite sudo.
|
||||
cmd = [wireguard_exe(), "/installtunnelservice", result]
|
||||
if is_windows():
|
||||
code, _, err = run_command(cmd, timeout=90)
|
||||
else:
|
||||
code, _, err = run_privileged(cmd, timeout=90)
|
||||
# /installtunnelservice enregistre le service et rend la main : le
|
||||
# démarrage effectif du tunnel est asynchrone. Tester l'état
|
||||
# immédiatement conclurait « échec » sur un tunnel qui monte.
|
||||
@@ -312,15 +315,13 @@ def disconnect(cfg: Config) -> tuple[bool, str]:
|
||||
name = cfg.wg.get("interface_name", "wgs0")
|
||||
|
||||
if is_windows():
|
||||
code, _, err = run_privileged(
|
||||
[wireguard_exe(), "/uninstalltunnelservice", name], timeout=60
|
||||
)
|
||||
# Nettoyage inconditionnel : si le service reste ou qu'une règle NRPT
|
||||
# survit, la résolution DNS resterait détournée vers le DNS du tunnel.
|
||||
# force_cleanup() appelle wireguard.exe /uninstalltunnelservice si le service existe,
|
||||
# puis nettoie les règles DNS résiduelles (NRPT).
|
||||
force_cleanup(cfg)
|
||||
if code == 0 or not dns_util.interface_exists(name):
|
||||
if not dns_util.interface_exists(name):
|
||||
return True, "Déconnecté"
|
||||
return False, err or "Erreur lors de la déconnexion"
|
||||
# Si le service existe toujours, c'est qu'il n'a pas pu être supprimé.
|
||||
return False, "Erreur lors de la déconnexion : le service n'a pas pu être arrêté"
|
||||
|
||||
err = ""
|
||||
if is_connected(cfg):
|
||||
|
||||
Reference in New Issue
Block a user