@forestadmin/agent 1.103.3 → 1.103.5
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/audit-trail/instrument.js +6 -3
- package/dist/audit-trail/record-visibility.d.ts +28 -0
- package/dist/audit-trail/record-visibility.js +49 -0
- package/dist/audit-trail/withhold.d.ts +41 -0
- package/dist/audit-trail/withhold.js +114 -0
- package/dist/routes/access/audit-trail-correlation.d.ts +1 -0
- package/dist/routes/access/audit-trail-correlation.js +80 -7
- package/dist/routes/access/audit-trail.d.ts +1 -1
- package/dist/routes/access/audit-trail.js +68 -42
- package/package.json +2 -2
- package/dist/audit-trail/scope.d.ts +0 -20
- package/dist/audit-trail/scope.js +0 -33
|
@@ -156,9 +156,12 @@ const redactValues = (values, redactedFields) => {
|
|
|
156
156
|
if (!redactedFields.length)
|
|
157
157
|
return values;
|
|
158
158
|
const result = { ...values };
|
|
159
|
-
|
|
160
|
-
|
|
159
|
+
// Own properties only: `'toString' in result` is true of every object, so a `redact` config
|
|
160
|
+
// naming an `Object.prototype` member would write a placeholder for a column the row never had.
|
|
161
|
+
for (const field of redactedFields) {
|
|
162
|
+
if (Object.prototype.hasOwnProperty.call(result, field))
|
|
161
163
|
result[field] = exports.REDACTED;
|
|
164
|
+
}
|
|
162
165
|
return result;
|
|
163
166
|
};
|
|
164
167
|
const consoleSink = record => {
|
|
@@ -390,4 +393,4 @@ function installAuditTrailHooks(dataSourceCustomizer, _collectionCustomizer, opt
|
|
|
390
393
|
// Returned so a broken bootstrap fails agent.start() instead of the first write.
|
|
391
394
|
return store?.init?.();
|
|
392
395
|
}
|
|
393
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdWRpdC10cmFpbC9pbnN0cnVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQW9QQSxzQ0EyRUM7QUFrTkQseUNBd0JDO0FBeGhCRCx3RUFLeUM7QUFFekMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFjLEVBQVcsRUFBRTtJQUN0RSxnR0FBZ0c7SUFDaEcsMEZBQTBGO0lBQzFGLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRXZELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBZ0MsQ0FBQzthQUNqRCxJQUFJLEVBQUU7YUFDTixNQUFNLENBQTBCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBSSxLQUFpQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXhELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLDBGQUEwRjtBQUMxRixxQ0FBcUM7QUFDckMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFVLEVBQUUsQ0FBVSxFQUFXLEVBQUUsQ0FDckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBRTFGLDJGQUEyRjtBQUMzRixnR0FBZ0c7QUFDaEcsaUdBQWlHO0FBQ2pHLHdGQUF3RjtBQUN4RixNQUFN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
|
|
396
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdWRpdC10cmFpbC9pbnN0cnVtZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXlQQSxzQ0EyRUM7QUFrTkQseUNBd0JDO0FBN2hCRCx3RUFLeUM7QUFFekMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFjLEVBQVcsRUFBRTtJQUN0RSxnR0FBZ0c7SUFDaEcsMEZBQTBGO0lBQzFGLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRXZELElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBZ0MsQ0FBQzthQUNqRCxJQUFJLEVBQUU7YUFDTixNQUFNLENBQTBCLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBSSxLQUFpQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXhELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLDBGQUEwRjtBQUMxRixxQ0FBcUM7QUFDckMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFVLEVBQUUsQ0FBVSxFQUFXLEVBQUUsQ0FDckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO0FBRTFGLDJGQUEyRjtBQUMzRixnR0FBZ0c7QUFDaEcsaUdBQWlHO0FBQ2pHLHdGQUF3RjtBQUN4RixNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBYSxFQUFXLEVBQUUsQ0FDbEQsT0FBUSxLQUE4QixDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUM7QUFFL0QsaUdBQWlHO0FBQ2pHLDBGQUEwRjtBQUMxRixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLDhGQUE4RjtBQUM5RixrR0FBa0c7QUFDbEcsZUFBZTtBQUNmLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBYyxFQUFXLEVBQUU7SUFDN0MsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdkQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV2RCxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25FLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFnQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JFLEdBQUc7WUFDSCxVQUFVLENBQUMsS0FBSyxDQUFDO1NBQ2xCLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUYsa0dBQWtHO0FBQ2xHLGtHQUFrRztBQUNsRyxrR0FBa0c7QUFDbEcscUdBQXFHO0FBQ3JHLHVDQUF1QztBQUMxQixRQUFBLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQVF6Qyw2RkFBNkY7QUFDN0Ysa0dBQWtHO0FBQ2xHLCtGQUErRjtBQUMvRix3REFBd0Q7QUFDeEQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBNkIsQ0FBQztBQUVuRSxTQUFTLFlBQVksQ0FBQyxHQUFXLEVBQUUsS0FBc0I7SUFDdkQsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMvQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xCLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELDRGQUE0RjtBQUM1RixpR0FBaUc7QUFDakcsaUdBQWlHO0FBQ2pHLG1HQUFtRztBQUNuRyw0RUFBNEU7QUFDNUUsU0FBUyxZQUFZLENBQUMsR0FBVyxFQUFFLEtBQWtCO0lBQ25ELE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRW5ELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRixNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTFELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXRELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELGtHQUFrRztBQUNsRyxpR0FBaUc7QUFDakcsbUdBQW1HO0FBQ25HLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQWdDLENBQUM7QUFFckUsd0VBQXdFO0FBQ3hFLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxNQUFrQixFQUFFLFdBQXFCLEVBQVUsRUFBRTtJQUM3RSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0QsQ0FBQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFrQixFQUFFLE9BQWlCLEVBQTJCLEVBQUUsQ0FDckYsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUUxRixNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQWMsRUFBb0MsRUFBRSxDQUN6RSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDO0FBRW5HLE1BQU0sYUFBYSxHQUFHLENBQUMsS0FBYyxFQUFzQyxFQUFFLENBQzNFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUl6RSxpR0FBaUc7QUFDakcsZ0dBQWdHO0FBQ2hHLCtGQUErRjtBQUMvRixpR0FBaUc7QUFDakcsb0VBQW9FO0FBQ3BFLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBZSxFQUFFLEtBQWMsRUFBZ0IsRUFBRTtJQUM3RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFM0MsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxRQUFRLEdBQTRCLEVBQUUsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBNEIsRUFBRSxDQUFDO1FBRXpDLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzNFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFL0MsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWM7b0JBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7Z0JBQ2hFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVTtvQkFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNsRCxNQUFNLFFBQVEsR0FBNEIsRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUE0QixFQUFFLENBQUM7UUFFekMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFbkQsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWM7b0JBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVTtvQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUN4RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3RFLENBQUM7SUFFRCxPQUFPO1FBQ0wsUUFBUSxFQUFFLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUk7UUFDdkUsSUFBSSxFQUFFLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUk7UUFDakUsY0FBYyxFQUFFLE1BQU0sS0FBSyxTQUFTO1FBQ3BDLFVBQVUsRUFBRSxLQUFLLEtBQUssU0FBUztLQUNoQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsa0dBQWtHO0FBQ2xHLGlHQUFpRztBQUNqRyxNQUFNLGFBQWEsR0FBRyxDQUNwQixNQUFrQixFQUNsQixLQUFpQixFQUNqQixPQUFpQixFQUNnRSxFQUFFO0lBQ25GLE1BQU0sY0FBYyxHQUE0QixFQUFFLENBQUM7SUFDbkQsTUFBTSxTQUFTLEdBQTRCLEVBQUUsQ0FBQztJQUU5QyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFbEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYztnQkFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUNuRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7Z0JBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQ3ZDLENBQUMsQ0FBQztBQUVXLFFBQUEsUUFBUSxHQUFHLFlBQVksQ0FBQztBQUVyQyxNQUFNLFlBQVksR0FBRyxDQUNuQixNQUErQixFQUMvQixjQUF3QixFQUNDLEVBQUU7SUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFFMUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBRTdCLDRGQUE0RjtJQUM1RixnR0FBZ0c7SUFDaEcsS0FBSyxNQUFNLEtBQUssSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNuQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDO1lBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLGdCQUFRLENBQUM7SUFDcEYsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLE1BQU0sV0FBVyxHQUFjLE1BQU0sQ0FBQyxFQUFFO0lBQ3RDLHNDQUFzQztJQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBYUYsU0FBZ0IsYUFBYSxDQUMzQixLQUE2QixFQUM3QixJQUEyQixFQUMzQixRQUFpQixFQUNqQixNQUEwQjtJQUUxQixJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ1YsT0FBTztZQUNMLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPO2dCQUM5QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztvQkFBRSxPQUFPLEVBQUUsQ0FBQztnQkFFcEMsSUFBSSxDQUFDO29CQUNILE9BQU8sTUFBTSxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixvRkFBb0Y7b0JBQ3BGLHNGQUFzRjtvQkFDdEYsaUNBQWlDO29CQUNqQyxJQUFJLFFBQVE7d0JBQUUsTUFBTSxLQUFLLENBQUM7b0JBRTFCLE1BQU0sRUFBRSxDQUNOLE9BQU8sRUFDUCw0RUFBNEUsS0FBSyxFQUFFLENBQ3BGLENBQUM7b0JBRUYsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNqQyxDQUFDO1lBQ0gsQ0FBQztZQUNELEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEtBQUs7Z0JBQ3JCLElBQUksRUFBRSxLQUFLLElBQUk7b0JBQUUsT0FBTztnQkFFeEIsSUFBSSxDQUFDO29CQUNILE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2pDLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZiwwRUFBMEU7b0JBQzFFLE1BQU0sRUFBRSxDQUNOLE9BQU8sRUFDUCxtRUFBbUUsS0FBSyxFQUFFLENBQzNFLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxXQUFXLENBQUM7SUFDakMsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7SUFDMUQsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsT0FBTztRQUNMLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPO1lBQzlCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDMUIsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDO2dCQUNsQixNQUFNLElBQUksQ0FBQyxDQUFDO2dCQUNaLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUU1QixPQUFPLEVBQUUsQ0FBQztZQUNaLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLEtBQUs7WUFDckIsSUFBSSxFQUFFLEtBQUssSUFBSTtnQkFBRSxPQUFPO1lBRXhCLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPO1lBRXJCLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZiwwRUFBMEU7Z0JBQzFFLE1BQU0sRUFBRSxDQUNOLE9BQU8sRUFDUCxtRUFBbUUsS0FBSyxFQUFFLENBQzNFLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FDM0IsVUFBZ0MsRUFDaEMsUUFBa0IsRUFDbEIsY0FBd0IsRUFDeEIsTUFBMEIsRUFDMUIsUUFBaUI7SUFFakIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQztJQUM5QixNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDL0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVsQyxPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUN0RCxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sV0FBVyxHQUFHLGdDQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELDRGQUE0RjtJQUM1Rix1Q0FBdUM7SUFDdkMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxXQUFXLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQztJQUU1QixNQUFNLFdBQVcsR0FBRyxDQUNsQixNQUFjLEVBQ2QsS0FBMEYsRUFDdEUsRUFBRSxDQUFDLENBQUM7UUFDeEIsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1FBQ25DLFVBQVUsRUFBRSxJQUFJO1FBQ2hCLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRTtRQUNqQixhQUFhLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDL0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxRQUFRO1FBQzdCLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSztRQUN2QixVQUFVLEVBQUUsSUFBSTtRQUNoQixjQUFjLEVBQUUsTUFBTSxDQUFDLFNBQVM7UUFDaEMsR0FBRyxLQUFLO1FBQ1IsY0FBYyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQztRQUNsRSxTQUFTLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDO0tBQ3pELENBQUMsQ0FBQztJQUVILGdHQUFnRztJQUNoRywrRkFBK0Y7SUFDL0YsaUdBQWlHO0lBQ2pHLCtGQUErRjtJQUMvRixrR0FBa0c7SUFDbEcsaUdBQWlHO0lBQ2pHLDhFQUE4RTtJQUM5RSxNQUFNLFNBQVMsR0FBRyxDQUFDLE1BQWMsRUFBbUIsRUFBRSxDQUNwRCxJQUFJLG9DQUFlLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSx5QkFBSSxDQUFDLENBQUMsRUFBRSw0QkFBb0IsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFbEYsZ0dBQWdHO0lBQ2hHLGdHQUFnRztJQUNoRyxnR0FBZ0c7SUFDaEcsMkZBQTJGO0lBQzNGLHFCQUFxQjtJQUNyQixNQUFNLGtCQUFrQixHQUFHLENBQUMsU0FBOEIsRUFBRSxTQUFrQixFQUFRLEVBQUU7UUFDdEYsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBRXZCLE1BQU0sT0FBTyxHQUNYLCtCQUErQixJQUFJLEtBQUssU0FBUyxxQkFBcUI7WUFDdEUsR0FBRyw0QkFBb0IsNkJBQTZCLDRCQUFvQixrQkFBa0IsQ0FBQztRQUU3RixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLE9BQU8sd0RBQXdELENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRUQsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQztJQUVGLFVBQVUsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBZ0MsRUFBRSxFQUFFO1FBQ3hGLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUMzQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUMxQixTQUFTLEVBQUUsUUFBUTtZQUNuQixRQUFRLEVBQUUsSUFBSTtZQUNkLGNBQWMsRUFBRSxFQUFFO1lBQ2xCLFNBQVMsRUFBRSxFQUFFO1NBQ2QsQ0FBQyxDQUNILENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVyRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqRCxDQUFDLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBK0IsRUFBRSxFQUFFO1FBQ3RGLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVELGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3BDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRTtZQUMxQyxTQUFTLEVBQUUsUUFBUTtZQUNuQixRQUFRLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztZQUMvQyxjQUFjLEVBQUUsRUFBRTtZQUNsQixTQUFTLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLEVBQUUsY0FBYyxDQUFDO1NBQzlFLENBQUMsQ0FDSCxDQUNGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBZ0MsRUFBRSxFQUFFO1FBQ3hGLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUk7UUFDNUMsNkZBQTZGO1FBQzdGLDRGQUE0RjtRQUM1RiwwQkFBMEI7UUFDMUIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUEyQixDQUFVLEVBQ3ZELGNBQXlCLENBQzFCLENBQWlCLENBQUM7UUFFbkIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sR0FBRyw0QkFBb0IsQ0FBQztRQUN4RCxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSw0QkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFFNUUsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUN6QyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUMxQixTQUFTLEVBQUUsUUFBUTtZQUNuQixRQUFRLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztZQUMvQyxjQUFjLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUM7WUFDcEQsU0FBUyxFQUFFLEVBQUU7U0FDZCxDQUFDLENBQ0gsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLE1BQU0sUUFBUSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXJFLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDN0UsQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQWdDLEVBQUUsRUFBRTtRQUN2RixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0QsSUFBSSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTztRQUV0RCxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLFFBQVEsQ0FBQztRQUV4QywyRkFBMkY7UUFDM0Ysc0ZBQXNGO1FBQ3RGLHdGQUF3RjtRQUN4RixxRUFBcUU7UUFDckUsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEYsTUFBTSxXQUFXLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sS0FBSyxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDMUMsRUFBRSxhQUFhLEVBQUUseUNBQW9CLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBVyxFQUM5RSxjQUF5QixDQUMxQixDQUFpQixDQUFDO1FBQ25CLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFaEcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDM0IsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNyRixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDO1lBRTVDLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU8sU0FBUyxDQUFDO1lBRS9CLE1BQU0sRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFFdEYsMEZBQTBGO1lBQzFGLG1GQUFtRjtZQUNuRix3RkFBd0Y7WUFDeEYscUZBQXFGO1lBQ3JGLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7Z0JBQ2pDLFNBQVMsRUFBRSxRQUFRO2dCQUNuQixRQUFRLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQztnQkFDaEQsY0FBYyxFQUFFLFlBQVksQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDO2dCQUM1RCxTQUFTLEVBQUUsWUFBWSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUM7YUFDbkQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFnQyxFQUFFLEVBQUU7UUFDeEYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSTtRQUM1Qyw2RkFBNkY7UUFDN0YsNEZBQTRGO1FBQzVGLDBCQUEwQjtRQUMxQixTQUFTLENBQUMsT0FBTyxDQUFDLE1BQTJCLENBQVUsRUFDdkQsY0FBeUIsQ0FDMUIsQ0FBaUIsQ0FBQztRQUVuQixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLDRCQUFvQixDQUFDO1FBQ3hELGtCQUFrQixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLDRCQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUU1RSxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQ3pDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQzFCLFNBQVMsRUFBRSxRQUFRO1lBQ25CLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO1lBQy9DLGNBQWMsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQztZQUNwRCxTQUFTLEVBQUUsRUFBRTtTQUNkLENBQUMsQ0FDSCxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFckUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUMsQ0FBQztJQUVILFVBQVUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBZ0MsRUFBRSxFQUFFO1FBQ3ZGLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBRXRCLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsUUFBUSxDQUFDO1FBRXhDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQzNCLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRTtZQUMxQyxTQUFTLEVBQUUsUUFBUTtZQUNuQixRQUFRLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQztZQUMvQyxjQUFjLEVBQUUsWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLEVBQUUsY0FBYyxDQUFDO1lBQ2xGLFNBQVMsRUFBRSxFQUFFO1NBQ2QsQ0FBQyxDQUNILENBQ0YsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQXdCLHNCQUFzQixDQUM1QyxvQkFBMEMsRUFDMUMscUJBQWtELEVBQ2xELE9BQXFDO0lBRXJDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDeEUsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTlELEtBQUssTUFBTSxVQUFVLElBQUksb0JBQW9CLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDMUQsNEZBQTRGO1FBQzVGLDRGQUE0RjtRQUM1Rix5Q0FBeUM7UUFDekMsSUFBSSxnQ0FBVyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sRUFBRSxDQUNOLE1BQU0sRUFDTix3Q0FBd0MsVUFBVSxDQUFDLElBQUksNEJBQTRCLENBQ3BGLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEcsQ0FBQztJQUNILENBQUM7SUFFRCxpRkFBaUY7SUFDakYsT0FBTyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztBQUN6QixDQUFDIn0=
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Collection, ConditionTree } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import type { Context } from 'koa';
|
|
3
|
+
export declare function recordExists(collection: Collection, packedId: string, context: Context, permissionScope: ConditionTree | null): Promise<boolean>;
|
|
4
|
+
export type RecordVisibility = {
|
|
5
|
+
/** False → the id still exists and fails the permission scope; the caller must be denied entirely (404). */
|
|
6
|
+
visible: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* True once the id no longer exists at all, under any scope. `visible` is then true for a
|
|
9
|
+
* different reason than "the record matches the scope": there is nothing left to check
|
|
10
|
+
* existence against. It doesn't mean every value the audit trail holds for that record is safe
|
|
11
|
+
* to hand back to this caller — a scoped-down field value captured while the record still
|
|
12
|
+
* existed can still fall outside the caller's permission scope, and callers should check that separately
|
|
13
|
+
* (e.g. by re-evaluating the permission scope's `ConditionTree` against a delete row's `previousValues`)
|
|
14
|
+
* before deciding how much of the record's captured data to surface.
|
|
15
|
+
*/
|
|
16
|
+
goneEntirely: boolean;
|
|
17
|
+
};
|
|
18
|
+
export default function checkRecordVisibility(collection: Collection, packedId: string, context: Context, permissionScope: ConditionTree | null): Promise<RecordVisibility>;
|
|
19
|
+
/**
|
|
20
|
+
* The record can be deleted — or moved out of the caller's permission scope — between the check
|
|
21
|
+
* that authorized the request and the audit read that answers it: the audit trail lives in its own
|
|
22
|
+
* database, often its own engine, so no single snapshot spans both. Re-reads once the rows are in
|
|
23
|
+
* hand, and returns null when there is nothing to re-read: a caller with no scope has nothing to
|
|
24
|
+
* withhold, and a record already gone at the first check has already had the withholding applied —
|
|
25
|
+
* an id recreated in the meantime would only widen what is served, never what is hidden.
|
|
26
|
+
*/
|
|
27
|
+
export declare function recheckRecordVisibility(collection: Collection, packedId: string, context: Context, permissionScope: ConditionTree | null, wasGoneEntirely: boolean): Promise<RecordVisibility | null>;
|
|
28
|
+
//# sourceMappingURL=record-visibility.d.ts.map
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.recordExists = recordExists;
|
|
7
|
+
exports.default = checkRecordVisibility;
|
|
8
|
+
exports.recheckRecordVisibility = recheckRecordVisibility;
|
|
9
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
10
|
+
const id_1 = __importDefault(require("../utils/id"));
|
|
11
|
+
const query_string_1 = __importDefault(require("../utils/query-string"));
|
|
12
|
+
async function recordExists(collection, packedId, context, permissionScope) {
|
|
13
|
+
const id = id_1.default.unpackId(collection.schema, packedId);
|
|
14
|
+
const filter = new datasource_toolkit_1.PaginatedFilter({
|
|
15
|
+
conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(collection.schema, [id]), permissionScope),
|
|
16
|
+
});
|
|
17
|
+
const records = await collection.list(query_string_1.default.parseCaller(context, { defaultTimezone: 'UTC' }), filter, new datasource_toolkit_1.Projection(...datasource_toolkit_1.SchemaUtils.getPrimaryKeys(collection.schema)));
|
|
18
|
+
return records.length > 0;
|
|
19
|
+
}
|
|
20
|
+
// A record-level permission scope can't be evaluated against a record that no longer exists, so a caller whose
|
|
21
|
+
// access is scoped down is only denied when the id currently exists and fails that permission scope — once it's
|
|
22
|
+
// genuinely gone there is nothing left to scope against, and showing that it existed (including that
|
|
23
|
+
// it was deleted, by whom and when) is much of the point of an audit trail.
|
|
24
|
+
// The caller passes the permission scope it will also withhold with, rather than this reading its
|
|
25
|
+
// own: two lookups can disagree if the scope cache turns over between them, and the answer here
|
|
26
|
+
// decides what that scope is then applied to.
|
|
27
|
+
async function checkRecordVisibility(collection, packedId, context, permissionScope) {
|
|
28
|
+
if (!permissionScope)
|
|
29
|
+
return { visible: true, goneEntirely: false };
|
|
30
|
+
if (await recordExists(collection, packedId, context, permissionScope)) {
|
|
31
|
+
return { visible: true, goneEntirely: false };
|
|
32
|
+
}
|
|
33
|
+
const existsOutsidePermissionScope = await recordExists(collection, packedId, context, null);
|
|
34
|
+
return { visible: !existsOutsidePermissionScope, goneEntirely: !existsOutsidePermissionScope };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The record can be deleted — or moved out of the caller's permission scope — between the check
|
|
38
|
+
* that authorized the request and the audit read that answers it: the audit trail lives in its own
|
|
39
|
+
* database, often its own engine, so no single snapshot spans both. Re-reads once the rows are in
|
|
40
|
+
* hand, and returns null when there is nothing to re-read: a caller with no scope has nothing to
|
|
41
|
+
* withhold, and a record already gone at the first check has already had the withholding applied —
|
|
42
|
+
* an id recreated in the meantime would only widen what is served, never what is hidden.
|
|
43
|
+
*/
|
|
44
|
+
async function recheckRecordVisibility(collection, packedId, context, permissionScope, wasGoneEntirely) {
|
|
45
|
+
if (!permissionScope || wasGoneEntirely)
|
|
46
|
+
return null;
|
|
47
|
+
return checkRecordVisibility(collection, packedId, context, permissionScope);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLXZpc2liaWxpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXVkaXQtdHJhaWwvcmVjb3JkLXZpc2liaWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFhQSxvQ0FxQkM7QUF3QkQsd0NBZUM7QUFVRCwwREFVQztBQTFGRCx3RUFLeUM7QUFFekMscURBQWtDO0FBQ2xDLHlFQUFzRDtBQUUvQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxVQUFzQixFQUN0QixRQUFnQixFQUNoQixPQUFnQixFQUNoQixlQUFxQztJQUVyQyxNQUFNLEVBQUUsR0FBRyxZQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekQsTUFBTSxNQUFNLEdBQUcsSUFBSSxvQ0FBZSxDQUFDO1FBQ2pDLGFBQWEsRUFBRSx5Q0FBb0IsQ0FBQyxTQUFTLENBQzNDLHlDQUFvQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDdEQsZUFBZSxDQUNoQjtLQUNGLENBQUMsQ0FBQztJQUVILE1BQU0sT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FDbkMsc0JBQWlCLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUNsRSxNQUFNLEVBQ04sSUFBSSwrQkFBVSxDQUFDLEdBQUcsZ0NBQVcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQ2pFLENBQUM7SUFFRixPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFpQkQsK0dBQStHO0FBQy9HLGdIQUFnSDtBQUNoSCxxR0FBcUc7QUFDckcsNEVBQTRFO0FBQzVFLGtHQUFrRztBQUNsRyxnR0FBZ0c7QUFDaEcsOENBQThDO0FBQy9CLEtBQUssVUFBVSxxQkFBcUIsQ0FDakQsVUFBc0IsRUFDdEIsUUFBZ0IsRUFDaEIsT0FBZ0IsRUFDaEIsZUFBcUM7SUFFckMsSUFBSSxDQUFDLGVBQWU7UUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFFcEUsSUFBSSxNQUFNLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQ3ZFLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQsTUFBTSw0QkFBNEIsR0FBRyxNQUFNLFlBQVksQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUU3RixPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsNEJBQTRCLEVBQUUsWUFBWSxFQUFFLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztBQUNqRyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNJLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsVUFBc0IsRUFDdEIsUUFBZ0IsRUFDaEIsT0FBZ0IsRUFDaEIsZUFBcUMsRUFDckMsZUFBd0I7SUFFeEIsSUFBSSxDQUFDLGVBQWUsSUFBSSxlQUFlO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFckQsT0FBTyxxQkFBcUIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztBQUMvRSxDQUFDIn0=
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AuditRecord } from './types';
|
|
2
|
+
import type { Collection, ConditionTree, Logger } from '@forestadmin/datasource-toolkit';
|
|
3
|
+
export type Withholding = {
|
|
4
|
+
collection: Collection;
|
|
5
|
+
permissionScope: ConditionTree;
|
|
6
|
+
timezone: string;
|
|
7
|
+
logger?: Logger;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Whether the row's own packed id answers for the side being tested.
|
|
11
|
+
*
|
|
12
|
+
* `false` for the previous side of an `update`: the capture files a row under the identity the
|
|
13
|
+
* record ended up with, so on an update that moved the primary key the row's id describes the new
|
|
14
|
+
* state only. It is also `false` for `/state`, whose reconstruction can sit on the far side of a
|
|
15
|
+
* move the route cannot see.
|
|
16
|
+
*/
|
|
17
|
+
type IdAnswersForSide = boolean;
|
|
18
|
+
export declare function permissionScopeAccepts(snapshot: Record<string, unknown>, { collection, permissionScope, timezone }: Withholding): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* The row's packed id as a `{ key: value }` map, or null when there is none to read — no id at all
|
|
21
|
+
* (a pending create), or one the current schema can no longer unpack.
|
|
22
|
+
*
|
|
23
|
+
* Absence is `null`, not falsiness: `''` is a legal value for a string primary key, and it packs
|
|
24
|
+
* and unpacks like any other. Reading it as "no id" would leave the key unanswered and blank the
|
|
25
|
+
* values of a record whose id genuinely is the empty string.
|
|
26
|
+
*/
|
|
27
|
+
export declare function decodePrimaryKeys(packedId: string | null, collection: Collection, logger?: Logger): Record<string, unknown> | null;
|
|
28
|
+
/** The snapshot a permission scope should be evaluated against, for one side of one row. */
|
|
29
|
+
export declare function snapshotFor(values: Record<string, unknown>, packedId: string | null, { collection, logger }: Pick<Withholding, 'collection' | 'logger'>, idAnswersForSide?: IdAnswersForSide): Record<string, unknown>;
|
|
30
|
+
/**
|
|
31
|
+
* Blanks the captured values a caller's record-level permission scope does not cover, keeping the row itself:
|
|
32
|
+
* that it happened, by whom and when stays visible either way.
|
|
33
|
+
*
|
|
34
|
+
* Each side is tested against its own snapshot. An `update` carries a partial diff, so a permission scope on a
|
|
35
|
+
* column it never touched is simply unanswerable there and withheld by the same rule as everything
|
|
36
|
+
* else — which is why this needs no special case beyond `action` rows, whose two columns hold a
|
|
37
|
+
* submitted form and a result summary rather than column values.
|
|
38
|
+
*/
|
|
39
|
+
export default function withholdOutsidePermissionScope(entries: AuditRecord[], withholding: Withholding): AuditRecord[];
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=withhold.d.ts.map
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.permissionScopeAccepts = permissionScopeAccepts;
|
|
7
|
+
exports.decodePrimaryKeys = decodePrimaryKeys;
|
|
8
|
+
exports.snapshotFor = snapshotFor;
|
|
9
|
+
exports.default = withholdOutsidePermissionScope;
|
|
10
|
+
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
11
|
+
const instrument_1 = require("./instrument");
|
|
12
|
+
const id_1 = __importDefault(require("../utils/id"));
|
|
13
|
+
// Only a snapshot that answers every field the permission scope asks about is worth matching. The
|
|
14
|
+
// capture keeps the writable columns, so a permission scope reaching for anything else — a
|
|
15
|
+
// read-only column, a relation — reads `undefined` there and would answer for a value the row never
|
|
16
|
+
// held: `status != 'private'` matches on the missing key and releases it.
|
|
17
|
+
//
|
|
18
|
+
// The snapshot reaching this point has already had its unanswerable fields removed, so a missing key
|
|
19
|
+
// is the whole test — see `answerableSnapshot`.
|
|
20
|
+
//
|
|
21
|
+
// Own properties only: `'toString' in snapshot` is true of every object, so a permission scope on a
|
|
22
|
+
// column named after one of `Object.prototype`'s members would otherwise resolve against the
|
|
23
|
+
// prototype.
|
|
24
|
+
function permissionScopeAccepts(snapshot, { collection, permissionScope, timezone }) {
|
|
25
|
+
const values = snapshot ?? {};
|
|
26
|
+
const answered = permissionScope.projection.every(field => Object.prototype.hasOwnProperty.call(values, field));
|
|
27
|
+
return answered && permissionScope.match(values, collection, timezone);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* What this side of a row can honestly answer about.
|
|
31
|
+
*
|
|
32
|
+
* A redacted value answers nothing, so it is dropped rather than matched against the placeholder:
|
|
33
|
+
* the field then reads as unanswered, which withholds.
|
|
34
|
+
*
|
|
35
|
+
* The packed id then fills in the primary keys the snapshot cannot supply, but only where the row's
|
|
36
|
+
* id is authoritative for this side:
|
|
37
|
+
*
|
|
38
|
+
* - **absent** means the key is read-only — the capture keeps every writable column — and a
|
|
39
|
+
* read-only key cannot move, so the row's id answers for it on either side. Always filled.
|
|
40
|
+
* - **redacted** means the key is writable, so it can have moved. The row's id then answers only for
|
|
41
|
+
* the side it was filed under. Filling the other side would judge the previous state by an id it
|
|
42
|
+
* never had, and a permission scope on the new id would release values captured under the old one.
|
|
43
|
+
*
|
|
44
|
+
* Declining to fill over-withholds an update's previous side whenever its primary key is redacted —
|
|
45
|
+
* the same "absent is not the same as passing" direction as everything else here. Carrying the
|
|
46
|
+
* id it moved from is what would remove that cost; see PRD-1321.
|
|
47
|
+
*/
|
|
48
|
+
function answerableSnapshot(values, decoded, idAnswersForSide) {
|
|
49
|
+
const entries = Object.entries(values ?? {});
|
|
50
|
+
const answered = Object.fromEntries(entries.filter(([, value]) => value !== instrument_1.REDACTED));
|
|
51
|
+
if (!decoded)
|
|
52
|
+
return answered;
|
|
53
|
+
const redacted = new Set(entries.filter(([, value]) => value === instrument_1.REDACTED).map(([field]) => field));
|
|
54
|
+
const fill = Object.fromEntries(Object.entries(decoded).filter(([field]) => idAnswersForSide || !redacted.has(field)));
|
|
55
|
+
return { ...fill, ...answered };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The row's packed id as a `{ key: value }` map, or null when there is none to read — no id at all
|
|
59
|
+
* (a pending create), or one the current schema can no longer unpack.
|
|
60
|
+
*
|
|
61
|
+
* Absence is `null`, not falsiness: `''` is a legal value for a string primary key, and it packs
|
|
62
|
+
* and unpacks like any other. Reading it as "no id" would leave the key unanswered and blank the
|
|
63
|
+
* values of a record whose id genuinely is the empty string.
|
|
64
|
+
*/
|
|
65
|
+
function decodePrimaryKeys(packedId, collection, logger) {
|
|
66
|
+
if (packedId === null || packedId === undefined)
|
|
67
|
+
return null;
|
|
68
|
+
try {
|
|
69
|
+
const names = datasource_toolkit_1.SchemaUtils.getPrimaryKeys(collection.schema);
|
|
70
|
+
const ids = id_1.default.unpackId(collection.schema, packedId);
|
|
71
|
+
return Object.fromEntries(names.map((name, index) => [name, ids[index]]));
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
// The id the row was filed under no longer fits the collection's key: a renamed or retyped
|
|
75
|
+
// primary key, or a corrupted row. Withholding is the safe answer and the caller gets it
|
|
76
|
+
// either way, but a live audit read failing to decode its own ids is worth saying out loud.
|
|
77
|
+
logger?.('Warn', `Audit trail: cannot unpack record id "${packedId}" (${error.message})`);
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** The snapshot a permission scope should be evaluated against, for one side of one row. */
|
|
82
|
+
function snapshotFor(values, packedId, { collection, logger }, idAnswersForSide = true) {
|
|
83
|
+
return answerableSnapshot(values, decodePrimaryKeys(packedId, collection, logger), idAnswersForSide);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Blanks the captured values a caller's record-level permission scope does not cover, keeping the row itself:
|
|
87
|
+
* that it happened, by whom and when stays visible either way.
|
|
88
|
+
*
|
|
89
|
+
* Each side is tested against its own snapshot. An `update` carries a partial diff, so a permission scope on a
|
|
90
|
+
* column it never touched is simply unanswerable there and withheld by the same rule as everything
|
|
91
|
+
* else — which is why this needs no special case beyond `action` rows, whose two columns hold a
|
|
92
|
+
* submitted form and a result summary rather than column values.
|
|
93
|
+
*/
|
|
94
|
+
function withholdOutsidePermissionScope(entries, withholding) {
|
|
95
|
+
return entries.map(entry => {
|
|
96
|
+
if (entry.operation === 'action' || entry.operation === 'action_failed')
|
|
97
|
+
return entry;
|
|
98
|
+
// Decoded once per row rather than once per side: the two sides read the same id, and a row
|
|
99
|
+
// whose id no longer decodes should say so once.
|
|
100
|
+
const decoded = decodePrimaryKeys(entry.recordId, withholding.collection, withholding.logger);
|
|
101
|
+
const side = (values, idAnswersForSide) => permissionScopeAccepts(answerableSnapshot(values, decoded, idAnswersForSide), withholding)
|
|
102
|
+
? values ?? {}
|
|
103
|
+
: {};
|
|
104
|
+
return {
|
|
105
|
+
...entry,
|
|
106
|
+
// The row is filed under the identity the record ended up with, so its id answers for the
|
|
107
|
+
// new side of an update and for a create or a delete — never for what an update moved away
|
|
108
|
+
// from.
|
|
109
|
+
previousValues: side(entry.previousValues, entry.operation !== 'update'),
|
|
110
|
+
newValues: side(entry.newValues, true),
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aGhvbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXVkaXQtdHJhaWwvd2l0aGhvbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFvQ0Esd0RBVUM7QUFpREQsOENBb0JDO0FBR0Qsa0NBV0M7QUFXRCxpREF5QkM7QUFsS0Qsd0VBQThEO0FBRTlELDZDQUF3QztBQUN4QyxxREFBa0M7QUFtQmxDLGtHQUFrRztBQUNsRywyRkFBMkY7QUFDM0Ysb0dBQW9HO0FBQ3BHLDBFQUEwRTtBQUMxRSxFQUFFO0FBQ0YscUdBQXFHO0FBQ3JHLGdEQUFnRDtBQUNoRCxFQUFFO0FBQ0Ysb0dBQW9HO0FBQ3BHLDZGQUE2RjtBQUM3RixhQUFhO0FBQ2IsU0FBZ0Isc0JBQXNCLENBQ3BDLFFBQWlDLEVBQ2pDLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQWU7SUFFdEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUM5QixNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUN4RCxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUNwRCxDQUFDO0lBRUYsT0FBTyxRQUFRLElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FDekIsTUFBK0IsRUFDL0IsT0FBdUMsRUFDdkMsZ0JBQWtDO0lBRWxDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxD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
|
|
@@ -12,6 +12,7 @@ export default class AuditTrailCorrelationRoute extends BaseRoute {
|
|
|
12
12
|
setupRoutes(router: Router): void;
|
|
13
13
|
handleHistory(context: Context): Promise<void>;
|
|
14
14
|
handleBatch(context: Context): Promise<void>;
|
|
15
|
+
private withhold;
|
|
15
16
|
private assertRecordReadable;
|
|
16
17
|
private static parseCorrelationKeys;
|
|
17
18
|
}
|
|
@@ -1,11 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
39
|
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
7
|
-
const
|
|
40
|
+
const record_visibility_1 = __importStar(require("../../audit-trail/record-visibility"));
|
|
41
|
+
const withhold_1 = __importDefault(require("../../audit-trail/withhold"));
|
|
8
42
|
const types_1 = require("../../types");
|
|
43
|
+
const query_string_1 = __importDefault(require("../../utils/query-string"));
|
|
9
44
|
const base_route_1 = __importDefault(require("../base-route"));
|
|
10
45
|
class AuditTrailCorrelationRoute extends base_route_1.default {
|
|
11
46
|
constructor(services, options, dataSource) {
|
|
@@ -30,7 +65,10 @@ class AuditTrailCorrelationRoute extends base_route_1.default {
|
|
|
30
65
|
recordId,
|
|
31
66
|
correlationKey: context.params.correlationKey,
|
|
32
67
|
});
|
|
33
|
-
|
|
68
|
+
const data = await this.withhold(history, target, context);
|
|
69
|
+
if (!data)
|
|
70
|
+
return;
|
|
71
|
+
context.response.body = { data };
|
|
34
72
|
}
|
|
35
73
|
async handleBatch(context) {
|
|
36
74
|
const target = await this.assertRecordReadable(context);
|
|
@@ -42,9 +80,37 @@ class AuditTrailCorrelationRoute extends base_route_1.default {
|
|
|
42
80
|
const history = correlationKeys.length
|
|
43
81
|
? await store.listByCorrelations({ collection, recordId, correlationKeys })
|
|
44
82
|
: [];
|
|
45
|
-
|
|
83
|
+
const data = await this.withhold(history, target, context);
|
|
84
|
+
if (!data)
|
|
85
|
+
return;
|
|
86
|
+
context.response.body = { data };
|
|
46
87
|
}
|
|
47
|
-
//
|
|
88
|
+
// Same rule as the per-record history route: these routes return the same rows, so a gone
|
|
89
|
+
// record's captured values are tested against the caller's permission scope here too. Without it the
|
|
90
|
+
// values the history route withholds come back through a correlation lookup.
|
|
91
|
+
// The record can go away — or move out of the caller's permission scope — while the audit read is
|
|
92
|
+
// in flight, so the decision is taken again on the way out rather than reused from the check that
|
|
93
|
+
// authorized the request. Returns null once it has issued the 404.
|
|
94
|
+
async withhold(entries, target, context) {
|
|
95
|
+
// An empty answer has nothing to withhold, so it does not earn a second read of the record.
|
|
96
|
+
if (!entries.length)
|
|
97
|
+
return entries;
|
|
98
|
+
const after = await (0, record_visibility_1.recheckRecordVisibility)(target.collectionObject, target.recordId, context, target.permissionScope, target.goneEntirely);
|
|
99
|
+
if (after && !after.visible) {
|
|
100
|
+
context.throw(types_1.HttpCode.NotFound, 'Record does not exists');
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const gone = after ? after.goneEntirely : target.goneEntirely;
|
|
104
|
+
if (!target.permissionScope || !gone)
|
|
105
|
+
return entries;
|
|
106
|
+
return (0, withhold_1.default)(entries, {
|
|
107
|
+
collection: target.collectionObject,
|
|
108
|
+
permissionScope: target.permissionScope,
|
|
109
|
+
timezone: query_string_1.default.parseCaller(context, { defaultTimezone: 'UTC' }).timezone,
|
|
110
|
+
logger: this.options.logger,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// Returns null (after issuing the 404) when a configured record-level permission scope excludes the id —
|
|
48
114
|
// same rule as the per-collection route: a scope can't be evaluated retroactively for a
|
|
49
115
|
// now-deleted record, so a scoped caller cannot look up correlations for an out-of-scope id.
|
|
50
116
|
async assertRecordReadable(context) {
|
|
@@ -58,12 +124,19 @@ class AuditTrailCorrelationRoute extends base_route_1.default {
|
|
|
58
124
|
throw new datasource_toolkit_1.ValidationError('Missing recordId');
|
|
59
125
|
const collection = this.dataSource.getCollection(collectionName);
|
|
60
126
|
await this.services.authorization.assertCanRead(context, collectionName);
|
|
61
|
-
const
|
|
127
|
+
const permissionScope = await this.services.authorization.getScope(collection, context);
|
|
128
|
+
const { visible, goneEntirely } = await (0, record_visibility_1.default)(collection, recordId, context, permissionScope);
|
|
62
129
|
if (!visible) {
|
|
63
130
|
context.throw(types_1.HttpCode.NotFound, 'Record does not exists');
|
|
64
131
|
return null;
|
|
65
132
|
}
|
|
66
|
-
return {
|
|
133
|
+
return {
|
|
134
|
+
collection: collectionName,
|
|
135
|
+
recordId,
|
|
136
|
+
collectionObject: collection,
|
|
137
|
+
permissionScope,
|
|
138
|
+
goneEntirely,
|
|
139
|
+
};
|
|
67
140
|
}
|
|
68
141
|
// Body array (POST) takes precedence over the comma-separated query param (GET).
|
|
69
142
|
static parseCorrelationKeys(context) {
|
|
@@ -81,4 +154,4 @@ class AuditTrailCorrelationRoute extends base_route_1.default {
|
|
|
81
154
|
}
|
|
82
155
|
}
|
|
83
156
|
exports.default = AuditTrailCorrelationRoute;
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdHJhaWwtY29ycmVsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL2FjY2Vzcy9hdWRpdC10cmFpbC1jb3JyZWxhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU9BLHdFQUFrRTtBQUVsRSx5RkFFNkM7QUFDN0MsMEVBQXdFO0FBQ3hFLHVDQUFrRDtBQUNsRCw0RUFBeUQ7QUFDekQsK0RBQXNDO0FBVXRDLE1BQXFCLDBCQUEyQixTQUFRLG9CQUFTO0lBSy9ELFlBQ0UsUUFBdUMsRUFDdkMsT0FBaUMsRUFDakMsVUFBc0I7UUFFdEIsS0FBSyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQVRsQixTQUFJLEdBQUcsaUJBQVMsQ0FBQyxZQUFZLENBQUM7UUFVckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2RixzRUFBc0U7UUFDdEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFnQjtRQUN6QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU87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
|
|
@@ -4,7 +4,7 @@ import CollectionRoute from '../collection-route';
|
|
|
4
4
|
export default class AuditTrailRoute extends CollectionRoute {
|
|
5
5
|
setupRoutes(router: Router): void;
|
|
6
6
|
handleHistory(context: Context): Promise<void>;
|
|
7
|
-
private
|
|
7
|
+
private withhold;
|
|
8
8
|
handleStateAt(context: Context): Promise<void>;
|
|
9
9
|
private fetchCurrentRecord;
|
|
10
10
|
private static auditedColumns;
|
|
@@ -39,7 +39,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
39
39
|
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
40
40
|
const luxon_1 = require("luxon");
|
|
41
41
|
const audit_trail_1 = require("../../audit-trail");
|
|
42
|
-
const
|
|
42
|
+
const record_visibility_1 = __importStar(require("../../audit-trail/record-visibility"));
|
|
43
|
+
const withhold_1 = __importStar(require("../../audit-trail/withhold"));
|
|
43
44
|
const types_1 = require("../../types");
|
|
44
45
|
const id_1 = __importDefault(require("../../utils/id"));
|
|
45
46
|
const query_string_1 = __importDefault(require("../../utils/query-string"));
|
|
@@ -57,8 +58,8 @@ class AuditTrailRoute extends collection_route_1.default {
|
|
|
57
58
|
}
|
|
58
59
|
async handleHistory(context) {
|
|
59
60
|
await this.services.authorization.assertCanRead(context, this.collection.name);
|
|
60
|
-
const
|
|
61
|
-
const { visible, goneEntirely } = await (0,
|
|
61
|
+
const permissionScope = await this.services.authorization.getScope(this.collection, context);
|
|
62
|
+
const { visible, goneEntirely } = await (0, record_visibility_1.default)(this.collection, context.params.id, context, permissionScope);
|
|
62
63
|
if (!visible) {
|
|
63
64
|
context.throw(types_1.HttpCode.NotFound, 'Record does not exists');
|
|
64
65
|
return;
|
|
@@ -86,41 +87,34 @@ class AuditTrailRoute extends collection_route_1.default {
|
|
|
86
87
|
store.countByRecord(filters),
|
|
87
88
|
isFirstFetch ? store.listDistinctUsers(filters) : undefined,
|
|
88
89
|
]);
|
|
89
|
-
//
|
|
90
|
+
// The record can be deleted — or moved out of the caller's permission scope — between the check above and
|
|
91
|
+
// the audit read: the audit trail lives in its own database, often its own engine, so no single
|
|
92
|
+
// snapshot spans both. Ask again once the rows are in hand and let that answer decide, so a
|
|
93
|
+
// record that went away mid-request is treated as the request starting a moment later would
|
|
94
|
+
// have treated it. Only for a scoped caller: with no permission scope there is nothing to withhold.
|
|
95
|
+
const after = await (0, record_visibility_1.recheckRecordVisibility)(this.collection, context.params.id, context, permissionScope, goneEntirely);
|
|
96
|
+
if (after && !after.visible) {
|
|
97
|
+
context.throw(types_1.HttpCode.NotFound, 'Record does not exists');
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const gone = after ? after.goneEntirely : goneEntirely;
|
|
101
|
+
// A genuinely deleted record bypasses the permission-scope check above — there's nothing left to check
|
|
90
102
|
// existence against — but create/update/delete rows still carry captured column values from
|
|
91
|
-
// when the record existed. If those values themselves would have failed the caller's scope,
|
|
103
|
+
// when the record existed. If those values themselves would have failed the caller's permission scope,
|
|
92
104
|
// withhold them while still surfacing that the row happened, by whom and when: that part
|
|
93
105
|
// stays visible regardless.
|
|
94
|
-
const data =
|
|
106
|
+
const data = permissionScope && gone ? this.withhold(rawData, permissionScope, context) : rawData;
|
|
95
107
|
context.response.body = {
|
|
96
108
|
data,
|
|
97
109
|
meta: { count, ...(availableUsers && { availableUsers }) },
|
|
98
110
|
};
|
|
99
111
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
if (scope.match(entry.previousValues, this.collection, timezone))
|
|
107
|
-
return entry;
|
|
108
|
-
return { ...entry, previousValues: {} };
|
|
109
|
-
}
|
|
110
|
-
if (entry.operation === 'create') {
|
|
111
|
-
if (scope.match(entry.newValues, this.collection, timezone))
|
|
112
|
-
return entry;
|
|
113
|
-
return { ...entry, newValues: {} };
|
|
114
|
-
}
|
|
115
|
-
// `update`'s previousValues/newValues are a partial diff (only the columns that changed) —
|
|
116
|
-
// a scope condition referencing a column this particular update didn't touch can't be
|
|
117
|
-
// evaluated reliably against it, so withhold unconditionally rather than risk a false
|
|
118
|
-
// negative. `action`/`action_failed` rows hold a submitted form and a result summary, not
|
|
119
|
-
// column values, so the scope doesn't apply to them at all.
|
|
120
|
-
if (entry.operation === 'update') {
|
|
121
|
-
return { ...entry, previousValues: {}, newValues: {} };
|
|
122
|
-
}
|
|
123
|
-
return entry;
|
|
112
|
+
withhold(entries, permissionScope, context) {
|
|
113
|
+
return (0, withhold_1.default)(entries, {
|
|
114
|
+
collection: this.collection,
|
|
115
|
+
permissionScope,
|
|
116
|
+
timezone: query_string_1.default.parseCaller(context, { defaultTimezone: 'UTC' }).timezone,
|
|
117
|
+
logger: this.options.logger,
|
|
124
118
|
});
|
|
125
119
|
}
|
|
126
120
|
// Only audited columns are returned; read-only/computed fields are not captured in the log.
|
|
@@ -128,18 +122,20 @@ class AuditTrailRoute extends collection_route_1.default {
|
|
|
128
122
|
await this.services.authorization.assertCanRead(context, this.collection.name);
|
|
129
123
|
const at = AuditTrailRoute.parseAt(context);
|
|
130
124
|
const auditedColumns = AuditTrailRoute.auditedColumns(this.collection.schema);
|
|
131
|
-
const
|
|
132
|
-
const current = await this.fetchCurrentRecord(context, auditedColumns,
|
|
133
|
-
// A missing current record is ambiguous (deleted vs. out-of-scope) once a scope applies; only
|
|
134
|
-
// deny when the id still exists outside that scope. If it's genuinely gone
|
|
135
|
-
//
|
|
136
|
-
//
|
|
137
|
-
|
|
138
|
-
|
|
125
|
+
const permissionScope = await this.services.authorization.getScope(this.collection, context);
|
|
126
|
+
const current = await this.fetchCurrentRecord(context, auditedColumns, permissionScope);
|
|
127
|
+
// A missing current record is ambiguous (deleted vs. out-of-scope) once a permission scope applies; only
|
|
128
|
+
// deny when the id still exists outside that scope. If it's genuinely gone the revert walk
|
|
129
|
+
// below proceeds — the reconstruction is then tested against the scope in its own right, since
|
|
130
|
+
// this route hands back nothing but those values.
|
|
131
|
+
let goneEntirely = false;
|
|
132
|
+
if (!current && permissionScope) {
|
|
133
|
+
const stillExists = await (0, record_visibility_1.recordExists)(this.collection, context.params.id, context, null);
|
|
139
134
|
if (stillExists) {
|
|
140
135
|
context.throw(types_1.HttpCode.NotFound, 'Record did not exist at this timestamp');
|
|
141
136
|
return;
|
|
142
137
|
}
|
|
138
|
+
goneEntirely = true;
|
|
143
139
|
}
|
|
144
140
|
const { store } = this.options.auditTrail;
|
|
145
141
|
const fetched = await store.listByRecord({
|
|
@@ -148,6 +144,15 @@ class AuditTrailRoute extends collection_route_1.default {
|
|
|
148
144
|
startTimestamp: at,
|
|
149
145
|
order: 'desc',
|
|
150
146
|
});
|
|
147
|
+
// Same re-read as the history route: the record can be deleted — or moved out of the caller's
|
|
148
|
+
// permission scope — while the audit read is in flight, and without asking again the gate below
|
|
149
|
+
// never runs for a record that was still there at the first check.
|
|
150
|
+
const after = await (0, record_visibility_1.recheckRecordVisibility)(this.collection, context.params.id, context, permissionScope, goneEntirely);
|
|
151
|
+
if (after && !after.visible) {
|
|
152
|
+
context.throw(types_1.HttpCode.NotFound, 'Record did not exist at this timestamp');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const goneNow = after ? after.goneEntirely : goneEntirely;
|
|
151
156
|
// `startTimestamp` is an inclusive lower bound, so an entry timestamped exactly `at` comes
|
|
152
157
|
// back too — but the record already reflects that entry's change at instant `at`, so it must
|
|
153
158
|
// be kept rather than reverted (which would wrongly return the state just *before* it).
|
|
@@ -167,14 +172,35 @@ class AuditTrailRoute extends collection_route_1.default {
|
|
|
167
172
|
entry.operation !== 'action_failed' &&
|
|
168
173
|
entry.status !== 'pending');
|
|
169
174
|
const state = (0, audit_trail_1.revertRecord)(current, entries);
|
|
170
|
-
if (!state)
|
|
175
|
+
if (!state) {
|
|
171
176
|
context.throw(types_1.HttpCode.NotFound, 'Record did not exist at this timestamp');
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// The history route withholds a gone record's captured values from a caller whose permission scope they
|
|
180
|
+
// fail; this route is nothing but those values, reassembled, so the same test applies to the
|
|
181
|
+
// reconstruction. Without it the withheld values are one request away for the same caller.
|
|
182
|
+
// A reconstruction the permission scope cannot answer — a scope on a column the capture never
|
|
183
|
+
// kept — withholds too: absent is not the same as passing, here as everywhere else. The packed
|
|
184
|
+
// id is merged in first for the same reason it is on a row: a read-only primary key never lands
|
|
185
|
+
// in the capture, so a scope on the id would blank the very record it names.
|
|
186
|
+
if (goneNow &&
|
|
187
|
+
!(0, withhold_1.permissionScopeAccepts)(
|
|
188
|
+
// `false`: the reconstruction may sit on the far side of a primary-key move this route
|
|
189
|
+
// cannot see, so the requested id does not answer for a key the trail redacted.
|
|
190
|
+
(0, withhold_1.snapshotFor)(state, context.params.id, { collection: this.collection, logger: this.options.logger }, false), {
|
|
191
|
+
collection: this.collection,
|
|
192
|
+
permissionScope,
|
|
193
|
+
timezone: query_string_1.default.parseCaller(context, { defaultTimezone: 'UTC' }).timezone,
|
|
194
|
+
})) {
|
|
195
|
+
context.response.body = { data: null };
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
172
198
|
context.response.body = { data: state };
|
|
173
199
|
}
|
|
174
|
-
async fetchCurrentRecord(context, auditedColumns,
|
|
200
|
+
async fetchCurrentRecord(context, auditedColumns, permissionScope) {
|
|
175
201
|
const id = id_1.default.unpackId(this.collection.schema, context.params.id);
|
|
176
202
|
const filter = new datasource_toolkit_1.PaginatedFilter({
|
|
177
|
-
conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, [id]),
|
|
203
|
+
conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, [id]), permissionScope),
|
|
178
204
|
});
|
|
179
205
|
const records = await this.collection.list(query_string_1.default.parseCaller(context, { defaultTimezone: 'UTC' }), filter, new datasource_toolkit_1.Projection(...auditedColumns));
|
|
180
206
|
return records[0] ?? null;
|
|
@@ -290,4 +316,4 @@ class AuditTrailRoute extends collection_route_1.default {
|
|
|
290
316
|
}
|
|
291
317
|
}
|
|
292
318
|
exports.default = AuditTrailRoute;
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdHJhaWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL2FjY2Vzcy9hdWRpdC10cmFpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLHdFQU15QztBQUN6QyxpQ0FBaUM7QUFFakMsbURBQWlEO0FBQ2pELGlFQUE4RTtBQUM5RSx1Q0FBdUM7QUFDdkMsd0RBQXFDO0FBQ3JDLDRFQUF5RDtBQUN6RCwyRUFBa0Q7QUFFbEQsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUM7QUFDeEMsTUFBTSxTQUFTLEdBQUcsdURBQXVELENBQUM7QUFDMUUscUZBQXFGO0FBQ3JGLE1BQU0sV0FBVyxHQUFHLHlCQUF5QixDQUFDO0FBRTlDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBQzdCLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQVUxQixNQUFxQixlQUFnQixTQUFRLDBCQUFlO0lBQzFELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksQ0FBQyxpQkFBaUIsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDekYsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLGlCQUFpQixZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFnQjtRQUN6QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUvRSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENB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
|
|
319
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQtdHJhaWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcm91dGVzL2FjY2Vzcy9hdWRpdC10cmFpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLHdFQU15QztBQUN6QyxpQ0FBaUM7QUFFakMsbURBQWlEO0FBQ2pELHlGQUc2QztBQUM3Qyx1RUFHb0M7QUFDcEMsdUNBQXVDO0FBQ3ZDLHdEQUFxQztBQUNyQyw0RUFBeUQ7QUFDekQsMkVBQWtEO0FBRWxELE1BQU0sU0FBUyxHQUFHLHFCQUFxQixDQUFDO0FBQ3hDLE1BQU0sU0FBUyxHQUFHLHVEQUF1RCxDQUFDO0FBQzFFLHFGQUFxRjtBQUNyRixNQUFNLFdBQVcsR0FBRyx5QkFBeUIsQ0FBQztBQUU5QyxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztBQUM3QixNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUM7QUFVMUIsTUFBcUIsZUFBZ0IsU0FBUSwwQkFBZTtJQUMxRCxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixJQUFJLENBQUMsaUJBQWlCLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3pGLE1BQU0sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksQ0FBQyxpQkFBaUIsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBZ0I7UUFDekMsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0UsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJ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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/agent",
|
|
3
|
-
"version": "1.103.
|
|
3
|
+
"version": "1.103.5",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"@forestadmin/datasource-customizer": "1.71.3",
|
|
18
18
|
"@forestadmin/datasource-toolkit": "1.55.1",
|
|
19
19
|
"@forestadmin/forestadmin-client": "1.43.4",
|
|
20
|
-
"@forestadmin/mcp-server": "1.24.
|
|
20
|
+
"@forestadmin/mcp-server": "1.24.6",
|
|
21
21
|
"@koa/bodyparser": "^6.0.0",
|
|
22
22
|
"@koa/cors": "^5.0.0",
|
|
23
23
|
"@koa/router": "^13.1.0",
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { ForestAdminHttpDriverServices } from '../services';
|
|
2
|
-
import type { Collection, ConditionTree } from '@forestadmin/datasource-toolkit';
|
|
3
|
-
import type { Context } from 'koa';
|
|
4
|
-
export declare function recordExists(collection: Collection, packedId: string, context: Context, scope: ConditionTree | null): Promise<boolean>;
|
|
5
|
-
export type RecordVisibility = {
|
|
6
|
-
/** False → the id still exists and fails the scope; the caller must be denied entirely (404). */
|
|
7
|
-
visible: boolean;
|
|
8
|
-
/**
|
|
9
|
-
* True once the id no longer exists at all, under any scope. `visible` is then true for a
|
|
10
|
-
* different reason than "the record matches the scope": there is nothing left to check
|
|
11
|
-
* existence against. It doesn't mean every value the audit trail holds for that record is safe
|
|
12
|
-
* to hand back to this caller — a scoped-down field value captured while the record still
|
|
13
|
-
* existed can still fall outside the caller's scope, and callers should check that separately
|
|
14
|
-
* (e.g. by re-evaluating the scope's `ConditionTree` against a delete row's `previousValues`)
|
|
15
|
-
* before deciding how much of the record's captured data to surface.
|
|
16
|
-
*/
|
|
17
|
-
goneEntirely: boolean;
|
|
18
|
-
};
|
|
19
|
-
export default function checkRecordVisibility(services: ForestAdminHttpDriverServices, collection: Collection, packedId: string, context: Context): Promise<RecordVisibility>;
|
|
20
|
-
//# sourceMappingURL=scope.d.ts.map
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.recordExists = recordExists;
|
|
7
|
-
exports.default = checkRecordVisibility;
|
|
8
|
-
const datasource_toolkit_1 = require("@forestadmin/datasource-toolkit");
|
|
9
|
-
const id_1 = __importDefault(require("../utils/id"));
|
|
10
|
-
const query_string_1 = __importDefault(require("../utils/query-string"));
|
|
11
|
-
async function recordExists(collection, packedId, context, scope) {
|
|
12
|
-
const id = id_1.default.unpackId(collection.schema, packedId);
|
|
13
|
-
const filter = new datasource_toolkit_1.PaginatedFilter({
|
|
14
|
-
conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(collection.schema, [id]), scope),
|
|
15
|
-
});
|
|
16
|
-
const records = await collection.list(query_string_1.default.parseCaller(context, { defaultTimezone: 'UTC' }), filter, new datasource_toolkit_1.Projection(...datasource_toolkit_1.SchemaUtils.getPrimaryKeys(collection.schema)));
|
|
17
|
-
return records.length > 0;
|
|
18
|
-
}
|
|
19
|
-
// A record-level scope can't be evaluated against a record that no longer exists, so a caller whose
|
|
20
|
-
// access is scoped down is only denied when the id currently exists and fails that scope — once it's
|
|
21
|
-
// genuinely gone there is nothing left to scope against, and showing that it existed (including that
|
|
22
|
-
// it was deleted, by whom and when) is much of the point of an audit trail.
|
|
23
|
-
async function checkRecordVisibility(services, collection, packedId, context) {
|
|
24
|
-
const scope = await services.authorization.getScope(collection, context);
|
|
25
|
-
if (!scope)
|
|
26
|
-
return { visible: true, goneEntirely: false };
|
|
27
|
-
if (await recordExists(collection, packedId, context, scope)) {
|
|
28
|
-
return { visible: true, goneEntirely: false };
|
|
29
|
-
}
|
|
30
|
-
const existsOutsideScope = await recordExists(collection, packedId, context, null);
|
|
31
|
-
return { visible: !existsOutsideScope, goneEntirely: !existsOutsideScope };
|
|
32
|
-
}
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NvcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXVkaXQtdHJhaWwvc2NvcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFjQSxvQ0FxQkM7QUFxQkQsd0NBaUJDO0FBckVELHdFQUt5QztBQUV6QyxxREFBa0M7QUFDbEMseUVBQXNEO0FBRS9DLEtBQUssVUFBVSxZQUFZLENBQ2hDLFVBQXNCLEVBQ3RCLFFBQWdCLEVBQ2hCLE9BQWdCLEVBQ2hCLEtBQTJCO0lBRTNCLE1BQU0sRUFBRSxHQUFHLFlBQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLG9DQUFlLENBQUM7UUFDakMsYUFBYSxFQUFFLHlDQUFvQixDQUFDLFNBQVMsQ0FDM0MseUNBQW9CLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUN0RCxLQUFLLENBQ047S0FDRixDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQ25DLHNCQUFpQixDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFDbEUsTUFBTSxFQUNOLElBQUksK0JBQVUsQ0FBQyxHQUFHLGdDQUFXLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUNqRSxDQUFDO0lBRUYsT0FBTyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBaUJELG9HQUFvRztBQUNwRyxxR0FBcUc7QUFDckcscUdBQXFHO0FBQ3JHLDRFQUE0RTtBQUM3RCxLQUFLLFVBQVUscUJBQXFCLENBQ2pELFFBQXVDLEVBQ3ZDLFVBQXNCLEVBQ3RCLFFBQWdCLEVBQ2hCLE9BQWdCO0lBRWhCLE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXpFLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDO0lBRTFELElBQUksTUFBTSxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFbkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRSxDQUFDLGtCQUFrQixFQUFFLENBQUM7QUFDN0UsQ0FBQyJ9
|