278 lines
18 KiB
Markdown
278 lines
18 KiB
Markdown
# Changelog — WGSecure (WGS)
|
||
|
||
Toutes les modifications notables de ce projet sont documentées ici.
|
||
Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/).
|
||
Ce projet suit le [Versionnage Sémantique](https://semver.org/lang/fr/).
|
||
|
||
---
|
||
|
||
## [0.6.0] — 2026-09-01
|
||
|
||
### Ajouté
|
||
- **Test de handshake réel, sans monter le tunnel.** Le diagnostic s'arrêtait au constat « le port
|
||
UDP ne rejette rien », qui est le maximum qu'une sonde aveugle puisse dire : un serveur WireGuard
|
||
ignore silencieusement tout paquet non authentifié, si bien qu'un port non redirigé, une clé
|
||
inconnue du serveur et un serveur en parfaite santé produisent exactement la même absence de
|
||
réponse. Le tunnel n'étant pas monté, les étapes suivantes étaient sautées et le rapport
|
||
concluait « chaîne validée » sur une configuration qui n'avait aucune chance de négocier.
|
||
WGSecure construit désormais un vrai message d'initiation et interprète la réponse : il distingue
|
||
un handshake complet, une clé pré-partagée attendue, en trop ou différente, un cookie anti-déni
|
||
de service, un port fermé et un silence complet — sans ouvrir de tunnel ni demander de privilèges.
|
||
- **Détection du filtrage sur port source.** Quand le serveur reste muet, une seconde tentative
|
||
part depuis le port du serveur. S'il répond alors, c'est qu'un équipement en chemin n'accepte le
|
||
trafic que si le port source égale le port de destination — une règle courante sur FortiGate,
|
||
dont l'objet Service porte un `udp-portrange 51820:51820`. Un client WireGuard émettant depuis un
|
||
port aléatoire ne peut jamais la satisfaire, et rien dans les journaux ne le disait.
|
||
|
||
### Modifié
|
||
- **Fenêtre d'administration ramenée à 720 × 600** (minimum 640 × 520) : le découpage en
|
||
sous-onglets a supprimé l'empilement qui imposait une grande fenêtre.
|
||
- **Encarts d'introduction retirés au-dessus des sous-onglets**, où ils répétaient ce que les
|
||
sous-onglets annoncent déjà. Ceux placés dans chaque sous-onglet sont conservés.
|
||
|
||
### Corrigé
|
||
- **Verdict trompeur quand le tunnel est inactif.** « Chaîne validée jusqu'au tunnel » laissait
|
||
croire que tout avait été vérifié, alors que les étapes sautées sont précisément celles qui
|
||
échouent quand un tunnel refuse de négocier. Le rapport annonce maintenant « rien de bloquant
|
||
détecté, mais le tunnel est inactif » et nomme les étapes non évaluées.
|
||
- **Causes du handshake manquant** : le port UDP du serveur figure désormais parmi les pistes
|
||
citées, un port erroné ne produisant aucune erreur visible.
|
||
|
||
### Technique
|
||
- Nouveau module `app/core/wg_handshake.py` : implémentation de la poignée de main
|
||
Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s du protocole WireGuard v1. Aucun état n'est conservé, la
|
||
session négociée est jetée aussitôt et le serveur traite l'initiation comme celle d'un pair qui
|
||
se reconnecte.
|
||
|
||
## [0.5.0] — 2026-09-01
|
||
|
||
### Ajouté
|
||
- **Option « Le serveur utilise une clé pré-partagée »** : la présence d'une PSK ne se devinait
|
||
plus au fait que le champ soit rempli. Un serveur qui n'en utilise pas — le cas par défaut de
|
||
WireGuard — déclenchait un avertissement à chaque diagnostic, et une clé oubliée dans le champ
|
||
se retrouvait écrite dans la configuration alors que le serveur n'en attendait aucune, ce qui
|
||
casse le handshake aussi sûrement qu'une clé manquante. Le champ et ses boutons suivent la case.
|
||
- **Encart d'introduction en tête de chaque onglet** : les pages s'ouvraient sur un formulaire nu,
|
||
sans dire ce qu'on y décidait ni ce qui se passait si on n'y touchait pas.
|
||
|
||
### Modifié
|
||
- **Onglets « WireGuard » et « Clés » fusionnés** en un seul, découpé en sous-onglets *Tunnel*,
|
||
*Clés* et *Profils & fichiers*. Les deux se chevauchaient : la clé publique du serveur se
|
||
saisissait dans l'un pendant que l'assistant qui la produit vivait dans l'autre, et les quatre
|
||
façons de sortir une configuration (aperçu, .conf, QR Code, volet serveur) étaient réparties
|
||
entre les deux sans logique.
|
||
- **Onglet « Test » en sous-onglets** *Chaîne de connexion*, *Fuite DNS* et *Droits* : les trois
|
||
tests s'empilaient sur une page unique où le rapport de diagnostic, le plus long, se retrouvait
|
||
comprimé entre les deux autres.
|
||
- **Onglets « MFA » et « Sécurité » regroupés** sous *Sécurité*, en sous-onglets *MFA* et
|
||
*Mot de passe* : ils répondent à la même question, qui a le droit de se connecter et
|
||
d'administrer. La barre passe de sept onglets à cinq.
|
||
- **Couleurs unifiées** : le panneau d'administration comptait vingt-quatre couleurs écrites en
|
||
dur, cinq bandeaux d'onglets sans rapport de teinte entre eux, et des blocs de résultat dont le
|
||
fond ne correspondait ni à celui de la page ni à celui de leurs voisins. Tout passe par une
|
||
palette commune.
|
||
- **L'aperçu de configuration se remplit à l'ouverture** au lieu d'exiger un clic sur
|
||
« Rafraîchir ».
|
||
|
||
### Corrigé
|
||
- **Section « Droits d'exécution » inadaptée sous Windows** : elle parlait de règles sudo, d'un
|
||
fichier sudoers et de `make setup-sudoers`, qui n'existent pas sur cette plateforme, et
|
||
concluait « privilèges root, rien à configurer » là où le rapport était simplement vide. Elle
|
||
devient *Élévation*, vérifie les droits administrateur et la présence de WireGuard, et explique
|
||
comment éviter la fenêtre UAC à chaque connexion.
|
||
- **Causes du handshake manquant plus fidèles** : le message citait la clé pré-partagée sans
|
||
savoir si elle était en jeu, et passait sous silence le port UDP du serveur — un port erroné ne
|
||
produit aucune erreur visible, WireGuard ignorant silencieusement les paquets.
|
||
|
||
### Technique
|
||
- Nouveau module `app/ui/theme.py` : jetons de couleur, styles de blocs de résultat par état,
|
||
bandeaux et barres d'onglets.
|
||
- Le drapeau `use_preshared_key` vaut `None` par défaut et non `False` : la fusion des valeurs par
|
||
défaut recopie ce défaut dans toute configuration antérieure au drapeau, et `False` aurait
|
||
désactivé la clé pré-partagée d'un tunnel qui fonctionnait. Une configuration existante conserve
|
||
donc sa PSK, une configuration neuve démarre sans.
|
||
|
||
## [0.4.6] — 2026-09-01
|
||
|
||
### Corrigé
|
||
- **Handshake impossible quand le réseau local figure dans les « IPs autorisées »** : si la
|
||
passerelle qui mène au serveur appartient à une plage autorisée, `wg-quick` route cette plage
|
||
vers le tunnel avec une métrique de 0 — la route l'emporte sur celle de la carte réseau, la
|
||
passerelle n'est plus joignable que par le tunnel, et le tunnel a justement besoin d'elle pour
|
||
sortir. Le tunnel montait, l'interface existait, et plus aucun paquet de handshake ne quittait
|
||
la machine. Le diagnostic détecte désormais ce cas et le signale comme point de blocage, au lieu
|
||
du simple avertissement « imprimante et NAS passeront par le VPN » qui n'en disait pas la gravité.
|
||
- **Rapport de test de connexion illisible** : le panneau de résultat était un simple libellé que
|
||
la mise en page comprimait à quelques lignes tronquées, alors que le rapport en réclame le double.
|
||
Il devient une zone de texte défilante en pleine largeur, et la fenêtre d'administration, jusque-là
|
||
figée à 700 × 600, s'ouvre plus grande et se redimensionne librement.
|
||
|
||
### Technique
|
||
- Nouvelle fonction `_next_hop()` (`app/core/wireguard.py`) : détermine la passerelle réellement
|
||
empruntée pour joindre le serveur, via `ip route get` sous Linux et `Find-NetRoute` sous Windows.
|
||
- `_dark_page()` accepte une option `scroll` : les onglets dont le contenu grandit à l'usage
|
||
disposent d'une zone défilante.
|
||
|
||
## [0.4.5] — 2026-08-31
|
||
|
||
### Corrigé
|
||
- **Tunnel « connecté » sans jamais négocier de handshake** : la clé pré-partagée (PresharedKey)
|
||
n'était écrite dans aucune configuration client. L'assistant « Générer config serveur + client »
|
||
en produisait une, visible à l'écran, mais impossible à enregistrer ; et l'import d'un fichier
|
||
`.conf` l'ignorait purement et simplement. Face à un serveur qui en attend une, le tunnel montait,
|
||
l'interface existait, l'application affichait « Connecté » — et pas un paquet ne passait. La clé
|
||
pré-partagée est désormais un champ à part entière : saisie, importée, exportée et écrite dans la
|
||
configuration du tunnel.
|
||
- **Latence du serveur jamais mesurée hors système anglophone** : la sortie de `ping` est traduite
|
||
(« temps= » en français), et seule la forme anglaise était reconnue. Un serveur qui répondait
|
||
correctement était rapporté comme injoignable.
|
||
|
||
### Ajouté
|
||
- **Diagnostic complet de la chaîne de connexion** : le bouton « Lancer le test de connexion »
|
||
ne se contentait plus d'un simple test UDP. Il déroule maintenant toute la chaîne et désigne
|
||
l'étape exacte qui bloque : présence de WireGuard, complétude de la configuration, cohérence de
|
||
la paire de clés du client, clé pré-partagée, résolution du nom du serveur, route empruntée,
|
||
cohérence des « IPs autorisées », ping ICMP, port UDP, montage du tunnel, handshake, trafic
|
||
chiffré, joignabilité du pair distant et résolution DNS dans le tunnel.
|
||
- **Détection des deux pièges de routage classiques** : l'adresse du serveur incluse dans les
|
||
« IPs autorisées » (le tunnel se coupe l'herbe sous le pied dès qu'il monte) et le réseau local
|
||
couvert par ces mêmes plages (imprimante, NAS et box basculent dans le VPN).
|
||
- **Champ MTU** : réglable, laissé automatique par défaut, importé et exporté avec les fichiers `.conf`.
|
||
- **Bouton « Appliquer le volet client »** dans l'assistant de génération : reporte clés et clé
|
||
pré-partagée directement dans la configuration, au lieu de les laisser dans une fenêtre à recopier.
|
||
|
||
### Modifié
|
||
- **Statistiques du tunnel** : le dernier handshake est lu via `wg show latest-handshakes`, ce qui
|
||
permet d'en donner l'ancienneté exacte et de signaler un pair qui a cessé de répondre.
|
||
|
||
## [0.4.4] — 2026-08-31
|
||
|
||
### Corrigé
|
||
- **Tunnel impossible à monter sous Windows** : les commandes envoyées à `wireguard.exe`
|
||
utilisaient des options qui n'existent pas (`/installtunnel`, `/uninstalltunnel`). WireGuard
|
||
affichait sa boîte d'aide et sortait sans rien faire : le bouton « Connecter » ne montait jamais
|
||
le tunnel. Les vraies options `/installtunnelservice` et `/uninstalltunnelservice` sont
|
||
désormais utilisées.
|
||
- **WireGuard déclaré absent sous Windows** : l'installateur WireGuard n'ajoute pas son
|
||
répertoire au PATH, et l'application cherchait `wireguard.exe` et `wg.exe` sans chemin. Ils sont
|
||
maintenant localisés dans `C:\Program Files\WireGuard`.
|
||
- **« Accès refusé » silencieux sous Windows** : installer ou retirer un tunnel exige les droits
|
||
administrateur, qui n'étaient jamais demandés. Une invite UAC apparaît désormais au moment
|
||
voulu, et l'annulation de cette invite est signalée clairement.
|
||
- **Détection de WireGuard toujours négative sous Windows** : le test d'installation lançait
|
||
`wireguard --help`, une option inexistante sur une application graphique. La présence du
|
||
logiciel est maintenant vérifiée sur le disque.
|
||
- **Échec annoncé sur un tunnel qui montait** : le service du tunnel démarre de façon asynchrone
|
||
et l'état était vérifié trop tôt. L'application attend désormais son démarrage effectif.
|
||
|
||
### Ajouté
|
||
- **Statistiques du tunnel sous Windows** : volumes envoyés/reçus, pair et dernier handshake,
|
||
jusqu'ici affichés vides.
|
||
|
||
## [0.4.3] — 2026-08-31
|
||
|
||
### Corrigé
|
||
- **Fenêtres noires clignotantes sous Windows** : l'application interroge en continu l'état du
|
||
tunnel et la latence du serveur, et chacune de ces vérifications ouvrait brièvement une fenêtre
|
||
de commande. Des fenêtres DOS apparaissaient et disparaissaient en permanence pendant toute
|
||
l'utilisation du logiciel. Ces appels s'exécutent désormais de façon totalement invisible.
|
||
|
||
## [0.4.2] — 2026-08-31
|
||
|
||
### Corrigé
|
||
- **Binaire Windows qui ne démarrait pas** : le paquetage PyInstaller sous Wine oubliait
|
||
d'embarquer le plugin Qt nécessaire au rendu de l'interface graphique sous Windows, faisant
|
||
échouer l'application dès le lancement avec l'erreur « no Qt platform plugin could be
|
||
initialized ». Le plugin est désormais inclus systématiquement dans le binaire.
|
||
|
||
## [0.4.1] — 2026-08-31
|
||
|
||
### Corrigé
|
||
- **Plus d'accès internet après déconnexion du VPN** : `wg-quick down` refusait de s'exécuter
|
||
quand l'interface avait disparu sans passage par lui (crash, arrêt brutal, veille) et ne
|
||
retirait donc jamais l'entrée DNS posée par `wg-quick up` — la résolution de noms restait
|
||
pointée vers un serveur devenu injoignable. Nettoyage DNS désormais garanti à la connexion,
|
||
la déconnexion, la fermeture de l'application et au démarrage suivant.
|
||
- **Détection de connexion fiabilisée** : `wg show` retourne un code de succès même en cas de
|
||
refus de permission pour un utilisateur non administrateur — l'application se croyait
|
||
déconnectée en permanence et ne démontait donc jamais le tunnel à la fermeture. Détection
|
||
réécrite sans nécessiter de privilèges.
|
||
- **Interface figée pendant la connexion/déconnexion** : les commandes réseau (souvent
|
||
accompagnées d'une demande de mot de passe) tournaient sur le thread graphique et gelaient
|
||
la fenêtre. Déportées en tâche de fond.
|
||
- **Dialogues d'authentification répétés à chaque connexion** : la détection « sudo demande un
|
||
mot de passe » ne fonctionnait pas en session non anglophone ni pour les comptes disposant
|
||
de tous les droits sudo, et l'écriture de la configuration WireGuard n'était couverte par
|
||
aucune règle sudo autorisée. Chaîne de privilèges revue de bout en bout.
|
||
- Restauration garantie de l'état réseau à la fermeture de l'application, sous Linux comme
|
||
sous Windows (fermeture normale, icône système, signal d'arrêt, plantage).
|
||
|
||
### Ajouté
|
||
- Diagnostic des droits d'exécution (`make check-privileges` et bouton dans le panneau Admin)
|
||
pour identifier précisément quelle commande déclenche un dialogue d'authentification.
|
||
- Avertissement lorsqu'un tunnel WireGuard tourne en dehors de WGSecure (autre nom
|
||
d'interface), cause fréquente de coupure DNS non détectée jusqu'ici.
|
||
|
||
---
|
||
|
||
## [0.2.0] — 2026-06-01
|
||
|
||
### Ajouté
|
||
- **Onglet "À propos"** dans le panneau admin : logo bouclier, version, branding JT-Tools by Johnny
|
||
- **Icône bouclier vectorielle** générée par QPainter (7 résolutions : 16→256 px)
|
||
- Vert connecté / Rouge déconnecté / Orange connexion en cours / Bleu app / Violet admin
|
||
- **Icône barre des tâches** : installation automatique de `~/.local/share/icons/wgsecure.png`
|
||
et `~/.local/share/applications/wgsecure.desktop` au premier démarrage
|
||
- **Thème sombre uniforme** sur les 6 onglets du panneau admin (CSS partagé `_TAB_CSS`)
|
||
- Fond `#1c2833`, texte blanc, champs semi-transparents
|
||
- Bandeau coloré par onglet (bleu/navy/teal/bleu/rouge)
|
||
- TabBar cohérente avec onglet actif mis en évidence
|
||
- **Makefile** : compilation binaire Linux (`make linux`) et Windows (`make windows` via Wine)
|
||
- **README** enrichi avec badges shields.io (version, Python, PyQt6, plateformes) et emojis
|
||
|
||
### Corrigé
|
||
- **Bug MDP vide** : `set_admin_password("")` effaçait incorrectement — hashait la chaîne vide,
|
||
forçant une demande de mot de passe vide après suppression
|
||
- **Menu systray incomplet** : `QAction` en variables locales GC'd par Python avant affichage →
|
||
toutes les actions passent désormais `self` comme parent Qt
|
||
- **Section infos invisible** : `QWidget` sans `autoFillBackground` ne peignait pas son fond ;
|
||
remplacé par `QFrame` avec `setAutoFillBackground(True)` et couleurs explicites
|
||
- **Bouton agrandir persistant** : `setWindowFlag` seul ignoré par Mutter/XWayland →
|
||
`setWindowFlags()` complet sans `WindowMaximizeButtonHint`
|
||
|
||
### Amélioré
|
||
- Fenêtre principale agrandie 380×460 → 400×520 pour afficher les 6 lignes d'infos
|
||
- Police des labels infos : 11 → 12 px, couleurs explicites `#2c3e50`
|
||
- Panneau admin : largeur 620 → 700 px pour éviter le débordement des onglets
|
||
- `app.setWindowIcon()` posé sur `QApplication` (multi-tailles) + `setDesktopFileName()`
|
||
- Page About : icône 96 → 86 px (−10 %), texte en blanc sur fond sombre `#1c2833`
|
||
|
||
---
|
||
|
||
## [0.1.0] — 2026-06-01
|
||
|
||
### Ajouté
|
||
- Interface graphique PyQt6 avec icône systray (Linux & Windows)
|
||
- **Mode User** (défaut) : connexion / déconnexion WireGuard en un clic, statut en temps réel
|
||
- **Mode Admin** (`--admin` ou via le menu) protégé par mot de passe
|
||
- Panneau Admin avec 5 onglets :
|
||
- **WireGuard** : configuration serveur (adresse, port UDP, clé publique, DNS, IP client)
|
||
- **Clés** : génération de paires Curve25519 (clé privée / publique), aperçu config exportable
|
||
- **MFA** : génération de secret TOTP, QR Code compatible Google Authenticator / Aegis
|
||
- **Test connexion** : vérification UDP du serveur avant tunnel
|
||
- **Sécurité** : gestion du mot de passe administrateur (SHA-256 + salt)
|
||
- Surcouche MFA : dialogue TOTP avec minuterie de validité (fenêtre glissante ±1)
|
||
- Génération de clés WireGuard via `cryptography` (X25519, sans `wg` binaire)
|
||
- Écriture automatique du fichier `.conf` WireGuard avec permissions `0600`
|
||
- Connexion via `wg-quick` (Linux) ou `wireguard /installtunnel` (Windows)
|
||
- Statut temps réel : trafic RX/TX, dernier handshake
|
||
- Réduction dans le systray à la fermeture de la fenêtre principale
|
||
- Configuration persistante JSON (`~/.wgsecure/config.json`)
|
||
|
||
---
|
||
|
||
*Versions planifiées :*
|
||
- `0.3.0` — Import/export de profils WireGuard (.conf), support multi-profils
|
||
- `0.4.0` — MFA par clé matérielle (FIDO2/YubiKey)
|
||
- `0.5.0` — Paquet installable (Windows .exe / Linux .deb)
|