diff --git a/scripts/publish-catalog.mjs b/scripts/publish-catalog.mjs index 598b334..aa24f44 100644 --- a/scripts/publish-catalog.mjs +++ b/scripts/publish-catalog.mjs @@ -104,7 +104,7 @@ function zipCentralDirectory(bytes, provider) { if ((generalPurposeFlags & 0x1) !== 0) fail(`${provider}: encrypted ZIP entries are forbidden`); if ((externalAttributes & 0x400) !== 0) fail(`${provider}: ZIP reparse-point entries are forbidden`); const dosDirectory = (externalAttributes & 0x10) !== 0; - if (isDir ? (!dosDirectory || compressedSize !== 0 || uncompressedSize !== 0 || + if (isDir ? (compressedSize !== 0 || uncompressedSize !== 0 || (mode !== 0 && (mode & 0xf000) !== 0x4000)) : (dosDirectory || (mode !== 0 && (mode & 0xf000) !== 0x8000))) fail(`${provider}: invalid ZIP file type`); if (compressedSize === 0 && uncompressedSize > 0 || diff --git a/scripts/publish-catalog.test.mjs b/scripts/publish-catalog.test.mjs index 88329ec..c09dbc5 100644 --- a/scripts/publish-catalog.test.mjs +++ b/scripts/publish-catalog.test.mjs @@ -149,7 +149,7 @@ test("archive policy rejects traversal, collisions, missing license, and extra f const appSpec = archiveSpec({ kind: "app", entrypoint: "dist/index.html", build: undefined, artifact: { name: "app.kspkg", url: "https://example.test/app.kspkg" } }); writeZip(app, [ { name: "dist/", data: Buffer.alloc(0), externalAttributes: 0x10 }, - { name: "dist/assets/", data: Buffer.alloc(0), externalAttributes: 0x10 }, + { name: "dist/assets/", data: Buffer.alloc(0), externalAttributes: 0x41ff0000 }, { name: "dist/index.html", data: Buffer.from("app") }, { name: "dist/assets/app.js", data: Buffer.from("js") }, { name: "icon.png", data: Buffer.from("icon") },