Fix bugs
This commit is contained in:
@@ -245,69 +245,6 @@ def ping_server(host: str, timeout: int = 2) -> int | None:
|
|||||||
return 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 ─────────────────────────────────────────────────────────
|
# ── Test DNS leak ─────────────────────────────────────────────────────────
|
||||||
|
|
||||||
def dns_leak_test(cfg: Config) -> dict:
|
def dns_leak_test(cfg: Config) -> dict:
|
||||||
|
|||||||
@@ -524,34 +524,6 @@ class AdminWindow(QDialog):
|
|||||||
|
|
||||||
lay.addWidget(grp1)
|
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")
|
grp2 = QGroupBox("Auto-reconnexion")
|
||||||
form2 = QFormLayout(grp2)
|
form2 = QFormLayout(grp2)
|
||||||
|
|
||||||
@@ -965,29 +937,6 @@ class AdminWindow(QDialog):
|
|||||||
f"padding: 8px; border-radius: 6px; font-size: 11px; {css}"
|
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):
|
def _set_admin_password(self):
|
||||||
p1 = self._admin_pw1.text()
|
p1 = self._admin_pw1.text()
|
||||||
p2 = self._admin_pw2.text()
|
p2 = self._admin_pw2.text()
|
||||||
|
|||||||
Reference in New Issue
Block a user