tuxgyverandClaude Opus 5 b3cf706bb6 feat(ui): panneau allégé, et le diagnostic nomme le chevauchement de plages
L'assistant « configuration serveur + client » disparaît. Il datait d'avant la
v0.8.0 et produisait un serveur WireGuard nu — sans API, sans quarantaine, sans
TOTP — incompatible avec le produit actuel, où le serveur enrôle le compte et
fournit un .conf. Son bouton « Appliquer le volet client » écrasait clés client
et clé publique du serveur : sur un poste déjà enrôlé, il détruisait le lien
avec le serveur, qui déclare l'ancienne clé publique.

L'identifiant VPN disparaît aussi, devenu sans emploi depuis que le serveur
reconnaît le poste à l'adresse de son tunnel. Un champ qui ne fait rien est
pire qu'un champ absent : il laisse croire qu'il compte. Les configurations
existantes sont purgées au chargement, profils compris. La pastille « À propos »
qui en déduisait « Code d'accès serveur » ou « Aucun code d'accès » n'affirme
plus rien qu'elle ne sache : l'accès passe par le serveur dans tous les cas.

Le sous-onglet Tunnel passe d'une liste de quinze champs à trois groupes :
l'essentiel, le split-DNS nommé comme tel — trois champs y portaient « DNS »
sans que rien ne dise lesquels allaient ensemble — et un repli « Avancé ».
Celui-ci réunit ce qui vient du serveur (adresse, port, clé publique) et ce qui
est correct par défaut (nom d'interface, URL de l'API, keepalive, MTU).

Le verrouillage après import d'un .conf devient persistant. Il existait déjà,
mais `_load_values` le levait sans condition : rouvrir le panneau ou changer de
profil rendait éditables, en silence, les champs décrivant un pair déjà déclaré
côté serveur. L'état est désormais enregistré et suit la configuration chargée.

Le diagnostic gagne une étape « Serveur DNS du réseau distant », qui couvre un
angle mort : le tunnel monte, le trafic passe, la résolution est au vert, et
pas un nom interne ne se résout. Deux causes, l'une et l'autre muettes — le
serveur DNS distant n'est couvert par aucune IP autorisée, ou il l'est mais son
adresse tombe aussi dans une plage que porte une carte du poste, auquel cas la
route locale l'emporte. Le second cas ne se déduit pas de la configuration :
l'étape interroge la route réellement retenue par le noyau, sans émettre de
paquet, et propose la route d'hôte qui reprend la main.

Le sous-onglet « Fuite DNS » devient « Résolution des noms » : il en faisait
trois choses sous un titre qui n'en annonçait qu'une. Son verdict « Statut
inconnu » recouvrait trois causes appelant trois gestes différents ; chacune
est maintenant nommée, avec l'action qui suit.

Enfin, la fenêtre. Sa hauteur augmente de 15 %, et son plancher passe de 520 à
703 : la page de test réclame 569 px et se chevauchait en dessous. Le rapport
de diagnostic passe en tableau à deux colonnes — il occupait 224 px quelle que
soit la largeur de la fenêtre, soit jusqu'à 79 % de blanc à droite, et tient
maintenant sur 38 % de hauteur en moins.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-08 12:18:08 +02:00
2026-06-01 22:31:22 +02:00
2026-09-08 11:22:30 +02:00
2026-09-08 11:22:30 +02:00
2026-09-08 11:22:30 +02:00
2026-09-08 11:22:30 +02:00

🛡️ WGSecure (WGS)

🚀 v0.9.1 · 🐍 · 🪟🐧 · 🔐 Accès validé par le serveur · 🛡️ WireGuard

WGSecure est une interface graphique multiplateforme (Windows & Linux) pour gérer une connexion WireGuard dont l'accès aux ressources distantes est ouvert par un code à 6 chiffres validé par le serveur.


Fonctionnalités

# Fonctionnalité Détail
🖥️ Interface systray Icône bouclier dans la barre de notification, connexion en un clic
👤 Mode User (défaut) Connexion / déconnexion WireGuard, statut RX/TX en temps réel
📊 Graphique bande passante Courbes RX/TX en direct sur les 30 dernières secondes
📋 Journal d'événements Horodatage de chaque connexion, déconnexion, erreur
🕘 Historique des sessions Durée, données transférées, serveur par session
⚙️ Mode Admin Configuration complète, protégé par mot de passe
🔑 Génération de clés Paire Curve25519 native (sans dépendance au binaire wg)
👤 Multi-profils Sauvegarde / bascule entre profils, import/export .conf
🛡️ Configuration WireGuard Serveur, port UDP, DNS, IP client, keepalive
🔐 Code d'accès serveur Le tunnel monte en quarantaine ; le serveur ouvre l'accès après validation du code
🔍 Test DNS leak Vérifie que le DNS passe bien par le tunnel
🏓 Ping en temps réel Badge de latence dans l'interface principale
🔄 Auto-reconnexion Surveillance et reconnexion automatique si le tunnel tombe — activée par défaut (15 s)
📡 Test de connexion Handshake WireGuard réel, sans monter le tunnel, avec détection du filtrage sur port source
🚀 Démarrage automatique Lancement au démarrage du système — activé par défaut
1️⃣ Instance unique Un second lancement réveille l'instance déjà active plutôt que d'en ouvrir une seconde
🪟🐧 Cross-platform Windows 10+ et Linux (wg-quick)

📋 Prérequis

🐧 Linux

sudo apt install wireguard-tools   # Debian/Ubuntu
sudo dnf install wireguard-tools   # Fedora

🪟 Windows

🐍 Python

Python >= 3.11

📦 Installation

git clone <repo>
cd WGSecure
pip install -r requirements.txt

