fix: changelog embarqué manquant, badge hors-ligne trompeur, installeur WireGuard

- CHANGELOG.md n'était pas empaqueté par PyInstaller (datas=[]) et son
  chemin, calculé depuis __file__, ne survivait pas à l'extraction
  onefile : la page « À propos » restait vide une fois compilée. Le
  fichier est désormais embarqué (--add-data) et son chemin bascule sur
  sys._MEIPASS en mode frozen.
- Le badge de latence se basait uniquement sur un ping ICMP vers
  l'endpoint : de nombreux serveurs/pare-feux le bloquent alors que le
  tunnel WireGuard fonctionne, d'où « hors ligne » permanent. Repli sur
  l'âge du dernier handshake réel quand l'ICMP échoue.
- wgsecure.iss installe désormais WireGuard for Windows en silencieux
  (prérequis manquant jusqu'ici), au même titre que le VC++
  Redistributable ; make installer-deps télécharge les deux binaires.
This commit is contained in:
2026-09-01 21:23:12 +02:00
parent 8c09c02362
commit ce4df4edb4
5 changed files with 99 additions and 12 deletions
+28
View File
@@ -994,6 +994,34 @@ def ping_server(host: str, timeout: int = 2) -> int | None:
return 0
#: Au-delà de cet âge (s), un handshake est considéré trop ancien pour
#: garantir que le tunnel répond encore (keepalive par défaut : 25 s).
_HANDSHAKE_STALE_S = 150
def ping_or_handshake(cfg: Config, timeout: int = 2) -> tuple[int | None, str]:
"""Latence ICMP vers l'endpoint, avec repli sur l'âge du handshake.
De nombreux serveurs (ou un pare-feu en chemin) bloquent l'ICMP echo
tout en laissant le tunnel WireGuard fonctionner parfaitement : sans ce
repli, le badge de statut affichait « hors ligne » en continu sur ces
configurations, alors que le handshake était récent et le trafic RX/TX
bien réel. Retourne (valeur, source) où `source` vaut "ping" (latence
ICMP), "handshake" (âge du dernier handshake, tunnel sain), "stale"
(handshake trop ancien) ou "down" (aucune des deux sondes n'aboutit).
"""
host = cfg.wg.get("server_endpoint", "")
ms = ping_server(host, timeout) if host else None
if ms is not None:
return ms, "ping"
age = last_handshake_age(cfg.wg.get("interface_name", "wgs0"))
if age is not None and 0 <= age <= _HANDSHAKE_STALE_S:
return age, "handshake"
if age is not None and age > _HANDSHAKE_STALE_S:
return age, "stale"
return None, "down"
# ── Test DNS leak ─────────────────────────────────────────────────────────
def dns_leak_test(cfg: Config) -> dict: