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/PS_Launcher-{$lver}.exe", 'sizeBytes' => 0, 'sha256' => 'REPLACE_AFTER_BUILD', ], 'releaseNotesUrl' => null, ]; saveManifest($manifestPath, $manifest); $message = "Section launcher mise à jour (v{$lver}). Upload PS_Launcher-{$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'); ?>
Version annoncée : v= htmlspecialchars($launcher['version']) ?>
• minRequired : = htmlspecialchars($launcher['minRequired'] ?? '—') ?>
• Exe : = $launcherZipPresent
? "présent"
: "absent" ?>
• Hash : = $launcherHashed
? "OK"
: "à calculer" ?>
• Signature manifest : = empty($manifest['signature'])
? "NON SIGNÉ"
: "SIGNÉ Ed25519" ?>
URL attendue de l'exe : = htmlspecialchars($launcher['download']['url']) ?>
Aucune version du launcher déclarée — l'auto-update est désactivé. Configure-la ci-dessous pour l'activer.
0.6.0).dotnet publish src\PSLauncher.App -c Release et dotnet publish src\PSLauncher.Updater -c Release (les exes sont copiés à la racine du repo).PS_Launcher.exe → PS_Launcher-X.Y.Z.exe.www/PS_Launcher/builds/launcher/.Aucun exe pour l'instant. Upload les binaires via SFTP dans www/PS_Launcher/builds/launcher/.
| Fichier | Taille |
|---|---|
= htmlspecialchars($f) ?> |
= Layout::formatBytes(filesize("$buildsDir/launcher/$f")) ?> |