🚀 Utilisation

Mode User (par défaut)

python main.py
# ou via Makefile :
make run

⚙️ Mode Administrateur (configuration)

python main.py --admin
# ou via Makefile :
make run-admin

Sans systray

python main.py --no-tray

🔧 Makefile

Commande Description
make install Installe les dépendances Python
make linux Compile un binaire Linux autonome (PyInstaller)
make windows Compile un binaire Windows via Wine
make release Binaire Linux renommé avec la version
make install-gnome Installe dans le menu GNOME (~/.local/)
make uninstall-gnome Désinstalle du menu GNOME
make reset-password Supprime le mot de passe administrateur
make run Lance l'application
make run-admin Lance en mode administrateur
make clean Supprime les artefacts de build

🗺️ Workflow recommandé

  1. 🚀 Lancer python main.py --admin
  2. 🛡️ Onglet WireGuard : renseigner l'adresse, le port et la clé publique du serveur
  3. 🔑 Onglet Clés : générer une paire de clés → copier la clé publique sur le serveur
  4. 🔐 Onglet WireGuard : renseigner l'identifiant VPN connu du serveur (le QR code TOTP est délivré par le serveur, pas par ce client)
  5. 🔒 Onglet Sécurité : définir un mot de passe pour l'accès admin
  6. Enregistrer → quitter → lancer python main.py en mode user

🐧 Élévation de privilèges Linux

wg-quick, la lecture de l'état du tunnel (wg show) et le nettoyage réseau (interface orpheline, DNS) nécessitent les droits root. WGSecure tente dans l'ordre :

  1. sudo -n — silencieux, fonctionne si une règle NOPASSWD est en place (voir ci-dessous)
  2. sudo -A avec programme askpass graphique (ssh-askpass, etc.)
  3. pkexec (polkit) — dialogue graphique GNOME/KDE ; nécessite un agent d'authentification actif, absent d'un simple terminal (SSH, tmux)

Le sondage périodique de l'état du tunnel (toutes les 3 s) ne tente que l'étape 1 : sans règle NOPASSWD, aucun dialogue n'apparaît, le handshake et les compteurs RX/TX restent simplement vides.

Supprimer la demande de mot de passe (recommandé)

make setup-sudoers

Invite le mot de passe une fois dans le terminal (via sudo, plus fiable que pkexec hors session graphique), puis installe une règle NOPASSWD limitée à wg-quick, wg, et au nettoyage d'une interface/DNS orpheline — jamais un accès root généralisé. Idempotent : une relance ne redemande le mot de passe que si le contenu a changé. make check-privileges affiche l'état courant.

Pour le faire à la main :

sudo visudo -f /etc/sudoers.d/wgsecure
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/wg-quick
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/wg
<utilisateur> ALL=(ALL) NOPASSWD: /usr/sbin/ip link delete dev *
<utilisateur> ALL=(ALL) NOPASSWD: /usr/sbin/resolvconf -d *
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/resolvectl revert *
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/resolvectl dns *
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/resolvectl domain *
<utilisateur> ALL=(ALL) NOPASSWD: /usr/bin/install -D -m 600 -o root -g root * /etc/wireguard/*

Réinitialiser le mot de passe admin oublié

make reset-password

🏗️ Architecture

WGSecure/
├── main.py                      # 🚀 Point d'entrée
├── requirements.txt
├── Makefile
├── app/
│   ├── __init__.py              # Version
│   ├── app_info.py              # ️  Contenu de la page « À propos »
│   ├── core/
│   │   ├── config.py            # 💾 Configuration JSON persistante + bcrypt
│   │   ├── wireguard.py         # 🛡️ Clés, tunnel, statut, DNS leak
│   │   ├── wg_handshake.py      # 🤝 Sonde de handshake réel, sans monter le tunnel
│   │   ├── single_instance.py   # 1️⃣  Garde une seule instance active
│   │   ├── history.py           # 🕘 Historique des sessions (sessions.json)
│   │   ├── log.py               # 📋 Journal d'événements (events.json)
│   │   └── vpn_session.py       # 🔐 Validation du code auprès du serveur
│   ├── ui/
│   │   ├── icons.py             # 🎨 Icônes bouclier générées par QPainter
│   │   ├── main_window.py       # 👤 Fenêtre principale (mode user)
│   │   ├── admin_window.py      # ⚙️  Panneau admin (onglets, thème sombre)
│   │   ├── bw_graph.py          # 📊 Widget graphique bande passante
│   │   ├── history_dialog.py    # 🕘 Dialogue historique des sessions
│   │   ├── access_code_dialog.py # 🔐 Saisie du code d'accès
│   │   └── systray.py           # 🖥️ Icône systray + menu contextuel
│   └── utils/
│       └── platform_utils.py    # 🔧 Détection OS, élévation de privilèges

🔒 Sécurité

Élément Protection
🔑 Mot de passe admin bcrypt (rounds=12) + sel intégré — migration transparente depuis SHA-256
🗝️ Clé privée WireGuard ~/.wgsecure/config.json (Linux) / %APPDATA%\WGSecure\ (Windows)
🔐 Secret TOTP Jamais sur le poste client — détenu par le serveur, qui seul valide le code et ouvre l'accès réseau
📄 Fichier .conf WireGuard Permissions 0600 (lecture propriétaire uniquement)

⚠️ Recommandation : chiffrez votre disque pour protéger le fichier de configuration.


👤 Auteur

Développé par JohnnyJT-Tools Version : v0.9.1 — Septembre 2026

S
Description
No description provided
Readme
148 MiB
2026-09-08 18:03:06 +00:00
Languages
Python 92.5%
Makefile 5.1%
Inno Setup 2.4%