"Manifest file is missing."]); } $decoded = json_decode((string) file_get_contents($manifestFile), true); if (!is_array($decoded)) { updateServerRespond(500, ["error" => "Manifest file is not valid JSON."]); } $latest = trim((string) ($decoded["latest"] ?? "")); $releases = isset($decoded["releases"]) && is_array($decoded["releases"]) ? $decoded["releases"] : []; if ($latest === "" || !updateServerValidateVersion($latest)) { updateServerRespond(404, ["error" => "No valid latest release is configured."]); } if (!isset($releases[$latest]) || !is_array($releases[$latest])) { updateServerRespond(404, ["error" => "Latest release entry is missing."]); } $release = $releases[$latest]; $version = trim((string) ($release["version"] ?? $latest)); $package = trim((string) ($release["package"] ?? "")); $sha256 = strtolower(trim((string) ($release["sha256"] ?? ""))); $publishedAt = trim((string) ($release["published_at"] ?? "")); $size = isset($release["size"]) ? (int) $release["size"] : 0; if ($version !== $latest || !updateServerValidateVersion($version)) { updateServerRespond(500, ["error" => "Latest release version is invalid."]); } if ($package === "" || str_contains($package, "\0") || str_starts_with($package, "/")) { updateServerRespond(500, ["error" => "Latest release package path is invalid."]); } if (!preg_match('/^[a-f0-9]{64}$/', $sha256)) { updateServerRespond(500, ["error" => "Latest release checksum is invalid."]); } $packagePath = realpath($baseDir . "/" . $package); $packagesDir = realpath($baseDir . "/packages"); if ( $packagePath === false || $packagesDir === false || !str_starts_with($packagePath, $packagesDir . DIRECTORY_SEPARATOR) || !is_file($packagePath) ) { updateServerRespond(404, ["error" => "Latest release package is missing."]); } if ($size <= 0) { $size = filesize($packagePath) ?: 0; } updateServerRespond(200, [ "latest" => $latest, "version" => $version, "package_url" => updateServerNormalizePackageUrl($version), "sha256" => $sha256, "size" => $size, "published_at" => $publishedAt, ]);