From d9c3f09e9a75a853e60b4e7efdbb073ac55dc9f4 Mon Sep 17 00:00:00 2001 From: "j.foucher" Date: Tue, 5 May 2026 09:37:19 +0200 Subject: [PATCH] =?UTF-8?q?v0.27.2=20=E2=80=94=20Persiste=20channel=20+=20?= =?UTF-8?q?canSeeBetas=20dans=20le=20cache=20license?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug : le LicenseValidationResponse réhydraté par GetCached() ne contenait plus les champs Channel et CanSeeBetas (introduits en v0.26.0). Cause : LocalConfig.LicenseConfig ne persistait pas ces deux champs, donc à chaque relance du launcher (ou simple GetCached), Channel retombait à null et CanSeeBetas à false. Conséquence visible : un client avec license channel='firefighter' côté serveur fetchait toujours /api/manifest (sans ?channel=), recevait le manifest default-only, et ne voyait jamais le build firefighter même après re-validation de license. Fix : - Ajout des champs CachedChannel + CachedCanSeeBetas sur LicenseConfig (persistés dans %LocalAppData%\PSLauncher\config.json) - SaveCached() écrit ces champs depuis la réponse signée du serveur - GetCached() les restaure dans la LicenseValidationResponse renvoyée Migration silencieuse : un launcher pre-v0.27.2 a CachedChannel=null et CachedCanSeeBetas=false dans son config.json. Au prochain Vérifier les MAJ, RefreshLicenseFromServerAsync re-valide la license, le serveur renvoie les valeurs courantes, SaveCached les persiste. La fois d'après le launcher fetch correctement avec ?channel=X. À tester chez l'utilisateur : 1. Recompiler + réinstaller le launcher en v0.27.2 2. Settings → Vérifier les MAJ (force la revalidation license) 3. Vérifier %LocalAppData%\PSLauncher\config.json : "CachedChannel": "firefighter" doit apparaître 4. Le manifest-cache.json devrait alors contenir le bon ZIP Co-Authored-By: Claude Opus 4.7 (1M context) --- installer/PSLauncher.iss | 2 +- src/PSLauncher.App/PSLauncher.App.csproj | 6 +++--- src/PSLauncher.Core/Licensing/LicenseService.cs | 9 +++++++++ src/PSLauncher.Models/LocalConfig.cs | 16 ++++++++++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/installer/PSLauncher.iss b/installer/PSLauncher.iss index c7b934c..f1a43c6 100644 --- a/installer/PSLauncher.iss +++ b/installer/PSLauncher.iss @@ -11,7 +11,7 @@ #define MyAppName "PROSERVE Launcher" #define MyAppShortName "PS_Launcher" -#define MyAppVersion "0.27.1" +#define MyAppVersion "0.27.2" #define MyAppPublisher "ASTERION VR" #define MyAppURL "https://asterionvr.com" #define MyAppExeName "PS_Launcher.exe" diff --git a/src/PSLauncher.App/PSLauncher.App.csproj b/src/PSLauncher.App/PSLauncher.App.csproj index 59017db..de7da73 100644 --- a/src/PSLauncher.App/PSLauncher.App.csproj +++ b/src/PSLauncher.App/PSLauncher.App.csproj @@ -18,9 +18,9 @@ PROSERVE Launcher © 2026 ASTERION VR — All rights reserved PSLauncher.App - 0.27.1 - 0.27.1.0 - 0.27.1.0 + 0.27.2 + 0.27.2.0 + 0.27.2.0 true diff --git a/src/PSLauncher.Core/Licensing/LicenseService.cs b/src/PSLauncher.Core/Licensing/LicenseService.cs index 2640294..eb9067b 100644 --- a/src/PSLauncher.Core/Licensing/LicenseService.cs +++ b/src/PSLauncher.Core/Licensing/LicenseService.cs @@ -212,6 +212,13 @@ public sealed class LicenseService : ILicenseService OwnerName = _config.License.CachedOwnerName, DownloadEntitlementUntil = _config.License.CachedEntitlementUntil, ServerTime = lastValidation, + // Restauration des champs channel + canSeeBetas (ajoutés persistants + // depuis v0.27.2). Sans ça, le channelProvider du ManifestService + // retombait sur null à chaque relance, le client fetch sans + // ?channel=, et l'utilisateur ne voyait que les versions default — + // jamais les builds spécifiques à son channel (firefighter, police…). + Channel = _config.License.CachedChannel, + CanSeeBetas = _config.License.CachedCanSeeBetas, }; } @@ -227,6 +234,8 @@ public sealed class LicenseService : ILicenseService _config.License.CachedOwnerName = response.OwnerName; _config.License.CachedEntitlementUntil = response.DownloadEntitlementUntil; _config.License.CachedStatus = response.Status; + _config.License.CachedChannel = response.Channel; + _config.License.CachedCanSeeBetas = response.CanSeeBetas; _configStore.Save(_config); } diff --git a/src/PSLauncher.Models/LocalConfig.cs b/src/PSLauncher.Models/LocalConfig.cs index 838c3b5..f65f11a 100644 --- a/src/PSLauncher.Models/LocalConfig.cs +++ b/src/PSLauncher.Models/LocalConfig.cs @@ -322,6 +322,22 @@ public sealed class LicenseConfig public DateTime? CachedEntitlementUntil { get; set; } public string? CachedOwnerName { get; set; } + /// + /// Channel de distribution attribué à cette license côté serveur (NULL = + /// aucun ⇒ accès uniquement aux versions taggées 'default'). Persisté ici + /// pour que restaure ce champ entre + /// deux lancements du launcher — sans ça, le channelProvider du + /// ManifestService retombait sur null à chaque relance et le client + /// fetchait toujours le manifest default. + /// + public string? CachedChannel { get; set; } + + /// + /// Flag canSeeBetas de la license. Persisté pour la même raison + /// que : restauration entre deux lancements. + /// + public bool CachedCanSeeBetas { get; set; } + /// /// Statut tel que renvoyé par le serveur lors de la dernière validation : "valid", /// "expired", "revoked", "invalid", "machine_limit_exceeded". Persisté pour qu'une