Replace fixed Linux Hopper release pins with current vendor feed metadata, complete detached-PGP package verification under the stable publisher primary key, and authenticated package evidence for offline admission. Share parsed publisher facts across approved setup, doctor and the pre-execution guard. Preserve existing ownership, cancellation, private-display and cleanup rules. Fixes #3577 Normalize empty XDG settings, preserve backups during approved cache repair, and retain publisher cleanup through cancellation and shutdown. Exercise cold offline verification without reusing process-local proof state. Serialize approved cache publication across processes, restore old evidence on failure, and share the existing lease owner from process without changing its identities. Validation: 438 focused tests (six platform-related skips), full static/documentation checks, real Ubuntu 24.04 official Hopper 6.6.0 setup/CLI/MCP, offline ordinary-user admission, launcher mutation rejection, and cold/warm verification measurements. Official RPM metadata mismatch is tracked separately in #3578 and fails closed. BREAKING CHANGE: Older Linux Hopper builds admitted by the fixed allowlist now require retained publisher-signed package evidence or an approved update to the current public demo. Update explicit HOPPER_LAUNCHER_PATH values when migrating; the live feed exposes only its current release. Co-authored-by: Kaoru0822 <208281322+kaoru0822-kitauji@users.noreply.github.com> Co-authored-by: gensokyo-dev <342580529+gensokyo-dev@users.noreply.github.com>
32 lines
1.2 KiB
JavaScript
32 lines
1.2 KiB
JavaScript
import { once } from "node:events";
|
|
import { randomUUID } from "node:crypto";
|
|
import { rename } from "node:fs/promises";
|
|
import { join } from "node:path";
|
|
import { createInterface } from "node:readline";
|
|
|
|
import { acquireHopperReleaseCacheLease } from "../../dist/process/HopperLease.js";
|
|
|
|
// The parent prepares authenticated fixture evidence. Coordinate a real second
|
|
// process publishing it while another publisher is waiting for this lease.
|
|
const [cacheDirectory, launcherSha256, staged] = process.argv.slice(2);
|
|
const commands = createInterface({ input: process.stdin });
|
|
const command = once(commands, "line");
|
|
const acquired = await acquireHopperReleaseCacheLease({
|
|
cacheDirectory,
|
|
launcherSha256,
|
|
runId: randomUUID(),
|
|
});
|
|
if (!acquired.acquired) throw new Error("Fixture cache lease was already held");
|
|
try {
|
|
console.log(JSON.stringify({ held: true }));
|
|
const [action] = await command;
|
|
if (action === "publish") {
|
|
const target = join(cacheDirectory, launcherSha256);
|
|
await rename(target, `${target}.backup-${randomUUID()}`);
|
|
await rename(staged, target);
|
|
} else if (action !== "release") throw new Error("Unknown fixture action");
|
|
} finally {
|
|
await acquired.lease.release();
|
|
commands.close();
|
|
}
|