L'autorisation obtenue auprès du serveur a un terme, mais le client n'en tenait aucun compte : `access_until`, pourtant renvoyé à chaque validation, ne servait qu'à composer une ligne de journal. L'accès était marqué ouvert jusqu'à la chute du tunnel, si bien qu'une fois le délai écoulé l'interface affichait « Ouvert ✓ » et masquait le bouton comme l'entrée de systray — laissant l'utilisateur devant un réseau muet, sans issue visible, dans la situation même que ce bouton existe pour couvrir depuis la v0.8.2. L'échéance remonte désormais jusqu'à la fenêtre principale, qui la relit sans jamais la calculer : sa durée est un réglage serveur, que le poste n'a pas à deviner. Un serveur qui n'en annonce pas laisse l'accès ouvert jusqu'à la déconnexion, plutôt que de se voir imposer un terme inventé ici. Corrige au passage l'heure de fin, annoncée en UTC mais présentée comme locale — deux heures d'avance en été. 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.5"
|
|
#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;
|