From 21510d13f7ecd4a6eac5c78246a46b3a7e2b30b8 Mon Sep 17 00:00:00 2001 From: Johnny Date: Fri, 4 Sep 2026 17:04:34 +0200 Subject: [PATCH] chore(release): v0.7.9 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Corrige la SDDL invalide (erreur 1804) produite par le fix précédent quand le service porte une clause S: (SACL/étiquette d'intégrité), et les accents corrompus dans les messages d'erreur Windows (mauvais codepage/encodage lors de la capture de sortie). Co-Authored-By: Claude Sonnet 5 --- CHANGELOG.md | 8 ++++++++ Makefile | 2 +- README.md | 4 ++-- app/__init__.py | 2 +- app/ui/admin_window.py | 16 ++++++++++++---- app/utils/platform_utils.py | 28 +++++++++++++++++++++++----- wgsecure.iss | 2 +- 7 files changed, 48 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92f6cba..90bd09e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,14 @@ Ce projet suit le [Versionnage Sémantique](https://semver.org/lang/fr/). --- +## [0.7.9] — 2026-09-04 + +### Corrigé +- **`sc sdset` échouait toujours (erreur 1804, SDDL invalide).** Le correctif précédent ajoutait l'ACE en fin de chaîne SDDL, mais la sécurité d'un service porte souvent aussi une clause `S:` (SACL — étiquette d'intégrité obligatoire, ex. `S:(ML;;NW;;;LW)`) : l'ACE se retrouvait alors insérée après le `S:`, produisant une SDDL syntaxiquement invalide. L'ACE est désormais insérée à l'intérieur de la clause `D:`, avant tout `S:` éventuel. +- **Caractères accentués corrompus dans les messages d'erreur Windows** (« échoué » affiché « ‚chou‚ »). Les outils console natifs (`sc.exe`, PowerShell non-Core) écrivent dans le codepage OEM de la console (CP850 en français), pas en UTF-8 ni en ANSI : `run_command()` décode désormais explicitement avec ce codepage. Le fichier de capture d'une commande élevée (v0.7.7) utilisait quant à lui la redirection `*>` brute, qui écrit en UTF-16LE par défaut sous Windows PowerShell — remplacée par `Out-File -Encoding utf8` explicite, lu en UTF-8. + +--- + ## [0.7.8] — 2026-09-04 ### Corrigé diff --git a/Makefile b/Makefile index 17b77ef..7dc828c 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ ## ────────────────────────────────────────────── APP := wgsecure -VERSION := 0.7.8 +VERSION := 0.7.9 VENV := .venv PYTHON := $(VENV)/bin/python3 PIP := $(VENV)/bin/pip diff --git a/README.md b/README.md index f88e02e..c39030f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 🛡️ WGSecure (WGS) -🚀 v0.7.8 · 🐍 · 🪟🐧 · 🔐 MFA TOTP · 🛡️ WireGuard +🚀 v0.7.9 · 🐍 · 🪟🐧 · 🔐 MFA TOTP · 🛡️ WireGuard **WGSecure** est une interface graphique multiplateforme (Windows & Linux) pour gérer une connexion WireGuard avec une surcouche MFA (authentification à deux facteurs TOTP). @@ -210,4 +210,4 @@ WGSecure/ ## 👤 Auteur Développé par **Johnny** — [JT-Tools](https://github.com/JT-Tools) -Version : ![v0.7.8](https://img.shields.io/badge/v0.7.8-septembre%202026-2980b9?style=flat-square) — Septembre 2026 +Version : ![v0.7.9](https://img.shields.io/badge/v0.7.9-septembre%202026-2980b9?style=flat-square) — Septembre 2026 diff --git a/app/__init__.py b/app/__init__.py index 81939ea..619e93a 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,3 +1,3 @@ -__version__ = "0.7.8" +__version__ = "0.7.9" APP_NAME = "WGSecure" APP_SHORT = "WGS" diff --git a/app/ui/admin_window.py b/app/ui/admin_window.py index 86fc931..f66e4bf 100644 --- a/app/ui/admin_window.py +++ b/app/ui/admin_window.py @@ -1927,15 +1927,23 @@ if (-not $currentSddl) { } $currentSddl = $currentSddl.Trim() -# Ajouter l'utilisateur actuel avec les permissions nécessaires, à -# l'intérieur de la clause D: existante (jamais en concaténant deux -# préfixes "D:" distincts, ce qui produit une SDDL invalide) : +# Insérer l'ACE de l'utilisateur actuel à l'intérieur de la clause D: +# existante, jamais en l'ajoutant après toute la chaîne : la SDDL d'un +# service porte souvent aussi une clause S: (SACL — étiquette d'intégrité +# obligatoire notamment, ex. "S:(ML;;NW;;;LW)"). Un simple "+" à la fin +# insérait alors l'ACE *après* le S:, produisant une SDDL syntaxiquement +# invalide (erreur 1804, ConvertStringSecurityDescriptorToSecurityDescriptor) +# — d'où l'échec systématique constaté malgré une lecture correcte de la +# SDDL actuelle. # CC = Create Child (créer des services enfants) # LC = List Child (lister les services enfants) # SW = Self Write (modifier ses propres services) # LO = List Object (lister) # CR = Control (contrôle) -$fullSddl = $currentSddl + "(A;;CCLCSWLOCRRC;;;$currentUserSid)" +if ($currentSddl -notmatch '^(D:[A-Z]*)((?:\([^)]*\))*)(S:.*)?$') { + throw "Format de SDDL inattendu pour '$serviceName' : $currentSddl" +} +$fullSddl = $matches[1] + $matches[2] + "(A;;CCLCSWLOCRRC;;;$currentUserSid)" + $matches[3] $setOutput = & sc.exe sdset $serviceName $fullSddl if ($LASTEXITCODE -ne 0) { diff --git a/app/utils/platform_utils.py b/app/utils/platform_utils.py index 1159426..bc28d64 100644 --- a/app/utils/platform_utils.py +++ b/app/utils/platform_utils.py @@ -102,12 +102,20 @@ def _no_window_kwargs() -> dict: def run_command(cmd: list[str], timeout: int = 10, env: dict | None = None) -> tuple[int, str, str]: try: + text_kwargs = {"text": True} + if is_windows(): + # Les outils console natifs (sc.exe, PowerShell non-Core, ping…) + # écrivent dans le codepage OEM de la console (ex. CP850 en + # français), pas en UTF-8 : sans préciser l'encodage, Python + # décode avec le codepage ANSI par défaut et tout caractère + # accentué remonte corrompu ("échoué" → "‚chou‚"). + text_kwargs = {"encoding": "oem", "errors": "replace"} result = subprocess.run( cmd, capture_output=True, - text=True, timeout=timeout, env=env, + **text_kwargs, **_no_window_kwargs(), ) return result.returncode, result.stdout.strip(), result.stderr.strip() @@ -215,10 +223,18 @@ def _run_elevated_windows(cmd: list[str], timeout: int = 60) -> tuple[int, str, ] out_path = os.path.join(tempfile.gettempdir(), f"wgsecure-elev-{uuid.uuid4().hex}.log") - # `*>` fusionne tous les flux (succès, erreur, avertissement…) — cohérent - # avec l'usage existant qui traite `err or out` indifféremment. + # `*>&1 | Out-File -Encoding utf8` plutôt que la redirection `*>` brute : + # cette dernière écrit en UTF-16LE (encodage par défaut de PowerShell + # Windows pour `>`/`*>`), que la lecture Python en UTF-8 corromprait + # (accents illisibles). `*>&1` fusionne tous les flux (succès, erreur, + # avertissement…) dans le flux de sortie avant le pipe, comme le faisait + # `*>` seul — cohérent avec l'usage existant qui traite `err or out` + # indifféremment. call_expr = "& " + " ".join(_ps_quote(a) for a in cmd) - wrapped_script = f"{call_expr} *> {_ps_quote(out_path)}; exit $LASTEXITCODE" + wrapped_script = ( + f"{call_expr} *>&1 | Out-File -FilePath {_ps_quote(out_path)} -Encoding utf8; " + f"exit $LASTEXITCODE" + ) elevated_cmd = ["powershell", "-NoProfile", "-NonInteractive", "-Command", wrapped_script] info = SHELLEXECUTEINFOW() @@ -239,7 +255,9 @@ def _run_elevated_windows(cmd: list[str], timeout: int = 60) -> tuple[int, str, def _read_output() -> str: try: - with open(out_path, encoding="utf-8", errors="replace") as f: + # utf-8-sig : Out-File -Encoding utf8 (Windows PowerShell) + # ajoute un BOM ; -sig l'ignore silencieusement s'il est présent. + with open(out_path, encoding="utf-8-sig", errors="replace") as f: return f.read().strip() except OSError: return "" diff --git a/wgsecure.iss b/wgsecure.iss index 9a8b19f..f6daf5f 100644 --- a/wgsecure.iss +++ b/wgsecure.iss @@ -5,7 +5,7 @@ ; ────────────────────────────────────────────── #define MyAppName "WGSecure" -#define MyAppVersion "0.7.8" +#define MyAppVersion "0.7.9" #define MyAppPublisher "WGSecure" #define MyAppExeName "wgsecure.exe"