v0.7.0 : instance unique, handshake ré-affiché, sudoers fiabilisé, À propos refaite

- Instance unique : un second lancement réveille l'instance active.
- Autostart et reconnexion auto activés par défaut (nouvelle installation).
- Page « À propos » refaite en 5 onglets (contenu séparé dans app_info.py).
- Corrige le handshake/RX-TX qui ne s'affichaient plus (wg show sans élévation).
- Corrige le diagnostic sudo trompeur (sondes qui ne matchaient jamais les règles).
- Corrige make setup-sudoers bloqué hors session graphique (pkexec -> sudo), idempotent.
- Corrige le README : Kill Switch inexistant retiré, ordre d'élévation réel documenté.
This commit is contained in:
2026-09-01 19:18:24 +02:00
parent 6251a3ea8e
commit 8c09c02362
13 changed files with 590 additions and 104 deletions
+18 -2
View File
@@ -1,7 +1,6 @@
#!/usr/bin/env python3
"""
WGSecure (WGS) — Interface graphique WireGuard avec MFA
Version 0.6.0
"""
import sys
import argparse
@@ -9,10 +8,12 @@ import argparse
from PyQt6.QtWidgets import QApplication, QMessageBox, QInputDialog, QLineEdit, QSystemTrayIcon
from PyQt6.QtCore import Qt
from app import __version__
from app.core.config import Config
from app.core import dns as dns_util
from app.core import log as conn_log
from app.core import shutdown as shutdown_guard
from app.core.single_instance import SingleInstanceGuard
from app.ui.main_window import MainWindow
from app.ui.systray import SystemTray
from app.ui import icons
@@ -92,8 +93,14 @@ def main():
)
app = QApplication(sys.argv)
app.setApplicationName("WGSecure")
app.setApplicationVersion("0.6.0")
app.setApplicationVersion(__version__)
app.setOrganizationName("WGS")
# Une seule instance à la fois : un second lancement réveille la
# première plutôt que d'ouvrir une deuxième fenêtre sur le même tunnel.
guard = SingleInstanceGuard()
if not guard.try_acquire():
sys.exit(0)
# Icône globale multi-tailles — barre des tâches + alt-tab
app_icon = icons.icon_app()
app.setWindowIcon(app_icon)
@@ -122,10 +129,12 @@ def main():
win = AdminWindow(config)
win.setWindowIcon(icons.icon_admin())
win.show()
guard.on_activate_requested(lambda: _raise_window(win))
sys.exit(app.exec())
# Mode User (défaut)
window = MainWindow(config)
guard.on_activate_requested(lambda: _raise_window(window))
# Systray
if not args.no_tray and QSystemTrayIcon_available():
@@ -148,6 +157,13 @@ def main():
sys.exit(app.exec())
def _raise_window(window) -> None:
"""Ramène une fenêtre existante au premier plan (second lancement)."""
window.showNormal()
window.raise_()
window.activateWindow()
def QSystemTrayIcon_available() -> bool:
from PyQt6.QtWidgets import QSystemTrayIcon
return QSystemTrayIcon.isSystemTrayAvailable()