alado 3.6.1 → 3.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/helpers/parser/body-parser.js +7 -9
- package/dist/helpers/parser/body-parser.js.map +1 -1
- package/dist/helpers/parser/index.d.ts +1 -0
- package/dist/helpers/parser/index.js +1 -0
- package/dist/helpers/parser/index.js.map +1 -1
- package/dist/helpers/parser/json-parser.d.ts +23 -0
- package/dist/helpers/parser/json-parser.js +105 -0
- package/dist/helpers/parser/json-parser.js.map +1 -0
- package/dist/helpers/validate/context/validate-request-part.js +4 -1
- package/dist/helpers/validate/context/validate-request-part.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,6 +7,7 @@ exports.bodyParser = bodyParser;
|
|
|
7
7
|
const _const_1 = require("../../constants/index.js");
|
|
8
8
|
const stream_1 = require("stream");
|
|
9
9
|
const xml_parser_1 = require("./xml-parser");
|
|
10
|
+
const json_parser_1 = require("./json-parser");
|
|
10
11
|
const file_signature_1 = require("../validate/context/file-signature");
|
|
11
12
|
// "application/xml; charset=utf-8" is still XML, and so are +xml types such as SOAP 1.2's application/soap+xml
|
|
12
13
|
function isXmlContentType(contentType) {
|
|
@@ -170,18 +171,15 @@ async function bodyParser(req, res, limit, acceptFiles = true) {
|
|
|
170
171
|
result.rawBody = body;
|
|
171
172
|
if (contentType?.startsWith(_const_1.ContentType.JSON)) {
|
|
172
173
|
try {
|
|
173
|
-
|
|
174
|
-
result.body = _const_1.deprecatedJsonPropertiesHintRegExp.test(body)
|
|
175
|
-
? JSON.parse(body, function (key, value) {
|
|
176
|
-
if (!_const_1.deprecatedJsonPropertiesRegExp.test(key)) {
|
|
177
|
-
return value;
|
|
178
|
-
}
|
|
179
|
-
})
|
|
180
|
-
: JSON.parse(body);
|
|
174
|
+
result.body = (0, json_parser_1.parseJson)(body);
|
|
181
175
|
resolve();
|
|
182
176
|
}
|
|
183
177
|
catch (e) {
|
|
184
|
-
|
|
178
|
+
// the depth message is ours; a SyntaxError's text is not passed on
|
|
179
|
+
reject({
|
|
180
|
+
statusCode: 400,
|
|
181
|
+
message: e instanceof json_parser_1.JsonDepthError ? `Invalid JSON body: ${e.message}` : `Invalid JSON body`,
|
|
182
|
+
});
|
|
185
183
|
}
|
|
186
184
|
}
|
|
187
185
|
else if (contentType?.startsWith(_const_1.ContentType.X_WWW_FORM_URLENCODED)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-parser.js","sourceRoot":"","sources":["../../../src/helpers/parser/body-parser.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"body-parser.js","sourceRoot":"","sources":["../../../src/helpers/parser/body-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,5 +17,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./access-control-checker"), exports);
|
|
18
18
|
__exportStar(require("./authenticate"), exports);
|
|
19
19
|
__exportStar(require("./body-parser"), exports);
|
|
20
|
+
__exportStar(require("./json-parser"), exports);
|
|
20
21
|
__exportStar(require("./query-parser"), exports);
|
|
21
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/parser/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,iDAA+B;AAC/B,gDAA8B;AAC9B,iDAA+B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/helpers/parser/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,iDAA+B;AAC/B,gDAA8B;AAC9B,gDAA8B;AAC9B,iDAA+B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const MAX_JSON_DEPTH: number;
|
|
2
|
+
export declare class JsonDepthError extends Error {
|
|
3
|
+
constructor();
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Whether arrays and objects nest deeper than `limit` (the outermost one is level 1). Reads the
|
|
7
|
+
* text, not the parsed value, so a deep document is refused before JSON.parse spends time building
|
|
8
|
+
* it, and stops at the first level past the limit. Brackets inside strings do not count.
|
|
9
|
+
*/
|
|
10
|
+
export declare function jsonDepthExceeds(text: string, limit?: number): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Deletes forbidden keys (__proto__, constructor, ...) from a JSON.parse result, at any depth.
|
|
13
|
+
* Iterative, so no nesting depth can overflow the stack. JSON.parse defines "__proto__" as an own
|
|
14
|
+
* data property, so `delete` removes it without touching the prototype.
|
|
15
|
+
*/
|
|
16
|
+
export declare function removeForbiddenKeys(root: unknown): void;
|
|
17
|
+
/**
|
|
18
|
+
* JSON.parse without forbidden keys and without nesting deeper than MAX_JSON_DEPTH (JsonDepthError).
|
|
19
|
+
* A reviver would take V8 off its fast JSON path and run for every value (about 7x slower on a
|
|
20
|
+
* 1 MB body); parsing plainly and walking the result afterwards, only when the text can contain
|
|
21
|
+
* such a key, gives the same result.
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseJson(text: string): unknown;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.JsonDepthError = exports.MAX_JSON_DEPTH = void 0;
|
|
4
|
+
exports.jsonDepthExceeds = jsonDepthExceeds;
|
|
5
|
+
exports.removeForbiddenKeys = removeForbiddenKeys;
|
|
6
|
+
exports.parseJson = parseJson;
|
|
7
|
+
const _const_1 = require("../../constants/index.js");
|
|
8
|
+
// Same limit as XML. JSON.parse itself copes with deeper input, but every recursive consumer after
|
|
9
|
+
// it (validators, transforms, JSON.stringify of a response) overflows the stack far earlier.
|
|
10
|
+
// Real documents stay far below it.
|
|
11
|
+
exports.MAX_JSON_DEPTH = 256;
|
|
12
|
+
class JsonDepthError extends Error {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(`nested deeper than ${exports.MAX_JSON_DEPTH} levels`);
|
|
15
|
+
this.name = 'JsonDepthError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.JsonDepthError = JsonDepthError;
|
|
19
|
+
/**
|
|
20
|
+
* Whether arrays and objects nest deeper than `limit` (the outermost one is level 1). Reads the
|
|
21
|
+
* text, not the parsed value, so a deep document is refused before JSON.parse spends time building
|
|
22
|
+
* it, and stops at the first level past the limit. Brackets inside strings do not count.
|
|
23
|
+
*/
|
|
24
|
+
function jsonDepthExceeds(text, limit = exports.MAX_JSON_DEPTH) {
|
|
25
|
+
// every level takes an opening and a closing bracket
|
|
26
|
+
if (text.length <= 2 * limit) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
let depth = 0;
|
|
30
|
+
let inString = false;
|
|
31
|
+
for (let i = 0; i < text.length; i++) {
|
|
32
|
+
const code = text.charCodeAt(i);
|
|
33
|
+
if (inString) {
|
|
34
|
+
if (code === 92) {
|
|
35
|
+
// backslash: the next character is escaped (\" does not end the string)
|
|
36
|
+
i++;
|
|
37
|
+
}
|
|
38
|
+
else if (code === 34) {
|
|
39
|
+
inString = false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (code === 34) {
|
|
43
|
+
inString = true;
|
|
44
|
+
}
|
|
45
|
+
else if (code === 91 || code === 123) {
|
|
46
|
+
if (++depth > limit) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else if (code === 93 || code === 125) {
|
|
51
|
+
depth--;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Deletes forbidden keys (__proto__, constructor, ...) from a JSON.parse result, at any depth.
|
|
58
|
+
* Iterative, so no nesting depth can overflow the stack. JSON.parse defines "__proto__" as an own
|
|
59
|
+
* data property, so `delete` removes it without touching the prototype.
|
|
60
|
+
*/
|
|
61
|
+
function removeForbiddenKeys(root) {
|
|
62
|
+
if (root === null || typeof root !== 'object') {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const stack = [root];
|
|
66
|
+
while (stack.length) {
|
|
67
|
+
const node = stack.pop();
|
|
68
|
+
if (Array.isArray(node)) {
|
|
69
|
+
for (let i = 0; i < node.length; i++) {
|
|
70
|
+
const value = node[i];
|
|
71
|
+
if (value !== null && typeof value === 'object') {
|
|
72
|
+
stack.push(value);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
for (const key of Object.keys(node)) {
|
|
78
|
+
if (_const_1.deprecatedJsonPropertiesRegExp.test(key)) {
|
|
79
|
+
delete node[key];
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const value = node[key];
|
|
83
|
+
if (value !== null && typeof value === 'object') {
|
|
84
|
+
stack.push(value);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* JSON.parse without forbidden keys and without nesting deeper than MAX_JSON_DEPTH (JsonDepthError).
|
|
91
|
+
* A reviver would take V8 off its fast JSON path and run for every value (about 7x slower on a
|
|
92
|
+
* 1 MB body); parsing plainly and walking the result afterwards, only when the text can contain
|
|
93
|
+
* such a key, gives the same result.
|
|
94
|
+
*/
|
|
95
|
+
function parseJson(text) {
|
|
96
|
+
if (jsonDepthExceeds(text)) {
|
|
97
|
+
throw new JsonDepthError();
|
|
98
|
+
}
|
|
99
|
+
const value = JSON.parse(text);
|
|
100
|
+
if (_const_1.deprecatedJsonPropertiesHintRegExp.test(text)) {
|
|
101
|
+
removeForbiddenKeys(value);
|
|
102
|
+
}
|
|
103
|
+
return value;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=json-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-parser.js","sourceRoot":"","sources":["../../../src/helpers/parser/json-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateRequestPart = validateRequestPart;
|
|
4
|
+
const json_parser_1 = require("../../parser/json-parser");
|
|
4
5
|
const nonProcessingRequestParts = new Set([
|
|
5
6
|
'files',
|
|
6
7
|
'auth',
|
|
@@ -59,7 +60,9 @@ function validateProperty(key, property, definition, request) {
|
|
|
59
60
|
let value = part[property];
|
|
60
61
|
if (isJSON && typeof value === 'string') {
|
|
61
62
|
try {
|
|
62
|
-
|
|
63
|
+
// same parser as JSON bodies: a field such as {"__proto__":{...}} must not reach the
|
|
64
|
+
// validator or a transform with an own __proto__ key
|
|
65
|
+
value = (0, json_parser_1.parseJson)(value);
|
|
63
66
|
}
|
|
64
67
|
catch {
|
|
65
68
|
// keep the raw string
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-request-part.js","sourceRoot":"","sources":["../../../../src/helpers/validate/context/validate-request-part.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"validate-request-part.js","sourceRoot":"","sources":["../../../../src/helpers/validate/context/validate-request-part.ts"],"names":[],"mappings":"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"}
|