Skip to content

Commit 7000eb1

Browse files
authored
Merge pull request #8786 from nightscout/bf/override-advisory-pins
Move two dependency pins to their patch releases, clearing the three high npm audit findings
2 parents 295f117 + 64a9cc1 commit 7000eb1

3 files changed

Lines changed: 84 additions & 19 deletions

File tree

‎package-lock.json‎

Lines changed: 37 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@
190190
"qs": "6.16.0",
191191
"flatted": "3.4.2",
192192
"picomatch": "2.3.2",
193-
"ajv@^6.0.0": "6.12.6",
193+
"ajv@^6.0.0": "6.14.0",
194194
"ajv@^8.0.0": "8.18.0",
195195
"socket.io-parser": "4.2.7",
196196
"filelist": {
@@ -218,7 +218,7 @@
218218
"axios": "1.20.0"
219219
},
220220
"request": {
221-
"form-data": "2.5.5",
221+
"form-data": "2.5.6",
222222
"qs": "6.16.0",
223223
"tough-cookie": "4.1.4"
224224
},

‎tests/dependency-overrides.test.js‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
'use strict';
2+
3+
const assert = require('assert');
4+
const { createRequire } = require('module');
5+
const semver = require('semver');
6+
7+
// package.json `overrides` win over every declared range, so an override
8+
// value inside an advisory range is invisible to `npm audit fix` (BF-147).
9+
// These pin the resolved copies, not the override text, so a lockfile that
10+
// drifts back below the fix fails here.
11+
function resolvedFrom (parent, name) {
12+
const parentRequire = createRequire(require.resolve(parent + '/package.json'));
13+
return parentRequire(name + '/package.json').version;
14+
}
15+
16+
describe('overridden dependency versions', function () {
17+
const ajvConsumers = ['har-validator', 'style-loader/node_modules/schema-utils', 'eslint'];
18+
19+
ajvConsumers.forEach(function (parent) {
20+
it('resolves ajv 6 at or above 6.14.0 for ' + parent, function () {
21+
let version;
22+
try {
23+
version = resolvedFrom(parent, 'ajv');
24+
} catch (err) {
25+
if (err.code === 'MODULE_NOT_FOUND') this.skip();
26+
throw err;
27+
}
28+
if (semver.major(version) !== 6) this.skip();
29+
assert.ok(semver.gte(version, '6.14.0'), parent + ' resolves ajv ' + version);
30+
});
31+
});
32+
33+
it('resolves request\'s form-data at or above 2.5.6', function () {
34+
const version = resolvedFrom('request', 'form-data');
35+
assert.ok(semver.gte(version, '2.5.6'), 'request resolves form-data ' + version);
36+
});
37+
38+
it('escapes line breaks in multipart field names and filenames built through request', function () {
39+
const FormData = createRequire(require.resolve('request/package.json'))('form-data');
40+
const form = new FormData();
41+
form.append('name\r\nX-Extra: 1', 'value', { filename: 'file\r\n.txt' });
42+
const head = form.getBuffer().toString().split('\r\n')[1];
43+
assert.strictEqual(head, 'Content-Disposition: form-data; name="name%0D%0AX-Extra: 1"; filename="file%0D%0A.txt"');
44+
});
45+
});

0 commit comments

Comments
 (0)