@forestadmin/agent 1.1.0-alpha.1 → 1.1.1
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/agent.d.ts +11 -1
- package/dist/agent.js +14 -1
- package/dist/routes/access/chart.js +8 -4
- package/dist/routes/access/count-related.js +3 -3
- package/dist/routes/access/count.js +3 -3
- package/dist/routes/access/csv-related.js +4 -4
- package/dist/routes/access/csv.js +4 -4
- package/dist/routes/access/get.js +3 -3
- package/dist/routes/access/list-related.js +3 -3
- package/dist/routes/access/list.js +3 -3
- package/dist/routes/modification/action.d.ts +1 -1
- package/dist/routes/modification/action.js +7 -24
- package/dist/routes/modification/associate-related.js +3 -3
- package/dist/routes/modification/create.js +4 -4
- package/dist/routes/modification/delete.js +3 -3
- package/dist/routes/modification/dissociate-delete-related.js +3 -3
- package/dist/routes/modification/update-field.js +3 -3
- package/dist/routes/modification/update-relation.js +5 -5
- package/dist/routes/modification/update.js +3 -3
- package/dist/routes/security/scope-invalidation.js +2 -2
- package/dist/services/index.d.ts +2 -2
- package/dist/services/index.js +6 -8
- package/dist/services/permissions.d.ts +19 -0
- package/dist/services/permissions.js +85 -0
- package/dist/types.d.ts +0 -2
- package/dist/types.js +1 -1
- package/dist/utils/forest-http-api.d.ts +28 -0
- package/dist/utils/forest-http-api.js +81 -1
- package/dist/utils/options-validator.js +6 -14
- package/package.json +4 -4
- package/dist/services/authorization/authorization.d.ts +0 -31
- package/dist/services/authorization/authorization.js +0 -107
- package/dist/services/authorization/index.d.ts +0 -4
- package/dist/services/authorization/index.js +0 -11
- package/dist/services/authorization/types.d.ts +0 -26
- package/dist/services/authorization/types.js +0 -3
|
@@ -15,7 +15,7 @@ class DissociateDeleteRelatedRoute extends relation_route_1.default {
|
|
|
15
15
|
router.delete(`/${this.collection.name}/:parentId/relationships/${this.relationName}`, this.handleDissociateDeleteRelatedRoute.bind(this));
|
|
16
16
|
}
|
|
17
17
|
async handleDissociateDeleteRelatedRoute(context) {
|
|
18
|
-
await this.services.
|
|
18
|
+
await this.services.permissions.can(context, `delete:${this.collection.name}`);
|
|
19
19
|
// Parse route params
|
|
20
20
|
const parentId = id_1.default.unpackId(this.collection.schema, context.params.parentId);
|
|
21
21
|
const isDeleteMode = Boolean(context.request.query?.delete);
|
|
@@ -73,7 +73,7 @@ class DissociateDeleteRelatedRoute extends relation_route_1.default {
|
|
|
73
73
|
throw new datasource_toolkit_1.ValidationError('Expected no empty id list');
|
|
74
74
|
}
|
|
75
75
|
return context_filter_factory_1.default.build(this.foreignCollection, context, null, {
|
|
76
|
-
conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(await this.services.
|
|
76
|
+
conditionTree: datasource_toolkit_1.ConditionTreeFactory.intersect(await this.services.permissions.getScope(this.foreignCollection, context), query_string_1.default.parseConditionTree(this.foreignCollection, context), selectedIds),
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
79
|
/** Wrapper around the util to simplify the call */
|
|
@@ -86,4 +86,4 @@ class DissociateDeleteRelatedRoute extends relation_route_1.default {
|
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
exports.default = DissociateDeleteRelatedRoute;
|
|
89
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzc29jaWF0ZS1kZWxldGUtcmVsYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yb3V0ZXMvbW9kaWZpY2F0aW9uL2Rpc3NvY2lhdGUtZGVsZXRlLXJlbGF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx3RUFVeUM7QUFJekMsdUNBQXVDO0FBQ3ZDLDBFQUFpRDtBQUNqRCxnR0FBc0U7QUFDdEUsd0RBQXFDO0FBQ3JDLDRFQUF5RDtBQUN6RCx1RUFBOEM7QUFFOUMsTUFBcUIsNEJBQTZCLFNBQVEsd0JBQWE7SUFDckUsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLE1BQU0sQ0FDWCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSw0QkFBNEIsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUN2RSxJQUFJLENBQUMsa0NBQWtDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxPQUFnQjtRQUM5RCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFL0UscUJBQXFCO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLFlBQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsc0JBQWlCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixD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
|
|
@@ -13,7 +13,7 @@ class UpdateField extends collection_route_1.default {
|
|
|
13
13
|
router.put(`/${this.collection.name}/:id/relationships/:field/:index(\\d+)`, this.handleUpdate.bind(this));
|
|
14
14
|
}
|
|
15
15
|
async handleUpdate(context) {
|
|
16
|
-
await this.services.
|
|
16
|
+
await this.services.permissions.can(context, `edit:${this.collection.name}`);
|
|
17
17
|
const { field, index, id } = context.params;
|
|
18
18
|
const subRecord = context.request.body?.data?.attributes;
|
|
19
19
|
// Validate parameters
|
|
@@ -21,7 +21,7 @@ class UpdateField extends collection_route_1.default {
|
|
|
21
21
|
datasource_toolkit_1.FieldValidator.validate(this.collection, field, [{ [field]: [subRecord] }]);
|
|
22
22
|
// Create caller & filter
|
|
23
23
|
const unpackedId = id_1.default.unpackId(this.collection.schema, id);
|
|
24
|
-
const conditionTree = datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, [unpackedId]), await this.services.
|
|
24
|
+
const conditionTree = datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, [unpackedId]), await this.services.permissions.getScope(this.collection, context));
|
|
25
25
|
const caller = query_string_1.default.parseCaller(context);
|
|
26
26
|
const filter = new datasource_toolkit_1.Filter({ conditionTree });
|
|
27
27
|
// Load & check record
|
|
@@ -36,4 +36,4 @@ class UpdateField extends collection_route_1.default {
|
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
38
|
exports.default = UpdateField;
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWZpZWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9tb2RpZmljYXRpb24vdXBkYXRlLWZpZWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBTXlDO0FBSXpDLHVDQUF1QztBQUN2QywyRUFBa0Q7QUFDbEQsd0RBQXFDO0FBQ3JDLDRFQUF5RDtBQUV6RCxNQUFxQixXQUFZLFNBQVEsMEJBQWU7SUFDdEQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FDUixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSx3Q0FBd0MsRUFDaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQzdCLENBQUM7SUFDSixDQUFDO0lBRU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFnQjtRQUN4QyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFN0UsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDO1FBRXpELHNCQUFzQjtRQUN0QiwyRkFBMkY7UUFDM0YsbUNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUU1RSx5QkFBeUI7UUFDekIsTUFBTSxVQUFVLEdBQUcsWUFBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRSxNQUFNLGFBQWEsR0FBRyx5Q0FBb0IsQ0FBQyxTQUFTLENBQ2xELHlDQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQ25FLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQ25FLENBQUM7UUFFRixNQUFNLE1BQU0sR0FBRyxzQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSwyQkFBTSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUU3QyxzQkFBc0I7UUFDdEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLCtCQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVuRixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxvQ0FBZSxDQUFDLFVBQVUsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQzVEO1FBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUVqQyxnQkFBZ0I7UUFDaEIsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXpFLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLGdCQUFRLENBQUMsU0FBUyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQTFDRCw4QkEwQ0MifQ==
|
|
@@ -29,8 +29,8 @@ class UpdateRelation extends relation_route_1.default {
|
|
|
29
29
|
}
|
|
30
30
|
async updateManyToOne(context, relation, parentId, linkedId, caller) {
|
|
31
31
|
// Perms
|
|
32
|
-
const scope = await this.services.
|
|
33
|
-
await this.services.
|
|
32
|
+
const scope = await this.services.permissions.getScope(this.collection, context);
|
|
33
|
+
await this.services.permissions.can(context, `edit:${this.collection.name}`);
|
|
34
34
|
// Load the value that will be used as foreignKey (=== linkedId[0] most of the time)
|
|
35
35
|
const foreignValue = linkedId
|
|
36
36
|
? await datasource_toolkit_1.CollectionUtils.getValue(this.foreignCollection, caller, linkedId, relation.foreignKeyTarget)
|
|
@@ -41,8 +41,8 @@ class UpdateRelation extends relation_route_1.default {
|
|
|
41
41
|
}
|
|
42
42
|
async updateOneToOne(context, relation, parentId, linkedId, caller) {
|
|
43
43
|
// Permissions
|
|
44
|
-
const scope = await this.services.
|
|
45
|
-
await this.services.
|
|
44
|
+
const scope = await this.services.permissions.getScope(this.foreignCollection, context);
|
|
45
|
+
await this.services.permissions.can(context, `edit:${this.foreignCollection.name}`);
|
|
46
46
|
// Load the value that will be used as originKey (=== parentId[0] most of the time)
|
|
47
47
|
const originValue = await datasource_toolkit_1.CollectionUtils.getValue(this.collection, caller, parentId, relation.originKeyTarget);
|
|
48
48
|
// Break old relation (may update zero or one records).
|
|
@@ -56,4 +56,4 @@ class UpdateRelation extends relation_route_1.default {
|
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
exports.default = UpdateRelation;
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXJlbGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9tb2RpZmljYXRpb24vdXBkYXRlLXJlbGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBU3lDO0FBSXpDLHVDQUF1QztBQUN2Qyx3REFBcUM7QUFDckMsNEVBQXlEO0FBQ3pELHVFQUE4QztBQUU5QyxNQUFxQixjQUFlLFNBQVEsd0JBQWE7SUFDdkQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FDUixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSw0QkFBNEIsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUN2RSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVNLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxPQUFnQjtRQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLHNCQUFpQixDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxZQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkYsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDN0MsQ0FBQyxDQUFDLFlBQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9FLENBQUMsQ0FBQyxJ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
|
|
@@ -12,7 +12,7 @@ class UpdateRoute extends collection_route_1.default {
|
|
|
12
12
|
router.put(`/${this.collection.name}/:id`, this.handleUpdate.bind(this));
|
|
13
13
|
}
|
|
14
14
|
async handleUpdate(context) {
|
|
15
|
-
await this.services.
|
|
15
|
+
await this.services.permissions.can(context, `edit:${this.collection.name}`);
|
|
16
16
|
const id = id_1.default.unpackId(this.collection.schema, context.params.id);
|
|
17
17
|
const { body } = context.request;
|
|
18
18
|
if ('relationships' in body.data) {
|
|
@@ -20,7 +20,7 @@ class UpdateRoute extends collection_route_1.default {
|
|
|
20
20
|
}
|
|
21
21
|
const record = this.services.serializer.deserialize(this.collection, body);
|
|
22
22
|
datasource_toolkit_1.RecordValidator.validate(this.collection, record);
|
|
23
|
-
const conditionTree = datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, [id]), await this.services.
|
|
23
|
+
const conditionTree = datasource_toolkit_1.ConditionTreeFactory.intersect(datasource_toolkit_1.ConditionTreeFactory.matchIds(this.collection.schema, [id]), await this.services.permissions.getScope(this.collection, context));
|
|
24
24
|
const caller = query_string_1.default.parseCaller(context);
|
|
25
25
|
await this.collection.update(caller, new datasource_toolkit_1.Filter({ conditionTree }), record);
|
|
26
26
|
const [updateResult] = await this.collection.list(caller, new datasource_toolkit_1.Filter({ conditionTree }), datasource_toolkit_1.ProjectionFactory.all(this.collection));
|
|
@@ -28,4 +28,4 @@ class UpdateRoute extends collection_route_1.default {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
exports.default = UpdateRoute;
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9tb2RpZmljYXRpb24vdXBkYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsd0VBS3lDO0FBSXpDLDJFQUFrRDtBQUNsRCx3REFBcUM7QUFDckMsNEVBQXlEO0FBRXpELE1BQXFCLFdBQVksU0FBUSwwQkFBZTtJQUN0RCxXQUFXLENBQUMsTUFBYztRQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQWdCO1FBQ3hDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU3RSxNQUFNLEVBQUUsR0FBRyxZQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdkUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFFakMsSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNoQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQ2hDO1FBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0Usb0NBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRCxNQUFNLGFBQWEsR0FBRyx5Q0FBb0IsQ0FBQyxTQUFTLENBQ2xELHlDQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQ25FLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxzQkFBaUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSwyQkFBTSxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1RSxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FDL0MsTUFBTSxFQUNOLElBQUksMkJBQU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQzdCLHNDQUFpQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3ZDLENBQUM7UUFFRixPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM1RixDQUFDO0NBQ0Y7QUFqQ0QsOEJBaUNDIn0=
|
|
@@ -20,9 +20,9 @@ class ScopeInvalidation extends base_route_1.default {
|
|
|
20
20
|
if (Number.isNaN(renderingId)) {
|
|
21
21
|
throw new datasource_toolkit_1.ValidationError('Malformed body');
|
|
22
22
|
}
|
|
23
|
-
this.services.
|
|
23
|
+
this.services.permissions.invalidateCache(renderingId);
|
|
24
24
|
context.response.status = types_1.HttpCode.NoContent;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
27
|
exports.default = ScopeInvalidation;
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NvcGUtaW52YWxpZGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRlcy9zZWN1cml0eS9zY29wZS1pbnZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSx3RUFBa0U7QUFHbEUsdUNBQWtEO0FBQ2xELCtEQUFzQztBQUV0QyxNQUFxQixpQkFBa0IsU0FBUSxvQkFBUztJQUF4RDs7UUFDVyxTQUFJLEdBQUcsaUJBQVMsQ0FBQyxZQUFZLENBQUM7SUFrQnpDLENBQUM7SUFoQkMsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQywyQkFBMkIsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCwwRkFBMEY7SUFDbEYsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFnQjtRQUM1QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFOUQsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQzdCLE1BQU0sSUFBSSxvQ0FBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDN0M7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdkQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsZ0JBQVEsQ0FBQyxTQUFTLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBbkJELG9DQW1CQyJ9
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { AgentOptionsWithDefaults } from '../types';
|
|
2
|
-
import
|
|
2
|
+
import PermissionService from './permissions';
|
|
3
3
|
import Serializer from './serializer';
|
|
4
4
|
export declare type ForestAdminHttpDriverServices = {
|
|
5
|
+
permissions: PermissionService;
|
|
5
6
|
serializer: Serializer;
|
|
6
|
-
authorization: AuthorizationService;
|
|
7
7
|
};
|
|
8
8
|
declare const _default: (options: AgentOptionsWithDefaults) => ForestAdminHttpDriverServices;
|
|
9
9
|
export default _default;
|
package/dist/services/index.js
CHANGED
|
@@ -3,12 +3,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const permissions_1 = __importDefault(require("./permissions"));
|
|
6
7
|
const serializer_1 = __importDefault(require("./serializer"));
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
};
|
|
13
|
-
};
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSw4REFBc0M7QUFDdEMsb0VBQTBEO0FBTzFELGtCQUFlLENBQUMsT0FBaUMsRUFBaUMsRUFBRTtJQUNsRixPQUFPO1FBQ0wsYUFBYSxFQUFFLElBQUEsdUJBQTJCLEVBQUMsT0FBTyxDQUFDO1FBQ25ELFVBQVUsRUFBRSxJQUFJLG9CQUFVLEVBQUU7S0FDN0IsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
|
|
8
|
+
exports.default = (options) => ({
|
|
9
|
+
permissions: new permissions_1.default(options),
|
|
10
|
+
serializer: new serializer_1.default(),
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxnRUFBOEM7QUFDOUMsOERBQXNDO0FBT3RDLGtCQUFlLENBQUMsT0FBaUMsRUFBaUMsRUFBRSxDQUFDLENBQUM7SUFDcEYsV0FBVyxFQUFFLElBQUkscUJBQWlCLENBQUMsT0FBTyxDQUFDO0lBQzNDLFVBQVUsRUFBRSxJQUFJLG9CQUFVLEVBQUU7Q0FDN0IsQ0FBQyxDQUFDIn0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Collection, ConditionTree } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { Context } from 'koa';
|
|
3
|
+
import { AgentOptionsWithDefaults } from '../types';
|
|
4
|
+
declare type RolesOptions = Pick<AgentOptionsWithDefaults, 'forestServerUrl' | 'envSecret' | 'isProduction' | 'permissionsCacheDurationInSeconds'>;
|
|
5
|
+
export default class PermissionService {
|
|
6
|
+
private options;
|
|
7
|
+
private cache;
|
|
8
|
+
constructor(options: RolesOptions);
|
|
9
|
+
invalidateCache(renderingId: number): void;
|
|
10
|
+
/** Checks that a charting query is in the list of allowed queries */
|
|
11
|
+
canChart(context: Context): Promise<void>;
|
|
12
|
+
/** Check if a user is allowed to perform a specific action */
|
|
13
|
+
can(context: Context, action: string, allowRefetch?: boolean): Promise<void>;
|
|
14
|
+
getScope(collection: Collection, context: Context): Promise<ConditionTree>;
|
|
15
|
+
/** Get cached version of "rendering permissions" */
|
|
16
|
+
private getRenderingPermissions;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
const lru_cache_1 = __importDefault(require("lru-cache"));
|
|
7
|
+
const object_hash_1 = __importDefault(require("object-hash"));
|
|
8
|
+
const types_1 = require("../types");
|
|
9
|
+
const condition_tree_parser_1 = __importDefault(require("../utils/condition-tree-parser"));
|
|
10
|
+
const forest_http_api_1 = __importDefault(require("../utils/forest-http-api"));
|
|
11
|
+
class PermissionService {
|
|
12
|
+
constructor(options) {
|
|
13
|
+
this.options = options;
|
|
14
|
+
this.cache = new lru_cache_1.default({
|
|
15
|
+
max: 256,
|
|
16
|
+
ttl: this.options.permissionsCacheDurationInSeconds * 1000,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
invalidateCache(renderingId) {
|
|
20
|
+
this.cache.delete(renderingId);
|
|
21
|
+
}
|
|
22
|
+
/** Checks that a charting query is in the list of allowed queries */
|
|
23
|
+
async canChart(context) {
|
|
24
|
+
// If the permissions level already allow the chart, no need to check further
|
|
25
|
+
if (['admin', 'editor', 'developer'].includes(context.state.user.permissionLevel)) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const chart = { ...context.request.body };
|
|
29
|
+
// When the server sends the data of the allowed charts, the target column is not specified
|
|
30
|
+
// for relations => allow them all.
|
|
31
|
+
if (chart?.group_by_field?.includes(':'))
|
|
32
|
+
chart.group_by_field = chart.group_by_field.substring(0, chart.group_by_field.indexOf(':'));
|
|
33
|
+
const chartHash = (0, object_hash_1.default)(chart, {
|
|
34
|
+
respectType: false,
|
|
35
|
+
excludeKeys: key => chart[key] === null,
|
|
36
|
+
});
|
|
37
|
+
await this.can(context, `chart:${chartHash}`);
|
|
38
|
+
}
|
|
39
|
+
/** Check if a user is allowed to perform a specific action */
|
|
40
|
+
async can(context, action, allowRefetch = true) {
|
|
41
|
+
const { id: userId, renderingId } = context.state.user;
|
|
42
|
+
const perms = await this.getRenderingPermissions(renderingId);
|
|
43
|
+
const isAllowed = perms.actions.has(action) || perms.actionsByUser[action]?.has(userId);
|
|
44
|
+
if (!isAllowed && allowRefetch) {
|
|
45
|
+
this.invalidateCache(renderingId);
|
|
46
|
+
return this.can(context, action, false);
|
|
47
|
+
}
|
|
48
|
+
if (!isAllowed) {
|
|
49
|
+
context.throw(types_1.HttpCode.Forbidden, 'Forbidden');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async getScope(collection, context) {
|
|
53
|
+
const { user } = context.state;
|
|
54
|
+
const perms = await this.getRenderingPermissions(user.renderingId);
|
|
55
|
+
const scopes = perms.scopes[collection.name];
|
|
56
|
+
if (!scopes)
|
|
57
|
+
return null;
|
|
58
|
+
const conditionTree = condition_tree_parser_1.default.fromPlainObject(collection, scopes.conditionTree);
|
|
59
|
+
return conditionTree.replaceLeafs(leaf => {
|
|
60
|
+
const dynamicValues = scopes.dynamicScopeValues?.[user.id];
|
|
61
|
+
if (typeof leaf.value === 'string' && leaf.value.startsWith('$currentUser')) {
|
|
62
|
+
// Search replacement hash from forestadmin server
|
|
63
|
+
if (dynamicValues) {
|
|
64
|
+
return leaf.override({ value: dynamicValues[leaf.value] });
|
|
65
|
+
}
|
|
66
|
+
// Search JWT token (new user)
|
|
67
|
+
return leaf.override({
|
|
68
|
+
value: leaf.value.startsWith('$currentUser.tags.')
|
|
69
|
+
? user.tags[leaf.value.substring(18)]
|
|
70
|
+
: user[leaf.value.substring(13)],
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return leaf;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/** Get cached version of "rendering permissions" */
|
|
77
|
+
getRenderingPermissions(renderingId) {
|
|
78
|
+
if (!this.cache.has(renderingId))
|
|
79
|
+
this.cache.set(renderingId, forest_http_api_1.default.getPermissions(this.options, renderingId));
|
|
80
|
+
// We already checked the entry is up-to-date with the .has() call => allowStale
|
|
81
|
+
return this.cache.get(renderingId, { allowStale: true });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.default = PermissionService;
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvcGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSwwREFBaUM7QUFDakMsOERBQXFDO0FBRXJDLG9DQUE4RDtBQUM5RCwyRkFBaUU7QUFDakUsK0VBQStFO0FBTy9FLE1BQXFCLGlCQUFpQjtJQUlwQyxZQUFZLE9BQXFCO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxtQkFBUSxDQUFDO1lBQ3hCLEdBQUcsRUFBRSxHQUFHO1lBQ1IsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsaUNBQWlDLEdBQUcsSUFBSTtTQUMzRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZSxDQUFDLFdBQW1CO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxxRUFBcUU7SUFDckUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFnQjtRQUM3Qiw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQ2pGLE9BQU87U0FDUjtRQUVELE1BQU0sS0FBSyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTFDLDJGQUEyRjtRQUMzRixtQ0FBbUM7UUFDbkMsSUFBSSxLQUFLLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDdEMsS0FBSyxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFP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
|
package/dist/types.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { CompositeId, Logger, LoggerLevel } from '@forestadmin/datasource-toolkit';
|
|
3
|
-
import { ForestAdminClient } from '@forestadmin/forestadmin-client';
|
|
4
3
|
import { IncomingMessage, ServerResponse } from 'http';
|
|
5
4
|
/** Options to configure behavior of an agent's forestadmin driver */
|
|
6
5
|
export declare type AgentOptions = {
|
|
@@ -16,7 +15,6 @@ export declare type AgentOptions = {
|
|
|
16
15
|
typingsPath?: string | null;
|
|
17
16
|
typingsMaxDepth?: number;
|
|
18
17
|
permissionsCacheDurationInSeconds?: number;
|
|
19
|
-
forestAdminClient?: ForestAdminClient;
|
|
20
18
|
};
|
|
21
19
|
export declare type AgentOptionsWithDefaults = Readonly<Required<AgentOptions>>;
|
|
22
20
|
export declare type HttpCallback = (req: IncomingMessage, res: ServerResponse) => void;
|
package/dist/types.js
CHANGED
|
@@ -20,4 +20,4 @@ var RouteType;
|
|
|
20
20
|
RouteType[RouteType["Authentication"] = 3] = "Authentication";
|
|
21
21
|
RouteType[RouteType["PrivateRoute"] = 4] = "PrivateRoute";
|
|
22
22
|
})(RouteType = exports.RouteType || (exports.RouteType = {}));
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBc0JBLElBQVksUUFRWDtBQVJELFdBQVksUUFBUTtJQUNsQixxREFBZ0IsQ0FBQTtJQUNoQixtREFBZSxDQUFBO0lBQ2YsdUVBQXlCLENBQUE7SUFDekIsbURBQWUsQ0FBQTtJQUNmLGlEQUFjLENBQUE7SUFDZCxxQ0FBUSxDQUFBO0lBQ1IsMkRBQW1CLENBQUE7QUFDckIsQ0FBQyxFQVJXLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBUW5CO0FBRUQsSUFBWSxTQU9YO0FBUEQsV0FBWSxTQUFTO0lBQ25CLGlHQUFpRztJQUNqRywyREFBaUIsQ0FBQTtJQUNqQix5REFBZ0IsQ0FBQTtJQUNoQix1REFBZSxDQUFBO0lBQ2YsNkRBQWtCLENBQUE7SUFDbEIseURBQWdCLENBQUE7QUFDbEIsQ0FBQyxFQVBXLFNBQVMsR0FBVCxpQkFBUyxLQUFULGlCQUFTLFFBT3BCIn0=
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { IssuerMetadata } from 'openid-client';
|
|
2
2
|
import { JSONAPIDocument } from 'json-api-serializer';
|
|
3
|
+
import { PlainConditionTree } from '@forestadmin/datasource-toolkit';
|
|
3
4
|
import { AgentOptions } from '../types';
|
|
4
5
|
export declare type IpWhitelistConfiguration = {
|
|
5
6
|
isFeatureEnabled: boolean;
|
|
@@ -24,6 +25,22 @@ export declare type UserInfo = {
|
|
|
24
25
|
};
|
|
25
26
|
permissionLevel: string;
|
|
26
27
|
};
|
|
28
|
+
export declare type RenderingPermissions = {
|
|
29
|
+
actions: Set<string>;
|
|
30
|
+
actionsByUser: {
|
|
31
|
+
[actionName: string]: Set<number>;
|
|
32
|
+
};
|
|
33
|
+
scopes: {
|
|
34
|
+
[collectionName: string]: {
|
|
35
|
+
conditionTree: PlainConditionTree;
|
|
36
|
+
dynamicScopeValues: {
|
|
37
|
+
[userId: number]: {
|
|
38
|
+
[replacementKey: string]: unknown;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
27
44
|
declare type HttpOptions = Pick<AgentOptions, 'envSecret' | 'forestServerUrl' | 'isProduction'>;
|
|
28
45
|
export default class ForestHttpApi {
|
|
29
46
|
static getIpWhitelistConfiguration(options: HttpOptions): Promise<IpWhitelistConfiguration>;
|
|
@@ -31,6 +48,17 @@ export default class ForestHttpApi {
|
|
|
31
48
|
static getUserInformation(options: HttpOptions, renderingId: number, accessToken: string): Promise<UserInfo>;
|
|
32
49
|
static hasSchema(options: HttpOptions, hash: string): Promise<boolean>;
|
|
33
50
|
static uploadSchema(options: HttpOptions, apimap: JSONAPIDocument): Promise<void>;
|
|
51
|
+
static getPermissions(options: HttpOptions, renderingId: number): Promise<RenderingPermissions>;
|
|
52
|
+
/** Helper to format permissions into something easy to validate against */
|
|
53
|
+
private static decodeChartPermissions;
|
|
54
|
+
/**
|
|
55
|
+
* Helper to format permissions into something easy to validate against
|
|
56
|
+
* Note that the format the server is sending varies depending on if we're using a remote or
|
|
57
|
+
* local environment.
|
|
58
|
+
*/
|
|
59
|
+
private static decodeActionPermissions;
|
|
60
|
+
/** Helper to format permissions into something easy to validate against */
|
|
61
|
+
private static decodeScopePermissions;
|
|
34
62
|
private static handleResponseError;
|
|
35
63
|
}
|
|
36
64
|
export {};
|
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const object_hash_1 = __importDefault(require("object-hash"));
|
|
6
7
|
const superagent_1 = __importDefault(require("superagent"));
|
|
7
8
|
class ForestHttpApi {
|
|
8
9
|
static async getIpWhitelistConfiguration(options) {
|
|
@@ -75,6 +76,85 @@ class ForestHttpApi {
|
|
|
75
76
|
this.handleResponseError(e);
|
|
76
77
|
}
|
|
77
78
|
}
|
|
79
|
+
static async getPermissions(options, renderingId) {
|
|
80
|
+
try {
|
|
81
|
+
const { body } = await superagent_1.default
|
|
82
|
+
.get(`${options.forestServerUrl}/liana/v3/permissions`)
|
|
83
|
+
.set('forest-secret-key', options.envSecret)
|
|
84
|
+
.query(`renderingId=${renderingId}`);
|
|
85
|
+
if (!body.meta?.rolesACLActivated) {
|
|
86
|
+
throw new Error('Roles V2 are unsupported');
|
|
87
|
+
}
|
|
88
|
+
const actions = new Set();
|
|
89
|
+
const actionsByUser = {};
|
|
90
|
+
ForestHttpApi.decodeChartPermissions(body?.stats ?? {}, actions);
|
|
91
|
+
ForestHttpApi.decodeActionPermissions(body?.data?.collections ?? {}, actions, actionsByUser);
|
|
92
|
+
return {
|
|
93
|
+
actions,
|
|
94
|
+
actionsByUser,
|
|
95
|
+
scopes: ForestHttpApi.decodeScopePermissions(body?.data?.renderings?.[renderingId] ?? {}),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
this.handleResponseError(e);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** Helper to format permissions into something easy to validate against */
|
|
103
|
+
static decodeChartPermissions(chartsByType, actions) {
|
|
104
|
+
const serverCharts = Object.values(chartsByType).flat();
|
|
105
|
+
const frontendCharts = serverCharts.map(chart => ({
|
|
106
|
+
type: chart.type,
|
|
107
|
+
filters: chart.filter,
|
|
108
|
+
aggregate: chart.aggregator,
|
|
109
|
+
aggregate_field: chart.aggregateFieldName,
|
|
110
|
+
collection: chart.sourceCollectionId,
|
|
111
|
+
time_range: chart.timeRange,
|
|
112
|
+
group_by_date_field: (chart.type === 'Line' && chart.groupByFieldName) || null,
|
|
113
|
+
group_by_field: (chart.type !== 'Line' && chart.groupByFieldName) || null,
|
|
114
|
+
limit: chart.limit,
|
|
115
|
+
label_field: chart.labelFieldName,
|
|
116
|
+
relationship_field: chart.relationshipFieldName,
|
|
117
|
+
}));
|
|
118
|
+
const hashes = frontendCharts.map(chart => (0, object_hash_1.default)(chart, {
|
|
119
|
+
respectType: false,
|
|
120
|
+
excludeKeys: key => chart[key] === null || chart[key] === undefined,
|
|
121
|
+
}));
|
|
122
|
+
hashes.forEach(hash => actions.add(`chart:${hash}`));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Helper to format permissions into something easy to validate against
|
|
126
|
+
* Note that the format the server is sending varies depending on if we're using a remote or
|
|
127
|
+
* local environment.
|
|
128
|
+
*/
|
|
129
|
+
static decodeActionPermissions(collections, actions, actionsByUser) {
|
|
130
|
+
for (const [name, settings] of Object.entries(collections)) {
|
|
131
|
+
for (const [actionName, userIds] of Object.entries(settings.collection ?? {})) {
|
|
132
|
+
const shortName = actionName.substring(0, actionName.length - 'Enabled'.length);
|
|
133
|
+
if (typeof userIds === 'boolean')
|
|
134
|
+
actions.add(`${shortName}:${name}`);
|
|
135
|
+
else
|
|
136
|
+
actionsByUser[`${shortName}:${name}`] = new Set(userIds);
|
|
137
|
+
}
|
|
138
|
+
for (const [actionName, actionPerms] of Object.entries(settings.actions ?? {})) {
|
|
139
|
+
const userIds = actionPerms.triggerEnabled;
|
|
140
|
+
if (typeof userIds === 'boolean')
|
|
141
|
+
actions.add(`custom:${actionName}:${name}`);
|
|
142
|
+
else
|
|
143
|
+
actionsByUser[`custom:${actionName}:${name}`] = new Set(userIds);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Helper to format permissions into something easy to validate against */
|
|
148
|
+
static decodeScopePermissions(rendering) {
|
|
149
|
+
const scopes = {};
|
|
150
|
+
for (const [name, { scope }] of Object.entries(rendering)) {
|
|
151
|
+
scopes[name] = scope && {
|
|
152
|
+
conditionTree: scope.filter,
|
|
153
|
+
dynamicScopeValues: scope.dynamicScopesValues?.users ?? {},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return scopes;
|
|
157
|
+
}
|
|
78
158
|
static handleResponseError(e) {
|
|
79
159
|
if (/certificate/i.test(e.message))
|
|
80
160
|
throw new Error('ForestAdmin server TLS certificate cannot be verified. ' +
|
|
@@ -97,4 +177,4 @@ class ForestHttpApi {
|
|
|
97
177
|
}
|
|
98
178
|
}
|
|
99
179
|
exports.default = ForestHttpApi;
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yZXN0LWh0dHAtYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2ZvcmVzdC1odHRwLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUlBLDhEQUFxQztBQUNyQyw0REFBaUU7QUF3Q2pFLE1BQXFCLGFBQWE7SUFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FDdEMsT0FBb0I7UUFFcEIsSUFBSTtZQUNGLE1BQU0sUUFBUSxHQUFhLE1BQU0sb0JBQVU7aUJBQ3hDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQ2hGLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFL0MsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNyRjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsT0FBb0I7UUFDdkQsSUFBSTtZQUNGLE1BQU0sUUFBUSxHQUFhLE1BQU0sb0JBQVU7aUJBQ3hDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyx3Q0FBd0MsRUFBRSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQzFGLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFL0MsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ3RCO1FBQUMsT0FB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
|
|
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const fs_1 = require("fs");
|
|
7
|
-
const forestadmin_client_1 = __importDefault(require("@forestadmin/forestadmin-client"));
|
|
8
7
|
const path_1 = __importDefault(require("path"));
|
|
9
8
|
class OptionsValidator {
|
|
10
9
|
static withDefaults(options) {
|
|
@@ -21,18 +20,11 @@ class OptionsValidator {
|
|
|
21
20
|
copyOptions.forestServerUrl = copyOptions.forestServerUrl || 'https://api.forestadmin.com';
|
|
22
21
|
copyOptions.typingsMaxDepth = copyOptions.typingsMaxDepth ?? 5;
|
|
23
22
|
copyOptions.prefix = copyOptions.prefix || '';
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
(0, forestadmin_client_1.default)({
|
|
30
|
-
envSecret: copyOptions.envSecret,
|
|
31
|
-
forestServerUrl: copyOptions.forestServerUrl,
|
|
32
|
-
logger: copyOptions.logger,
|
|
33
|
-
permissionsCacheDurationInSeconds: copyOptions.permissionsCacheDurationInSeconds,
|
|
34
|
-
});
|
|
35
|
-
return copyOptions;
|
|
23
|
+
return {
|
|
24
|
+
loggerLevel: 'Info',
|
|
25
|
+
permissionsCacheDurationInSeconds: 15 * 60,
|
|
26
|
+
...copyOptions,
|
|
27
|
+
};
|
|
36
28
|
}
|
|
37
29
|
static validate(options) {
|
|
38
30
|
OptionsValidator.checkForestServerOptions(options);
|
|
@@ -97,4 +89,4 @@ OptionsValidator.loggerPrefix = {
|
|
|
97
89
|
Warn: '\x1b[33mwarning:\x1b[0m',
|
|
98
90
|
Error: '\x1b[31merror:\x1b[0m',
|
|
99
91
|
};
|
|
100
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy12YWxpZGF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvb3B0aW9ucy12YWxpZGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwyQkFBZ0M7QUFDaEMsZ0RBQXdCO0FBSXhCLE1BQXFCLGdCQUFnQjtJQVFuQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQXFCO1FBQ3ZDLE1BQU0sV0FBVyxHQUFHLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUVuQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNwQyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQztZQUNsRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUU5QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDeEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDM0Q7UUFDSCxDQUFDLENBQUM7UUFFRixXQUFXLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDO1FBQ3pELFdBQVcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsSUFBSSwwQkFBMEIsQ0FBQztRQUM5RSxXQUFXLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxlQUFlLElBQUksNkJBQTZCLENBQUM7UUFDM0YsV0FBVyxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQztRQUMvRCxXQUFXLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO1FBRTlDLE9B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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forestadmin/agent",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "GPL-3.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -14,9 +14,8 @@
|
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"@fast-csv/format": "^4.3.5",
|
|
16
16
|
"@fastify/express": "^1.1.0",
|
|
17
|
-
"@forestadmin/datasource-customizer": "1.
|
|
18
|
-
"@forestadmin/datasource-toolkit": "1.0.
|
|
19
|
-
"@forestadmin/forestadmin-client": "1.0.0-alpha.1",
|
|
17
|
+
"@forestadmin/datasource-customizer": "1.2.0",
|
|
18
|
+
"@forestadmin/datasource-toolkit": "1.0.0",
|
|
20
19
|
"@koa/cors": "^3.3.0",
|
|
21
20
|
"@koa/router": "^10.1.1",
|
|
22
21
|
"forest-ip-utils": "^1.0.1",
|
|
@@ -26,6 +25,7 @@
|
|
|
26
25
|
"koa": "^2.13.4",
|
|
27
26
|
"koa-bodyparser": "^4.3.0",
|
|
28
27
|
"koa-jwt": "^4.0.3",
|
|
28
|
+
"lru-cache": "^7.3.1",
|
|
29
29
|
"luxon": "^2.3.0",
|
|
30
30
|
"object-hash": "^3.0.0",
|
|
31
31
|
"openid-client": "5.1.3",
|