@webiny/api-aco 5.37.8 → 5.38.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/AcoApp.d.ts +4 -0
- package/apps/AcoApp.js +44 -5
- package/apps/AcoApp.js.map +1 -1
- package/apps/AcoApps.js +3 -1
- package/apps/app.gql.js +6 -4
- package/apps/app.gql.js.map +1 -1
- package/apps/index.js +3 -1
- package/createAcoContext.js +90 -15
- package/createAcoContext.js.map +1 -1
- package/createAcoGraphQL.js +5 -2
- package/createAcoGraphQL.js.map +1 -1
- package/createAcoHooks.js +9 -3
- package/createAcoHooks.js.map +1 -1
- package/createAcoModels.js +5 -2
- package/createAcoModels.js.map +1 -1
- package/createAcoStorageOperations.js +5 -2
- package/createAcoStorageOperations.js.map +1 -1
- package/fields/index.js +3 -1
- package/fields/location.js +3 -1
- package/filter/filter.crud.d.ts +3 -0
- package/filter/filter.crud.js +94 -0
- package/filter/filter.crud.js.map +1 -0
- package/filter/filter.gql.d.ts +3 -0
- package/filter/filter.gql.js +150 -0
- package/filter/filter.gql.js.map +1 -0
- package/filter/filter.model.d.ts +4 -0
- package/filter/filter.model.js +127 -0
- package/filter/filter.model.js.map +1 -0
- package/filter/filter.so.d.ts +3 -0
- package/filter/filter.so.js +96 -0
- package/filter/filter.so.js.map +1 -0
- package/filter/filter.types.d.ts +95 -0
- package/filter/filter.types.js +14 -0
- package/filter/filter.types.js.map +1 -0
- package/folder/folder.crud.d.ts +8 -1
- package/folder/folder.crud.js +197 -15
- package/folder/folder.crud.js.map +1 -1
- package/folder/folder.gql.js +75 -7
- package/folder/folder.gql.js.map +1 -1
- package/folder/folder.model.js +49 -3
- package/folder/folder.model.js.map +1 -1
- package/folder/folder.so.js +12 -4
- package/folder/folder.so.js.map +1 -1
- package/folder/folder.types.d.ts +23 -0
- package/folder/folder.types.js +3 -1
- package/folder/folder.types.js.map +1 -1
- package/folder/onFolderBeforeDeleteAco.hook.d.ts +2 -0
- package/folder/{onFolderBeforeDelete.hook.js → onFolderBeforeDeleteAco.hook.js} +8 -6
- package/folder/onFolderBeforeDeleteAco.hook.js.map +1 -0
- package/folder/onFolderBeforeDeleteFm.hook.d.ts +2 -0
- package/folder/onFolderBeforeDeleteFm.hook.js +49 -0
- package/folder/onFolderBeforeDeleteFm.hook.js.map +1 -0
- package/folder/onFolderBeforeDeleteHcms.hook.d.ts +2 -0
- package/folder/onFolderBeforeDeleteHcms.hook.js +56 -0
- package/folder/onFolderBeforeDeleteHcms.hook.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +12 -2
- package/index.js.map +1 -1
- package/package.json +25 -20
- package/plugins/AcoAppModifierPlugin.js +3 -1
- package/plugins/AcoAppRegisterPlugin.js +3 -1
- package/plugins/index.js +3 -1
- package/record/graphql/createAppResolvers.js +11 -9
- package/record/graphql/createAppResolvers.js.map +1 -1
- package/record/graphql/createAppSchema.js +3 -1
- package/record/record.crud.js +3 -1
- package/record/record.gql.js +3 -1
- package/record/record.model.js +3 -1
- package/record/record.so.js +3 -1
- package/record/record.types.d.ts +2 -1
- package/record/record.types.js +3 -1
- package/record/record.types.js.map +1 -1
- package/types.d.ts +19 -5
- package/types.js +16 -1
- package/types.js.map +1 -1
- package/utils/FolderLevelPermissions.d.ts +65 -0
- package/utils/FolderLevelPermissions.js +355 -0
- package/utils/FolderLevelPermissions.js.map +1 -0
- package/utils/acoRecordId.js +3 -1
- package/utils/createListSort.js +3 -1
- package/utils/createModelField.js +3 -1
- package/utils/createOperationsWrapper.js +3 -1
- package/utils/decorators/CmsEntriesCrudDecorators.d.ts +11 -0
- package/utils/decorators/CmsEntriesCrudDecorators.js +175 -0
- package/utils/decorators/CmsEntriesCrudDecorators.js.map +1 -0
- package/utils/ensureAuthentication.d.ts +2 -0
- package/utils/{checkPermissions.js → ensureAuthentication.js} +5 -3
- package/utils/ensureAuthentication.js.map +1 -0
- package/utils/fieldResolver.js +3 -1
- package/utils/getFieldValues.d.ts +2 -0
- package/utils/getFieldValues.js +9 -1
- package/utils/getFieldValues.js.map +1 -1
- package/utils/getFolderAndItsAncestors.d.ts +2 -2
- package/utils/getFolderAndItsAncestors.js +16 -11
- package/utils/getFolderAndItsAncestors.js.map +1 -1
- package/utils/isInstallationPending.js +3 -1
- package/utils/modelFactory.js +3 -1
- package/utils/resolve.js +3 -1
- package/folder/onFolderBeforeDelete.hook.d.ts +0 -2
- package/folder/onFolderBeforeDelete.hook.js.map +0 -1
- package/utils/checkPermissions.d.ts +0 -2
- package/utils/checkPermissions.js.map +0 -1
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.FolderLevelPermissions = void 0;
|
|
8
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
var _apiSecurity = require("@webiny/api-security");
|
|
11
|
+
var _structuredClone = _interopRequireDefault(require("@ungap/structured-clone"));
|
|
12
|
+
class FolderLevelPermissions {
|
|
13
|
+
constructor(params) {
|
|
14
|
+
(0, _defineProperty2.default)(this, "getIdentity", void 0);
|
|
15
|
+
(0, _defineProperty2.default)(this, "getIdentityTeam", void 0);
|
|
16
|
+
(0, _defineProperty2.default)(this, "listPermissions", void 0);
|
|
17
|
+
(0, _defineProperty2.default)(this, "listAllFoldersCallback", void 0);
|
|
18
|
+
(0, _defineProperty2.default)(this, "canUseTeams", void 0);
|
|
19
|
+
(0, _defineProperty2.default)(this, "canUseFolderLevelPermissions", void 0);
|
|
20
|
+
(0, _defineProperty2.default)(this, "allFolders", {});
|
|
21
|
+
this.getIdentity = params.getIdentity;
|
|
22
|
+
this.getIdentityTeam = params.getIdentityTeam;
|
|
23
|
+
this.listPermissions = params.listPermissions;
|
|
24
|
+
this.listAllFoldersCallback = params.listAllFolders;
|
|
25
|
+
this.canUseTeams = params.canUseTeams;
|
|
26
|
+
this.canUseFolderLevelPermissions = params.canUseFolderLevelPermissions;
|
|
27
|
+
}
|
|
28
|
+
async listAllFolders(folderType) {
|
|
29
|
+
if (folderType in this.allFolders) {
|
|
30
|
+
return (0, _structuredClone.default)(this.allFolders[folderType]);
|
|
31
|
+
}
|
|
32
|
+
this.allFolders[folderType] = await this.listAllFoldersCallback(folderType);
|
|
33
|
+
return (0, _structuredClone.default)(this.allFolders[folderType]);
|
|
34
|
+
}
|
|
35
|
+
async listAllFoldersWithPermissions(folderType) {
|
|
36
|
+
const folders = await this.listAllFolders(folderType);
|
|
37
|
+
|
|
38
|
+
// Filter folders based on permissions and assign permissions to each folder.
|
|
39
|
+
const filteredFoldersWithPermissions = await this.filterFolders({
|
|
40
|
+
folders,
|
|
41
|
+
rwd: "r"
|
|
42
|
+
});
|
|
43
|
+
await this.assignFolderPermissions(filteredFoldersWithPermissions);
|
|
44
|
+
return filteredFoldersWithPermissions;
|
|
45
|
+
}
|
|
46
|
+
invalidateCache(folderType) {
|
|
47
|
+
if (folderType) {
|
|
48
|
+
if (folderType in this.allFolders) {
|
|
49
|
+
delete this.allFolders[folderType];
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
this.allFolders = {};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async listFoldersPermissions(params) {
|
|
56
|
+
if (!this.canUseFolderLevelPermissions()) {
|
|
57
|
+
return [];
|
|
58
|
+
}
|
|
59
|
+
const {
|
|
60
|
+
folderType,
|
|
61
|
+
foldersList
|
|
62
|
+
} = params;
|
|
63
|
+
const allFolders = foldersList || (await this.listAllFolders(folderType));
|
|
64
|
+
const identity = this.getIdentity();
|
|
65
|
+
const permissions = await this.listPermissions();
|
|
66
|
+
const processedFolderPermissions = [];
|
|
67
|
+
let identityTeam;
|
|
68
|
+
if (this.canUseTeams()) {
|
|
69
|
+
identityTeam = await this.getIdentityTeam();
|
|
70
|
+
}
|
|
71
|
+
const processFolderPermissions = folder => {
|
|
72
|
+
var _folder$permissions;
|
|
73
|
+
if (processedFolderPermissions.some(fp => fp.folderId === folder.id)) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Copy permissions, so we don't modify the original object.
|
|
78
|
+
const currentFolderPermissions = {
|
|
79
|
+
folderId: folder.id,
|
|
80
|
+
// On new folders, permissions can be `null`. Guard against that.
|
|
81
|
+
permissions: ((_folder$permissions = folder.permissions) === null || _folder$permissions === void 0 ? void 0 : _folder$permissions.map(permission => (0, _objectSpread2.default)({}, permission))) || []
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// Check for permissions inherited from parent folder.
|
|
85
|
+
if (folder.parentId) {
|
|
86
|
+
const parentFolder = allFolders.find(f => f.id === folder.parentId);
|
|
87
|
+
if (parentFolder) {
|
|
88
|
+
// First check if the parent folder has already been processed.
|
|
89
|
+
let processedParentFolderPermissions = processedFolderPermissions.find(fp => fp.folderId === parentFolder.id);
|
|
90
|
+
|
|
91
|
+
// If not, process the parent folder.
|
|
92
|
+
if (!processedParentFolderPermissions) {
|
|
93
|
+
processFolderPermissions(parentFolder);
|
|
94
|
+
processedParentFolderPermissions = processedFolderPermissions.find(fp => fp.folderId === folder.parentId);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// If the parent folder has permissions, let's add them to the current folder.
|
|
98
|
+
if (processedParentFolderPermissions) {
|
|
99
|
+
const inheritedPermissions = processedParentFolderPermissions.permissions.map(p => {
|
|
100
|
+
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, p), {}, {
|
|
101
|
+
inheritedFrom: "parent:" + processedParentFolderPermissions.folderId
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
currentFolderPermissions.permissions.push(...inheritedPermissions);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Finally, let's also ensure that the current user is included in the permissions,
|
|
110
|
+
// if not already. Let's also ensure the user is the first item in the array.
|
|
111
|
+
const [firstPermission] = currentFolderPermissions.permissions;
|
|
112
|
+
let identityFirstPermission;
|
|
113
|
+
|
|
114
|
+
// If current identity is already listed as the first permission, we don't need to do anything.
|
|
115
|
+
if ((firstPermission === null || firstPermission === void 0 ? void 0 : firstPermission.target) === `admin:${identity.id}`) {
|
|
116
|
+
identityFirstPermission = firstPermission;
|
|
117
|
+
}
|
|
118
|
+
if (!identityFirstPermission) {
|
|
119
|
+
const currentIdentityPermissionIndex = currentFolderPermissions.permissions.findIndex(p => p.target === `admin:${identity.id}`);
|
|
120
|
+
if (currentIdentityPermissionIndex >= 0) {
|
|
121
|
+
const [identityPermission] = currentFolderPermissions.permissions.splice(currentIdentityPermissionIndex, 1);
|
|
122
|
+
currentFolderPermissions.permissions.unshift(identityPermission);
|
|
123
|
+
identityFirstPermission = identityPermission;
|
|
124
|
+
} else {
|
|
125
|
+
// If the current identity is not in the permissions, let's add it.
|
|
126
|
+
// If the user has full access, we'll add it as "owner".
|
|
127
|
+
const hasFullAccess = permissions.some(p => p.name === "*");
|
|
128
|
+
if (hasFullAccess) {
|
|
129
|
+
identityFirstPermission = {
|
|
130
|
+
target: `admin:${identity.id}`,
|
|
131
|
+
level: "owner",
|
|
132
|
+
inheritedFrom: "role:full-access"
|
|
133
|
+
};
|
|
134
|
+
currentFolderPermissions.permissions.unshift(identityFirstPermission);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Let's check if there is a team associated with the current identity.
|
|
140
|
+
if (!identityFirstPermission) {
|
|
141
|
+
if (identityTeam) {
|
|
142
|
+
const teamPermission = currentFolderPermissions.permissions.find(p => p.target === `team:${identityTeam.id}`);
|
|
143
|
+
if (teamPermission) {
|
|
144
|
+
identityFirstPermission = {
|
|
145
|
+
target: `admin:${identity.id}`,
|
|
146
|
+
level: teamPermission.level,
|
|
147
|
+
inheritedFrom: "team:" + identityTeam.id
|
|
148
|
+
};
|
|
149
|
+
currentFolderPermissions.permissions.unshift(identityFirstPermission);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
processedFolderPermissions.push(currentFolderPermissions);
|
|
154
|
+
};
|
|
155
|
+
for (let i = 0; i < allFolders.length; i++) {
|
|
156
|
+
const folder = allFolders[i];
|
|
157
|
+
processFolderPermissions(folder);
|
|
158
|
+
}
|
|
159
|
+
return processedFolderPermissions;
|
|
160
|
+
}
|
|
161
|
+
async getFolderPermissions(params) {
|
|
162
|
+
const {
|
|
163
|
+
folder,
|
|
164
|
+
foldersList
|
|
165
|
+
} = params;
|
|
166
|
+
const folderPermissionsList = await this.listFoldersPermissions({
|
|
167
|
+
folderType: folder.type,
|
|
168
|
+
foldersList
|
|
169
|
+
});
|
|
170
|
+
return folderPermissionsList.find(fp => fp.folderId === folder.id);
|
|
171
|
+
}
|
|
172
|
+
async canAccessFolder(params) {
|
|
173
|
+
var _folderPermissions$pe;
|
|
174
|
+
if (!this.canUseFolderLevelPermissions()) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
const {
|
|
178
|
+
folder
|
|
179
|
+
} = params;
|
|
180
|
+
|
|
181
|
+
// We check for parent folder access first because the passed folder should be
|
|
182
|
+
// inaccessible if the parent folder is inaccessible.
|
|
183
|
+
if (folder.parentId) {
|
|
184
|
+
let foldersList = params.foldersList;
|
|
185
|
+
if (!foldersList) {
|
|
186
|
+
foldersList = await this.listAllFolders(folder.type);
|
|
187
|
+
}
|
|
188
|
+
const parentFolder = foldersList.find(f => f.id === folder.parentId);
|
|
189
|
+
if (parentFolder) {
|
|
190
|
+
const canAccessParentFolder = await this.canAccessFolder((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
|
|
191
|
+
folder: parentFolder
|
|
192
|
+
}));
|
|
193
|
+
if (!canAccessParentFolder) {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
const folderPermissions = await this.getFolderPermissions({
|
|
199
|
+
folder,
|
|
200
|
+
foldersList: params.foldersList
|
|
201
|
+
});
|
|
202
|
+
const identity = this.getIdentity();
|
|
203
|
+
const userAccessLevel = folderPermissions === null || folderPermissions === void 0 || (_folderPermissions$pe = folderPermissions.permissions.find(p => p.target === "admin:" + identity.id)) === null || _folderPermissions$pe === void 0 ? void 0 : _folderPermissions$pe.level;
|
|
204
|
+
let teamAccessLevel;
|
|
205
|
+
if (this.canUseTeams()) {
|
|
206
|
+
const identityTeam = await this.getIdentityTeam();
|
|
207
|
+
if (identityTeam) {
|
|
208
|
+
var _folderPermissions$pe2;
|
|
209
|
+
teamAccessLevel = folderPermissions === null || folderPermissions === void 0 || (_folderPermissions$pe2 = folderPermissions.permissions.find(p => p.target === "team:" + identityTeam.id)) === null || _folderPermissions$pe2 === void 0 ? void 0 : _folderPermissions$pe2.level;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const accessLevels = [userAccessLevel, teamAccessLevel].filter(Boolean);
|
|
213
|
+
if (params.rwd !== "r") {
|
|
214
|
+
return accessLevels.includes("owner");
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// If we are here, it means we are checking for "read" access.
|
|
218
|
+
// For starters, let's check if the user has any access level.
|
|
219
|
+
if (accessLevels.length > 0) {
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// If the user doesn't have any access level, let's check if the folder has any permissions set.
|
|
224
|
+
// Folders that don't have any permissions set are considered "public".
|
|
225
|
+
const hasPermissions = folderPermissions && folderPermissions.permissions.length > 0;
|
|
226
|
+
if (!hasPermissions) {
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// No conditions were met, so we can return false.
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
async ensureCanAccessFolder(params) {
|
|
234
|
+
const canAccessFolder = await this.canAccessFolder(params);
|
|
235
|
+
if (!canAccessFolder) {
|
|
236
|
+
throw new _apiSecurity.NotAuthorizedError();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
canManageFolderPermissions(folder) {
|
|
240
|
+
if (!this.canUseFolderLevelPermissions()) {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
return this.canAccessFolder({
|
|
244
|
+
folder,
|
|
245
|
+
rwd: "w"
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
canManageFolderStructure(folder) {
|
|
249
|
+
if (!this.canUseFolderLevelPermissions()) {
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
return this.canAccessFolder({
|
|
253
|
+
folder,
|
|
254
|
+
rwd: "w"
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
async canAccessFolderContent(params) {
|
|
258
|
+
var _folderPermissions$pe3;
|
|
259
|
+
if (!this.canUseFolderLevelPermissions()) {
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
const {
|
|
263
|
+
folder,
|
|
264
|
+
foldersList
|
|
265
|
+
} = params;
|
|
266
|
+
const folderPermissions = await this.getFolderPermissions({
|
|
267
|
+
folder,
|
|
268
|
+
foldersList
|
|
269
|
+
});
|
|
270
|
+
const identity = this.getIdentity();
|
|
271
|
+
const userAccessLevel = folderPermissions === null || folderPermissions === void 0 || (_folderPermissions$pe3 = folderPermissions.permissions.find(p => p.target === "admin:" + identity.id)) === null || _folderPermissions$pe3 === void 0 ? void 0 : _folderPermissions$pe3.level;
|
|
272
|
+
let teamAccessLevel;
|
|
273
|
+
if (this.canUseTeams()) {
|
|
274
|
+
const identityTeam = await this.getIdentityTeam();
|
|
275
|
+
if (identityTeam) {
|
|
276
|
+
var _folderPermissions$pe4;
|
|
277
|
+
teamAccessLevel = folderPermissions === null || folderPermissions === void 0 || (_folderPermissions$pe4 = folderPermissions.permissions.find(p => p.target === "team:" + identityTeam.id)) === null || _folderPermissions$pe4 === void 0 ? void 0 : _folderPermissions$pe4.level;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
const accessLevels = [userAccessLevel, teamAccessLevel].filter(Boolean);
|
|
281
|
+
|
|
282
|
+
// If the user is not an owner and we're checking for "write" or
|
|
283
|
+
// "delete" access, then we can immediately return false.
|
|
284
|
+
if (params.rwd !== "r") {
|
|
285
|
+
return accessLevels.includes("owner") || accessLevels.includes("editor");
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// If we are here, it means we are checking for "read" access.
|
|
289
|
+
// For starters, let's check if the user has any access level.
|
|
290
|
+
if (accessLevels.length > 0) {
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// If the user doesn't have any access level, let's check if the folder has any permissions set.
|
|
295
|
+
// Folders that don't have any permissions set are considered "public".
|
|
296
|
+
const hasPermissions = folderPermissions && folderPermissions.permissions.length > 0;
|
|
297
|
+
if (!hasPermissions) {
|
|
298
|
+
return true;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// No conditions were met, so we can return false.
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
async ensureCanAccessFolderContent(params) {
|
|
305
|
+
const canAccessFolderContent = await this.canAccessFolderContent(params);
|
|
306
|
+
if (!canAccessFolderContent) {
|
|
307
|
+
throw new _apiSecurity.NotAuthorizedError();
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
async canCreateFolderInRoot() {
|
|
311
|
+
if (!this.canUseFolderLevelPermissions()) {
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
const permissions = await this.listPermissions();
|
|
315
|
+
return permissions.some(p => p.name === "*");
|
|
316
|
+
}
|
|
317
|
+
async filterFolders(params) {
|
|
318
|
+
const filteredFolders = [];
|
|
319
|
+
const {
|
|
320
|
+
folders,
|
|
321
|
+
rwd
|
|
322
|
+
} = params;
|
|
323
|
+
for (let i = 0; i < folders.length; i++) {
|
|
324
|
+
const folder = folders[i];
|
|
325
|
+
const canAccessFolder = await this.canAccessFolder({
|
|
326
|
+
folder,
|
|
327
|
+
rwd
|
|
328
|
+
});
|
|
329
|
+
if (canAccessFolder) {
|
|
330
|
+
filteredFolders.push(folder);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return filteredFolders;
|
|
334
|
+
}
|
|
335
|
+
async assignFolderPermissions(folder) {
|
|
336
|
+
const folders = Array.isArray(folder) ? folder : [folder];
|
|
337
|
+
for (let i = 0; i < folders.length; i++) {
|
|
338
|
+
const folder = folders[i];
|
|
339
|
+
const folderPermissions = await this.getFolderPermissions({
|
|
340
|
+
folder
|
|
341
|
+
});
|
|
342
|
+
if (folderPermissions) {
|
|
343
|
+
folder.permissions = folderPermissions.permissions;
|
|
344
|
+
} else {
|
|
345
|
+
folder.permissions = [];
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
permissionsIncludeNonInheritedPermissions(folderPermissionsList) {
|
|
350
|
+
return folderPermissionsList === null || folderPermissionsList === void 0 ? void 0 : folderPermissionsList.some(p => !p.inheritedFrom);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
exports.FolderLevelPermissions = FolderLevelPermissions;
|
|
354
|
+
|
|
355
|
+
//# sourceMappingURL=FolderLevelPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_apiSecurity","require","_structuredClone","_interopRequireDefault","FolderLevelPermissions","constructor","params","_defineProperty2","default","getIdentity","getIdentityTeam","listPermissions","listAllFoldersCallback","listAllFolders","canUseTeams","canUseFolderLevelPermissions","folderType","allFolders","structuredClone","listAllFoldersWithPermissions","folders","filteredFoldersWithPermissions","filterFolders","rwd","assignFolderPermissions","invalidateCache","listFoldersPermissions","foldersList","identity","permissions","processedFolderPermissions","identityTeam","processFolderPermissions","folder","_folder$permissions","some","fp","folderId","id","currentFolderPermissions","map","permission","_objectSpread2","parentId","parentFolder","find","f","processedParentFolderPermissions","inheritedPermissions","p","inheritedFrom","push","firstPermission","identityFirstPermission","target","currentIdentityPermissionIndex","findIndex","identityPermission","splice","unshift","hasFullAccess","name","level","teamPermission","i","length","getFolderPermissions","folderPermissionsList","type","canAccessFolder","_folderPermissions$pe","canAccessParentFolder","folderPermissions","userAccessLevel","teamAccessLevel","_folderPermissions$pe2","accessLevels","filter","Boolean","includes","hasPermissions","ensureCanAccessFolder","NotAuthorizedError","canManageFolderPermissions","canManageFolderStructure","canAccessFolderContent","_folderPermissions$pe3","_folderPermissions$pe4","ensureCanAccessFolderContent","canCreateFolderInRoot","filteredFolders","Array","isArray","permissionsIncludeNonInheritedPermissions","exports"],"sources":["FolderLevelPermissions.ts"],"sourcesContent":["import { Authentication } from \"@webiny/api-authentication/types\";\nimport { SecurityPermission, Team } from \"@webiny/api-security/types\";\nimport { Folder } from \"~/folder/folder.types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport structuredClone from \"@ungap/structured-clone\";\n\nexport type FolderAccessLevel = \"owner\" | \"viewer\" | \"editor\";\n\nexport interface FolderPermission {\n target: string;\n level: FolderAccessLevel;\n inheritedFrom?: string;\n}\n\nexport interface FolderPermissionsListItem {\n folderId: string;\n permissions: FolderPermission[];\n}\n\nexport type FolderPermissionsList = FolderPermissionsListItem[];\n\nexport interface CanAccessFolderParams {\n folder: Pick<Folder, \"id\" | \"type\" | \"parentId\">;\n rwd?: \"r\" | \"w\" | \"d\";\n foldersList?: Folder[];\n}\n\ninterface FilterFoldersParams {\n folders: Array<Folder>;\n rwd?: \"r\" | \"w\" | \"d\";\n}\n\ninterface GetFolderPermissionsParams {\n folder: Pick<Folder, \"id\" | \"type\">;\n foldersList?: Folder[];\n}\n\ninterface ListFolderPermissionsParams {\n folderType: string;\n foldersList?: Folder[];\n}\n\nexport interface FolderLevelPermissionsParams {\n getIdentity: Authentication[\"getIdentity\"];\n getIdentityTeam: () => Promise<Team | null>;\n listPermissions: () => Promise<SecurityPermission[]>;\n listAllFolders: (folderType: string) => Promise<Folder[]>;\n canUseTeams: () => boolean;\n canUseFolderLevelPermissions: () => boolean;\n}\n\nexport class FolderLevelPermissions {\n private readonly getIdentity: Authentication[\"getIdentity\"];\n private readonly getIdentityTeam: () => Promise<Team | null>;\n private readonly listPermissions: () => Promise<SecurityPermission[]>;\n private readonly listAllFoldersCallback: (folderType: string) => Promise<Folder[]>;\n private readonly canUseTeams: () => boolean;\n private readonly canUseFolderLevelPermissions: () => boolean;\n private allFolders: Record<string, Folder[]> = {};\n\n constructor(params: FolderLevelPermissionsParams) {\n this.getIdentity = params.getIdentity;\n this.getIdentityTeam = params.getIdentityTeam;\n this.listPermissions = params.listPermissions;\n this.listAllFoldersCallback = params.listAllFolders;\n this.canUseTeams = params.canUseTeams;\n this.canUseFolderLevelPermissions = params.canUseFolderLevelPermissions;\n }\n\n async listAllFolders(folderType: string): Promise<Folder[]> {\n if (folderType in this.allFolders) {\n return structuredClone(this.allFolders[folderType]);\n }\n\n this.allFolders[folderType] = await this.listAllFoldersCallback(folderType);\n return structuredClone(this.allFolders[folderType]);\n }\n\n async listAllFoldersWithPermissions(folderType: string) {\n const folders = await this.listAllFolders(folderType);\n\n // Filter folders based on permissions and assign permissions to each folder.\n const filteredFoldersWithPermissions = await this.filterFolders({\n folders,\n rwd: \"r\"\n });\n\n await this.assignFolderPermissions(filteredFoldersWithPermissions);\n\n return filteredFoldersWithPermissions;\n }\n\n invalidateCache(folderType?: string) {\n if (folderType) {\n if (folderType in this.allFolders) {\n delete this.allFolders[folderType];\n }\n } else {\n this.allFolders = {};\n }\n }\n\n async listFoldersPermissions(\n params: ListFolderPermissionsParams\n ): Promise<FolderPermissionsList> {\n if (!this.canUseFolderLevelPermissions()) {\n return [];\n }\n\n const { folderType, foldersList } = params;\n\n const allFolders = foldersList || (await this.listAllFolders(folderType));\n const identity = this.getIdentity();\n const permissions = await this.listPermissions();\n\n const processedFolderPermissions: FolderPermissionsListItem[] = [];\n\n let identityTeam: Team | null;\n if (this.canUseTeams()) {\n identityTeam = await this.getIdentityTeam();\n }\n\n const processFolderPermissions = (folder: Folder) => {\n if (processedFolderPermissions.some(fp => fp.folderId === folder.id)) {\n return;\n }\n\n // Copy permissions, so we don't modify the original object.\n const currentFolderPermissions: FolderPermissionsListItem = {\n folderId: folder.id,\n // On new folders, permissions can be `null`. Guard against that.\n permissions: folder.permissions?.map(permission => ({ ...permission })) || []\n };\n\n // Check for permissions inherited from parent folder.\n if (folder.parentId) {\n const parentFolder = allFolders!.find(f => f.id === folder.parentId)!;\n if (parentFolder) {\n // First check if the parent folder has already been processed.\n let processedParentFolderPermissions = processedFolderPermissions.find(\n fp => fp.folderId === parentFolder.id\n );\n\n // If not, process the parent folder.\n if (!processedParentFolderPermissions) {\n processFolderPermissions(parentFolder);\n processedParentFolderPermissions = processedFolderPermissions.find(\n fp => fp.folderId === folder.parentId\n );\n }\n\n // If the parent folder has permissions, let's add them to the current folder.\n if (processedParentFolderPermissions) {\n const inheritedPermissions =\n processedParentFolderPermissions.permissions.map(p => {\n return {\n ...p,\n inheritedFrom:\n \"parent:\" + processedParentFolderPermissions!.folderId\n };\n });\n\n currentFolderPermissions.permissions.push(...inheritedPermissions);\n }\n }\n }\n\n // Finally, let's also ensure that the current user is included in the permissions,\n // if not already. Let's also ensure the user is the first item in the array.\n const [firstPermission] = currentFolderPermissions.permissions;\n\n let identityFirstPermission: FolderPermission | undefined;\n\n // If current identity is already listed as the first permission, we don't need to do anything.\n if (firstPermission?.target === `admin:${identity.id}`) {\n identityFirstPermission = firstPermission;\n }\n\n if (!identityFirstPermission) {\n const currentIdentityPermissionIndex =\n currentFolderPermissions.permissions.findIndex(\n p => p.target === `admin:${identity.id}`\n );\n\n if (currentIdentityPermissionIndex >= 0) {\n const [identityPermission] = currentFolderPermissions.permissions.splice(\n currentIdentityPermissionIndex,\n 1\n );\n currentFolderPermissions.permissions.unshift(identityPermission);\n identityFirstPermission = identityPermission;\n } else {\n // If the current identity is not in the permissions, let's add it.\n // If the user has full access, we'll add it as \"owner\".\n const hasFullAccess = permissions.some(p => p.name === \"*\");\n if (hasFullAccess) {\n identityFirstPermission = {\n target: `admin:${identity.id}`,\n level: \"owner\",\n inheritedFrom: \"role:full-access\"\n };\n currentFolderPermissions.permissions.unshift(identityFirstPermission);\n }\n }\n }\n\n // Let's check if there is a team associated with the current identity.\n if (!identityFirstPermission) {\n if (identityTeam) {\n const teamPermission = currentFolderPermissions.permissions.find(\n p => p.target === `team:${identityTeam!.id}`\n );\n\n if (teamPermission) {\n identityFirstPermission = {\n target: `admin:${identity.id}`,\n level: teamPermission.level,\n inheritedFrom: \"team:\" + identityTeam!.id\n };\n\n currentFolderPermissions.permissions.unshift(identityFirstPermission);\n }\n }\n }\n\n processedFolderPermissions.push(currentFolderPermissions);\n };\n\n for (let i = 0; i < allFolders!.length; i++) {\n const folder = allFolders![i];\n processFolderPermissions(folder);\n }\n\n return processedFolderPermissions;\n }\n\n async getFolderPermissions(\n params: GetFolderPermissionsParams\n ): Promise<FolderPermissionsListItem | undefined> {\n const { folder, foldersList } = params;\n const folderPermissionsList = await this.listFoldersPermissions({\n folderType: folder.type,\n foldersList\n });\n\n return folderPermissionsList.find(fp => fp.folderId === folder.id);\n }\n\n async canAccessFolder(params: CanAccessFolderParams) {\n if (!this.canUseFolderLevelPermissions()) {\n return true;\n }\n\n const { folder } = params;\n\n // We check for parent folder access first because the passed folder should be\n // inaccessible if the parent folder is inaccessible.\n if (folder.parentId) {\n let foldersList = params.foldersList;\n if (!foldersList) {\n foldersList = await this.listAllFolders(folder.type);\n }\n\n const parentFolder = foldersList.find(f => f.id === folder.parentId);\n if (parentFolder) {\n const canAccessParentFolder = await this.canAccessFolder({\n ...params,\n folder: parentFolder\n });\n\n if (!canAccessParentFolder) {\n return false;\n }\n }\n }\n\n const folderPermissions = await this.getFolderPermissions({\n folder,\n foldersList: params.foldersList\n });\n\n const identity = this.getIdentity();\n\n const userAccessLevel = folderPermissions?.permissions.find(\n p => p.target === \"admin:\" + identity.id\n )?.level;\n\n let teamAccessLevel: FolderAccessLevel | undefined;\n\n if (this.canUseTeams()) {\n const identityTeam = await this.getIdentityTeam();\n if (identityTeam) {\n teamAccessLevel = folderPermissions?.permissions.find(\n p => p.target === \"team:\" + identityTeam.id\n )?.level;\n }\n }\n\n const accessLevels = [userAccessLevel, teamAccessLevel].filter(Boolean);\n\n if (params.rwd !== \"r\") {\n return accessLevels.includes(\"owner\");\n }\n\n // If we are here, it means we are checking for \"read\" access.\n // For starters, let's check if the user has any access level.\n if (accessLevels.length > 0) {\n return true;\n }\n\n // If the user doesn't have any access level, let's check if the folder has any permissions set.\n // Folders that don't have any permissions set are considered \"public\".\n const hasPermissions = folderPermissions && folderPermissions.permissions.length > 0;\n if (!hasPermissions) {\n return true;\n }\n\n // No conditions were met, so we can return false.\n return false;\n }\n\n async ensureCanAccessFolder(params: CanAccessFolderParams) {\n const canAccessFolder = await this.canAccessFolder(params);\n if (!canAccessFolder) {\n throw new NotAuthorizedError();\n }\n }\n\n canManageFolderPermissions(folder: Folder) {\n if (!this.canUseFolderLevelPermissions()) {\n return false;\n }\n\n return this.canAccessFolder({ folder, rwd: \"w\" });\n }\n\n canManageFolderStructure(folder: Folder) {\n if (!this.canUseFolderLevelPermissions()) {\n return true;\n }\n\n return this.canAccessFolder({ folder, rwd: \"w\" });\n }\n\n async canAccessFolderContent(params: CanAccessFolderParams) {\n if (!this.canUseFolderLevelPermissions()) {\n return true;\n }\n\n const { folder, foldersList } = params;\n\n const folderPermissions = await this.getFolderPermissions({\n folder,\n foldersList\n });\n\n const identity = this.getIdentity();\n\n const userAccessLevel = folderPermissions?.permissions.find(\n p => p.target === \"admin:\" + identity.id\n )?.level;\n\n let teamAccessLevel: FolderAccessLevel | undefined;\n if (this.canUseTeams()) {\n const identityTeam = await this.getIdentityTeam();\n if (identityTeam) {\n teamAccessLevel = folderPermissions?.permissions.find(\n p => p.target === \"team:\" + identityTeam.id\n )?.level;\n }\n }\n\n const accessLevels = [userAccessLevel, teamAccessLevel].filter(Boolean);\n\n // If the user is not an owner and we're checking for \"write\" or\n // \"delete\" access, then we can immediately return false.\n if (params.rwd !== \"r\") {\n return accessLevels.includes(\"owner\") || accessLevels.includes(\"editor\");\n }\n\n // If we are here, it means we are checking for \"read\" access.\n // For starters, let's check if the user has any access level.\n if (accessLevels.length > 0) {\n return true;\n }\n\n // If the user doesn't have any access level, let's check if the folder has any permissions set.\n // Folders that don't have any permissions set are considered \"public\".\n const hasPermissions = folderPermissions && folderPermissions.permissions.length > 0;\n if (!hasPermissions) {\n return true;\n }\n\n // No conditions were met, so we can return false.\n return false;\n }\n\n async ensureCanAccessFolderContent(params: CanAccessFolderParams) {\n const canAccessFolderContent = await this.canAccessFolderContent(params);\n if (!canAccessFolderContent) {\n throw new NotAuthorizedError();\n }\n }\n\n async canCreateFolderInRoot() {\n if (!this.canUseFolderLevelPermissions()) {\n return true;\n }\n\n const permissions = await this.listPermissions();\n return permissions.some(p => p.name === \"*\");\n }\n\n async filterFolders(params: FilterFoldersParams) {\n const filteredFolders: Folder[] = [];\n\n const { folders, rwd } = params;\n for (let i = 0; i < folders.length; i++) {\n const folder = folders[i];\n const canAccessFolder = await this.canAccessFolder({ folder, rwd });\n if (canAccessFolder) {\n filteredFolders.push(folder);\n }\n }\n\n return filteredFolders;\n }\n\n async assignFolderPermissions(folder: Folder | Folder[]) {\n const folders = Array.isArray(folder) ? folder : [folder];\n\n for (let i = 0; i < folders.length; i++) {\n const folder = folders[i];\n const folderPermissions = await this.getFolderPermissions({ folder });\n if (folderPermissions) {\n folder.permissions = folderPermissions.permissions;\n } else {\n folder.permissions = [];\n }\n }\n }\n\n permissionsIncludeNonInheritedPermissions(folderPermissionsList?: FolderPermission[]) {\n return folderPermissionsList?.some(p => !p.inheritedFrom);\n }\n}\n"],"mappings":"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"}
|
package/utils/acoRecordId.js
CHANGED
package/utils/createListSort.js
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AcoContext } from "../../types";
|
|
2
|
+
declare type Context = Pick<AcoContext, "aco" | "cms">;
|
|
3
|
+
interface EntryManagerCrudDecoratorsParams {
|
|
4
|
+
context: Context;
|
|
5
|
+
}
|
|
6
|
+
export declare class CmsEntriesCrudDecorators {
|
|
7
|
+
private readonly context;
|
|
8
|
+
constructor({ context }: EntryManagerCrudDecoratorsParams);
|
|
9
|
+
decorate(): void;
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.CmsEntriesCrudDecorators = void 0;
|
|
8
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
var _handlerGraphql = require("@webiny/handler-graphql");
|
|
11
|
+
const ROOT_FOLDER = "root";
|
|
12
|
+
const createFolderType = model => {
|
|
13
|
+
return `cms:${model.modelId}`;
|
|
14
|
+
};
|
|
15
|
+
const filterEntriesByFolderFactory = (context, permissions) => {
|
|
16
|
+
return async (model, entries) => {
|
|
17
|
+
const [folders] = await context.aco.folder.listAll({
|
|
18
|
+
where: {
|
|
19
|
+
type: createFolderType(model)
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
const results = await Promise.all(entries.map(async entry => {
|
|
23
|
+
var _entry$location;
|
|
24
|
+
const folderId = (_entry$location = entry.location) === null || _entry$location === void 0 ? void 0 : _entry$location.folderId;
|
|
25
|
+
if (!folderId || folderId === ROOT_FOLDER) {
|
|
26
|
+
return entry;
|
|
27
|
+
}
|
|
28
|
+
const folder = folders.find(folder => folder.id === folderId);
|
|
29
|
+
if (!folder) {
|
|
30
|
+
throw new _handlerGraphql.NotFoundError(`Folder "${folderId}" not found.`);
|
|
31
|
+
}
|
|
32
|
+
const result = await permissions.canAccessFolderContent({
|
|
33
|
+
folder,
|
|
34
|
+
rwd: "r"
|
|
35
|
+
});
|
|
36
|
+
return result ? entry : null;
|
|
37
|
+
}));
|
|
38
|
+
return results.filter(entry => !!entry);
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
class CmsEntriesCrudDecorators {
|
|
42
|
+
constructor({
|
|
43
|
+
context
|
|
44
|
+
}) {
|
|
45
|
+
(0, _defineProperty2.default)(this, "context", void 0);
|
|
46
|
+
this.context = context;
|
|
47
|
+
}
|
|
48
|
+
decorate() {
|
|
49
|
+
const context = this.context;
|
|
50
|
+
const folderLevelPermissions = context.aco.folderLevelPermissions;
|
|
51
|
+
const filterEntriesByFolder = filterEntriesByFolderFactory(context, folderLevelPermissions);
|
|
52
|
+
const originalCmsListEntries = context.cms.listEntries.bind(context.cms);
|
|
53
|
+
context.cms.listEntries = async (model, params) => {
|
|
54
|
+
const folderType = model.modelId === "fmFile" ? "FmFile" : `cms:${model.modelId}`;
|
|
55
|
+
const allFolders = await folderLevelPermissions.listAllFoldersWithPermissions(folderType);
|
|
56
|
+
return originalCmsListEntries(model, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
|
|
57
|
+
where: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, (params === null || params === void 0 ? void 0 : params.where) || {}), {}, {
|
|
58
|
+
wbyAco_location: {
|
|
59
|
+
// At the moment, all users can access entries in the root folder.
|
|
60
|
+
// Root folder level permissions cannot be set yet.
|
|
61
|
+
folderId_in: [ROOT_FOLDER, ...allFolders.map(folder => folder.id)]
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
}));
|
|
65
|
+
};
|
|
66
|
+
const originalCmsGetEntry = context.cms.getEntry.bind(context.cms);
|
|
67
|
+
context.cms.getEntry = async (model, params) => {
|
|
68
|
+
var _entry$location2;
|
|
69
|
+
const entry = await originalCmsGetEntry(model, params);
|
|
70
|
+
const folderId = entry === null || entry === void 0 || (_entry$location2 = entry.location) === null || _entry$location2 === void 0 ? void 0 : _entry$location2.folderId;
|
|
71
|
+
if (!folderId || folderId === ROOT_FOLDER) {
|
|
72
|
+
return entry;
|
|
73
|
+
}
|
|
74
|
+
const folder = await context.aco.folder.get(folderId);
|
|
75
|
+
await folderLevelPermissions.ensureCanAccessFolderContent({
|
|
76
|
+
folder,
|
|
77
|
+
rwd: "r"
|
|
78
|
+
});
|
|
79
|
+
return entry;
|
|
80
|
+
};
|
|
81
|
+
const originalCmsGetEntryById = context.cms.getEntryById.bind(context.cms);
|
|
82
|
+
context.cms.getEntryById = async (model, params) => {
|
|
83
|
+
var _entry$location3;
|
|
84
|
+
const entry = await originalCmsGetEntryById(model, params);
|
|
85
|
+
const folderId = entry === null || entry === void 0 || (_entry$location3 = entry.location) === null || _entry$location3 === void 0 ? void 0 : _entry$location3.folderId;
|
|
86
|
+
if (!folderId || folderId === ROOT_FOLDER) {
|
|
87
|
+
return entry;
|
|
88
|
+
}
|
|
89
|
+
const folder = await context.aco.folder.get(folderId);
|
|
90
|
+
await folderLevelPermissions.ensureCanAccessFolderContent({
|
|
91
|
+
folder,
|
|
92
|
+
rwd: "r"
|
|
93
|
+
});
|
|
94
|
+
return entry;
|
|
95
|
+
};
|
|
96
|
+
const originalGetLatestEntriesByIds = context.cms.getLatestEntriesByIds.bind(context.cms);
|
|
97
|
+
context.cms.getLatestEntriesByIds = async (model, ids) => {
|
|
98
|
+
const entries = await originalGetLatestEntriesByIds(model, ids);
|
|
99
|
+
return filterEntriesByFolder(model, entries);
|
|
100
|
+
};
|
|
101
|
+
const originalGetPublishedEntriesByIds = context.cms.getPublishedEntriesByIds.bind(context.cms);
|
|
102
|
+
context.cms.getPublishedEntriesByIds = async (model, ids) => {
|
|
103
|
+
const entries = await originalGetPublishedEntriesByIds(model, ids);
|
|
104
|
+
return filterEntriesByFolder(model, entries);
|
|
105
|
+
};
|
|
106
|
+
const originalCmsCreateEntry = context.cms.createEntry.bind(context.cms);
|
|
107
|
+
context.cms.createEntry = async (model, params) => {
|
|
108
|
+
var _params$wbyAco_locati, _params$location;
|
|
109
|
+
const folderId = ((_params$wbyAco_locati = params.wbyAco_location) === null || _params$wbyAco_locati === void 0 ? void 0 : _params$wbyAco_locati.folderId) || ((_params$location = params.location) === null || _params$location === void 0 ? void 0 : _params$location.folderId);
|
|
110
|
+
if (!folderId || folderId === ROOT_FOLDER) {
|
|
111
|
+
return originalCmsCreateEntry(model, params);
|
|
112
|
+
}
|
|
113
|
+
const folder = await context.aco.folder.get(folderId);
|
|
114
|
+
await folderLevelPermissions.ensureCanAccessFolderContent({
|
|
115
|
+
folder,
|
|
116
|
+
rwd: "w"
|
|
117
|
+
});
|
|
118
|
+
return originalCmsCreateEntry(model, params);
|
|
119
|
+
};
|
|
120
|
+
const originalCmsUpdateEntry = context.cms.updateEntry.bind(context.cms);
|
|
121
|
+
context.cms.updateEntry = async (model, id, input, meta) => {
|
|
122
|
+
var _entry$location4;
|
|
123
|
+
const entry = await context.cms.storageOperations.entries.getRevisionById(model, {
|
|
124
|
+
id
|
|
125
|
+
});
|
|
126
|
+
const folderId = entry === null || entry === void 0 || (_entry$location4 = entry.location) === null || _entry$location4 === void 0 ? void 0 : _entry$location4.folderId;
|
|
127
|
+
if (!folderId || folderId === ROOT_FOLDER) {
|
|
128
|
+
return originalCmsUpdateEntry(model, id, input, meta);
|
|
129
|
+
}
|
|
130
|
+
const folder = await context.aco.folder.get(folderId);
|
|
131
|
+
await folderLevelPermissions.ensureCanAccessFolderContent({
|
|
132
|
+
folder,
|
|
133
|
+
rwd: "w"
|
|
134
|
+
});
|
|
135
|
+
return originalCmsUpdateEntry(model, id, input, meta);
|
|
136
|
+
};
|
|
137
|
+
const originalCmsDeleteEntry = context.cms.deleteEntry.bind(context.cms);
|
|
138
|
+
context.cms.deleteEntry = async (model, id) => {
|
|
139
|
+
var _entry$location5;
|
|
140
|
+
const entry = await context.cms.storageOperations.entries.getRevisionById(model, {
|
|
141
|
+
id
|
|
142
|
+
});
|
|
143
|
+
const folderId = entry === null || entry === void 0 || (_entry$location5 = entry.location) === null || _entry$location5 === void 0 ? void 0 : _entry$location5.folderId;
|
|
144
|
+
if (!folderId || folderId === ROOT_FOLDER) {
|
|
145
|
+
return originalCmsDeleteEntry(model, id);
|
|
146
|
+
}
|
|
147
|
+
const folder = await context.aco.folder.get(folderId);
|
|
148
|
+
await folderLevelPermissions.ensureCanAccessFolderContent({
|
|
149
|
+
folder,
|
|
150
|
+
rwd: "d"
|
|
151
|
+
});
|
|
152
|
+
return originalCmsDeleteEntry(model, id);
|
|
153
|
+
};
|
|
154
|
+
const originalCmsDeleteEntryRevision = context.cms.deleteEntryRevision.bind(context.cms);
|
|
155
|
+
context.cms.deleteEntryRevision = async (model, id) => {
|
|
156
|
+
var _entry$location6;
|
|
157
|
+
const entry = await context.cms.storageOperations.entries.getRevisionById(model, {
|
|
158
|
+
id
|
|
159
|
+
});
|
|
160
|
+
const folderId = entry === null || entry === void 0 || (_entry$location6 = entry.location) === null || _entry$location6 === void 0 ? void 0 : _entry$location6.folderId;
|
|
161
|
+
if (!folderId || folderId === ROOT_FOLDER) {
|
|
162
|
+
return originalCmsDeleteEntryRevision(model, id);
|
|
163
|
+
}
|
|
164
|
+
const folder = await context.aco.folder.get(folderId);
|
|
165
|
+
await folderLevelPermissions.ensureCanAccessFolderContent({
|
|
166
|
+
folder,
|
|
167
|
+
rwd: "d"
|
|
168
|
+
});
|
|
169
|
+
return originalCmsDeleteEntryRevision(model, id);
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
exports.CmsEntriesCrudDecorators = CmsEntriesCrudDecorators;
|
|
174
|
+
|
|
175
|
+
//# sourceMappingURL=CmsEntriesCrudDecorators.js.map
|