Files
WGSecure/main.py
T
2026-06-01 23:22:18 +02:00

129 lines
3.6 KiB
Python

#!/usr/bin/env python3
"""
WGSecure (WGS) — Interface graphique WireGuard avec MFA
Version 0.4.0
"""
import sys
import argparse
from PyQt6.QtWidgets import QApplication, QMessageBox, QInputDialog, QLineEdit, QSystemTrayIcon
from PyQt6.QtCore import Qt
from app.core.config import Config
from app.ui.main_window import MainWindow
from app.ui.systray import SystemTray
from app.ui import icons
from app.utils.platform_utils import install_desktop_entry
def _install_taskbar_icon(app_icon) -> None:
"""Exporte l'icône en PNG 256 px et installe l'entrée .desktop."""
try:
import tempfile, os
tmp = os.path.join(tempfile.gettempdir(), "wgsecure_icon.png")
app_icon.pixmap(256, 256).save(tmp, "PNG")
install_desktop_entry(tmp)
except Exception:
pass
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
prog="wgsecure",
description="WGSecure — WireGuard GUI avec MFA",
)
parser.add_argument(
"--admin",
action="store_true",
help="Lancer directement en mode Administrateur",
)
parser.add_argument(
"--no-tray",
action="store_true",
help="Désactiver l'icône systray",
)
return parser.parse_args()
def require_admin_auth(config: Config, app: QApplication) -> bool:
"""Vérifie le mot de passe admin si configuré. Retourne True si autorisé."""
if not config.has_admin_password():
return True
pw, ok = QInputDialog.getText(
None,
"Accès Administrateur",
"Mot de passe administrateur :",
QLineEdit.EchoMode.Password,
)
if not ok:
return False
if config.check_admin_password(pw):
return True
QMessageBox.warning(None, "WGSecure", "Mot de passe incorrect.")
return False
def main():
args = parse_args()
# Support DPI haute résolution
QApplication.setHighDpiScaleFactorRoundingPolicy(
Qt.HighDpiScaleFactorRoundingPolicy.PassThrough
)
app = QApplication(sys.argv)
app.setApplicationName("WGSecure")
app.setApplicationVersion("0.4.0")
app.setOrganizationName("WGS")
# Icône globale multi-tailles — barre des tâches + alt-tab
app_icon = icons.icon_app()
app.setWindowIcon(app_icon)
app.setDesktopFileName("wgsecure")
# Installe .desktop + PNG pour que GNOME/KDE affiche l'icône sur la taskbar
_install_taskbar_icon(app_icon)
# Empêche la fermeture quand toutes les fenêtres sont cachées (tray)
app.setQuitOnLastWindowClosed(False)
config = Config()
# Mode Admin direct (--admin)
if args.admin:
if not require_admin_auth(config, app):
sys.exit(0)
from app.ui.admin_window import AdminWindow
win = AdminWindow(config)
win.setWindowIcon(icons.icon_admin())
win.show()
sys.exit(app.exec())
# Mode User (défaut)
window = MainWindow(config)
# Systray
if not args.no_tray and QSystemTrayIcon_available():
tray = SystemTray(config, window)
tray.show()
# Démarrer réduit si déjà configuré
if config.configured:
window.show()
else:
window.show()
tray.showMessage(
"WGSecure",
"Bienvenue ! Ouvrez le panneau Administrateur pour configurer WireGuard.",
QSystemTrayIcon.MessageIcon.Information,
4000,
)
else:
window.show()
sys.exit(app.exec())
def QSystemTrayIcon_available() -> bool:
from PyQt6.QtWidgets import QSystemTrayIcon
return QSystemTrayIcon.isSystemTrayAvailable()
if __name__ == "__main__":
main()