Files
WGSecure/wgsecure.iss
T
tuxgyverandClaude Sonnet 5 e272b9397e chore(release): v0.7.19
Sécurité : la clé privée ne subsiste plus en clair dans %APPDATA%.
Le .conf généré est écrasé puis supprimé dès que wireguard.exe l'a
consommé (il en garde sa propre copie chiffrée DPAPI), et l'import
propose d'effacer le fichier source. Windows uniquement : sous Linux
/etc/wireguard/<iface>.conf reste requis par wg-quick down.

Corrige aussi ImpersonateNamedPipeClient, qui appartient à
win32security et non à win32pipe (vérifié par introspection).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-05 08:36:16 +02:00

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.7.19"
#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;