@webiny/api-aco 5.37.8 → 5.38.0-beta.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.
Files changed (108) hide show
  1. package/apps/AcoApp.d.ts +4 -0
  2. package/apps/AcoApp.js +44 -5
  3. package/apps/AcoApp.js.map +1 -1
  4. package/apps/AcoApps.js +3 -1
  5. package/apps/app.gql.js +6 -4
  6. package/apps/app.gql.js.map +1 -1
  7. package/apps/index.js +3 -1
  8. package/createAcoContext.js +98 -15
  9. package/createAcoContext.js.map +1 -1
  10. package/createAcoGraphQL.js +5 -2
  11. package/createAcoGraphQL.js.map +1 -1
  12. package/createAcoHooks.js +9 -3
  13. package/createAcoHooks.js.map +1 -1
  14. package/createAcoModels.js +5 -2
  15. package/createAcoModels.js.map +1 -1
  16. package/createAcoStorageOperations.js +5 -2
  17. package/createAcoStorageOperations.js.map +1 -1
  18. package/fields/index.js +3 -1
  19. package/fields/location.js +3 -1
  20. package/filter/filter.crud.d.ts +3 -0
  21. package/filter/filter.crud.js +94 -0
  22. package/filter/filter.crud.js.map +1 -0
  23. package/filter/filter.gql.d.ts +3 -0
  24. package/filter/filter.gql.js +150 -0
  25. package/filter/filter.gql.js.map +1 -0
  26. package/filter/filter.model.d.ts +4 -0
  27. package/filter/filter.model.js +127 -0
  28. package/filter/filter.model.js.map +1 -0
  29. package/filter/filter.so.d.ts +3 -0
  30. package/filter/filter.so.js +96 -0
  31. package/filter/filter.so.js.map +1 -0
  32. package/filter/filter.types.d.ts +95 -0
  33. package/filter/filter.types.js +14 -0
  34. package/filter/filter.types.js.map +1 -0
  35. package/folder/folder.crud.d.ts +8 -1
  36. package/folder/folder.crud.js +197 -15
  37. package/folder/folder.crud.js.map +1 -1
  38. package/folder/folder.gql.js +75 -7
  39. package/folder/folder.gql.js.map +1 -1
  40. package/folder/folder.model.js +52 -3
  41. package/folder/folder.model.js.map +1 -1
  42. package/folder/folder.so.js +12 -4
  43. package/folder/folder.so.js.map +1 -1
  44. package/folder/folder.types.d.ts +23 -0
  45. package/folder/folder.types.js +3 -1
  46. package/folder/folder.types.js.map +1 -1
  47. package/folder/onFolderBeforeDeleteAco.hook.d.ts +2 -0
  48. package/folder/{onFolderBeforeDelete.hook.js → onFolderBeforeDeleteAco.hook.js} +8 -6
  49. package/folder/onFolderBeforeDeleteAco.hook.js.map +1 -0
  50. package/folder/onFolderBeforeDeleteFm.hook.d.ts +2 -0
  51. package/folder/onFolderBeforeDeleteFm.hook.js +49 -0
  52. package/folder/onFolderBeforeDeleteFm.hook.js.map +1 -0
  53. package/folder/onFolderBeforeDeleteHcms.hook.d.ts +2 -0
  54. package/folder/onFolderBeforeDeleteHcms.hook.js +56 -0
  55. package/folder/onFolderBeforeDeleteHcms.hook.js.map +1 -0
  56. package/index.d.ts +1 -0
  57. package/index.js +12 -2
  58. package/index.js.map +1 -1
  59. package/package.json +25 -20
  60. package/plugins/AcoAppModifierPlugin.js +3 -1
  61. package/plugins/AcoAppRegisterPlugin.js +3 -1
  62. package/plugins/index.js +3 -1
  63. package/record/graphql/createAppResolvers.js +11 -9
  64. package/record/graphql/createAppResolvers.js.map +1 -1
  65. package/record/graphql/createAppSchema.js +3 -1
  66. package/record/record.crud.js +3 -1
  67. package/record/record.gql.js +3 -1
  68. package/record/record.model.js +3 -1
  69. package/record/record.so.js +3 -1
  70. package/record/record.types.d.ts +2 -1
  71. package/record/record.types.js +3 -1
  72. package/record/record.types.js.map +1 -1
  73. package/types.d.ts +19 -5
  74. package/types.js +16 -1
  75. package/types.js.map +1 -1
  76. package/utils/FolderLevelPermissions.d.ts +68 -0
  77. package/utils/FolderLevelPermissions.js +370 -0
  78. package/utils/FolderLevelPermissions.js.map +1 -0
  79. package/utils/acoRecordId.js +3 -1
  80. package/utils/createListSort.js +3 -1
  81. package/utils/createModelField.js +3 -1
  82. package/utils/createOperationsWrapper.js +3 -1
  83. package/utils/decorators/CmsEntriesCrudDecorators.d.ts +11 -0
  84. package/utils/decorators/CmsEntriesCrudDecorators.js +244 -0
  85. package/utils/decorators/CmsEntriesCrudDecorators.js.map +1 -0
  86. package/utils/decorators/constants.d.ts +1 -0
  87. package/utils/decorators/constants.js +10 -0
  88. package/utils/decorators/constants.js.map +1 -0
  89. package/utils/decorators/where.d.ts +14 -0
  90. package/utils/decorators/where.js +45 -0
  91. package/utils/decorators/where.js.map +1 -0
  92. package/utils/ensureAuthentication.d.ts +2 -0
  93. package/utils/{checkPermissions.js → ensureAuthentication.js} +5 -3
  94. package/utils/ensureAuthentication.js.map +1 -0
  95. package/utils/fieldResolver.js +3 -1
  96. package/utils/getFieldValues.d.ts +2 -0
  97. package/utils/getFieldValues.js +9 -1
  98. package/utils/getFieldValues.js.map +1 -1
  99. package/utils/getFolderAndItsAncestors.d.ts +2 -2
  100. package/utils/getFolderAndItsAncestors.js +16 -11
  101. package/utils/getFolderAndItsAncestors.js.map +1 -1
  102. package/utils/isInstallationPending.js +3 -1
  103. package/utils/modelFactory.js +3 -1
  104. package/utils/resolve.js +3 -1
  105. package/folder/onFolderBeforeDelete.hook.d.ts +0 -2
  106. package/folder/onFolderBeforeDelete.hook.js.map +0 -1
  107. package/utils/checkPermissions.d.ts +0 -2
  108. package/utils/checkPermissions.js.map +0 -1
