diff --git a/app/core/config.py b/app/core/config.py index 7ff6a32..f66a6b1 100644 --- a/app/core/config.py +++ b/app/core/config.py @@ -34,6 +34,7 @@ _DEFAULT: dict[str, Any] = { "ui": { "minimize_to_tray": True, "autostart": False, + "auto_connect_on_startup": False, "auto_reconnect": False, "reconnect_interval": 30, }, diff --git a/app/ui/admin_window.py b/app/ui/admin_window.py index 9091825..279aa5f 100644 --- a/app/ui/admin_window.py +++ b/app/ui/admin_window.py @@ -280,6 +280,7 @@ class AdminWindow(QDialog): btn_gen = QPushButton("GΓ©nΓ©rer une nouvelle paire de clΓ©s") btn_gen.setFixedHeight(28) + btn_gen.clicked.connect(self._generate_keys) self._row(form, "", btn_gen) lay.addWidget(grp) @@ -512,6 +513,15 @@ class AdminWindow(QDialog): self._chk_autostart.setChecked(bool(self._cfg.get("ui", "autostart"))) form1.addRow("", self._chk_autostart) + self._chk_auto_connect = QCheckBox( + "Se connecter automatiquement au dΓ©marrage (profil actif)" + ) + self._chk_auto_connect.setStyleSheet("color: white;") + self._chk_auto_connect.setChecked( + bool(self._cfg.get("ui", "auto_connect_on_startup")) + ) + form1.addRow("", self._chk_auto_connect) + lay.addWidget(grp1) grp_ks = QGroupBox("πŸ”’ Kill Switch (Linux)") @@ -569,6 +579,7 @@ class AdminWindow(QDialog): self._cfg.set("ui", "minimize_to_tray", self._chk_tray.isChecked()) self._cfg.set("ui", "auto_reconnect", self._chk_autorecon.isChecked()) self._cfg.set("ui", "reconnect_interval", self._spin_interval.value()) + self._cfg.set("ui", "auto_connect_on_startup", self._chk_auto_connect.isChecked()) autostart = self._chk_autostart.isChecked() if autostart != bool(self._cfg.get("ui", "autostart")): self._cfg.set_autostart(autostart) diff --git a/app/ui/main_window.py b/app/ui/main_window.py index 17bfb96..028d2c8 100644 --- a/app/ui/main_window.py +++ b/app/ui/main_window.py @@ -11,9 +11,11 @@ from PyQt6.QtGui import QFont, QCloseEvent, QColor from app.core.config import Config from app.core import wireguard as wg_core from app.core import log as conn_log +from app.core import history as hist from app.ui.mfa_dialog import MFADialog from app.ui.admin_window import AdminWindow from app.ui.bw_graph import BandwidthGraph +from app.ui.history_dialog import HistoryDialog from app.ui import icons _DARK = "#1c2833" @@ -44,6 +46,7 @@ class MainWindow(QMainWindow): self._prev_rx: int | None = None self._prev_tx: int | None = None self._auto_reconnect_active = False + self._session_id: int | None = None self.setWindowTitle("WGSecure") self.setFixedSize(430, 680) @@ -80,6 +83,9 @@ class MainWindow(QMainWindow): self._reload_log() self._reload_profiles() + if self._cfg.get("ui", "auto_connect_on_startup") and self._cfg.configured: + QTimer.singleShot(500, self._on_connect) + # ------------------------------------------------------------------ # # Construction UI # ------------------------------------------------------------------ # @@ -246,7 +252,10 @@ class MainWindow(QMainWindow): self._btn_connect.clicked.connect(self._on_connect) bl.addWidget(self._btn_connect) - btn_admin = QPushButton("βš™οΈ Panneau Administrateur") + secondary_row = QHBoxLayout() + secondary_row.setSpacing(6) + + btn_admin = QPushButton("βš™οΈ Administrateur") btn_admin.setFixedHeight(30) btn_admin.setStyleSheet( "QPushButton { background: #2e4057; color: white; border-radius: 6px;" @@ -254,7 +263,19 @@ class MainWindow(QMainWindow): "QPushButton:hover { background: #3d5166; }" ) btn_admin.clicked.connect(self._open_admin) - bl.addWidget(btn_admin) + secondary_row.addWidget(btn_admin) + + btn_history = QPushButton("πŸ“Š Historique") + btn_history.setFixedHeight(30) + btn_history.setStyleSheet( + "QPushButton { background: #2e4057; color: white; border-radius: 6px;" + " font-size: 11px; border: none; }" + "QPushButton:hover { background: #3d5166; }" + ) + btn_history.clicked.connect(self._open_history) + secondary_row.addWidget(btn_history) + + bl.addLayout(secondary_row) root.addWidget(btn_area) # ── Helpers UI ─────────────────────────────────────────────────────── @@ -508,6 +529,11 @@ class MainWindow(QMainWindow): if connected: ok, msg = wg_core.disconnect(self._cfg) if ok: + if self._session_id is not None: + rx = self._prev_rx or 0 + tx = self._prev_tx or 0 + hist.end_session(self._session_id, rx, tx) + self._session_id = None self._add_log("Tunnel WireGuard dΓ©sactivΓ©", "warning") else: self._add_log(f"Erreur dΓ©connexion : {msg}", "error") @@ -543,9 +569,10 @@ class MainWindow(QMainWindow): if ok: self._connected_since = QDateTime.currentDateTime() - self._add_log( - f"Connexion Γ©tablie β†’ {self._cfg.wg.get('server_endpoint','')}", "success" - ) + endpoint = self._cfg.wg.get("server_endpoint", "") + profile = self._cfg.active_profile + self._session_id = hist.start_session(endpoint, profile) + self._add_log(f"Connexion Γ©tablie β†’ {endpoint}", "success") QTimer.singleShot(5000, self._update_ping) else: self._add_log(f"Erreur : {msg}", "error") @@ -553,6 +580,9 @@ class MainWindow(QMainWindow): self._refresh_status() + def _open_history(self): + HistoryDialog(self).exec() + def _open_admin(self): if self._cfg.has_admin_password(): pw, ok = QInputDialog.getText(