mirror of
https://github.com/nimbold/Firelink.git
synced 2026-09-09 17:25:42 +00:00
d8a6440998
- cache target-scoped engine payloads with exact lock and toolchain keys\n- validate manifest provenance, checksums, and paths before reuse\n- restrict cache writes to trusted main pushes while allowing release restores\n- fall back to source provisioning when a cache is absent or invalid\n- harden release checksum generation against pipeline races
98 lines
3.0 KiB
JavaScript
98 lines
3.0 KiB
JavaScript
import assert from 'node:assert/strict';
|
|
import fs from 'node:fs';
|
|
import os from 'node:os';
|
|
import path from 'node:path';
|
|
import test from 'node:test';
|
|
|
|
import {
|
|
assertPayloadManifestProvenance,
|
|
buildPayloadProvenance,
|
|
readAndValidatePayloadManifest,
|
|
} from './engine-payload-manifest.js';
|
|
import { sha256 } from './engine-payload-integrity.js';
|
|
|
|
const TARGET = 'x86_64-unknown-linux-gnu';
|
|
const SOURCES = {
|
|
'yt-dlp': {
|
|
version: '2026.08.19',
|
|
url: 'https://example.invalid/yt-dlp.zip',
|
|
sha256: 'a'.repeat(64),
|
|
},
|
|
deno: {
|
|
version: '2.9.6',
|
|
url: 'https://example.invalid/deno.zip',
|
|
sha256: 'b'.repeat(64),
|
|
},
|
|
ffmpeg: {
|
|
version: '9.0.1',
|
|
url: 'https://example.invalid/ffmpeg.tar.xz',
|
|
sha256: 'c'.repeat(64),
|
|
},
|
|
aria2c: {
|
|
version: '1.37.0-firelink-native-dns-v1',
|
|
url: 'https://example.invalid/aria2.tar.xz',
|
|
sha256: 'd'.repeat(64),
|
|
buildFromSource: true,
|
|
patchSha256: 'e'.repeat(64),
|
|
allocationTelemetry: true,
|
|
firelinkRouteContract: {
|
|
revision: 'firelink-native-dns-v1',
|
|
dnsResolver: 'native-async',
|
|
networkTargetPolicy: 'firelink-v1',
|
|
networkTargetPolicyDigest: 'sha256:test',
|
|
},
|
|
},
|
|
};
|
|
|
|
function createPayload() {
|
|
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'firelink-engine-manifest-'));
|
|
const file = path.join(root, 'aria2c');
|
|
fs.writeFileSync(file, 'verified engine');
|
|
const manifest = {
|
|
schemaVersion: 1,
|
|
target: TARGET,
|
|
generatedFrom: buildPayloadProvenance(SOURCES),
|
|
files: { aria2c: sha256(file) },
|
|
};
|
|
fs.writeFileSync(path.join(root, 'payload-manifest.json'), `${JSON.stringify(manifest)}\n`);
|
|
return { root, manifest };
|
|
}
|
|
|
|
test('payload manifest validation binds files and source provenance', () => {
|
|
const { root, manifest } = createPayload();
|
|
try {
|
|
assert.deepEqual(readAndValidatePayloadManifest(root, SOURCES, TARGET), manifest);
|
|
assert.doesNotThrow(() => assertPayloadManifestProvenance(manifest, SOURCES, TARGET));
|
|
} finally {
|
|
fs.rmSync(root, { recursive: true, force: true });
|
|
}
|
|
});
|
|
|
|
test('payload manifest validation rejects changed provenance and path traversal', () => {
|
|
const { root, manifest } = createPayload();
|
|
try {
|
|
const changed = { ...manifest, generatedFrom: { ...manifest.generatedFrom } };
|
|
changed.generatedFrom.aria2c = {
|
|
...changed.generatedFrom.aria2c,
|
|
patchSha256: 'f'.repeat(64),
|
|
};
|
|
fs.writeFileSync(path.join(root, 'payload-manifest.json'), JSON.stringify(changed));
|
|
assert.throws(
|
|
() => readAndValidatePayloadManifest(root, SOURCES, TARGET),
|
|
/provenance mismatch/,
|
|
);
|
|
|
|
const traversal = {
|
|
...manifest,
|
|
files: { '../outside': '0'.repeat(64) },
|
|
};
|
|
fs.writeFileSync(path.join(root, 'payload-manifest.json'), JSON.stringify(traversal));
|
|
assert.throws(
|
|
() => readAndValidatePayloadManifest(root, SOURCES, TARGET),
|
|
/escapes its root|files do not match/,
|
|
);
|
|
} finally {
|
|
fs.rmSync(root, { recursive: true, force: true });
|
|
}
|
|
});
|