chore(release): v0.7.19

Sécurité : la clé privée ne subsiste plus en clair dans %APPDATA%.
Le .conf généré est écrasé puis supprimé dès que wireguard.exe l'a
consommé (il en garde sa propre copie chiffrée DPAPI), et l'import
propose d'effacer le fichier source. Windows uniquement : sous Linux
/etc/wireguard/<iface>.conf reste requis par wg-quick down.

Corrige aussi ImpersonateNamedPipeClient, qui appartient à
win32security et non à win32pipe (vérifié par introspection).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 08:36:16 +02:00
co-authored by Claude Sonnet 5
parent e96f829f8b
commit e272b9397e
9 changed files with 100 additions and 15 deletions
+24 -8
View File
@@ -16,6 +16,7 @@ from app.utils.platform_utils import (
run_command,
run_privileged,
run_privileged_readonly,
secure_delete,
wg_available,
wg_exe,
wg_quick_available,
@@ -367,14 +368,29 @@ def connect(cfg: Config) -> tuple[bool, str]:
if dns_util.interface_exists(name):
force_cleanup(cfg)
cmd = [wireguard_exe(), "/installtunnelservice", result]
code, _, err = _run_wireguard_service_cmd(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.
if code == 0 and _wait_connected(cfg, timeout=15):
return True, _post_connect_message(cfg)
force_cleanup(cfg)
return False, err or f"Échec de l'installation du tunnel (code {code})"
try:
code, _, err = _run_wireguard_service_cmd(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.
if code == 0 and _wait_connected(cfg, timeout=15):
return True, _post_connect_message(cfg)
force_cleanup(cfg)
return False, err or f"Échec de l'installation du tunnel (code {code})"
finally:
# Ce .conf porte la clé privée en clair, dans un dossier lisible
# par l'utilisateur (%APPDATA%\WGSecure) : il ne doit pas y
# subsister une fois consommé. wireguard.exe en a déjà pris sa
# propre copie, chiffrée par DPAPI, dans son magasin
# (ProgramData\WireGuard\Configurations) — et
# /uninstalltunnelservice ne prend que le nom de l'interface,
# jamais un chemin : plus rien ne le relit ensuite. Il est
# réécrit à chaque connexion.
#
# Sous Linux au contraire, /etc/wireguard/<iface>.conf est
# indispensable à `wg-quick down` : on n'y touche pas (branche
# Windows uniquement).
secure_delete(result)
# Déjà monté et fonctionnel : rien à faire.
if is_connected(cfg):