@@ -0,0 +1,370 @@
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
+ let identityTeam;
67
+ if (this.canUseTeams()) {
68
+ identityTeam = await this.getIdentityTeam();
69
+ }
70
+ const processedFolderPermissions = [];
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 isPublicParentFolder = processedParentFolderPermissions.permissions.some(p => p.level === "public");
100
+
101
+ // We inherit parent permissions if:
102
+ // 1. the parent folder is not public or...
103
+ // 2. ...the parent folder is public, but the current folder doesn't have any permissions set
104
+ const mustInherit = !isPublicParentFolder || currentFolderPermissions.permissions.length === 0;
105
+ if (mustInherit) {
106
+ const inheritedPermissions = processedParentFolderPermissions.permissions.map(p => {
107
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, p), {}, {
108
+ inheritedFrom: "parent:" + processedParentFolderPermissions.folderId
109
+ });
110
+ });
111
+ currentFolderPermissions.permissions.push(...inheritedPermissions);
112
+ }
113
+ }
114
+ }
115
+ }
116
+
117
+ // Let's ensure current identity's permission is included in the permissions array.
118
+ // We first check if the current identity is already included in the permissions array.
119
+ // If not, we check if the user has full access or if the team user belongs to has access.
120
+ const currentIdentityIncludedInPermissions = currentFolderPermissions.permissions.some(p => p.target === `admin:${identity.id}`);
121
+ if (currentIdentityIncludedInPermissions) {
122
+ // Ensure existing identity permission is always the first one in the array.
123
+ const currentIdentityPermissionIndex = currentFolderPermissions.permissions.findIndex(p => p.target === `admin:${identity.id}`);
124
+ if (currentIdentityPermissionIndex > 0) {
125
+ const [currentIdentityPermission] = currentFolderPermissions.permissions.splice(currentIdentityPermissionIndex, 1);
126
+ currentFolderPermissions.permissions.unshift(currentIdentityPermission);
127
+ }
128
+ } else {
129
+ // Current identity not included in permissions? Let's add it.
130
+ let currentIdentityPermission = null;
131
+
132
+ // 1. Check if the user has full access.
133
+ const hasFullAccess = permissions.some(p => p.name === "*");
134
+ if (hasFullAccess) {
135
+ currentIdentityPermission = {
136
+ target: `admin:${identity.id}`,
137
+ level: "owner",
138
+ inheritedFrom: "role:full-access"
139
+ };
140
+ } else if (identityTeam) {
141
+ // 2. Check the team user belongs to grants access to the folder.
142
+ const teamPermission = currentFolderPermissions.permissions.find(p => p.target === `team:${identityTeam.id}`);
143
+ if (teamPermission) {
144
+ currentIdentityPermission = {
145
+ target: `admin:${identity.id}`,
146
+ level: teamPermission.level,
147
+ inheritedFrom: "team:" + identityTeam.id
148
+ };
149
+ }
150
+ }
151
+ if (currentIdentityPermission) {
152
+ // If permission is found, let's add it to the beginning of the array.
153
+ // We're doing this just because it looks nicer in the UI.
154
+ currentFolderPermissions.permissions.unshift(currentIdentityPermission);
155
+ }
156
+ }
157
+
158
+ // Note that this can only happen with root folders. All other (child) folders will
159
+ // always have at least one permission (inherited from parent).
160
+ const mustAddPublicPermission = currentFolderPermissions.permissions.length === 0;
161
+ if (mustAddPublicPermission) {
162
+ currentFolderPermissions.permissions = [{
163
+ target: `admin:${identity.id}`,
164
+ level: "public",
165
+ inheritedFrom: "public"
166
+ }];
167
+ }
168
+ processedFolderPermissions.push(currentFolderPermissions);
169
+ };
170
+ for (let i = 0; i < allFolders.length; i++) {
171
+ const folder = allFolders[i];
172
+ processFolderPermissions(folder);
173
+ }
174
+ return processedFolderPermissions;
175
+ }
176
+ async getFolderPermissions(params) {
177
+ const {
178
+ folder,
179
+ foldersList
180
+ } = params;
181
+ const folderPermissionsList = await this.listFoldersPermissions({
182
+ folderType: folder.type,
183
+ foldersList
184
+ });
185
+ return folderPermissionsList.find(fp => fp.folderId === folder.id);
186
+ }
187
+ async canAccessFolder(params) {
188
+ var _folderPermissions$pe;
189
+ if (!this.canUseFolderLevelPermissions()) {
190
+ return true;
191
+ }
192
+ if (params.managePermissions && params.rwd !== "w") {
193
+ throw new Error(`Cannot check for "managePermissions" access without "w" access.`);
194
+ }
195
+ const {
196
+ folder
197
+ } = params;
198
+
199
+ // We check for parent folder access first because the passed folder should be
200
+ // inaccessible if the parent folder is inaccessible.
201
+ if (folder.parentId) {
202
+ let foldersList = params.foldersList;
203
+ if (!foldersList) {
204
+ foldersList = await this.listAllFolders(folder.type);
205
+ }
206
+ const parentFolder = foldersList.find(f => f.id === folder.parentId);
207
+ if (parentFolder) {
208
+ const canAccessParentFolder = await this.canAccessFolder((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
209
+ folder: parentFolder
210
+ }));
211
+ if (!canAccessParentFolder) {
212
+ return false;
213
+ }
214
+ }
215
+ }
216
+ const folderPermissions = await this.getFolderPermissions({
217
+ folder,
218
+ foldersList: params.foldersList
219
+ });
220
+
221
+ // If dealing with a public folder, we only care if we're checking for "managePermissions" access.
222
+ // If we are, we can return false, because public folders cannot have permissions managed.
223
+ const isPublicFolder = folderPermissions === null || folderPermissions === void 0 ? void 0 : folderPermissions.permissions.some(p => p.level === "public");
224
+ if (isPublicFolder) {
225
+ return !params.managePermissions;
226
+ }
227
+ const identity = this.getIdentity();
228
+ 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;
229
+ let teamAccessLevel;
230
+ if (this.canUseTeams()) {
231
+ const identityTeam = await this.getIdentityTeam();
232
+ if (identityTeam) {
233
+ var _folderPermissions$pe2;
234
+ 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;
235
+ }
236
+ }
237
+ const accessLevels = [userAccessLevel, teamAccessLevel].filter(Boolean);
238
+ if (params.rwd !== "r") {
239
+ return accessLevels.includes("owner");
240
+ }
241
+
242
+ // If we are here, it means we are checking for "read" access.
243
+ // For starters, let's check if the user has any access level.
244
+ if (accessLevels.length > 0) {
245
+ return true;
246
+ }
247
+
248
+ // No conditions were met, so we can return false.
249
+ return false;
250
+ }
251
+ async ensureCanAccessFolder(params) {
252
+ const canAccessFolder = await this.canAccessFolder(params);
253
+ if (!canAccessFolder) {
254
+ throw new _apiSecurity.NotAuthorizedError();
255
+ }
256
+ }
257
+ canManageFolderPermissions(folder) {
258
+ if (!this.canUseFolderLevelPermissions()) {
259
+ return false;
260
+ }
261
+ return this.canAccessFolder({
262
+ folder,
263
+ rwd: "w",
264
+ managePermissions: true
265
+ });
266
+ }
267
+ canManageFolderStructure(folder) {
268
+ if (!this.canUseFolderLevelPermissions()) {
269
+ return true;
270
+ }
271
+ return this.canAccessFolder({
272
+ folder,
273
+ rwd: "w"
274
+ });
275
+ }
276
+ async canAccessFolderContent(params) {
277
+ var _folderPermissions$pe3;
278
+ if (!this.canUseFolderLevelPermissions()) {
279
+ return true;
280
+ }
281
+ const {
282
+ folder,
283
+ foldersList
284
+ } = params;
285
+ const folderPermissions = await this.getFolderPermissions({
286
+ folder,
287
+ foldersList
288
+ });
289
+
290
+ // If dealing with a public folder, we only care if we're checking for "managePermissions" access.
291
+ // If we are, we can return false, because public folders cannot have permissions managed.
292
+ const isPublicFolder = folderPermissions === null || folderPermissions === void 0 ? void 0 : folderPermissions.permissions.some(p => p.level === "public");
293
+ if (isPublicFolder) {
294
+ return true;
295
+ }
296
+ const identity = this.getIdentity();
297
+ 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;
298
+ let teamAccessLevel;
299
+ if (this.canUseTeams()) {
300
+ const identityTeam = await this.getIdentityTeam();
301
+ if (identityTeam) {
302
+ var _folderPermissions$pe4;
303
+ 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;
304
+ }
305
+ }
306
+ const accessLevels = [userAccessLevel, teamAccessLevel].filter(Boolean);
307
+
308
+ // If the user is not an owner and we're checking for "write" or
309
+ // "delete" access, then we can immediately return false.
310
+ if (params.rwd !== "r") {
311
+ return accessLevels.includes("owner") || accessLevels.includes("editor");
312
+ }
313
+
314
+ // If we are here, it means we are checking for "read" access.
315
+ // For starters, let's check if the user has any access level.
316
+ if (accessLevels.length > 0) {
317
+ return true;
318
+ }
319
+
320
+ // No conditions were met, so we can return false.
321
+ return false;
322
+ }
323
+ async ensureCanAccessFolderContent(params) {
324
+ const canAccessFolderContent = await this.canAccessFolderContent(params);
325
+ if (!canAccessFolderContent) {
326
+ throw new _apiSecurity.NotAuthorizedError();
327
+ }
328
+ }
329
+ async canCreateFolderInRoot() {
330
+ return true;
331
+ }
332
+ async filterFolders(params) {
333
+ const filteredFolders = [];
334
+ const {
335
+ folders,
336
+ rwd
337
+ } = params;
338
+ for (let i = 0; i < folders.length; i++) {
339
+ const folder = folders[i];
340
+ const canAccessFolder = await this.canAccessFolder({
341
+ folder,
342
+ rwd
343
+ });
344
+ if (canAccessFolder) {
345
+ filteredFolders.push(folder);
346
+ }
347
+ }
348
+ return filteredFolders;
349
+ }
350
+ async assignFolderPermissions(folder) {
351
+ const folders = Array.isArray(folder) ? folder : [folder];
352
+ for (let i = 0; i < folders.length; i++) {
353
+ const folder = folders[i];
354
+ const folderPermissions = await this.getFolderPermissions({
355
+ folder
356
+ });
357
+ if (folderPermissions) {
358
+ folder.permissions = folderPermissions.permissions;
359
+ } else {
360
+ folder.permissions = [];
361
+ }
362
+ }
363
+ }
364
+ permissionsIncludeNonInheritedPermissions(folderPermissionsList) {
365
+ return folderPermissionsList === null || folderPermissionsList === void 0 ? void 0 : folderPermissionsList.some(p => !p.inheritedFrom);
366
+ }
367
+ }
368
+ exports.FolderLevelPermissions = FolderLevelPermissions;
369
+
370
+ //# 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","identityTeam","processedFolderPermissions","processFolderPermissions","folder","_folder$permissions","some","fp","folderId","id","currentFolderPermissions","map","permission","_objectSpread2","parentId","parentFolder","find","f","processedParentFolderPermissions","isPublicParentFolder","p","level","mustInherit","length","inheritedPermissions","inheritedFrom","push","currentIdentityIncludedInPermissions","target","currentIdentityPermissionIndex","findIndex","currentIdentityPermission","splice","unshift","hasFullAccess","name","teamPermission","mustAddPublicPermission","i","getFolderPermissions","folderPermissionsList","type","canAccessFolder","_folderPermissions$pe","managePermissions","Error","canAccessParentFolder","folderPermissions","isPublicFolder","userAccessLevel","teamAccessLevel","_folderPermissions$pe2","accessLevels","filter","Boolean","includes","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\" | \"public\";\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 CanAccessFolderContentParams {\n folder: Pick<Folder, \"id\" | \"type\" | \"parentId\">;\n rwd?: \"r\" | \"w\" | \"d\";\n foldersList?: Folder[];\n}\n\nexport interface CanAccessFolderParams extends CanAccessFolderContentParams {\n managePermissions?: boolean;\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 let identityTeam: Team | null;\n if (this.canUseTeams()) {\n identityTeam = await this.getIdentityTeam();\n }\n\n const processedFolderPermissions: FolderPermissionsListItem[] = [];\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 isPublicParentFolder =\n processedParentFolderPermissions.permissions.some(\n p => p.level === \"public\"\n );\n\n // We inherit parent permissions if:\n // 1. the parent folder is not public or...\n // 2. ...the parent folder is public, but the current folder doesn't have any permissions set\n const mustInherit =\n !isPublicParentFolder ||\n currentFolderPermissions.permissions.length === 0;\n\n if (mustInherit) {\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\n // Let's ensure current identity's permission is included in the permissions array.\n // We first check if the current identity is already included in the permissions array.\n // If not, we check if the user has full access or if the team user belongs to has access.\n const currentIdentityIncludedInPermissions = currentFolderPermissions.permissions.some(\n p => p.target === `admin:${identity.id}`\n );\n\n if (currentIdentityIncludedInPermissions) {\n // Ensure existing identity permission is always the first one in the array.\n const currentIdentityPermissionIndex =\n currentFolderPermissions.permissions.findIndex(\n p => p.target === `admin:${identity.id}`\n );\n\n if (currentIdentityPermissionIndex > 0) {\n const [currentIdentityPermission] = currentFolderPermissions.permissions.splice(\n currentIdentityPermissionIndex,\n 1\n );\n currentFolderPermissions.permissions.unshift(currentIdentityPermission);\n }\n } else {\n // Current identity not included in permissions? Let's add it.\n let currentIdentityPermission: FolderPermission | null = null;\n\n // 1. Check if the user has full access.\n const hasFullAccess = permissions.some(p => p.name === \"*\");\n if (hasFullAccess) {\n currentIdentityPermission = {\n target: `admin:${identity.id}`,\n level: \"owner\",\n inheritedFrom: \"role:full-access\"\n };\n } else if (identityTeam) {\n // 2. Check the team user belongs to grants access to the folder.\n const teamPermission = currentFolderPermissions.permissions.find(\n p => p.target === `team:${identityTeam!.id}`\n );\n\n if (teamPermission) {\n currentIdentityPermission = {\n target: `admin:${identity.id}`,\n level: teamPermission.level,\n inheritedFrom: \"team:\" + identityTeam!.id\n };\n }\n }\n\n if (currentIdentityPermission) {\n // If permission is found, let's add it to the beginning of the array.\n // We're doing this just because it looks nicer in the UI.\n currentFolderPermissions.permissions.unshift(currentIdentityPermission);\n }\n }\n\n // Note that this can only happen with root folders. All other (child) folders will\n // always have at least one permission (inherited from parent).\n const mustAddPublicPermission = currentFolderPermissions.permissions.length === 0;\n if (mustAddPublicPermission) {\n currentFolderPermissions.permissions = [\n {\n target: `admin:${identity.id}`,\n level: \"public\",\n inheritedFrom: \"public\"\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 if (params.managePermissions && params.rwd !== \"w\") {\n throw new Error(`Cannot check for \"managePermissions\" access without \"w\" access.`);\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 // If dealing with a public folder, we only care if we're checking for \"managePermissions\" access.\n // If we are, we can return false, because public folders cannot have permissions managed.\n const isPublicFolder = folderPermissions?.permissions.some(p => p.level === \"public\");\n if (isPublicFolder) {\n return !params.managePermissions;\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 // 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\", managePermissions: true });\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: CanAccessFolderContentParams) {\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 // If dealing with a public folder, we only care if we're checking for \"managePermissions\" access.\n // If we are, we can return false, because public folders cannot have permissions managed.\n const isPublicFolder = folderPermissions?.permissions.some(p => p.level === \"public\");\n if (isPublicFolder) {\n return true;\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 // No conditions were met, so we can return false.\n return false;\n }\n\n async ensureCanAccessFolderContent(params: CanAccessFolderContentParams) {\n const canAccessFolderContent = await this.canAccessFolderContent(params);\n if (!canAccessFolderContent) {\n throw new NotAuthorizedError();\n }\n }\n\n async canCreateFolderInRoot() {\n return true;\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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"}
@@ -30,4 +30,6 @@ const removeAcoRecordPrefix = id => {
30
30
  }
