@forestadmin/forestadmin-client 1.0.0-alpha.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/LICENSE +674 -0
- package/README.md +3 -0
- package/dist/forest-admin-client-with-cache.d.ts +17 -0
- package/dist/forest-admin-client-with-cache.js +28 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +33 -0
- package/dist/permissions/action-permission.d.ts +15 -0
- package/dist/permissions/action-permission.js +70 -0
- package/dist/permissions/errors/jwt-token-expired-error.d.ts +3 -0
- package/dist/permissions/errors/jwt-token-expired-error.js +6 -0
- package/dist/permissions/errors/jwt-unable-to-verify-error.d.ts +3 -0
- package/dist/permissions/errors/jwt-unable-to-verify-error.js +6 -0
- package/dist/permissions/forest-http-api.d.ts +11 -0
- package/dist/permissions/forest-http-api.js +63 -0
- package/dist/permissions/generate-action-identifier.d.ts +4 -0
- package/dist/permissions/generate-action-identifier.js +12 -0
- package/dist/permissions/generate-actions-from-permissions.d.ts +8 -0
- package/dist/permissions/generate-actions-from-permissions.js +87 -0
- package/dist/permissions/generate-user-scope.d.ts +4 -0
- package/dist/permissions/generate-user-scope.js +36 -0
- package/dist/permissions/hash-chart.d.ts +4 -0
- package/dist/permissions/hash-chart.js +48 -0
- package/dist/permissions/is-segment-query-authorized.d.ts +2 -0
- package/dist/permissions/is-segment-query-authorized.js +19 -0
- package/dist/permissions/permission-with-cache.d.ts +42 -0
- package/dist/permissions/permission-with-cache.js +40 -0
- package/dist/permissions/rendering-permission.d.ts +36 -0
- package/dist/permissions/rendering-permission.js +110 -0
- package/dist/permissions/types.d.ts +184 -0
- package/dist/permissions/types.js +37 -0
- package/dist/permissions/user-permission.d.ts +11 -0
- package/dist/permissions/user-permission.js +36 -0
- package/dist/permissions/verify-approval.d.ts +2 -0
- package/dist/permissions/verify-approval.js +49 -0
- package/dist/types.d.ts +56 -0
- package/dist/types.js +3 -0
- package/package.json +38 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { GenericTree } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { ForestAdminClient, ForestAdminClientOptionsWithDefaults, PermissionService } from './types';
|
|
3
|
+
import RenderingPermissionService from './permissions/rendering-permission';
|
|
4
|
+
export default class ForestAdminClientWithCache implements ForestAdminClient {
|
|
5
|
+
protected readonly options: ForestAdminClientOptionsWithDefaults;
|
|
6
|
+
readonly permissionService: PermissionService;
|
|
7
|
+
protected readonly renderingPermissionService: RenderingPermissionService;
|
|
8
|
+
constructor(options: ForestAdminClientOptionsWithDefaults, permissionService: PermissionService, renderingPermissionService: RenderingPermissionService);
|
|
9
|
+
verifySignedActionParameters<TSignedParameters>(signedParameters: string): TSignedParameters;
|
|
10
|
+
getScope({ renderingId, userId, collectionName, }: {
|
|
11
|
+
renderingId: number | string;
|
|
12
|
+
userId: number | string;
|
|
13
|
+
collectionName: string;
|
|
14
|
+
}): Promise<GenericTree>;
|
|
15
|
+
markScopesAsUpdated(renderingId: number | string): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=forest-admin-client-with-cache.d.ts.map
|
|
@@ -0,0 +1,28 @@
|
|
|
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 verify_approval_1 = __importDefault(require("./permissions/verify-approval"));
|
|
7
|
+
class ForestAdminClientWithCache {
|
|
8
|
+
constructor(options, permissionService, renderingPermissionService) {
|
|
9
|
+
this.options = options;
|
|
10
|
+
this.permissionService = permissionService;
|
|
11
|
+
this.renderingPermissionService = renderingPermissionService;
|
|
12
|
+
}
|
|
13
|
+
verifySignedActionParameters(signedParameters) {
|
|
14
|
+
return (0, verify_approval_1.default)(signedParameters, this.options.envSecret);
|
|
15
|
+
}
|
|
16
|
+
async getScope({ renderingId, userId, collectionName, }) {
|
|
17
|
+
return this.renderingPermissionService.getScope({
|
|
18
|
+
renderingId,
|
|
19
|
+
collectionName,
|
|
20
|
+
userId,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
markScopesAsUpdated(renderingId) {
|
|
24
|
+
this.renderingPermissionService.invalidateCache(renderingId);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = ForestAdminClientWithCache;
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yZXN0LWFkbWluLWNsaWVudC13aXRoLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ZvcmVzdC1hZG1pbi1jbGllbnQtd2l0aC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVFBLG9GQUFxRTtBQUVyRSxNQUFxQiwwQkFBMEI7SUFDN0MsWUFDcUIsT0FBNkMsRUFDaEQsaUJBQW9DLEVBQ2pDLDBCQUFzRDtRQUZ0RCxZQUFPLEdBQVAsT0FBTyxDQUFzQztRQUNoRCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ2pDLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBNEI7SUFDeEUsQ0FBQztJQUVHLDRCQUE0QixDQUNqQyxnQkFBd0I7UUFFeEIsT0FBTyxJQUFBLHlCQUF3QixFQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVNLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFDcEIsV0FBVyxFQUNYLE1BQU0sRUFDTixjQUFjLEdBS2Y7UUFDQyxPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLENBQUM7WUFDOUMsV0FBVztZQUNYLGNBQWM7WUFDZCxNQUFNO1NBQ1AsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLG1CQUFtQixDQUFDLFdBQTRCO1FBQ3JELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0QsQ0FBQztDQUNGO0FBaENELDZDQWdDQyJ9
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ForestAdminClientOptions } from './types';
|
|
2
|
+
import ForestAdminClient from './forest-admin-client-with-cache';
|
|
3
|
+
export { ForestAdminClientOptions, Logger, LoggerLevel, ForestAdminClient } from './types';
|
|
4
|
+
export { CollectionActionEvent } from './permissions/types';
|
|
5
|
+
export { default as JTWTokenExpiredError } from './permissions/errors/jwt-token-expired-error';
|
|
6
|
+
export { default as JTWUnableToVerifyError } from './permissions/errors/jwt-unable-to-verify-error';
|
|
7
|
+
export default function createForestAdminClient(options: ForestAdminClientOptions): ForestAdminClient;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
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.JTWUnableToVerifyError = exports.JTWTokenExpiredError = exports.CollectionActionEvent = void 0;
|
|
7
|
+
const action_permission_1 = __importDefault(require("./permissions/action-permission"));
|
|
8
|
+
const forest_admin_client_with_cache_1 = __importDefault(require("./forest-admin-client-with-cache"));
|
|
9
|
+
const permission_with_cache_1 = __importDefault(require("./permissions/permission-with-cache"));
|
|
10
|
+
const rendering_permission_1 = __importDefault(require("./permissions/rendering-permission"));
|
|
11
|
+
const user_permission_1 = __importDefault(require("./permissions/user-permission"));
|
|
12
|
+
var types_1 = require("./permissions/types");
|
|
13
|
+
Object.defineProperty(exports, "CollectionActionEvent", { enumerable: true, get: function () { return types_1.CollectionActionEvent; } });
|
|
14
|
+
var jwt_token_expired_error_1 = require("./permissions/errors/jwt-token-expired-error");
|
|
15
|
+
Object.defineProperty(exports, "JTWTokenExpiredError", { enumerable: true, get: function () { return __importDefault(jwt_token_expired_error_1).default; } });
|
|
16
|
+
var jwt_unable_to_verify_error_1 = require("./permissions/errors/jwt-unable-to-verify-error");
|
|
17
|
+
Object.defineProperty(exports, "JTWUnableToVerifyError", { enumerable: true, get: function () { return __importDefault(jwt_unable_to_verify_error_1).default; } });
|
|
18
|
+
function createForestAdminClient(options) {
|
|
19
|
+
const optionsWithDefaults = {
|
|
20
|
+
forestServerUrl: 'https://api.forestadmin.com',
|
|
21
|
+
permissionsCacheDurationInSeconds: 15 * 60,
|
|
22
|
+
// eslint-disable-next-line no-console
|
|
23
|
+
logger: (level, ...args) => console[level.toLowerCase()](...args),
|
|
24
|
+
...options,
|
|
25
|
+
};
|
|
26
|
+
const actionPermission = new action_permission_1.default(optionsWithDefaults);
|
|
27
|
+
const userPermission = new user_permission_1.default(optionsWithDefaults);
|
|
28
|
+
const renderingPermission = new rendering_permission_1.default(optionsWithDefaults, userPermission);
|
|
29
|
+
const permissionService = new permission_with_cache_1.default(actionPermission, renderingPermission);
|
|
30
|
+
return new forest_admin_client_with_cache_1.default(optionsWithDefaults, permissionService, renderingPermission);
|
|
31
|
+
}
|
|
32
|
+
exports.default = createForestAdminClient;
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0Esd0ZBQXNFO0FBQ3RFLHNHQUFpRTtBQUNqRSxnR0FBb0U7QUFDcEUsOEZBQTRFO0FBQzVFLG9GQUFrRTtBQUdsRSw2Q0FBNEQ7QUFBbkQsOEdBQUEscUJBQXFCLE9BQUE7QUFDOUIsd0ZBQStGO0FBQXRGLGdKQUFBLE9BQU8sT0FBd0I7QUFDeEMsOEZBQW9HO0FBQTNGLHFKQUFBLE9BQU8sT0FBMEI7QUFFMUMsU0FBd0IsdUJBQXVCLENBQzdDLE9BQWlDO0lBRWpDLE1BQU0sbUJBQW1CLEdBQXlDO1FBQ2hFLGVBQWUsRUFBRSw2QkFBNkI7UUFDOUMsaUNBQWlDLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDMUMsc0NBQXNDO1FBQ3RDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pFLEdBQUcsT0FBTztLQUNYLENBQUM7SUFFRixNQUFNLGdCQUFnQixHQUFHLElBQUksMkJBQXVCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMxRSxNQUFNLGNBQWMsR0FBRyxJQUFJLHlCQUFxQixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEUsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLDhCQUEwQixDQUFDLG1CQUFtQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ2hHLE1BQU0saUJBQWlCLEdBQUcsSUFBSSwrQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBRXZGLE9BQU8sSUFBSSx3Q0FBaUIsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0FBQzVGLENBQUM7QUFqQkQsMENBaUJDIn0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ForestAdminClientOptionsWithDefaults } from '../types';
|
|
2
|
+
export default class ActionPermissionService {
|
|
3
|
+
private readonly options;
|
|
4
|
+
private permissionsPromise;
|
|
5
|
+
private permissionExpirationTimestamp;
|
|
6
|
+
constructor(options: ForestAdminClientOptionsWithDefaults);
|
|
7
|
+
canOneOf(userId: string, actionNames: string[]): Promise<boolean>;
|
|
8
|
+
can(userId: string, actionName: string): Promise<boolean>;
|
|
9
|
+
private hasPermissionOrRefetch;
|
|
10
|
+
private isAllowedOneOf;
|
|
11
|
+
private isAllowed;
|
|
12
|
+
private getPermissions;
|
|
13
|
+
private fetchEnvironmentPermissions;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=action-permission.d.ts.map
|
|
@@ -0,0 +1,70 @@
|
|
|
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 forest_http_api_1 = __importDefault(require("./forest-http-api"));
|
|
7
|
+
const generate_actions_from_permissions_1 = __importDefault(require("./generate-actions-from-permissions"));
|
|
8
|
+
class ActionPermissionService {
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
}
|
|
12
|
+
canOneOf(userId, actionNames) {
|
|
13
|
+
return this.hasPermissionOrRefetch({
|
|
14
|
+
userId,
|
|
15
|
+
actionNames,
|
|
16
|
+
allowRefetch: true,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
can(userId, actionName) {
|
|
20
|
+
return this.hasPermissionOrRefetch({
|
|
21
|
+
userId,
|
|
22
|
+
actionNames: [actionName],
|
|
23
|
+
allowRefetch: true,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async hasPermissionOrRefetch({ userId, actionNames, allowRefetch, }) {
|
|
27
|
+
const permissions = await this.getPermissions();
|
|
28
|
+
const isAllowed = this.isAllowedOneOf({ permissions, actionNames, userId });
|
|
29
|
+
if (!isAllowed && allowRefetch) {
|
|
30
|
+
this.permissionsPromise = undefined;
|
|
31
|
+
this.permissionExpirationTimestamp = undefined;
|
|
32
|
+
return this.hasPermissionOrRefetch({
|
|
33
|
+
userId,
|
|
34
|
+
actionNames,
|
|
35
|
+
allowRefetch: false,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
this.options.logger('Debug', `User ${userId} is ${isAllowed ? '' : 'not '}allowed to perform ${actionNames.length > 1 ? ' one of ' : ''}${actionNames.join(', ')}`);
|
|
39
|
+
return isAllowed;
|
|
40
|
+
}
|
|
41
|
+
isAllowedOneOf({ permissions, actionNames, userId, }) {
|
|
42
|
+
return actionNames.some(actionName => this.isAllowed({ permissions, actionName, userId }));
|
|
43
|
+
}
|
|
44
|
+
isAllowed({ permissions, actionName, userId, }) {
|
|
45
|
+
return Boolean(permissions.everythingAllowed ||
|
|
46
|
+
permissions.actionsGloballyAllowed.has(actionName) ||
|
|
47
|
+
permissions.actionsAllowedByUser.get(actionName)?.has(userId));
|
|
48
|
+
}
|
|
49
|
+
async getPermissions() {
|
|
50
|
+
if (this.permissionsPromise &&
|
|
51
|
+
this.permissionExpirationTimestamp &&
|
|
52
|
+
this.permissionExpirationTimestamp > Date.now()) {
|
|
53
|
+
return this.permissionsPromise;
|
|
54
|
+
}
|
|
55
|
+
this.permissionsPromise = this.fetchEnvironmentPermissions();
|
|
56
|
+
this.permissionExpirationTimestamp =
|
|
57
|
+
Date.now() + this.options.permissionsCacheDurationInSeconds * 1000;
|
|
58
|
+
return this.permissionsPromise;
|
|
59
|
+
}
|
|
60
|
+
async fetchEnvironmentPermissions() {
|
|
61
|
+
this.options.logger('Debug', 'Fetching environment permissions');
|
|
62
|
+
const [rawPermissions, users] = await Promise.all([
|
|
63
|
+
forest_http_api_1.default.getEnvironmentPermissions(this.options),
|
|
64
|
+
forest_http_api_1.default.getUsers(this.options),
|
|
65
|
+
]);
|
|
66
|
+
return (0, generate_actions_from_permissions_1.default)(rawPermissions, users);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.default = ActionPermissionService;
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLXBlcm1pc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvYWN0aW9uLXBlcm1pc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSx3RUFBOEM7QUFDOUMsNEdBRTZDO0FBRTdDLE1BQXFCLHVCQUF1QjtJQUkxQyxZQUE2QixPQUE2QztRQUE3QyxZQUFPLEdBQVAsT0FBTyxDQUFzQztJQUFHLENBQUM7SUFFdkUsUUFBUSxDQUFDLE1BQWMsRUFBRSxXQUFxQjtRQUNuRCxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztZQUNqQyxNQUFNO1lBQ04sV0FBVztZQUNYLFlBQVksRUFBRSxJQUFJO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxHQUFHLENBQUMsTUFBYyxFQUFFLFVBQWtCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO1lBQ2pDLE1BQU07WUFDTixXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDekIsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxFQUNuQyxNQUFNLEVBQ04sV0FBVyxFQUNYLFlBQVksR0FLYjtRQUNDLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2hELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxZQUFZLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztZQUNwQyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsU0FBUyxDQUFDO1lBRS9DLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixDQUFDO2dCQUNqQyxNQUFNO2dCQUNOLFdBQVc7Z0JBQ1gsWUFBWSxFQUFFLEtBQUs7YUFDcEIsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDakIsT0FBTyxFQUNQLFFBQVEsTUFBTSxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLHNCQUMxQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUN4QyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDNUIsQ0FBQztRQUVGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxjQUFjLENBQUMsRUFDckIsV0FBVyxFQUNYLFdBQVcsRUFDWCxNQUFNLEdBS1A7UUFDQyxPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVPLFNBQVMsQ0FBQyxFQUNoQixXQUFXLEVBQ1gsVUFBVSxFQUNWLE1BQU0sR0FLUDtRQUNDLE9BQU8sT0FBTyxDQUNaLFdBQVcsQ0FBQyxpQkFBaUI7WUFDM0IsV0FBVyxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7WUFDbEQsV0FBVyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQ2hFLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWM7UUFDMUIsSUFDRSxJQUFJLENBQUMsa0JBQWtCO1lBQ3ZCLElBQUksQ0FBQyw2QkFBNkI7WUFDbEMsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFDL0M7WUFDQSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztTQUNoQztRQUVELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUM3RCxJQUFJLENBQUMsNkJBQTZCO1lBQ2hDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxHQUFHLElBQUksQ0FBQztRQUVyRSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRU8sS0FBSyxDQUFDLDJCQUEyQjtRQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsa0NBQWtDLENBQUMsQ0FBQztRQUVqRSxNQUFNLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNoRCx5QkFBYSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDckQseUJBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUNyQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUEsMkNBQThCLEVBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9ELENBQUM7Q0FDRjtBQTdHRCwwQ0E2R0MifQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class JTWTokenExpiredError extends Error {
|
|
4
|
+
}
|
|
5
|
+
exports.default = JTWTokenExpiredError;
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LXRva2VuLWV4cGlyZWQtZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGVybWlzc2lvbnMvZXJyb3JzL2p3dC10b2tlbi1leHBpcmVkLWVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBcUIsb0JBQXFCLFNBQVEsS0FBSztDQUFHO0FBQTFELHVDQUEwRCJ9
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class JTWUnableToVerifyError extends Error {
|
|
4
|
+
}
|
|
5
|
+
exports.default = JTWUnableToVerifyError;
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LXVuYWJsZS10by12ZXJpZnktZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGVybWlzc2lvbnMvZXJyb3JzL2p3dC11bmFibGUtdG8tdmVyaWZ5LWVycm9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsTUFBcUIsc0JBQXVCLFNBQVEsS0FBSztDQUFHO0FBQTVELHlDQUE0RCJ9
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EnvironmentPermissionsV4, RenderingPermissionV4, UserPermissionV4 } from './types';
|
|
2
|
+
import { ForestAdminClientOptionsWithDefaults } from '../types';
|
|
3
|
+
declare type HttpOptions = Pick<ForestAdminClientOptionsWithDefaults, 'envSecret' | 'forestServerUrl'>;
|
|
4
|
+
export default class ForestHttpApi {
|
|
5
|
+
static getEnvironmentPermissions(options: HttpOptions): Promise<EnvironmentPermissionsV4>;
|
|
6
|
+
static getUsers(options: HttpOptions): Promise<UserPermissionV4[]>;
|
|
7
|
+
static getRenderingPermissions(renderingId: number, options: HttpOptions): Promise<RenderingPermissionV4>;
|
|
8
|
+
private static handleResponseError;
|
|
9
|
+
}
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=forest-http-api.d.ts.map
|
|
@@ -0,0 +1,63 @@
|
|
|
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 superagent_1 = __importDefault(require("superagent"));
|
|
7
|
+
class ForestHttpApi {
|
|
8
|
+
static async getEnvironmentPermissions(options) {
|
|
9
|
+
try {
|
|
10
|
+
const { body } = await superagent_1.default
|
|
11
|
+
.get(`${options.forestServerUrl}/liana/v4/permissions/environment`)
|
|
12
|
+
.set('forest-secret-key', options.envSecret);
|
|
13
|
+
return body;
|
|
14
|
+
}
|
|
15
|
+
catch (e) {
|
|
16
|
+
this.handleResponseError(e);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
static async getUsers(options) {
|
|
20
|
+
try {
|
|
21
|
+
const { body } = await superagent_1.default
|
|
22
|
+
.get(`${options.forestServerUrl}/liana/v4/permissions/users`)
|
|
23
|
+
.set('forest-secret-key', options.envSecret);
|
|
24
|
+
return body;
|
|
25
|
+
}
|
|
26
|
+
catch (e) {
|
|
27
|
+
this.handleResponseError(e);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
static async getRenderingPermissions(renderingId, options) {
|
|
31
|
+
try {
|
|
32
|
+
const { body } = await superagent_1.default
|
|
33
|
+
.get(`${options.forestServerUrl}/liana/v4/permissions/renderings/${renderingId}`)
|
|
34
|
+
.set('forest-secret-key', options.envSecret);
|
|
35
|
+
return body;
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
this.handleResponseError(e);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
static handleResponseError(e) {
|
|
42
|
+
if (/certificate/i.test(e.message))
|
|
43
|
+
throw new Error('ForestAdmin server TLS certificate cannot be verified. ' +
|
|
44
|
+
'Please check that your system time is set properly.');
|
|
45
|
+
if (e.response) {
|
|
46
|
+
const status = e?.response?.status;
|
|
47
|
+
// 0 == offline, 502 == bad gateway from proxy
|
|
48
|
+
if (status === 0 || status === 502)
|
|
49
|
+
throw new Error('Failed to reach ForestAdmin server. Are you online?');
|
|
50
|
+
if (status === 404)
|
|
51
|
+
throw new Error('ForestAdmin server failed to find the project related to the envSecret you configured.' +
|
|
52
|
+
' Can you check that you copied it properly in the Forest initialization?');
|
|
53
|
+
if (status === 503)
|
|
54
|
+
throw new Error('Forest is in maintenance for a few minutes. We are upgrading your experience in ' +
|
|
55
|
+
'the forest. We just need a few more minutes to get it right.');
|
|
56
|
+
throw new Error('An unexpected error occurred while contacting the ForestAdmin server. ' +
|
|
57
|
+
'Please contact support@forestadmin.com for further investigations.');
|
|
58
|
+
}
|
|
59
|
+
throw e;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.default = ForestHttpApi;
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yZXN0LWh0dHAtYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Blcm1pc3Npb25zL2ZvcmVzdC1odHRwLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDREQUF1RDtBQU92RCxNQUFxQixhQUFhO0lBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsT0FBb0I7UUFDekQsSUFBSTtZQUNGLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLG9CQUFVO2lCQUM5QixHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsZUFBZSxtQ0FBbUMsQ0FBQztpQkFDbEUsR0FBRyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUUvQyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBb0I7UUFDeEMsSUFBSTtZQUNGLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLG9CQUFVO2lCQUM5QixHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsZUFBZSw2QkFBNkIsQ0FBQztpQkFDNUQsR0FBRyxDQUFDLG1CQUFtQixFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUUvQyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FDbEMsV0FBbUIsRUFDbkIsT0FBb0I7UUFFcEIsSUFBSTtZQUNGLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLG9CQUFVO2lCQUM5QixHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsZUFBZSxvQ0FBb0MsV0FBVyxFQUFFLENBQUM7aUJBQ2hGLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFL0MsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFRO1FBQ3pDLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IseURBQXlEO2dCQUN2RCxxREFBcUQsQ0FDeEQsQ0FBQztRQUVKLElBQUssQ0FBbUIsQ0FBQyxRQUFRLEVBQUU7WUFDakMsTUFBTSxNQUFNLEdBQUksQ0FBbUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDO1lBRXRELDhDQUE4QztZQUM5QyxJQUFJLE1BQU0sS0FBSyxDQUFDLElBQUksTUFBTSxLQUFLLEdBQUc7Z0JBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztZQUV6RSxJQUFJLE1BQU0sS0FBSyxHQUFHO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUNiLHdGQUF3RjtvQkFDdEYsMEVBQTBFLENBQzdFLENBQUM7WUFFSixJQUFJLE1BQU0sS0FBSyxHQUFHO2dCQUNoQixNQUFNLElBQUksS0FBSyxDQUNiLGtGQUFrRjtvQkFDaEYsOERBQThELENBQ2pFLENBQUM7WUFFSixNQUFNLElBQUksS0FBSyxDQUNiLHdFQUF3RTtnQkFDdEUsb0VBQW9FLENBQ3ZFLENBQUM7U0FDSDtRQUVELE1BQU0sQ0FBQyxDQUFDO0lBQ1YsQ0FBQztDQUNGO0FBMUVELGdDQTBFQyJ9
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { CollectionActionEvent, CustomActionEvent } from './types';
|
|
2
|
+
export declare function generateCustomActionIdentifier(actionEventName: CustomActionEvent, customActionName: string, collectionName: string): string;
|
|
3
|
+
export declare function generateCollectionActionIdentifier(action: CollectionActionEvent, collectionName: string): string;
|
|
4
|
+
//# sourceMappingURL=generate-action-identifier.d.ts.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateCollectionActionIdentifier = exports.generateCustomActionIdentifier = void 0;
|
|
4
|
+
function generateCustomActionIdentifier(actionEventName, customActionName, collectionName) {
|
|
5
|
+
return `custom:${collectionName}:${customActionName}:${actionEventName}`;
|
|
6
|
+
}
|
|
7
|
+
exports.generateCustomActionIdentifier = generateCustomActionIdentifier;
|
|
8
|
+
function generateCollectionActionIdentifier(action, collectionName) {
|
|
9
|
+
return `collection:${collectionName}:${action}`;
|
|
10
|
+
}
|
|
11
|
+
exports.generateCollectionActionIdentifier = generateCollectionActionIdentifier;
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtYWN0aW9uLWlkZW50aWZpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvZ2VuZXJhdGUtYWN0aW9uLWlkZW50aWZpZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsU0FBZ0IsOEJBQThCLENBQzVDLGVBQWtDLEVBQ2xDLGdCQUF3QixFQUN4QixjQUFzQjtJQUV0QixPQUFPLFVBQVUsY0FBYyxJQUFJLGdCQUFnQixJQUFJLGVBQWUsRUFBRSxDQUFDO0FBQzNFLENBQUM7QUFORCx3RUFNQztBQUVELFNBQWdCLGtDQUFrQyxDQUNoRCxNQUE2QixFQUM3QixjQUFzQjtJQUV0QixPQUFPLGNBQWMsY0FBYyxJQUFJLE1BQU0sRUFBRSxDQUFDO0FBQ2xELENBQUM7QUFMRCxnRkFLQyJ9
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { EnvironmentPermissionsV4, UserPermissionV4 } from './types';
|
|
2
|
+
export declare type ActionPermissions = {
|
|
3
|
+
everythingAllowed: boolean;
|
|
4
|
+
actionsGloballyAllowed: Set<string>;
|
|
5
|
+
actionsAllowedByUser: Map<string, Set<string>>;
|
|
6
|
+
};
|
|
7
|
+
export default function generateActionsFromPermissions(environmentPermissions: EnvironmentPermissionsV4, users: UserPermissionV4[]): ActionPermissions;
|
|
8
|
+
//# sourceMappingURL=generate-actions-from-permissions.d.ts.map
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const types_1 = require("./types");
|
|
4
|
+
const generate_action_identifier_1 = require("./generate-action-identifier");
|
|
5
|
+
function generateCollectionPermissions(permissions) {
|
|
6
|
+
return Object.entries(permissions).reduce((acc, [collectionId, collectionPermissions]) => {
|
|
7
|
+
const { collection } = collectionPermissions;
|
|
8
|
+
return {
|
|
9
|
+
...acc,
|
|
10
|
+
[(0, generate_action_identifier_1.generateCollectionActionIdentifier)(types_1.CollectionActionEvent.Browse, collectionId)]: collection.browseEnabled,
|
|
11
|
+
[(0, generate_action_identifier_1.generateCollectionActionIdentifier)(types_1.CollectionActionEvent.Read, collectionId)]: collection.readEnabled,
|
|
12
|
+
[(0, generate_action_identifier_1.generateCollectionActionIdentifier)(types_1.CollectionActionEvent.Edit, collectionId)]: collection.editEnabled,
|
|
13
|
+
[(0, generate_action_identifier_1.generateCollectionActionIdentifier)(types_1.CollectionActionEvent.Add, collectionId)]: collection.addEnabled,
|
|
14
|
+
[(0, generate_action_identifier_1.generateCollectionActionIdentifier)(types_1.CollectionActionEvent.Delete, collectionId)]: collection.deleteEnabled,
|
|
15
|
+
[(0, generate_action_identifier_1.generateCollectionActionIdentifier)(types_1.CollectionActionEvent.Export, collectionId)]: collection.exportEnabled,
|
|
16
|
+
};
|
|
17
|
+
}, {});
|
|
18
|
+
}
|
|
19
|
+
function generateCollectionActionPermission(collectionId, actions) {
|
|
20
|
+
return Object.entries(actions).reduce((acc, [actionName, actionPermissions]) => {
|
|
21
|
+
return {
|
|
22
|
+
...acc,
|
|
23
|
+
...{
|
|
24
|
+
[(0, generate_action_identifier_1.generateCustomActionIdentifier)(types_1.CustomActionEvent.Approve, actionName, collectionId)]: actionPermissions.userApprovalEnabled,
|
|
25
|
+
[(0, generate_action_identifier_1.generateCustomActionIdentifier)(types_1.CustomActionEvent.SelfApprove, actionName, collectionId)]: actionPermissions.selfApprovalEnabled,
|
|
26
|
+
[(0, generate_action_identifier_1.generateCustomActionIdentifier)(types_1.CustomActionEvent.Trigger, actionName, collectionId)]: actionPermissions.triggerEnabled,
|
|
27
|
+
[(0, generate_action_identifier_1.generateCustomActionIdentifier)(types_1.CustomActionEvent.RequireApproval, actionName, collectionId)]: actionPermissions.approvalRequired,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}, {});
|
|
31
|
+
}
|
|
32
|
+
function generateActionPermissions(permissions) {
|
|
33
|
+
return Object.entries(permissions).reduce((acc, [collectionId, collectionPermissions]) => {
|
|
34
|
+
const { actions } = collectionPermissions;
|
|
35
|
+
return {
|
|
36
|
+
...acc,
|
|
37
|
+
...generateCollectionActionPermission(collectionId, actions),
|
|
38
|
+
};
|
|
39
|
+
}, {});
|
|
40
|
+
}
|
|
41
|
+
function generateActionsGloballyAllowed(permissions) {
|
|
42
|
+
return new Set(Object.entries(permissions)
|
|
43
|
+
.filter(([, permission]) => permission === true)
|
|
44
|
+
.map(([action]) => action));
|
|
45
|
+
}
|
|
46
|
+
function getUsersForRoles(roles, userIdsByRole) {
|
|
47
|
+
return new Set(roles.reduce((acc, roleId) => {
|
|
48
|
+
const userIds = (userIdsByRole.get(roleId) || []).map(userId => `${userId}`);
|
|
49
|
+
if (userIds) {
|
|
50
|
+
return [...acc, ...userIds];
|
|
51
|
+
}
|
|
52
|
+
return acc;
|
|
53
|
+
}, []));
|
|
54
|
+
}
|
|
55
|
+
function generateActionsAllowedByUser(permissions, users) {
|
|
56
|
+
const userIdsByRole = users.reduce((acc, { id, roleId }) => {
|
|
57
|
+
acc.set(roleId, [...(acc.get(roleId) || []), id]);
|
|
58
|
+
return acc;
|
|
59
|
+
}, new Map());
|
|
60
|
+
return new Map(Object.entries(permissions)
|
|
61
|
+
.filter(([, permission]) => typeof permission !== 'boolean')
|
|
62
|
+
.map(([name, permission]) => [
|
|
63
|
+
name,
|
|
64
|
+
getUsersForRoles(permission.roles, userIdsByRole),
|
|
65
|
+
]));
|
|
66
|
+
}
|
|
67
|
+
function generateActionsFromPermissions(environmentPermissions, users) {
|
|
68
|
+
if (environmentPermissions === true) {
|
|
69
|
+
return {
|
|
70
|
+
everythingAllowed: true,
|
|
71
|
+
actionsGloballyAllowed: new Set(),
|
|
72
|
+
actionsAllowedByUser: new Map(),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const remotePermissions = environmentPermissions;
|
|
76
|
+
const allPermissions = {
|
|
77
|
+
...generateCollectionPermissions(remotePermissions.collections),
|
|
78
|
+
...generateActionPermissions(remotePermissions.collections),
|
|
79
|
+
};
|
|
80
|
+
return {
|
|
81
|
+
everythingAllowed: false,
|
|
82
|
+
actionsGloballyAllowed: generateActionsGloballyAllowed(allPermissions),
|
|
83
|
+
actionsAllowedByUser: generateActionsAllowedByUser(allPermissions, users),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
exports.default = generateActionsFromPermissions;
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtYWN0aW9ucy1mcm9tLXBlcm1pc3Npb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Blcm1pc3Npb25zL2dlbmVyYXRlLWFjdGlvbnMtZnJvbS1wZXJtaXNzaW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1DQVVpQjtBQUNqQiw2RUFHc0M7QUFZdEMsU0FBUyw2QkFBNkIsQ0FDcEMsV0FBZ0Q7SUFFaEQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksRUFBRSxxQkFBcUIsQ0FBQyxFQUFFLEVBQUU7UUFDdkYsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLHFCQUFxQixDQUFDO1FBRTdDLE9BQU87WUFDTCxHQUFHLEdBQUc7WUFDTixDQUFDLElBQUEsK0RBQWtDLEVBQUMsNkJBQXFCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQzlFLFVBQVUsQ0FBQyxhQUFhO1lBQzFCLENBQUMsSUFBQSwrREFBa0MsRUFBQyw2QkFBcUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsRUFDNUUsVUFBVSxDQUFDLFdBQVc7WUFDeEIsQ0FBQyxJQUFBLCtEQUFrQyxFQUFDLDZCQUFxQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUM1RSxVQUFVLENBQUMsV0FBVztZQUN4QixDQUFDLElBQUEsK0RBQWtDLEVBQUMsNkJBQXFCLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQzNFLFVBQVUsQ0FBQyxVQUFVO1lBQ3ZCLENBQUMsSUFBQSwrREFBa0MsRUFBQyw2QkFBcUIsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUMsRUFDOUUsVUFBVSxDQUFDLGFBQWE7WUFDMUIsQ0FBQyxJQUFBLCtEQUFrQyxFQUFDLDZCQUFxQixDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQyxF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
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GenericTree } from '@forestadmin/datasource-toolkit';
|
|
2
|
+
import { Team, UserPermissionV4 } from './types';
|
|
3
|
+
export default function generateUserScope(filter: GenericTree | null, team: Team, user: UserPermissionV4): GenericTree;
|
|
4
|
+
//# sourceMappingURL=generate-user-scope.d.ts.map
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const USER_VALUE_PREFIX = '$currentUser.';
|
|
4
|
+
const USER_VALUE_TAG_PREFIX = '$currentUser.tags.';
|
|
5
|
+
const USER_VALUE_TEAM_PREFIX = '$currentUser.team.';
|
|
6
|
+
function generateUserValue(value, team, user) {
|
|
7
|
+
if (typeof value !== 'string' || !value.startsWith(USER_VALUE_PREFIX)) {
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
if (value.startsWith(USER_VALUE_TEAM_PREFIX)) {
|
|
11
|
+
return team[value.slice(USER_VALUE_TEAM_PREFIX.length)];
|
|
12
|
+
}
|
|
13
|
+
if (value.startsWith(USER_VALUE_TAG_PREFIX)) {
|
|
14
|
+
return user?.tags?.[value.substring(USER_VALUE_TAG_PREFIX.length)];
|
|
15
|
+
}
|
|
16
|
+
return user?.[value.substring(USER_VALUE_PREFIX.length)];
|
|
17
|
+
}
|
|
18
|
+
function generateUserScope(filter, team, user) {
|
|
19
|
+
if (!filter) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const branch = filter;
|
|
23
|
+
if (branch.aggregator) {
|
|
24
|
+
return {
|
|
25
|
+
...filter,
|
|
26
|
+
conditions: branch.conditions.map(condition => generateUserScope(condition, team, user)),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const leaf = filter;
|
|
30
|
+
return {
|
|
31
|
+
...filter,
|
|
32
|
+
value: generateUserValue(leaf.value, team, user),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
exports.default = generateUserScope;
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUtdXNlci1zY29wZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wZXJtaXNzaW9ucy9nZW5lcmF0ZS11c2VyLXNjb3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUEsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLENBQUM7QUFDMUMsTUFBTSxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztBQUNuRCxNQUFNLHNCQUFzQixHQUFHLG9CQUFvQixDQUFDO0FBRXBELFNBQVMsaUJBQWlCLENBQUMsS0FBdUIsRUFBRSxJQUFVLEVBQUUsSUFBc0I7SUFDcEYsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEVBQUU7UUFDckUsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1FBQzVDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUN6RDtJQUVELElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO1FBQzNDLE9BQU8sSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUNwRTtJQUVELE9BQU8sSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxTQUF3QixpQkFBaUIsQ0FDdkMsTUFBMEIsRUFDMUIsSUFBVSxFQUNWLElBQXNCO0lBRXRCLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBMkIsQ0FBQztJQUUzQyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDckIsT0FBTztZQUNMLEdBQUcsTUFBTTtZQUNULFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDekYsQ0FBQztLQUNIO0lBRUQsTUFBTSxJQUFJLEdBQUcsTUFBeUIsQ0FBQztJQUV2QyxPQUFPO1FBQ0wsR0FBRyxNQUFNO1FBQ1QsS0FBSyxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQztLQUNqRCxDQUFDO0FBQ0osQ0FBQztBQXhCRCxvQ0F3QkMifQ==
|
|
@@ -0,0 +1,48 @@
|
|
|
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.hashChartRequest = exports.hashServerCharts = void 0;
|
|
7
|
+
const object_hash_1 = __importDefault(require("object-hash"));
|
|
8
|
+
const types_1 = require("./types");
|
|
9
|
+
function hashChart(chart) {
|
|
10
|
+
const hash = (0, object_hash_1.default)(chart, {
|
|
11
|
+
respectType: false,
|
|
12
|
+
excludeKeys: key => chart[key] === null || chart[key] === undefined,
|
|
13
|
+
});
|
|
14
|
+
return hash;
|
|
15
|
+
}
|
|
16
|
+
function hashServerCharts(charts) {
|
|
17
|
+
const frontendCharts = charts.map(chart => ({
|
|
18
|
+
type: chart.type,
|
|
19
|
+
filters: chart.filter,
|
|
20
|
+
aggregate: chart.aggregator,
|
|
21
|
+
aggregate_field: chart.aggregateFieldName,
|
|
22
|
+
collection: chart.sourceCollectionId,
|
|
23
|
+
time_range: chart.timeRange,
|
|
24
|
+
group_by_date_field: (chart.type === types_1.ChartType.Line && chart.groupByFieldName) || null,
|
|
25
|
+
group_by_field: (chart.type !== types_1.ChartType.Line && chart.groupByFieldName) || null,
|
|
26
|
+
limit: chart.limit,
|
|
27
|
+
label_field: chart.labelFieldName,
|
|
28
|
+
relationship_field: chart.relationshipFieldName,
|
|
29
|
+
query: chart.query,
|
|
30
|
+
}));
|
|
31
|
+
const hashes = frontendCharts.map(hashChart);
|
|
32
|
+
return new Set(hashes);
|
|
33
|
+
}
|
|
34
|
+
exports.hashServerCharts = hashServerCharts;
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
|
+
function hashChartRequest(chart) {
|
|
37
|
+
const hashed = {
|
|
38
|
+
...chart,
|
|
39
|
+
// When the server sends the data of the allowed charts, the target column is not specified
|
|
40
|
+
// for relations => allow them all.
|
|
41
|
+
...(chart?.group_by_field?.includes(':')
|
|
42
|
+
? { group_by_field: chart.group_by_field.substring(0, chart.group_by_field.indexOf(':')) }
|
|
43
|
+
: {}),
|
|
44
|
+
};
|
|
45
|
+
return hashChart(hashed);
|
|
46
|
+
}
|
|
47
|
+
exports.hashChartRequest = hashChartRequest;
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaC1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wZXJtaXNzaW9ucy9oYXNoLWNoYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhEQUFxQztBQUVyQyxtQ0FVaUI7QUFFakIsU0FBUyxTQUFTLENBQUMsS0FBOEI7SUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQkFBVSxFQUFDLEtBQUssRUFBRTtRQUM3QixXQUFXLEVBQUUsS0FBSztRQUNsQixXQUFXLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTO0tBQ3BFLENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQWdCLGdCQUFnQixDQUFDLE1BQWU7SUFDOUMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLE9BQU8sRUFBRyxLQUF5QixDQUFDLE1BQU07UUFDMUMsU0FBUyxFQUFHLEtBQXlCLENBQUMsVUFBVTtRQUNoRCxlQUFlLEVBQUcsS0FBeUIsQ0FBQyxrQkFBa0I7UUFDOUQsVUFBVSxFQUFHLEtBQXlCLENBQUMsa0JBQWtCO1FBQ3pELFVBQVUsRUFBRyxLQUFtQixDQUFDLFNBQVM7UUFDMUMsbUJBQW1CLEVBQ2pCLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxpQkFBUyxDQUFDLElBQUksSUFBSyxLQUFtQixDQUFDLGdCQUFnQixDQUFDLElBQUksSUFBSTtRQUNsRixjQUFjLEVBQ1osQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLGlCQUFTLENBQUMsSUFBSSxJQUFLLEtBQXdCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFJO1FBQ3ZGLEtBQUssRUFBRyxLQUEwQixDQUFDLEtBQUs7UUFDeEMsV0FBVyxFQUFHLEtBQTBCLENBQUMsY0FBYztRQUN2RCxrQkFBa0IsRUFBRyxLQUEwQixDQUFDLHFCQUFxQjtRQUNyRSxLQUFLLEVBQUcsS0FBb0IsQ0FBQyxLQUFLO0tBQ25DLENBQUMsQ0FBQyxDQUFDO0lBRUosTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUU3QyxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFyQkQsNENBcUJDO0FBRUQsOERBQThEO0FBQzlELFNBQWdCLGdCQUFnQixDQUFDLEtBQTBCO0lBQ3pELE1BQU0sTUFBTSxHQUFHO1FBQ2IsR0FBRyxLQUFLO1FBQ1IsMkZBQTJGO1FBQzNGLG1DQUFtQztRQUNuQyxHQUFHLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUMxRixDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ1IsQ0FBQztJQUVGLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFYRCw0Q0FXQyJ9
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
function isSegmentQueryAllowed(inputSegmentQuery, authorizedSegments) {
|
|
4
|
+
if (!authorizedSegments) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
// NOTICE: Handle UNION queries made by the FRONT to display available actions on details view
|
|
8
|
+
// NOTICE: This can only be used on related data (Has Many relationships) to detect available
|
|
9
|
+
// Smart Actions restricted to segment when a Smart Action is available on multiple SQL segments
|
|
10
|
+
const unionQueries = inputSegmentQuery.split('/*MULTI-SEGMENTS-QUERIES-UNION*/ UNION ');
|
|
11
|
+
if (unionQueries.length > 1) {
|
|
12
|
+
const authorizedQueries = new Set(authorizedSegments.map(segmentQuery => segmentQuery.replace(/;\s*/i, '').trim()));
|
|
13
|
+
return unionQueries.every((unionQuery) => authorizedQueries.has(unionQuery.trim()));
|
|
14
|
+
}
|
|
15
|
+
// NOTICE: Queries made by the FRONT to browse to an SQL segment
|
|
16
|
+
return authorizedSegments.some(segmentQuery => segmentQuery === inputSegmentQuery);
|
|
17
|
+
}
|
|
18
|
+
exports.default = isSegmentQueryAllowed;
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXMtc2VnbWVudC1xdWVyeS1hdXRob3JpemVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Blcm1pc3Npb25zL2lzLXNlZ21lbnQtcXVlcnktYXV0aG9yaXplZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLFNBQXdCLHFCQUFxQixDQUMzQyxpQkFBeUIsRUFDekIsa0JBQTRCO0lBRTVCLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtRQUN2QixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsOEZBQThGO0lBQzlGLDZGQUE2RjtJQUM3RixnR0FBZ0c7SUFDaEcsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFFeEYsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUMzQixNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUMvQixrQkFBa0IsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUNqRixDQUFDO1FBRUYsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsVUFBa0IsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDN0Y7SUFFRCxnRUFBZ0U7SUFDaEUsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEtBQUssaUJBQWlCLENBQUMsQ0FBQztBQUNyRixDQUFDO0FBdkJELHdDQXVCQyJ9
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { CollectionActionEvent } from './types';
|
|
2
|
+
import { PermissionService } from '../types';
|
|
3
|
+
import ActionPermission from './action-permission';
|
|
4
|
+
import RenderingPermissionService from './rendering-permission';
|
|
5
|
+
export default class PermissionServiceWithCache implements PermissionService {
|
|
6
|
+
private readonly actionPermissionService;
|
|
7
|
+
private readonly renderingPermissionService;
|
|
8
|
+
constructor(actionPermissionService: ActionPermission, renderingPermissionService: RenderingPermissionService);
|
|
9
|
+
canOnCollection({ userId, collectionName, event, }: {
|
|
10
|
+
userId: number;
|
|
11
|
+
event: CollectionActionEvent;
|
|
12
|
+
collectionName: string;
|
|
13
|
+
}): Promise<boolean>;
|
|
14
|
+
canExecuteSegmentQuery(params: {
|
|
15
|
+
userId: number;
|
|
16
|
+
collectionName: string;
|
|
17
|
+
renderingId: number;
|
|
18
|
+
segmentQuery: string;
|
|
19
|
+
}): Promise<boolean>;
|
|
20
|
+
canTriggerCustomAction({ userId, collectionName, customActionName, }: {
|
|
21
|
+
userId: number;
|
|
22
|
+
customActionName: string;
|
|
23
|
+
collectionName: string;
|
|
24
|
+
}): Promise<boolean>;
|
|
25
|
+
canApproveCustomAction({ userId, collectionName, customActionName, requesterId, }: {
|
|
26
|
+
userId: number;
|
|
27
|
+
customActionName: string;
|
|
28
|
+
collectionName: string;
|
|
29
|
+
requesterId: number;
|
|
30
|
+
}): Promise<boolean>;
|
|
31
|
+
canRequestCustomActionParameters({ userId, collectionName, customActionName, }: {
|
|
32
|
+
userId: number;
|
|
33
|
+
collectionName: string;
|
|
34
|
+
customActionName: string;
|
|
35
|
+
}): Promise<boolean>;
|
|
36
|
+
canRetrieveChart({ renderingId, userId, chartRequest, }: {
|
|
37
|
+
renderingId: number;
|
|
38
|
+
userId: number;
|
|
39
|
+
chartRequest: unknown;
|
|
40
|
+
}): Promise<boolean>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=permission-with-cache.d.ts.map
|