prepare_quit() attend les threads en cours avant toute destruction, mais sa liste en oubliait deux : le sondage d'état ajouté en 0.8.6 — ma régression — et le thread de validation de la fenêtre de saisie, parenté à cette fenêtre depuis la v0.8.2 et jamais attendu. Fermer la fenêtre de code pendant qu'une requête est en vol suffisait à avorter le process, ce qui arrive dès que le serveur tarde. Reproduit avec un serveur qui accepte sans jamais répondre, puis vérifié corrigé sur les deux chemins. Le sondage est ramené à 4 s : l'arrêt l'attend désormais, et dix secondes y seraient une interface figée. Son échec ne coûte rien, contrairement à une validation ratée qui gâche un code déjà saisi. Ajoute le temps restant sur la ligne Accès distant, et un repli pour les serveurs sans GET /api/session : sur un 404, le client observe si le trafic atteint le réseau distant plutôt que de réclamer un code déjà validé. Un 403 reste une réponse qui fait autorité. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
133 lines
5.9 KiB
Plaintext
133 lines
5.9 KiB
Plaintext
; ──────────────────────────────────────────────
|
|
; WGSecure (WGS) — Script Inno Setup
|
|
; Installeur Windows complet : WGSecure + WireGuard +
|
|
; Visual C++ Redistributable, chacun installé en silence si absent.
|
|
; ──────────────────────────────────────────────
|
|
|
|
#define MyAppName "WGSecure"
|
|
#define MyAppVersion "0.8.7"
|
|
#define MyAppPublisher "WGSecure"
|
|
#define MyAppExeName "wgsecure.exe"
|
|
|
|
[Setup]
|
|
AppId={{8F3B2C1A-7D4E-4A9B-9C6F-1E2D3F4A5B6C}
|
|
AppName={#MyAppName}
|
|
AppVersion={#MyAppVersion}
|
|
AppPublisher={#MyAppPublisher}
|
|
DefaultDirName={autopf}\{#MyAppName}
|
|
DefaultGroupName={#MyAppName}
|
|
DisableProgramGroupPage=yes
|
|
OutputDir=dist
|
|
OutputBaseFilename=wgsecure-{#MyAppVersion}-setup
|
|
Compression=lzma2
|
|
SolidCompression=yes
|
|
ArchitecturesAllowed=x64compatible
|
|
ArchitecturesInstallIn64BitMode=x64compatible
|
|
PrivilegesRequired=admin
|
|
|
|
[Languages]
|
|
Name: "french"; MessagesFile: "compiler:Languages\French.isl"
|
|
|
|
[Files]
|
|
Source: "dist\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
|
|
; Service privilégié optionnel (cf. app/service/, `make helper`) : installe/
|
|
; désinstalle le tunnel et pose/retire les règles NRPT (split-DNS) en
|
|
; LocalSystem, pour éviter une invite d'authentification à chaque connexion/
|
|
; déconnexion. skipifsourcedoesntexist : le build peut être absent (composant
|
|
; optionnel, pas encore généré sur toutes les machines de build) — dans ce
|
|
; cas l'app retombe simplement sur son chemin élevé existant.
|
|
Source: "dist\wgsecure-helper.exe"; DestDir: "{app}"; Flags: ignoreversion skipifsourcedoesntexist
|
|
; VC++ Redistributable x64 — téléchargé automatiquement par `make installer-deps` :
|
|
; https://aka.ms/vs/17/release/vc_redist.x64.exe → installer\VC_redist.x64.exe
|
|
Source: "installer\VC_redist.x64.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall
|
|
; WireGuard pour Windows — prérequis à WGSecure (fournit wg.exe, le pilote
|
|
; tunnel et le service WireGuardTunnel$ que wireguard.py pilote). Téléchargé
|
|
; automatiquement par `make installer-deps` :
|
|
; https://download.wireguard.com/windows-client/wireguard-installer.exe
|
|
; → installer\wireguard-installer.exe
|
|
Source: "installer\wireguard-installer.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall
|
|
|
|
[Icons]
|
|
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
|
|
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
|
|
|
|
[Run]
|
|
; Installation silencieuse du VC++ Redistributable si absent (corrige "Failed to load Python DLL: python312.dll")
|
|
Filename: "{tmp}\VC_redist.x64.exe"; Parameters: "/install /quiet /norestart"; StatusMsg: "Installation du composant Visual C++ Redistributable…"; Check: VCRedistNeedsInstall
|
|
; L'installeur officiel WireGuard s'exécute déjà sans assistant (juste une
|
|
; fenêtre de progression) : notre propre installeur tourne en admin
|
|
; (PrivilegesRequired=admin ci-dessus), donc pas d'UAC supplémentaire non plus.
|
|
; `waituntilterminated` : l'app ne doit pas démarrer avant que wg.exe existe.
|
|
Filename: "{tmp}\wireguard-installer.exe"; StatusMsg: "Installation de WireGuard…"; Check: WireGuardNeedsInstall; Flags: waituntilterminated
|
|
Filename: "{app}\{#MyAppExeName}"; Description: "Lancer {#MyAppName}"; Flags: nowait postinstall skipifsilent
|
|
|
|
[Code]
|
|
function VCRedistNeedsInstall: Boolean;
|
|
var
|
|
Version: String;
|
|
begin
|
|
// Clé présente si VC++ 2015-2022 x64 (v14+) déjà installé
|
|
Result := not RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\X64', 'Version', Version);
|
|
end;
|
|
|
|
function WireGuardNeedsInstall: Boolean;
|
|
begin
|
|
// WireGuard s'installe toujours dans le Program Files 64 bits, quelle que
|
|
// soit l'architecture de WGSecure : {pf} y pointe bien puisque
|
|
// ArchitecturesInstallIn64BitMode=x64compatible ci-dessus.
|
|
Result := not FileExists(ExpandConstant('{pf}\WireGuard\wireguard.exe'));
|
|
end;
|
|
|
|
// Enregistre et démarre le service privilégié (cf. app/service/) via
|
|
// Exec()+AddQuotes plutôt que des entrées [Run] à guillemets échappés
|
|
// ("" imbriqués) : une tentative précédente basée sur l'échappement de
|
|
// chaîne Inno Setup produisait une commande sc.exe invalide (silencieuse,
|
|
// aucune erreur visible pendant l'installation) alors que la même commande
|
|
// fonctionnait telle quelle lancée à la main — AddQuotes() gère le
|
|
// guillemetage de façon fiable, sans juggler des niveaux d'échappement
|
|
// imbriqués à la main.
|
|
procedure InstallHelperService;
|
|
var
|
|
ResultCode: Integer;
|
|
ExePath, Params: String;
|
|
begin
|
|
ExePath := ExpandConstant('{app}\wgsecure-helper.exe');
|
|
// Optionnel (skipifsourcedoesntexist dans [Files]) : n'enregistrer le
|
|
// service que si le binaire a bien été copié.
|
|
if not FileExists(ExePath) then
|
|
exit;
|
|
|
|
Params := 'create WGSecureHelper binPath= ' + AddQuotes(ExePath) +
|
|
' start= auto DisplayName= ' + AddQuotes('WGSecure Helper');
|
|
Exec(ExpandConstant('{sys}\sc.exe'), Params, '', SW_HIDE,
|
|
ewWaitUntilTerminated, ResultCode);
|
|
|
|
Exec(ExpandConstant('{sys}\sc.exe'), 'start WGSecureHelper', '', SW_HIDE,
|
|
ewWaitUntilTerminated, ResultCode);
|
|
end;
|
|
|
|
// sc.exe ignore silencieusement une commande sur un service déjà absent
|
|
// (ex. installeur généré sans le composant service) : pas besoin de tester
|
|
// son existence avant d'arrêter/supprimer.
|
|
procedure UninstallHelperService;
|
|
var
|
|
ResultCode: Integer;
|
|
begin
|
|
Exec(ExpandConstant('{sys}\sc.exe'), 'stop WGSecureHelper', '', SW_HIDE,
|
|
ewWaitUntilTerminated, ResultCode);
|
|
Exec(ExpandConstant('{sys}\sc.exe'), 'delete WGSecureHelper', '', SW_HIDE,
|
|
ewWaitUntilTerminated, ResultCode);
|
|
end;
|
|
|
|
procedure CurStepChanged(CurStep: TSetupStep);
|
|
begin
|
|
if CurStep = ssPostInstall then
|
|
InstallHelperService;
|
|
end;
|
|
|
|
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
|
|
begin
|
|
if CurUninstallStep = usUninstall then
|
|
UninstallHelperService;
|
|
end;
|