31
31
  return id.substring(WBY_ACO_PREFIX.length);
32
32
  };
33
- exports.removeAcoRecordPrefix = removeAcoRecordPrefix;
33
+ exports.removeAcoRecordPrefix = removeAcoRecordPrefix;
34
+
35
+ //# sourceMappingURL=acoRecordId.js.map
@@ -10,4 +10,6 @@ const createListSort = sort => {
10
10
  }
11
11
  return Object.keys(sort).map(key => `${key}_${sort[key]}`);
12
12
  };
13
- exports.createListSort = createListSort;
13
+ exports.createListSort = createListSort;
14
+
15
+ //# sourceMappingURL=createListSort.js.map
@@ -34,4 +34,6 @@ const createModelField = params => {
34
34
  predefinedValues
35
35
  };
36
36
  };
37
- exports.createModelField = createModelField;
37
+ exports.createModelField = createModelField;
38
+
39
+ //# sourceMappingURL=createModelField.js.map
@@ -26,4 +26,6 @@ const createOperationsWrapper = params => {
26
26
  withModel
27
27
  };
28
28
  };
29
- exports.createOperationsWrapper = createOperationsWrapper;
29
+ exports.createOperationsWrapper = createOperationsWrapper;
30
+
31
+ //# sourceMappingURL=createOperationsWrapper.js.map
@@ -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 {};