Fix latent identifié en marge du v1.0.6 : UpdateChecker.CheckAsync retournait toujours la plus haute version disponible sans filtrer par isBeta, indépendamment des droits de la license courante. Conséquence possible : un client sans droits beta pouvait recevoir un popup « Nouvelle version disponible : 1.5.4.32 » puis ne pas voir cette version dans la liste (RebuildList applique le filtre canSeeBetas), et au clic il n'aurait pas pu la télécharger (entitlement backend). UX incohérente + confusion opérationnelle. Fix : IUpdateChecker.CheckAsync prend maintenant un paramètre `bool canSeeBetas`. UpdateChecker filtre les entrées isBeta=true de la sélection LatestRemote quand ce flag est false. Le manifest complet reste retourné dans le UpdateCheckResult pour le rendu ultérieur — seule la variable "quelle version est proposée comme MAJ ?" est concernée. Côté caller (MainViewModel.CheckForUpdatesAsync), on passe `_license?.CanSeeBetas ?? false` — même défaut que RebuildList, comportement cohérent bout-en-bout. Rétrocompat : aucun autre caller de CheckAsync dans le codebase (grep vérifié). Le nouveau param est requis mais n'a qu'un site d'appel. Bump : 1.0.6 → 1.0.7 (petit fix isolé, mérite d'être tracé séparément puisque la sémantique change). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
136 lines
7.6 KiB
Plaintext
136 lines
7.6 KiB
Plaintext
; Script Inno Setup pour PS_Launcher
|
|
; Compilation : ouvrir avec Inno Setup Compiler (https://jrsoftware.org/isdl.php)
|
|
; ou en ligne de commande :
|
|
; "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" PSLauncher.iss
|
|
;
|
|
; Avant compile :
|
|
; 1. Faire `dotnet publish src/PSLauncher.App -c Release` (génère PS_Launcher.exe ~77 Mo)
|
|
; 2. Faire `dotnet publish src/PSLauncher.Updater -c Release` (génère PS_Launcher.Updater.exe ~10 Mo)
|
|
;
|
|
; Le script picore directement les binaires dans bin/Release/.../publish/.
|
|
|
|
#define MyAppName "PROSERVE Launcher"
|
|
#define MyAppShortName "PS_Launcher"
|
|
#define MyAppVersion "1.0.7"
|
|
#define MyAppPublisher "ASTERION VR"
|
|
#define MyAppURL "https://asterionvr.com"
|
|
#define MyAppExeName "PS_Launcher.exe"
|
|
#define MyUpdaterExeName "PS_Launcher.Updater.exe"
|
|
|
|
[Setup]
|
|
; AppId est UNIQUE pour PSLauncher — ne pas changer entre deux versions sinon
|
|
; chaque release créera une nouvelle entrée dans Programmes et fonctionnalités.
|
|
AppId={{8A4F3E1B-9D2C-4A6B-8F5E-3C7A1D9B4E2F}
|
|
AppName={#MyAppName}
|
|
AppVersion={#MyAppVersion}
|
|
AppVerName={#MyAppName} {#MyAppVersion}
|
|
AppPublisher={#MyAppPublisher}
|
|
AppPublisherURL={#MyAppURL}
|
|
AppSupportURL={#MyAppURL}
|
|
AppUpdatesURL={#MyAppURL}
|
|
; Installation system-wide dans Program Files. {autopf} résout vers
|
|
; "C:\Program Files" sur cible 64-bit (cf. ArchitecturesInstallIn64BitMode=x64
|
|
; ci-dessous). PrivilegesRequired=admin → UAC à l'install, et UAC à chaque
|
|
; self-update du launcher (LauncherSelfUpdater détecte automatiquement le
|
|
; dossier non-writable et lance PS_Launcher.Updater.exe avec Verb="runas").
|
|
; Le staging du nouveau .exe avant swap reste dans %LocalAppData%\PSLauncher\
|
|
; selfupdate\, user-writable et lisible depuis l'updater élevé.
|
|
DefaultDirName={autopf}\{#MyAppPublisher}\{#MyAppShortName}
|
|
DefaultGroupName={#MyAppName}
|
|
DisableProgramGroupPage=yes
|
|
OutputDir=output
|
|
OutputBaseFilename=PS_Launcher-Setup-{#MyAppVersion}
|
|
SetupIconFile=..\src\PSLauncher.App\Resources\favicon.ico
|
|
Compression=lzma2/ultra
|
|
SolidCompression=yes
|
|
WizardStyle=modern
|
|
PrivilegesRequired=admin
|
|
UsedUserAreasWarning=no
|
|
ArchitecturesAllowed=x64
|
|
ArchitecturesInstallIn64BitMode=x64
|
|
UninstallDisplayName={#MyAppName}
|
|
UninstallDisplayIcon={app}\{#MyAppExeName}
|
|
VersionInfoVersion={#MyAppVersion}
|
|
VersionInfoCompany={#MyAppPublisher}
|
|
VersionInfoProductName={#MyAppName}
|
|
|
|
[Languages]
|
|
Name: "french"; MessagesFile: "compiler:Languages\French.isl"
|
|
Name: "english"; MessagesFile: "compiler:Default.isl"
|
|
|
|
[Tasks]
|
|
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
|
|
|
|
[Files]
|
|
Source: "..\src\PSLauncher.App\bin\Release\net8.0-windows10.0.17763.0\win-x64\publish\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
|
|
Source: "..\src\PSLauncher.Updater\bin\Release\net8.0-windows\win-x64\publish\{#MyUpdaterExeName}"; DestDir: "{app}"; Flags: ignoreversion
|
|
Source: "..\docs\PS_Launcher-Guide-Utilisateur.pptx"; DestDir: "{app}\docs"; Flags: ignoreversion
|
|
; WebView2 Evergreen Bootstrapper (Microsoft, redistribuable). 1.6 MB.
|
|
; Téléchargé depuis https://go.microsoft.com/fwlink/p/?LinkId=2124703
|
|
; Exécuté en silencieux à l'install SI WebView2 Runtime n'est pas déjà présent
|
|
; (vérification registre via la fonction Pascal IsWebView2Installed ci-dessous).
|
|
; Sans ça, sur un Win10/Server sans WebView2 préinstallé, la fenêtre du launcher
|
|
; reste toute blanche au démarrage parce que les contrôles WebView2 (Reports +
|
|
; Documentation) ne peuvent pas s'initialiser et plantent en silence le rendu UI.
|
|
Source: "redists\MicrosoftEdgeWebview2Setup.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall; Check: not IsWebView2Installed
|
|
|
|
[Icons]
|
|
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
|
|
Name: "{group}\Guide utilisateur"; Filename: "{app}\docs\PS_Launcher-Guide-Utilisateur.pptx"; IconFilename: "{app}\{#MyAppExeName}"
|
|
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
|
|
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
|
|
|
|
[Run]
|
|
; Installe WebView2 Runtime si pas déjà présent. /silent /install = install
|
|
; non-interactif. Le bootstrapper télécharge ~150 MB depuis Microsoft (1-2 min
|
|
; selon la connexion). StatusMsg pour que l'utilisateur voie ce qu'il se passe.
|
|
; Code exit attendu : 0 (déjà installé OU install réussie). On ne fail pas le
|
|
; setup global même si ça échoue — le launcher logue ensuite l'absence si ça
|
|
; pose problème, plutôt que de bloquer toute l'installation pour ça.
|
|
Filename: "{tmp}\MicrosoftEdgeWebview2Setup.exe"; Parameters: "/silent /install"; StatusMsg: "Installation du composant Microsoft Edge WebView2 Runtime (~150 MB, peut prendre 1-2 min)..."; Check: not IsWebView2Installed; Flags: waituntilterminated
|
|
|
|
; Règles firewall pour le cache LAN P2P. Profile=private,domain (PAS public) =
|
|
; safety net : même si l'utilisateur connecte le PC à un Wi-Fi public, le port
|
|
; reste fermé. Le filtre RFC1918 dans LanCacheServer.cs est la première barrière,
|
|
; ces règles sont la deuxième. runhidden = pas de console visible à l'install.
|
|
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""PSLauncher LAN Cache HTTP"" dir=in action=allow program=""{app}\{#MyAppExeName}"" protocol=TCP localport=47623 profile=private,domain"; Flags: runhidden
|
|
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall add rule name=""PSLauncher LAN Discovery"" dir=in action=allow program=""{app}\{#MyAppExeName}"" protocol=UDP localport=47624 profile=private,domain"; Flags: runhidden
|
|
|
|
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent
|
|
|
|
[UninstallRun]
|
|
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall delete rule name=""PSLauncher LAN Cache HTTP"""; Flags: runhidden
|
|
Filename: "{sys}\netsh.exe"; Parameters: "advfirewall firewall delete rule name=""PSLauncher LAN Discovery"""; Flags: runhidden
|
|
|
|
[UninstallDelete]
|
|
; Ne touche PAS au cache utilisateur (%LocalAppData%\PSLauncher) ni aux versions installées
|
|
; (qui peuvent vivre dans n'importe quel installRoot configuré). On supprime uniquement les
|
|
; binaires installés et le dossier d'install s'il est vide après.
|
|
Type: filesandordirs; Name: "{app}\*.bak"
|
|
Type: dirifempty; Name: "{app}"
|
|
|
|
[Code]
|
|
// Détecte si Microsoft Edge WebView2 Runtime est déjà installé sur le système.
|
|
// Référence : https://learn.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution
|
|
//
|
|
// 3 emplacements registre possibles selon le contexte d'install du runtime :
|
|
// - HKLM 64-bit (machine-wide, install par admin)
|
|
// - HKLM 32-bit (machine-wide, parfois utilisé par les versions plus anciennes)
|
|
// - HKCU (user-only, install par utilisateur sans admin)
|
|
//
|
|
// La clé contient une valeur 'pv' avec la version installée. Présence non vide
|
|
// = runtime présent. Le check Edge classique (HKLM\...\Edge\BLBeacon) ne suffit
|
|
// pas parce qu'Edge stable ≠ WebView2 Runtime (deux composants distincts).
|
|
function IsWebView2Installed(): Boolean;
|
|
var
|
|
PV: String;
|
|
begin
|
|
Result := False;
|
|
if RegQueryStringValue(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}', 'pv', PV) and (PV <> '') and (PV <> '0.0.0.0') then
|
|
Result := True
|
|
else if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}', 'pv', PV) and (PV <> '') and (PV <> '0.0.0.0') then
|
|
Result := True
|
|
else if RegQueryStringValue(HKCU, 'Software\Microsoft\EdgeUpdate\Clients\{F3017226-FE2A-4295-8BDF-00C3A9A7E4C5}', 'pv', PV) and (PV <> '') and (PV <> '0.0.0.0') then
|
|
Result := True;
|
|
end;
|