1, 'versions' => []]; return json_decode(file_get_contents($path), true) ?? []; } function saveManifest(string $path, array $manifest): void { // usort attend une référence — on ne peut pas lui passer `?? []` en PHP 8. if (isset($manifest['versions']) && is_array($manifest['versions'])) { usort($manifest['versions'], fn($a, $b) => version_compare($b['version'], $a['version'])); } file_put_contents( $path, json_encode($manifest, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n" ); } if ($_SERVER['REQUEST_METHOD'] === 'POST') { Auth::checkCsrf(); $action = $_POST['action'] ?? ''; $manifest = loadManifest($manifestPath); try { if ($action === 'set_launcher') { $lver = trim($_POST['launcher_version'] ?? ''); $lmin = trim($_POST['launcher_min_required'] ?? ''); if (!preg_match('/^\d+\.\d+\.\d+$/', $lver)) { throw new Exception('Numéro de version launcher invalide (X.Y.Z attendu).'); } if ($lmin !== '' && !preg_match('/^\d+\.\d+\.\d+$/', $lmin)) { throw new Exception('Numéro de version "minRequired" invalide.'); } $base = $config['base_url'] ?? 'https://asterionvr.com/PS_Launcher'; $manifest['launcher'] = [ 'version' => $lver, 'minRequired' => $lmin !== '' ? $lmin : '0.5.0', 'download' => [ 'url' => "{$base}/builds/launcher/PSLauncher-{$lver}.exe", 'sizeBytes' => 0, 'sha256' => 'REPLACE_AFTER_BUILD', ], 'releaseNotesUrl' => null, ]; saveManifest($manifestPath, $manifest); $message = "Section launcher mise à jour (v{$lver}). Upload PSLauncher-{$lver}.exe dans builds/launcher/ puis clique « Hasher le launcher + signer »."; } elseif ($action === 'remove_launcher') { unset($manifest['launcher']); saveManifest($manifestPath, $manifest); $message = "Section launcher retirée du manifest (auto-update désactivé)."; } elseif ($action === 'sync_launcher') { require_once "$root/tools/SignManifest.php"; $signer = new \PSLauncher\Tools\SignManifest($root); $force = !empty($_POST['force']); $result = $signer->run('launcher', $force); $forceLabel = $force ? ' [FORCE: cache ignoré]' : ''; $message = "Sortie du script (scope: launcher{$forceLabel}) :\n" . implode("\n", $result['log']); if (!$result['ok']) $messageType = 'error'; } } catch (Exception $e) { $message = $e->getMessage(); $messageType = 'error'; } } $manifest = loadManifest($manifestPath); $launcher = $manifest['launcher'] ?? null; $launcherFiles = is_dir("$buildsDir/launcher") ? array_map('basename', glob("$buildsDir/launcher/*.exe") ?: []) : []; $launcherZipPresent = false; $launcherHashed = false; if ($launcher) { $expectedFile = basename(parse_url($launcher['download']['url'] ?? '', PHP_URL_PATH) ?? ''); $launcherZipPresent = in_array($expectedFile, $launcherFiles, true); $launcherHashed = !empty($launcher['download']['sha256']) && !str_starts_with($launcher['download']['sha256'], 'REPLACE'); } Layout::header('Launcher', 'launcher'); ?>

Launcher — auto-update

État actuel

Version annoncée : v • minRequired : • Exe : présent" : "absent" ?> • Hash : OK" : "à calculer" ?> • Signature manifest : NON SIGNÉ" : "SIGNÉ Ed25519" ?>

URL attendue de l'exe :

Aucune version du launcher déclarée — l'auto-update est désactivé. Configure-la ci-dessous pour l'activer.

Workflow d'une nouvelle version du launcher

  1. Remplis le formulaire Définir / mettre à jour ci-dessous (ex : 0.6.0).
  2. Sur ton poste : dotnet publish src\PSLauncher.App -c Release et dotnet publish src\PSLauncher.Updater -c Release (les exes sont copiés à la racine du repo).
  3. Renomme la copie : PSLauncher.exe → PSLauncher-X.Y.Z.exe.
  4. Upload via SFTP dans www/PS_Launcher/builds/launcher/.
  5. Clique 🔁 Hasher le launcher + signer.
  6. Les launchers déjà déployés détecteront la nouvelle version au prochain « Vérifier les MAJ ».

Définir / mettre à jour

Exes présents dans builds/launcher/

Aucun exe pour l'instant. Upload les binaires via SFTP dans www/PS_Launcher/builds/launcher/.

FichierTaille