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
+28
View File
@@ -22,6 +22,34 @@ def get_config_dir() -> str:
return path
def secure_delete(path: str) -> bool:
"""Écrase puis supprime un fichier contenant un secret.
Sert aux fichiers `.conf` WireGuard, qui portent la clé privée en
clair : ils ne doivent pas subsister une fois consommés.
L'écrasement préalable est explicitement « au mieux » : sur SSD (wear
levelling, TRIM) ou sur un système de fichiers journalisé ou
copy-on-write, l'ancien contenu peut survivre dans des blocs que le
système n'expose plus. Il protège d'une récupération simple de
l'espace libre, pas d'une analyse forensique — la seule protection
solide reste le chiffrement du disque.
"""
try:
size = os.path.getsize(path)
with open(path, "r+b") as f:
f.write(b"\0" * size)
f.flush()
os.fsync(f.fileno())
except OSError:
pass # fichier absent ou verrouillé : on tente quand même la suppression
try:
os.remove(path)
return True
except OSError:
return False
def get_wg_config_dir() -> str:
if is_windows():
base = os.environ.get("PROGRAMDATA", r"C:\ProgramData")