From 2f2da257c329a23efeb4d2b8cdf8feb03eb69dc4 Mon Sep 17 00:00:00 2001 From: tuxgyver Date: Tue, 8 Sep 2026 14:37:11 +0200 Subject: [PATCH] chore(release): v0.11.0 --- CHANGELOG.md | 23 +++++++++++++++++++++++ Makefile | 2 +- README.md | 4 ++-- app/__init__.py | 2 +- wgsecure.iss | 2 +- 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6373c06..b91bbc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,29 @@ Ce projet suit le [Versionnage Sémantique](https://semver.org/lang/fr/). --- +## [0.11.0] — 2026-09-08 + +### Ajouté +- **Mise à jour de l'application, servie par le serveur depuis l'intérieur du tunnel.** Les binaires ne peuvent pas venir du dépôt Gitea, qui est privé : un jeton embarqué dans une application distribuée est un jeton donné à tous ses utilisateurs. Ils viennent donc du serveur WGSecure, où le contrôle d'accès existe déjà — l'API n'est joignable que par le tunnel, et on y parvient parce que sa clé WireGuard y est déclarée. Aucun secret n'est embarqué dans le client. +- **Un bandeau propose la version disponible ; rien ne s'installe sans un clic.** La vérification est automatique — au montage du tunnel, puis toutes les demi-heures —, le téléchargement attend le bouton. Cette application monte un VPN : une version défaillante qui se propagerait seule couperait l'accès d'un parc entier sans que personne ne l'ait demandé. La croix rouge reporte la proposition pour la session ; elle revient au démarrage suivant. +- **Barre de progression** pendant le téléchargement, alimentée depuis le thread qui le mène. Sur une centaine de mégaoctets, l'application paraissait figée et rien ne distinguait une attente d'un échec. +- **L'artefact est vérifié contre son empreinte SHA-256 avant d'être mis en place**, et le fichier temporaire est détruit à la moindre anomalie. Le canal est déjà authentifié par WireGuard ; le condensat couvre ce que le chiffrement ne couvre pas — un téléchargement tronqué, un disque plein, un artefact mal publié. +- **Sous Windows, l'installation passe par le service**, qui tourne en LocalSystem et écrit dans Program Files sans invite d'élévation. La commande ne prend aucun paramètre : le service lit le manifeste, télécharge et vérifie lui-même. Lui passer un fichier déjà téléchargé aurait donné à tout compte du poste — le canal de communication est ouvert aux utilisateurs interactifs — le moyen de faire exécuter ce qu'il veut avec les privilèges du système. +- Nouvelle cible `make publish-updates`, qui dépose artefacts et manifeste sur le serveur. `ANNOUNCE=` annonce les binaires sous un autre numéro, pour exercer la chaîne sans compiler une seconde version. + +### Sécurité +- **Le service n'obéit plus qu'à un seul compte.** Le premier appelant devient propriétaire et son identifiant est retenu ; ensuite, seuls ce compte et les administrateurs sont servis. Le canal étant ouvert à tout utilisateur interactif, n'importe quel compte du poste pouvait jusqu'ici couper le tunnel d'un autre, ou poser une règle de résolution DNS valable pour la machine entière, sans être administrateur. +- **Le contenu d'un fichier `.conf` installé par le service est vérifié**, et non plus son seul chemin : les directives exécutables y sont refusées, la taille est bornée, la structure contrôlée. Elles auraient fait exécuter des commandes avec les privilèges du système. + +### Corrigé +- **Le remplacement du binaire échouait sous Linux** (« Fichier texte occupé »). Le téléchargement atterrissait dans `/tmp`, souvent un autre système de fichiers que la destination : la mise en place se faisait alors par copie, donc par écriture dans l'exécutable en cours, ce que le noyau refuse. Le fichier est désormais téléchargé à côté de sa destination et mis en place par renommage, qui ne touche qu'une entrée de répertoire et laisse le programme tourner jusqu'à sa fermeture. L'application propose ensuite de redémarrer, plutôt que de laisser deviner. +- **La mise à jour ne s'installait pas sous Windows.** Les deux exécutables à remplacer tournent au moment de la mise à jour, et Windows verrouille l'image d'un processus vivant : l'installeur, lancé de surcroît par le service dont il devait remplacer le binaire, abandonnait en silence. Il ferme maintenant l'application par le gestionnaire de redémarrage, arrête les tunnels et le service avant la copie — en attendant la libération réelle du fichier, l'ordre d'arrêt rendant la main avant la fin de celui-ci — et garde en dernier recours le remplacement au redémarrage. Le service, lui, lance l'installeur détaché sans l'attendre. +- **La proposition de mise à jour ne revenait jamais** si le serveur n'était pas joignable à l'instant précis où le tunnel montait — routes non encore posées, quarantaine en cours. La question se repose désormais toutes les demi-heures. +- **Le texte du bandeau était illisible** et deux boutons se disputaient l'attention. Un seul bouton vert, et une croix rouge pour reporter. +- **Compiler Linux puis Windows produisait des binaires corrompus.** Les deux cibles partageaient le répertoire de travail de PyInstaller, que l'option `--clean` vide au démarrage : lancées à la suite, chacune effaçait les fichiers intermédiaires de l'autre. Un installeur Windows gonflé de 44 Mo et un binaire Linux tronqué, dont l'archive ne se décompressait plus, ont été produits ainsi. Chaque cible a maintenant son propre répertoire. + +--- + ## [0.10.0] — 2026-09-08 ### Supprimé diff --git a/Makefile b/Makefile index cf61d0d..32fba4a 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ ## ────────────────────────────────────────────── APP := wgsecure -VERSION := 0.10.0 +VERSION := 0.11.0 VENV := .venv PYTHON := $(VENV)/bin/python3 PIP := $(VENV)/bin/pip diff --git a/README.md b/README.md index 048b53b..5dd5b8a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 🛡️ WGSecure (WGS) -🚀 v0.10.0 · 🐍 · 🪟🐧 · 🔐 Accès validé par le serveur · 🛡️ WireGuard +🚀 v0.11.0 · 🐍 · 🪟🐧 · 🔐 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**. @@ -210,4 +210,4 @@ WGSecure/ ## 👤 Auteur Développé par **Johnny** — [JT-Tools](https://github.com/JT-Tools) -Version : ![v0.10.0](https://img.shields.io/badge/v0.10.0-septembre%202026-2980b9?style=flat-square) — Septembre 2026 +Version : ![v0.11.0](https://img.shields.io/badge/v0.11.0-septembre%202026-2980b9?style=flat-square) — Septembre 2026 diff --git a/app/__init__.py b/app/__init__.py index c77bba4..f08987b 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,3 +1,3 @@ -__version__ = "0.10.0" +__version__ = "0.11.0" APP_NAME = "WGSecure" APP_SHORT = "WGS" diff --git a/wgsecure.iss b/wgsecure.iss index 0a0f8b7..8cb2c61 100644 --- a/wgsecure.iss +++ b/wgsecure.iss @@ -5,7 +5,7 @@ ; ────────────────────────────────────────────── #define MyAppName "WGSecure" -#define MyAppVersion "0.10.0" +#define MyAppVersion "0.11.0" #define MyAppPublisher "WGSecure" #define MyAppExeName "wgsecure.exe"