fix: accept equivalent installer metadata names
Allow updater manifests from the Gitea and GitHub release pipelines to use different separator characters in the same installer filename while preserving exact version, size, checksum, and executable validation.
This commit is contained in:
+5
-1
@@ -61,6 +61,10 @@ function findLatestYml(assets) {
|
|||||||
return assets.find(a => /^latest\.yml$/i.test(a.name)) || null;
|
return assets.find(a => /^latest\.yml$/i.test(a.name)) || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function normalizeInstallerName(value) {
|
||||||
|
return path.basename(String(value || '')).toLowerCase().replace(/[ ._]+/g, '');
|
||||||
|
}
|
||||||
|
|
||||||
async function fetchJson(url, signal) {
|
async function fetchJson(url, signal) {
|
||||||
const controller = new AbortController();
|
const controller = new AbortController();
|
||||||
const timeout = setTimeout(() => controller.abort(), CHECK_TIMEOUT);
|
const timeout = setTimeout(() => controller.abort(), CHECK_TIMEOUT);
|
||||||
@@ -180,7 +184,7 @@ async function parseLatestYml(url, expected = {}, fetchImpl = fetch) {
|
|||||||
if (expected.version && version !== expected.version) {
|
if (expected.version && version !== expected.version) {
|
||||||
throw new Error('Prüfsummen-Metadaten gehören zu einer anderen Version');
|
throw new Error('Prüfsummen-Metadaten gehören zu einer anderen Version');
|
||||||
}
|
}
|
||||||
if (expected.assetName && path.basename(assetPath) !== path.basename(expected.assetName)) {
|
if (expected.assetName && normalizeInstallerName(assetPath) !== normalizeInstallerName(expected.assetName)) {
|
||||||
throw new Error('Prüfsummen-Metadaten gehören nicht zum ausgewählten Installer');
|
throw new Error('Prüfsummen-Metadaten gehören nicht zum ausgewählten Installer');
|
||||||
}
|
}
|
||||||
if (expected.assetSize && size !== Number(expected.assetSize)) {
|
if (expected.assetSize && size !== Number(expected.assetSize)) {
|
||||||
|
|||||||
@@ -336,3 +336,18 @@ test('existing release recovery rejects a mismatched transport tag', async () =>
|
|||||||
/existing release tag "v9\.9\.9" does not match "v2\.1\.20"/
|
/existing release tag "v9\.9\.9" does not match "v2\.1\.20"/
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('checksum metadata accepts equivalent transport-specific installer separators', async () => {
|
||||||
|
const sha = crypto.randomBytes(64).toString('base64');
|
||||||
|
const metadata = await parseLatestYml('https://update.invalid/latest.yml', {
|
||||||
|
version: '2.1.22',
|
||||||
|
assetName: 'Multi-Hoster-Upload Setup 2.1.22.exe',
|
||||||
|
assetSize: 456
|
||||||
|
}, async () => ({
|
||||||
|
ok: true,
|
||||||
|
status: 200,
|
||||||
|
text: async () => `version: 2.1.22\npath: Multi-Hoster-Upload.Setup.2.1.22.exe\nsha512: ${sha}\nsize: 456\n`
|
||||||
|
}));
|
||||||
|
|
||||||
|
assert.equal(metadata.path, 'Multi-Hoster-Upload.Setup.2.1.22.exe');
|
||||||
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user