From 2f9ca6b55399e1ba6465102f63cb017e53dc84b6 Mon Sep 17 00:00:00 2001 From: Johnny Date: Wed, 3 Jun 2026 09:55:39 +0200 Subject: [PATCH] Fix bugs --- app/core/wireguard.py | 63 ------------------------------------------ app/ui/admin_window.py | 51 ---------------------------------- 2 files changed, 114 deletions(-) diff --git a/app/core/wireguard.py b/app/core/wireguard.py index 5016459..156c6cc 100644 --- a/app/core/wireguard.py +++ b/app/core/wireguard.py @@ -245,69 +245,6 @@ def ping_server(host: str, timeout: int = 2) -> int | None: return None -# ── Kill switch ────────────────────────────────────────────────────────── - -_KS_CHAIN = "WGS_KILLSWITCH" - - -def enable_kill_switch(cfg: Config) -> tuple[bool, str]: - """Active le kill switch : bloque tout trafic hors du tunnel WireGuard.""" - if is_windows(): - return False, "Kill switch non disponible sur Windows (utilisez le pare-feu Windows)" - - iface = cfg.wg.get("interface_name", "wgs0") - server = cfg.wg.get("server_endpoint", "") - port = str(cfg.wg.get("server_port", 51820)) - - # Créer la chaîne dédiée (idempotent) - run_privileged(["iptables", "-N", _KS_CHAIN]) - run_privileged(["iptables", "-F", _KS_CHAIN]) - - rules = [ - ["iptables", "-A", _KS_CHAIN, "-o", "lo", "-j", "ACCEPT"], - ["iptables", "-A", _KS_CHAIN, "-o", iface, "-j", "ACCEPT"], - ["iptables", "-A", _KS_CHAIN, "-m", "state", - "--state", "ESTABLISHED,RELATED", "-j", "ACCEPT"], - ] - if server: - rules.append(["iptables", "-A", _KS_CHAIN, - "-d", server, "-p", "udp", "--dport", port, "-j", "ACCEPT"]) - rules.append(["iptables", "-A", _KS_CHAIN, "-j", "REJECT", - "--reject-with", "icmp-net-unreachable"]) - - for rule in rules: - code, _, err = run_privileged(rule) - if code != 0: - disable_kill_switch(cfg) - return False, f"Erreur iptables : {err}" - - # Insérer la chaîne dans OUTPUT (évite les doublons) - run_privileged(["iptables", "-D", "OUTPUT", "-j", _KS_CHAIN]) - code, _, err = run_privileged(["iptables", "-I", "OUTPUT", "-j", _KS_CHAIN]) - if code != 0: - disable_kill_switch(cfg) - return False, err - - return True, f"Kill switch activé (interface {iface})" - - -def disable_kill_switch(cfg: Config) -> tuple[bool, str]: - """Désactive le kill switch.""" - if is_windows(): - return True, "N/A" - run_privileged(["iptables", "-D", "OUTPUT", "-j", _KS_CHAIN]) - run_privileged(["iptables", "-F", _KS_CHAIN]) - run_privileged(["iptables", "-X", _KS_CHAIN]) - return True, "Kill switch désactivé" - - -def kill_switch_active() -> bool: - if is_windows(): - return False - code, out, _ = run_command(["iptables", "-L", "OUTPUT", "-n"]) - return _KS_CHAIN in out - - # ── Test DNS leak ───────────────────────────────────────────────────────── def dns_leak_test(cfg: Config) -> dict: diff --git a/app/ui/admin_window.py b/app/ui/admin_window.py index 59e7e01..78c7347 100644 --- a/app/ui/admin_window.py +++ b/app/ui/admin_window.py @@ -524,34 +524,6 @@ class AdminWindow(QDialog): lay.addWidget(grp1) - grp_ks = QGroupBox("🔒 Kill Switch (Linux)") - g_ks = QVBoxLayout(grp_ks) - note_ks = QLabel( - "Bloque tout trafic internet si le tunnel VPN tombe.\n" - "Nécessite des droits root (iptables)." - ) - note_ks.setWordWrap(True) - note_ks.setStyleSheet("color: rgba(255,255,255,0.7); font-size: 11px;") - g_ks.addWidget(note_ks) - ks_row = QHBoxLayout() - self._btn_ks_enable = QPushButton("🔒 Activer") - self._btn_ks_enable.clicked.connect(self._enable_kill_switch) - self._btn_ks_disable = QPushButton("🔓 Désactiver") - self._btn_ks_disable.setStyleSheet( - "QPushButton { background: #6e2e1c; border-radius: 5px; padding: 7px 12px;" - " color: white; border: none; } QPushButton:hover { background: #922b21; }" - ) - self._btn_ks_disable.clicked.connect(self._disable_kill_switch) - self._ks_status = QLabel("—") - self._ks_status.setStyleSheet("font-size: 11px; color: #aed6f1;") - ks_row.addWidget(self._btn_ks_enable) - ks_row.addWidget(self._btn_ks_disable) - ks_row.addWidget(self._ks_status) - ks_row.addStretch() - g_ks.addLayout(ks_row) - lay.addWidget(grp_ks) - self._refresh_ks_status() - grp2 = QGroupBox("Auto-reconnexion") form2 = QFormLayout(grp2) @@ -965,29 +937,6 @@ class AdminWindow(QDialog): f"padding: 8px; border-radius: 6px; font-size: 11px; {css}" ) - def _refresh_ks_status(self): - active = wg_core.kill_switch_active() - if active: - self._ks_status.setText("🔒 Actif") - self._ks_status.setStyleSheet("color: #a9dfbf; font-size: 11px;") - else: - self._ks_status.setText("🔓 Inactif") - self._ks_status.setStyleSheet("color: #f1948a; font-size: 11px;") - - def _enable_kill_switch(self): - self._save_values() - ok, msg = wg_core.enable_kill_switch(self._cfg) - self._refresh_ks_status() - if ok: - QMessageBox.information(self, "Kill Switch", msg) - else: - QMessageBox.warning(self, "Kill Switch", msg) - - def _disable_kill_switch(self): - ok, msg = wg_core.disable_kill_switch(self._cfg) - self._refresh_ks_status() - QMessageBox.information(self, "Kill Switch", msg) - def _set_admin_password(self): p1 = self._admin_pw1.text() p2 = self._admin_pw2.text()