j.foucher d52e29151e v1.0.5 — Fix /download-url sur manifests multi-channels (same-version)
Bug rapporté : sur un manifest avec deux entrées partageant le numéro de
version 1.5.4.32 (channels proserve-firefighter vs proserve-full), le
client se prenait au démarrage de l'install le garde-fou :

  « Incohérence serveur : l'endpoint /download-url retourne un nom de
    fichier différent du manifest. Manifest : proserve-full-1.5.4.32.zip.
    Signé : proserve-firefighter-1.5.4.32.zip. → DownloadUrl.php côté
    serveur doit lire le filename depuis manifest.download.url, pas via
    un template hardcodé. »

Root cause : DownloadUrl.php faisait un `foreach ... if version match {
break; }` — il retournait donc TOUJOURS la première entrée matchant le
numéro, quel que soit le channel réellement cliqué côté client. Pareil
que le bug de sync_one (même famille de problèmes), mais côté endpoint
runtime du client.

Fix côté serveur : /download-url accepte maintenant un query param optionnel
`?filename=proserve-full-1.5.4.32.zip`. Si présent, le foreach filtre sur
(numéro version AND basename(download.url) == filename attendu). Whitelist
défensive sur le filename (path traversal). Rétro-compat : sans param, le
1er match par numéro gagne comme avant.

Fix côté client : le client extrait le filename attendu de `row.Remote.
Download.Url` (déjà connu, signé Ed25519) et le passe à l'endpoint. Deux
sites d'appel modifiés : le call initial dans InstallVersionAsync + le
callback RefreshUrlAsync (utilisé quand un segment reçoit 403/410 mid-DL
et qu'il faut re-signer). Sans le refresh à jour, un DL long sur ADSL
tomberait au 1er refresh forcé.

Extension d'interface : ILicenseService.GetSignedDownloadUrlAsync prend
maintenant un `string? expectedFilename` en 2e param. Callers qui passent
null continuent de fonctionner comme avant (utile pour les tests).

Bump : 1.0.4 → 1.0.5 (bug fix ciblé sur les setups multi-channel).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-07-07 13:49:22 +02:00
2026-05-03 10:58:51 +02:00

PS_Launcher

Launcher Windows pour l'application UE5 PROSERVE : gère plusieurs versions cohabitantes, téléchargement et installation de nouvelles versions depuis un serveur, validation de license, release notes.

Composants

  • src/ — Solution C# / .NET 8 / WPF (Visual Studio 2022 + SDK .NET 8 requis)
    • PSLauncher.App : UI WPF (style Epic Games Launcher)
    • PSLauncher.Core : services (Manifest, Download, Install, Process…)
    • PSLauncher.Models : DTOs partagés
  • server/ — Code serveur PHP 8 (à déployer sous www/PS_Launcher/ sur OVH mutualisé)

Démarrage rapide (dev)

dotnet build PS_Launcher.sln
dotnet run --project src/PSLauncher.App

Pour produire un binaire autonome distribuable (un seul .exe ~70 Mo) :

dotnet publish src/PSLauncher.App -c Release
# Sortie : src/PSLauncher.App/bin/Release/net8.0-windows/win-x64/publish/PSLauncher.exe

Configuration locale

Le launcher écrit sa config dans %LocalAppData%\PSLauncher\config.json au premier lancement. Édite serverBaseUrl pour pointer vers ton serveur :

{
  "serverBaseUrl": "https://ton-domaine.com/PS_Launcher/api",
  "installRoot": "C:\\ASTERION\\GIT\\PS_Launcher\\ASTERION_VR"
}

État (roadmap)

  • v0.1 — Scan + lancement de versions installées
  • v0.2 — Manifest distant, download ZIP, install cohabitante, release notes Markdown
  • v0.3 — Reprise (HTTP Range), retry Polly, state.json
  • v0.4 — License (MySQL + Ed25519 + DPAPI)
  • v0.5 — Settings, suppression manuelle versions, toasts
  • v1.0 — Auto-update launcher, MSI installer

Voir le plan détaillé pour la roadmap complète.

Licence / interne

Repo interne ASTERION. Ne pas distribuer.

Description
No description provided
Readme 170 MiB
Languages
C# 46%
HTML 29%
PHP 23.3%
CSS 0.6%
Batchfile 0.5%
Other 0.6%