fix: replace inherited updater provider in Gitea packages

This commit is contained in:
2026-10-25 17:41:43 +03:00
parent 674d4bd8c6
commit 2da091d6e9
5 changed files with 34 additions and 11 deletions
+18 -4
View File
@@ -5,7 +5,7 @@ import os from "node:os";
import path from "node:path";
import { after, test } from "node:test";
import { createRequire } from "node:module";
import { expectedLinuxAssets, writeChecksums, verifyLocal, verifyRemote, UPDATE_URL } from "../scripts/gitea-release.mjs";
import { expectedLinuxAssets, writeChecksums, verifyLocal, verifyRemote, verifyPackagedUpdater, UPDATE_URL } from "../scripts/gitea-release.mjs";
const root = await fs.mkdtemp(path.join(os.tmpdir(), "lh-gitea-gate-"));
after(() => fs.rm(root, { recursive: true, force: true }));
@@ -39,6 +39,7 @@ test("updater cannot point at traversal paths, other versions, or substituted in
["traversal", (feed: any) => { feed.files[0].url = "../outside.AppImage"; }, /reference exactly/],
["version", (feed: any) => { feed.version = "0.3.7"; }, /metadata version/],
["hash", (feed: any) => { feed.files[0].sha512 = "bad"; }, /update checksum/],
["duplicate", (feed: any) => { feed.files.push({ ...feed.files[1] }); }, /reference exactly/],
] as const) {
const directory = await fixture(name);
const file = path.join(directory, "latest-linux.yml");
@@ -73,11 +74,24 @@ test("remote verification downloads and hashes every draft attachment, and refus
test("release configuration preserves packaging while replacing the upstream update origin", async () => {
const require = createRequire(import.meta.url);
const yaml = require("js-yaml");
const config = yaml.load(await fs.readFile(new URL("../electron-builder.gitea.yml", import.meta.url), "utf8"));
assert.equal(config.extends, "./electron-builder.yml");
assert.deepEqual(config.publish, [{ provider: "generic", url: UPDATE_URL }]);
const { getConfig } = require("app-builder-lib/out/util/config/config.js");
const config = await getConfig(path.resolve(import.meta.dirname, ".."), "electron-builder.gitea.yml", null);
assert.deepEqual(config.publish, { provider: "generic", url: UPDATE_URL });
assert.equal(config.appId, "com.learnharness.LearnHarness");
assert.deepEqual(config.linux.target.map((target: any) => target.target), ["AppImage", "deb"]);
const workflow = yaml.load(await fs.readFile(new URL("../.gitea/workflows/release.yml", import.meta.url), "utf8"));
assert(workflow.on.workflow_dispatch);
assert(!workflow.on.pull_request, "untrusted pull requests must not run release publishing");
assert.equal(workflow.permissions.releases, "write");
});
test("packaged updater verification refuses inherited GitHub or incorrect generic destinations", async () => {
const directory = path.join(root, "package");
await fs.mkdir(path.join(directory, "resources"), { recursive: true });
const file = path.join(directory, "resources", "app-update.yml");
await fs.writeFile(file, JSON.stringify({ provider: "github", owner: "amosblomqvist", repo: "learnharness" }));
await assert.rejects(verifyPackagedUpdater(directory), /Gitea generic provider/);
await fs.writeFile(file, JSON.stringify({ provider: "generic", url: "https://other.example" }));
await assert.rejects(verifyPackagedUpdater(directory), /public Gitea release feed/);
await fs.writeFile(file, JSON.stringify({ provider: "generic", url: UPDATE_URL }));
await verifyPackagedUpdater(directory);
});