Skip to content

Commit fae320e

Browse files
author
Joel Denning
authored
Delete old integrity urls in PATCH and DELETE endpoints (#175)
* Delete old integrity urls in PATCH and DELETE endpoints * Self review * Self review
1 parent 2b7e276 commit fae320e

File tree

2 files changed

+121
-0
lines changed

2 files changed

+121
-0
lines changed

src/modify.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,11 @@ exports.modifyService = function (
137137
) {
138138
return modifyLock(env, (json) => {
139139
const map = getMapFromManifest(json);
140+
const oldUrl = map[serviceName];
141+
if (oldUrl && json.integrity) {
142+
delete json.integrity[oldUrl];
143+
}
144+
140145
if (remove) {
141146
delete map[serviceName];
142147
delete map[serviceName + "/"];

test/integrity.test.js

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
const request = require("supertest");
2+
const { app, setConfig } = require("../src/web-server");
3+
const {
4+
resetManifest: resetMemoryManifest,
5+
} = require("../src/io-methods/memory");
6+
7+
describe(`integrity`, () => {
8+
beforeAll(() => {
9+
setConfig({
10+
manifestFormat: "importmap",
11+
packagesViaTrailingSlashes: true,
12+
locations: {
13+
prod: "memory://prod",
14+
},
15+
});
16+
});
17+
18+
beforeEach(() => {
19+
resetMemoryManifest();
20+
});
21+
22+
it(`sets integrity field in import map`, async () => {
23+
const url = "/a.js";
24+
const integrity = "sha256-example";
25+
26+
const response = await request(app)
27+
.patch("/services")
28+
.query({
29+
skip_url_check: true,
30+
})
31+
.set("accept", "json")
32+
.send({
33+
service: "a",
34+
url,
35+
integrity,
36+
})
37+
.expect(200)
38+
.expect("Content-Type", /json/);
39+
40+
expect(response.body.integrity).toMatchObject({
41+
[url]: integrity,
42+
});
43+
});
44+
45+
it(`removes old integrity when patching a service`, async () => {
46+
const url = "/a.js";
47+
const integrity = "sha256-a";
48+
49+
const response = await request(app)
50+
.patch("/services")
51+
.query({
52+
skip_url_check: true,
53+
})
54+
.set("accept", "json")
55+
.send({
56+
service: "a",
57+
url,
58+
integrity,
59+
})
60+
.expect(200)
61+
.expect("Content-Type", /json/);
62+
63+
expect(response.body.integrity[url]).not.toBeUndefined();
64+
65+
const url2 = "/a2.js";
66+
const integrity2 = "sha256-a2";
67+
68+
const response2 = await request(app)
69+
.patch("/services")
70+
.query({
71+
skip_url_check: true,
72+
})
73+
.set("accept", "json")
74+
.send({
75+
service: "a",
76+
url: url2,
77+
integrity: integrity2,
78+
})
79+
.expect(200)
80+
.expect("Content-Type", /json/);
81+
82+
expect(response2.body.integrity[url]).toBeUndefined();
83+
expect(response2.body.integrity[url2]).not.toBeUndefined();
84+
});
85+
86+
it(`deletes old integrity when deleting a service`, async () => {
87+
const url = "/a.js";
88+
const integrity = "sha256-example";
89+
90+
const response = await request(app)
91+
.patch("/services")
92+
.query({
93+
skip_url_check: true,
94+
})
95+
.set("accept", "json")
96+
.send({
97+
service: "a",
98+
url,
99+
integrity,
100+
})
101+
.expect(200)
102+
.expect("Content-Type", /json/);
103+
104+
expect(response.body.integrity).toMatchObject({
105+
[url]: integrity,
106+
});
107+
108+
const response2 = await request(app)
109+
.delete("/services/a")
110+
.set("accept", "json")
111+
.send()
112+
.expect(200)
113+
.expect("Content-Type", /json/);
114+
expect(response2.body.integrity[url]).toBeUndefined();
115+
});
116+
});

0 commit comments

Comments
 (0)