field-redactor 1.1.0 → 1.5.0
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/.github/workflows/ci.yml +38 -0
- package/CHANGELOG.md +156 -0
- package/README.md +64 -647
- package/dist/configValidator.d.ts +10 -0
- package/dist/configValidator.d.ts.map +1 -0
- package/dist/configValidator.js +94 -0
- package/dist/configValidator.js.map +1 -0
- package/dist/copyOnWriteHelpers.d.ts +20 -0
- package/dist/copyOnWriteHelpers.d.ts.map +1 -0
- package/dist/copyOnWriteHelpers.js +58 -0
- package/dist/copyOnWriteHelpers.js.map +1 -0
- package/dist/customObjectManager.d.ts +13 -7
- package/dist/customObjectManager.d.ts.map +1 -1
- package/dist/customObjectManager.js +30 -29
- package/dist/customObjectManager.js.map +1 -1
- package/dist/dryRun.d.ts +8 -0
- package/dist/dryRun.d.ts.map +1 -0
- package/dist/dryRun.js +75 -0
- package/dist/dryRun.js.map +1 -0
- package/dist/dryRunAttribution.d.ts +8 -0
- package/dist/dryRunAttribution.d.ts.map +1 -0
- package/dist/dryRunAttribution.js +106 -0
- package/dist/dryRunAttribution.js.map +1 -0
- package/dist/fieldRedactor.d.ts +43 -5
- package/dist/fieldRedactor.d.ts.map +1 -1
- package/dist/fieldRedactor.js +124 -23
- package/dist/fieldRedactor.js.map +1 -1
- package/dist/fieldRedactorConfigBuilder.d.ts +49 -0
- package/dist/fieldRedactorConfigBuilder.d.ts.map +1 -0
- package/dist/fieldRedactorConfigBuilder.js +98 -0
- package/dist/fieldRedactorConfigBuilder.js.map +1 -0
- package/dist/fieldRedactorDeps.d.ts +17 -0
- package/dist/fieldRedactorDeps.d.ts.map +1 -0
- package/dist/fieldRedactorDeps.js +41 -0
- package/dist/fieldRedactorDeps.js.map +1 -0
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/jsonWalk.d.ts +11 -0
- package/dist/jsonWalk.d.ts.map +1 -0
- package/dist/jsonWalk.js +86 -0
- package/dist/jsonWalk.js.map +1 -0
- package/dist/objectRedactor.d.ts +9 -34
- package/dist/objectRedactor.d.ts.map +1 -1
- package/dist/objectRedactor.js +11 -271
- package/dist/objectRedactor.js.map +1 -1
- package/dist/objectRedactorCow.d.ts +35 -0
- package/dist/objectRedactorCow.d.ts.map +1 -0
- package/dist/objectRedactorCow.js +300 -0
- package/dist/objectRedactorCow.js.map +1 -0
- package/dist/objectRedactorCustomObject.d.ts +49 -0
- package/dist/objectRedactorCustomObject.d.ts.map +1 -0
- package/dist/objectRedactorCustomObject.js +138 -0
- package/dist/objectRedactorCustomObject.js.map +1 -0
- package/dist/objectRedactorHelpers.d.ts +9 -0
- package/dist/objectRedactorHelpers.d.ts.map +1 -0
- package/dist/objectRedactorHelpers.js +58 -0
- package/dist/objectRedactorHelpers.js.map +1 -0
- package/dist/objectRedactorMutation.d.ts +10 -0
- package/dist/objectRedactorMutation.d.ts.map +1 -0
- package/dist/objectRedactorMutation.js +89 -0
- package/dist/objectRedactorMutation.js.map +1 -0
- package/dist/objectRedactorSync.d.ts +2 -0
- package/dist/objectRedactorSync.d.ts.map +1 -0
- package/dist/objectRedactorSync.js +7 -0
- package/dist/objectRedactorSync.js.map +1 -0
- package/dist/objectRedactorTraversal.d.ts +57 -0
- package/dist/objectRedactorTraversal.d.ts.map +1 -0
- package/dist/objectRedactorTraversal.js +576 -0
- package/dist/objectRedactorTraversal.js.map +1 -0
- package/dist/presets.d.ts +22 -0
- package/dist/presets.d.ts.map +1 -0
- package/dist/presets.js +50 -0
- package/dist/presets.js.map +1 -0
- package/dist/primitiveRedactor.d.ts +13 -8
- package/dist/primitiveRedactor.d.ts.map +1 -1
- package/dist/primitiveRedactor.js +32 -27
- package/dist/primitiveRedactor.js.map +1 -1
- package/dist/redactionRules.d.ts +23 -0
- package/dist/redactionRules.d.ts.map +1 -0
- package/dist/redactionRules.js +76 -0
- package/dist/redactionRules.js.map +1 -0
- package/dist/regexUtils.d.ts +3 -0
- package/dist/regexUtils.d.ts.map +1 -0
- package/dist/regexUtils.js +8 -0
- package/dist/regexUtils.js.map +1 -0
- package/dist/secretManager.d.ts +18 -5
- package/dist/secretManager.d.ts.map +1 -1
- package/dist/secretManager.js +49 -11
- package/dist/secretManager.js.map +1 -1
- package/dist/types.d.ts +110 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +13 -6
- package/dist/types.js.map +1 -1
- package/dist/valuePatternMatcher.d.ts +15 -0
- package/dist/valuePatternMatcher.d.ts.map +1 -0
- package/dist/valuePatternMatcher.js +30 -0
- package/dist/valuePatternMatcher.js.map +1 -0
- package/docs/guides/anti-patterns.md +107 -0
- package/docs/guides/metadata-redaction.md +112 -0
- package/docs/guides/migration-1.2-to-1.5.md +106 -0
- package/docs/guides/secret-key-modes.md +108 -0
- package/docs/guides/value-pattern-redaction.md +58 -0
- package/docs/reference/config.md +135 -0
- package/docs/release-notes/2.0.0.md +19 -0
- package/docs/release-notes/2.1.0.md +17 -0
- package/docs/release-notes/2.2.0.md +16 -0
- package/docs/release-notes/2.3.0.md +17 -0
- package/docs/release-notes/2.3.1.md +17 -0
- package/docs/release-notes/2.4.0.md +30 -0
- package/docs/release-notes/2.5.0.md +33 -0
- package/docs/release-notes/2.5.1.md +17 -0
- package/docs/release-notes/README.md +30 -0
- package/docs/release-notes/v1.0.0.md +17 -0
- package/docs/release-notes/v1.1.0.md +18 -0
- package/docs/release-notes/v1.2.0.md +18 -0
- package/docs/release-notes/v1.2.1.md +16 -0
- package/docs/release-notes/v1.2.2.md +19 -0
- package/docs/release-notes/v1.3.0.md +112 -0
- package/docs/release-notes/v1.5.0.md +88 -0
- package/jest.config.js +4 -1
- package/package.json +3 -3
package/dist/jsonWalk.js
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.walkTraversableJson = exports.isTraversableJson = exports.joinPath = exports.getParentContext = exports.getJsonValueAtPath = exports.parseJsonPath = void 0;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
const parseJsonPath = (path) => {
|
|
6
|
+
if (!path) {
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
const segments = [];
|
|
10
|
+
let current = '';
|
|
11
|
+
for (let index = 0; index < path.length; index++) {
|
|
12
|
+
const char = path[index];
|
|
13
|
+
if (char === '.') {
|
|
14
|
+
if (current) {
|
|
15
|
+
segments.push(current);
|
|
16
|
+
current = '';
|
|
17
|
+
}
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (char === '[') {
|
|
21
|
+
if (current) {
|
|
22
|
+
segments.push(current);
|
|
23
|
+
current = '';
|
|
24
|
+
}
|
|
25
|
+
const close = path.indexOf(']', index);
|
|
26
|
+
segments.push(Number(path.slice(index + 1, close)));
|
|
27
|
+
index = close;
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
current += char;
|
|
31
|
+
}
|
|
32
|
+
if (current) {
|
|
33
|
+
segments.push(current);
|
|
34
|
+
}
|
|
35
|
+
return segments;
|
|
36
|
+
};
|
|
37
|
+
exports.parseJsonPath = parseJsonPath;
|
|
38
|
+
const getJsonValueAtPath = (value, segments) => {
|
|
39
|
+
let current = value;
|
|
40
|
+
for (const segment of segments) {
|
|
41
|
+
if (current === undefined || current === null || typeof current !== 'object') {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
if (Array.isArray(current) && typeof segment === 'number') {
|
|
45
|
+
current = current[segment];
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if ((0, types_1.isJsonObject)(current) && typeof segment === 'string') {
|
|
49
|
+
current = current[segment];
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
return current;
|
|
55
|
+
};
|
|
56
|
+
exports.getJsonValueAtPath = getJsonValueAtPath;
|
|
57
|
+
const getParentContext = (value, segments) => {
|
|
58
|
+
if (segments.length === 0) {
|
|
59
|
+
return { parent: undefined, leaf: undefined };
|
|
60
|
+
}
|
|
61
|
+
const leaf = segments.at(-1);
|
|
62
|
+
const parent = segments.length === 1 ? value : (0, exports.getJsonValueAtPath)(value, segments.slice(0, -1));
|
|
63
|
+
return (0, exports.isTraversableJson)(parent) ? { parent, leaf } : { parent: undefined, leaf };
|
|
64
|
+
};
|
|
65
|
+
exports.getParentContext = getParentContext;
|
|
66
|
+
const joinPath = (base, segment) => typeof segment === 'number' ? (base ? `${base}[${segment}]` : `[${segment}]`) : base ? `${base}.${segment}` : segment;
|
|
67
|
+
exports.joinPath = joinPath;
|
|
68
|
+
const isTraversableJson = (value) => !!value && typeof value === 'object' && !(value instanceof Date);
|
|
69
|
+
exports.isTraversableJson = isTraversableJson;
|
|
70
|
+
const walkTraversableJson = (value, path, visit) => {
|
|
71
|
+
if (!(0, exports.isTraversableJson)(value)) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (Array.isArray(value)) {
|
|
75
|
+
value.forEach((item, index) => (0, exports.walkTraversableJson)(item, (0, exports.joinPath)(path, index), visit));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if ((0, types_1.isJsonObject)(value)) {
|
|
79
|
+
visit(value, path);
|
|
80
|
+
for (const key of Object.keys(value)) {
|
|
81
|
+
(0, exports.walkTraversableJson)(value[key], (0, exports.joinPath)(path, key), visit);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
exports.walkTraversableJson = walkTraversableJson;
|
|
86
|
+
//# sourceMappingURL=jsonWalk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonWalk.js","sourceRoot":"","sources":["../src/jsonWalk.ts"],"names":[],"mappings":"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"}
|
package/dist/objectRedactor.d.ts
CHANGED
|
@@ -1,42 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TraversableJson } from './types';
|
|
2
2
|
import { CustomObjectManager } from './customObjectManager';
|
|
3
3
|
import { PrimitiveRedactor } from './primitiveRedactor';
|
|
4
|
+
import { SecretManager } from './secretManager';
|
|
5
|
+
import { ValuePatternMatcher } from './valuePatternMatcher';
|
|
4
6
|
/**
|
|
5
7
|
* Redacts fields in a JSON object using the secretManager, primitiveRedactor, and CustomObjectChecker provided in the
|
|
6
|
-
* constructor.
|
|
7
|
-
* followed by fullSecretKeys, then deepSecretKeys, and finally secretKeys. If a field is an object or an array it is
|
|
8
|
-
* assessed recursively unless otherwise configured by a CustomObject or deepSecretKey.
|
|
8
|
+
* constructor. CustomObjects take highest precedence, followed by fullSecretKeys, then deepSecretKeys, and finally secretKeys.
|
|
9
9
|
*/
|
|
10
10
|
export declare class ObjectRedactor {
|
|
11
|
-
private readonly
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
* Conditionally redacts fields in the JSON object in place based on the configuration using the
|
|
17
|
-
* primitive redactor, custom object checker, and secret manager provided in the constructor.
|
|
18
|
-
* @param value The JSON value to redact in place.
|
|
19
|
-
* @returns The JSON value provided in the argument.
|
|
20
|
-
*/
|
|
21
|
-
redactInPlace(value: any): Promise<any>;
|
|
22
|
-
private redactSecretObjectFieldsInPlace;
|
|
23
|
-
private redactArrayInObject;
|
|
24
|
-
private redactObjectsInArray;
|
|
25
|
-
private redactAllArrayValues;
|
|
26
|
-
private redactObjectInObject;
|
|
27
|
-
private handleCustomObjectInPlace;
|
|
28
|
-
private handleCustomObjectValueIfArray;
|
|
29
|
-
private getStringSpecifiedCustomObjectSecretKeyValueIfExists;
|
|
30
|
-
private handleCustomObjectArrayValueIfStringKeySpecified;
|
|
31
|
-
private handleCustomObjectArrayValueIfMatchTypeSpecified;
|
|
32
|
-
private handlecustomObjectValueIfObject;
|
|
33
|
-
private handleCustomObjectObjectValueIfStringKeySpecified;
|
|
34
|
-
private handleCustomObjectOjectValueIfMatchTypeSpecified;
|
|
35
|
-
private handleCustomObjectValueIfPrimitive;
|
|
36
|
-
private handleCustomObjectPrimitiveValueIfMatchTypeSpecified;
|
|
37
|
-
private handleCustomObjectPrimitiveValueIfStringKeySpecified;
|
|
38
|
-
private getStringValue;
|
|
39
|
-
private isObject;
|
|
40
|
-
private redactPrimitiveValueIfSecret;
|
|
11
|
+
private readonly traversal;
|
|
12
|
+
constructor(primitiveRedactor: PrimitiveRedactor, secretManager: SecretManager, customObjManager: CustomObjectManager, valuePatternMatcher: ValuePatternMatcher);
|
|
13
|
+
redactInPlace<T extends TraversableJson>(value: T): Promise<T>;
|
|
14
|
+
redactInPlaceSync<T extends TraversableJson>(value: T): T;
|
|
15
|
+
redactCopyOnWrite<T extends TraversableJson>(value: T): T;
|
|
41
16
|
}
|
|
42
17
|
//# sourceMappingURL=objectRedactor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"objectRedactor.d.ts","sourceRoot":"","sources":["../src/objectRedactor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"objectRedactor.d.ts","sourceRoot":"","sources":["../src/objectRedactor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;gBAGlD,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,mBAAmB,EACrC,mBAAmB,EAAE,mBAAmB;IAU7B,aAAa,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAQpE,iBAAiB,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IAIzD,iBAAiB,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;CAGjE"}
|
package/dist/objectRedactor.js
CHANGED
|
@@ -10,288 +10,28 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.ObjectRedactor = void 0;
|
|
13
|
-
const
|
|
13
|
+
const objectRedactorTraversal_1 = require("./objectRedactorTraversal");
|
|
14
14
|
/**
|
|
15
15
|
* Redacts fields in a JSON object using the secretManager, primitiveRedactor, and CustomObjectChecker provided in the
|
|
16
|
-
* constructor.
|
|
17
|
-
* followed by fullSecretKeys, then deepSecretKeys, and finally secretKeys. If a field is an object or an array it is
|
|
18
|
-
* assessed recursively unless otherwise configured by a CustomObject or deepSecretKey.
|
|
16
|
+
* constructor. CustomObjects take highest precedence, followed by fullSecretKeys, then deepSecretKeys, and finally secretKeys.
|
|
19
17
|
*/
|
|
20
18
|
class ObjectRedactor {
|
|
21
|
-
constructor(primitiveRedactor, secretManager, customObjManager) {
|
|
22
|
-
this.
|
|
23
|
-
this.secretManager = secretManager;
|
|
24
|
-
this.customObjManager = customObjManager;
|
|
19
|
+
constructor(primitiveRedactor, secretManager, customObjManager, valuePatternMatcher) {
|
|
20
|
+
this.traversal = new objectRedactorTraversal_1.ObjectRedactorTraversal(primitiveRedactor, secretManager, customObjManager, valuePatternMatcher);
|
|
25
21
|
}
|
|
26
|
-
/**
|
|
27
|
-
* Conditionally redacts fields in the JSON object in place based on the configuration using the
|
|
28
|
-
* primitive redactor, custom object checker, and secret manager provided in the constructor.
|
|
29
|
-
* @param value The JSON value to redact in place.
|
|
30
|
-
* @returns The JSON value provided in the argument.
|
|
31
|
-
*/
|
|
32
22
|
redactInPlace(value) {
|
|
33
23
|
return __awaiter(this, void 0, void 0, function* () {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
yield this.handleCustomObjectInPlace(value, customObject);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
yield this.redactSecretObjectFieldsInPlace(value);
|
|
40
|
-
}
|
|
41
|
-
return value;
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
redactSecretObjectFieldsInPlace(object_1) {
|
|
45
|
-
return __awaiter(this, arguments, void 0, function* (object, forceDeepRedaction = false) {
|
|
46
|
-
for (const key of Object.keys(object)) {
|
|
47
|
-
const value = object[key];
|
|
48
|
-
const customObject = this.customObjManager.getMatchingCustomObject(value);
|
|
49
|
-
if (customObject) {
|
|
50
|
-
yield this.handleCustomObjectInPlace(value, customObject);
|
|
51
|
-
}
|
|
52
|
-
else if (this.secretManager.isFullSecretKey(key)) {
|
|
53
|
-
object[key] = yield this.primitiveRedactor.redactValue(this.getStringValue(value));
|
|
54
|
-
}
|
|
55
|
-
else if (Array.isArray(object[key])) {
|
|
56
|
-
object[key] = yield this.redactArrayInObject(value, key, forceDeepRedaction);
|
|
57
|
-
}
|
|
58
|
-
else if (this.isObject(object[key])) {
|
|
59
|
-
yield this.redactObjectInObject(object[key], key, forceDeepRedaction);
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
object[key] = yield this.redactPrimitiveValueIfSecret(key, value, forceDeepRedaction);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
redactArrayInObject(array, key, forceDeepRedaction) {
|
|
68
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
-
const deepSecretKey = this.secretManager.isDeepSecretKey(key);
|
|
70
|
-
if (this.secretManager.isSecretKey(key) || deepSecretKey || forceDeepRedaction) {
|
|
71
|
-
return this.redactAllArrayValues(array, forceDeepRedaction || deepSecretKey);
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
return yield this.redactObjectsInArray(array);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
redactObjectsInArray(array) {
|
|
79
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
-
const promises = array.map((value) => __awaiter(this, void 0, void 0, function* () {
|
|
81
|
-
if (this.isObject(value)) {
|
|
82
|
-
const customObject = this.customObjManager.getMatchingCustomObject(value);
|
|
83
|
-
if (customObject) {
|
|
84
|
-
yield this.handleCustomObjectInPlace(value, customObject);
|
|
85
|
-
return value;
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
yield this.redactSecretObjectFieldsInPlace(value, false);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
return value;
|
|
92
|
-
}));
|
|
93
|
-
return Promise.all(promises);
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
redactAllArrayValues(array, forceDeepRedaction) {
|
|
97
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
98
|
-
const promises = array.map((value) => __awaiter(this, void 0, void 0, function* () {
|
|
99
|
-
if (Array.isArray(value)) {
|
|
100
|
-
return this.redactAllArrayValues(value, forceDeepRedaction);
|
|
101
|
-
}
|
|
102
|
-
else if (!this.isObject(value)) {
|
|
103
|
-
return this.primitiveRedactor.redactValue(value);
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
const customObject = this.customObjManager.getMatchingCustomObject(value);
|
|
107
|
-
if (customObject) {
|
|
108
|
-
yield this.handleCustomObjectInPlace(value, customObject);
|
|
109
|
-
return Promise.resolve(value);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
yield this.redactSecretObjectFieldsInPlace(value, forceDeepRedaction);
|
|
113
|
-
return Promise.resolve(value);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}));
|
|
117
|
-
return Promise.all(promises);
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
redactObjectInObject(value, key, forceDeepRedaction) {
|
|
121
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
122
|
-
const customObject = this.customObjManager.getMatchingCustomObject(value);
|
|
123
|
-
if (customObject) {
|
|
124
|
-
yield this.handleCustomObjectInPlace(value, customObject);
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
const secretObject = forceDeepRedaction || this.secretManager.isDeepSecretKey(key);
|
|
128
|
-
yield this.redactSecretObjectFieldsInPlace(value, secretObject);
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
handleCustomObjectInPlace(value, customObject) {
|
|
133
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
134
|
-
for (const key of Object.keys(customObject)) {
|
|
135
|
-
if (Array.isArray(value[key])) {
|
|
136
|
-
yield this.handleCustomObjectValueIfArray(value, key, customObject);
|
|
137
|
-
}
|
|
138
|
-
else if (this.isObject(value[key])) {
|
|
139
|
-
yield this.handlecustomObjectValueIfObject(value, key, customObject);
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
yield this.handleCustomObjectValueIfPrimitive(value, customObject, key);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
}
|
|
147
|
-
handleCustomObjectValueIfArray(value, key, customObject) {
|
|
148
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
149
|
-
const stringKey = this.getStringSpecifiedCustomObjectSecretKeyValueIfExists(value, customObject, key);
|
|
150
|
-
if (stringKey) {
|
|
151
|
-
yield this.handleCustomObjectArrayValueIfStringKeySpecified(value, key, stringKey);
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
yield this.handleCustomObjectArrayValueIfMatchTypeSpecified(value, key, customObject[key]);
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
getStringSpecifiedCustomObjectSecretKeyValueIfExists(value, customObject, key) {
|
|
159
|
-
const hasSecretKey = typeof customObject[key] === 'string' && !!value[customObject[key]];
|
|
160
|
-
return hasSecretKey ? value[customObject[key]] : null;
|
|
161
|
-
}
|
|
162
|
-
handleCustomObjectArrayValueIfStringKeySpecified(value, key, stringKey) {
|
|
163
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
164
|
-
if (this.secretManager.isFullSecretKey(stringKey)) {
|
|
165
|
-
value[key] = yield this.primitiveRedactor.redactValue(this.getStringValue(value[key]));
|
|
166
|
-
}
|
|
167
|
-
const isDeepSecretKey = this.secretManager.isDeepSecretKey(stringKey);
|
|
168
|
-
if (isDeepSecretKey || this.secretManager.isSecretKey(stringKey)) {
|
|
169
|
-
value[key] = yield this.redactAllArrayValues(value[key], isDeepSecretKey);
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
handleCustomObjectArrayValueIfMatchTypeSpecified(value, key, matchType) {
|
|
174
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
175
|
-
switch (matchType) {
|
|
176
|
-
case types_1.CustomObjectMatchType.Full:
|
|
177
|
-
value[key] = yield this.primitiveRedactor.redactValue(this.getStringValue(value[key]));
|
|
178
|
-
return Promise.resolve();
|
|
179
|
-
case types_1.CustomObjectMatchType.Deep:
|
|
180
|
-
value[key] = yield this.redactAllArrayValues(value[key], true);
|
|
181
|
-
return Promise.resolve();
|
|
182
|
-
case types_1.CustomObjectMatchType.Shallow:
|
|
183
|
-
value[key] = yield this.redactAllArrayValues(value[key], false);
|
|
184
|
-
return Promise.resolve();
|
|
185
|
-
case types_1.CustomObjectMatchType.Pass:
|
|
186
|
-
value[key] = yield this.redactArrayInObject(value[key], key, false);
|
|
187
|
-
default:
|
|
188
|
-
return Promise.resolve();
|
|
24
|
+
if (!this.traversal.usesAsyncRedactor()) {
|
|
25
|
+
return Promise.resolve(this.redactInPlaceSync(value));
|
|
189
26
|
}
|
|
27
|
+
return this.traversal.redactInPlaceAsync(value);
|
|
190
28
|
});
|
|
191
29
|
}
|
|
192
|
-
|
|
193
|
-
return
|
|
194
|
-
const stringKey = this.getStringSpecifiedCustomObjectSecretKeyValueIfExists(value, customObject, key);
|
|
195
|
-
if (stringKey) {
|
|
196
|
-
yield this.handleCustomObjectObjectValueIfStringKeySpecified(value, key, stringKey);
|
|
197
|
-
}
|
|
198
|
-
else {
|
|
199
|
-
yield this.handleCustomObjectOjectValueIfMatchTypeSpecified(value, key, customObject[key]);
|
|
200
|
-
}
|
|
201
|
-
});
|
|
30
|
+
redactInPlaceSync(value) {
|
|
31
|
+
return this.traversal.redactInPlace(value);
|
|
202
32
|
}
|
|
203
|
-
|
|
204
|
-
return
|
|
205
|
-
const customObject = this.customObjManager.getMatchingCustomObject(value[key]);
|
|
206
|
-
if (customObject) {
|
|
207
|
-
yield this.handleCustomObjectInPlace(value[key], customObject);
|
|
208
|
-
}
|
|
209
|
-
else if (this.secretManager.isFullSecretKey(stringKey)) {
|
|
210
|
-
value[key] = yield this.primitiveRedactor.redactValue(this.getStringValue(value[key]));
|
|
211
|
-
}
|
|
212
|
-
else if (this.secretManager.isDeepSecretKey(stringKey)) {
|
|
213
|
-
yield this.redactSecretObjectFieldsInPlace(value[key], true);
|
|
214
|
-
}
|
|
215
|
-
else if (this.secretManager.isSecretKey(stringKey)) {
|
|
216
|
-
yield this.redactSecretObjectFieldsInPlace(value[key], false);
|
|
217
|
-
}
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
handleCustomObjectOjectValueIfMatchTypeSpecified(value, key, matchType) {
|
|
221
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
222
|
-
switch (matchType) {
|
|
223
|
-
case types_1.CustomObjectMatchType.Full:
|
|
224
|
-
value[key] = yield this.primitiveRedactor.redactValue(this.getStringValue(value[key]));
|
|
225
|
-
return Promise.resolve();
|
|
226
|
-
case types_1.CustomObjectMatchType.Deep:
|
|
227
|
-
return this.redactSecretObjectFieldsInPlace(value[key], true);
|
|
228
|
-
case types_1.CustomObjectMatchType.Shallow:
|
|
229
|
-
case types_1.CustomObjectMatchType.Pass:
|
|
230
|
-
return this.redactSecretObjectFieldsInPlace(value[key], false);
|
|
231
|
-
case types_1.CustomObjectMatchType.Ignore:
|
|
232
|
-
return Promise.resolve();
|
|
233
|
-
}
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
handleCustomObjectValueIfPrimitive(value, customObject, key) {
|
|
237
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
238
|
-
if (typeof customObject[key] === 'number') {
|
|
239
|
-
value[key] = yield this.handleCustomObjectPrimitiveValueIfMatchTypeSpecified(value[key], customObject[key]);
|
|
240
|
-
}
|
|
241
|
-
else {
|
|
242
|
-
value[key] = yield this.handleCustomObjectPrimitiveValueIfStringKeySpecified(value, customObject, key);
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
}
|
|
246
|
-
handleCustomObjectPrimitiveValueIfMatchTypeSpecified(value, matchValue) {
|
|
247
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
248
|
-
switch (matchValue) {
|
|
249
|
-
case types_1.CustomObjectMatchType.Full:
|
|
250
|
-
return this.primitiveRedactor.redactValue(this.getStringValue(value));
|
|
251
|
-
case types_1.CustomObjectMatchType.Deep:
|
|
252
|
-
case types_1.CustomObjectMatchType.Shallow:
|
|
253
|
-
return this.primitiveRedactor.redactValue(value);
|
|
254
|
-
case types_1.CustomObjectMatchType.Pass:
|
|
255
|
-
default:
|
|
256
|
-
return Promise.resolve(value);
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
handleCustomObjectPrimitiveValueIfStringKeySpecified(value, customObject, key) {
|
|
261
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
262
|
-
const secretKey = this.getStringSpecifiedCustomObjectSecretKeyValueIfExists(value, customObject, key);
|
|
263
|
-
if (!secretKey) {
|
|
264
|
-
return value[key];
|
|
265
|
-
}
|
|
266
|
-
return this.redactPrimitiveValueIfSecret(secretKey, value[key], false);
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
getStringValue(val) {
|
|
270
|
-
if (this.isObject(val) || Array.isArray(val)) {
|
|
271
|
-
return JSON.stringify(val);
|
|
272
|
-
}
|
|
273
|
-
else if (val === null || val === undefined) {
|
|
274
|
-
return val;
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
return val.toString();
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
isObject(value) {
|
|
281
|
-
return !!value && typeof value === 'object' && !(value instanceof Date) && !Array.isArray(value);
|
|
282
|
-
}
|
|
283
|
-
redactPrimitiveValueIfSecret(key, value, forceDeepRedaction) {
|
|
284
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
285
|
-
if (this.secretManager.isFullSecretKey(key)) {
|
|
286
|
-
return this.primitiveRedactor.redactValue(this.getStringValue(value));
|
|
287
|
-
}
|
|
288
|
-
else if (forceDeepRedaction || this.secretManager.isSecretKey(key) || this.secretManager.isDeepSecretKey(key)) {
|
|
289
|
-
return this.primitiveRedactor.redactValue(value);
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
return value;
|
|
293
|
-
}
|
|
294
|
-
});
|
|
33
|
+
redactCopyOnWrite(value) {
|
|
34
|
+
return this.traversal.redactCopyOnWrite(value);
|
|
295
35
|
}
|
|
296
36
|
}
|
|
297
37
|
exports.ObjectRedactor = ObjectRedactor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"objectRedactor.js","sourceRoot":"","sources":["../src/objectRedactor.ts"],"names":[],"mappings":";;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"objectRedactor.js","sourceRoot":"","sources":["../src/objectRedactor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAKA,uEAAoE;AAEpE;;;GAGG;AACH,MAAa,cAAc;IAGzB,YACE,iBAAoC,EACpC,aAA4B,EAC5B,gBAAqC,EACrC,mBAAwC;QAExC,IAAI,CAAC,SAAS,GAAG,IAAI,iDAAuB,CAC1C,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAEY,aAAa,CAA4B,KAAQ;;YAC5D,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBACxC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YACxD,CAAC;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAClD,CAAC;KAAA;IAEM,iBAAiB,CAA4B,KAAQ;QAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAEM,iBAAiB,CAA4B,KAAQ;QAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;CACF;AAhCD,wCAgCC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { TraversableJson } from './types';
|
|
2
|
+
import { SecretManager } from './secretManager';
|
|
3
|
+
import { CustomObjectManager } from './customObjectManager';
|
|
4
|
+
import { PrimitiveRedactor } from './primitiveRedactor';
|
|
5
|
+
/**
|
|
6
|
+
* Copy-on-write JSON traversal: clones only branches that are mutated so unredacted
|
|
7
|
+
* subtrees are shared with the input.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ObjectRedactorCowTraversal {
|
|
10
|
+
private readonly primitiveRedactor;
|
|
11
|
+
private readonly secretManager;
|
|
12
|
+
private readonly customObjManager;
|
|
13
|
+
constructor(primitiveRedactor: PrimitiveRedactor, secretManager: SecretManager, customObjManager: CustomObjectManager);
|
|
14
|
+
redactCopyOnWrite<T extends TraversableJson>(value: T): T;
|
|
15
|
+
private redactSecretObjectFields;
|
|
16
|
+
private redactSecretArrayRecord;
|
|
17
|
+
private redactSecretObjectRecord;
|
|
18
|
+
private redactArrayInObject;
|
|
19
|
+
private redactObjectsInArray;
|
|
20
|
+
private redactAllArrayValues;
|
|
21
|
+
private redactNestedObject;
|
|
22
|
+
private handleCustomObject;
|
|
23
|
+
private handleCustomObjectValueIfArray;
|
|
24
|
+
private handleCustomObjectArrayValueIfStringKeySpecified;
|
|
25
|
+
private handleCustomObjectArrayValueIfMatchTypeSpecified;
|
|
26
|
+
private handleCustomObjectValueIfObject;
|
|
27
|
+
private handleCustomObjectObjectValueIfStringKeySpecified;
|
|
28
|
+
private handleCustomObjectObjectValueIfMatchTypeSpecified;
|
|
29
|
+
private handleCustomObjectValueIfPrimitive;
|
|
30
|
+
private handleCustomObjectPrimitiveValueIfMatchTypeSpecified;
|
|
31
|
+
private handleCustomObjectPrimitiveValueIfStringKeySpecified;
|
|
32
|
+
private redactPrimitiveValueIfSecret;
|
|
33
|
+
private redactPrimitive;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=objectRedactorCow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"objectRedactorCow.d.ts","sourceRoot":"","sources":["../src/objectRedactorCow.ts"],"names":[],"mappings":"AAAA,OAAO,EAUL,eAAe,EAChB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAkBxD;;;GAGG;AACH,qBAAa,0BAA0B;IAEnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAFhB,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,mBAAmB;IAGxD,iBAAiB,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC;IASzD,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,uBAAuB;IAyB/B,OAAO,CAAC,wBAAwB;IAwBhC,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,8BAA8B;IAStC,OAAO,CAAC,gDAAgD;IAsBxD,OAAO,CAAC,gDAAgD;IA8BxD,OAAO,CAAC,+BAA+B;IASvC,OAAO,CAAC,iDAAiD;IAwBzD,OAAO,CAAC,iDAAiD;IA6BzD,OAAO,CAAC,kCAAkC;IAkB1C,OAAO,CAAC,oDAAoD;IAsB5D,OAAO,CAAC,oDAAoD;IAgB5D,OAAO,CAAC,4BAA4B;IAcpC,OAAO,CAAC,eAAe;CAGxB"}
|