Skip to content

Commit

Permalink
Delete old integrity urls in PATCH and DELETE endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
joeldenning committed Oct 15, 2024
1 parent 2b7e276 commit 31d8cdb
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 0 deletions.
9 changes: 9 additions & 0 deletions src/modify.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,15 @@ exports.modifyService = function (
) {
return modifyLock(env, (json) => {
const map = getMapFromManifest(json);
const oldUrl = map[serviceName];
const oldIntegrity = json.integrity ? json.integrity[oldUrl] : null;

if (remove) {
delete map[serviceName];
delete map[serviceName + "/"];
if (json.integrity) {
delete json.integrity[oldUrl];
}
} else {
map[serviceName] = url;

Expand All @@ -164,6 +170,9 @@ exports.modifyService = function (
json.integrity = json.integrity ?? {};
json.integrity[url] = integrity;
}
if (oldIntegrity && json.integrity) {
delete json.integrity[oldUrl];
}
}
const alphabetical = !!getConfig().alphabetical;
if (alphabetical) {
Expand Down
116 changes: 116 additions & 0 deletions test/integrity.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
const request = require("supertest");
const { app, setConfig } = require("../src/web-server");
const {
resetManifest: resetMemoryManifest,
} = require("../src/io-methods/memory");

describe(`integrity`, () => {
beforeAll(() => {
setConfig({
manifestFormat: "importmap",
packagesViaTrailingSlashes: true,
locations: {
prod: "memory://prod",
},
});
});

beforeEach(() => {
resetMemoryManifest();
});

it(`sets integrity field in import map`, async () => {
const url = "/a.js";
const integrity = "sha256-example";

const response = await request(app)
.patch("/services")
.query({
skip_url_check: true,
})
.set("accept", "json")
.send({
service: "a",
url,
integrity,
})
.expect(200)
.expect("Content-Type", /json/);

expect(response.body.integrity).toMatchObject({
[url]: integrity,
});
});

it(`removes old integrity when patching a service`, async () => {
const url = "/a.js";
const integrity = "sha256-a";

const response = await request(app)
.patch("/services")
.query({
skip_url_check: true,
})
.set("accept", "json")
.send({
service: "a",
url,
integrity,
})
.expect(200)
.expect("Content-Type", /json/);

expect(response.body.integrity[url]).not.toBeUndefined();

const url2 = "/a2.js";
const integrity2 = "sha256-a2";

const response2 = await request(app)
.patch("/services")
.query({
skip_url_check: true,
})
.set("accept", "json")
.send({
service: "a",
url: url2,
integrity: integrity2,
})
.expect(200)
.expect("Content-Type", /json/);

expect(response2.body.integrity[url]).toBeUndefined();
expect(response2.body.integrity[url2]).not.toBeUndefined();
});

it(`deletes old integrity when deleting a service`, async () => {
const url = "/a.js";
const integrity = "sha256-example";

const response = await request(app)
.patch("/services")
.query({
skip_url_check: true,
})
.set("accept", "json")
.send({
service: "a",
url,
integrity,
})
.expect(200)
.expect("Content-Type", /json/);

expect(response.body.integrity).toMatchObject({
[url]: integrity,
});

const response2 = await request(app)
.delete("/services/a")
.set("accept", "json")
.send()
.expect(200)
.expect("Content-Type", /json/);
expect(response2.body.integrity[url]).toBeUndefined();
});
});

0 comments on commit 31d8cdb

Please sign in to comment.