passbolt-browser-extension 5.12.1 → 5.13.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.
Files changed (198) hide show
  1. package/.devcontainer/safe-chain-config.json +2 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +30 -22
  3. package/.github/ISSUE_TEMPLATE/config.yml +11 -0
  4. package/.jpmignore +0 -1
  5. package/CHANGELOG.md +82 -1
  6. package/CONTRIBUTING.md +1 -12
  7. package/README.md +5 -16
  8. package/RELEASE_NOTES.md +2 -3
  9. package/SECURITY.md +7 -0
  10. package/i18next.config.js +28 -0
  11. package/jest.config.json +1 -0
  12. package/package.json +20 -40
  13. package/src/all/background_page/controller/accountRecovery/reviewRequestController.test.js +1 -1
  14. package/src/all/background_page/{event → controller/actionLog}/findAllForActionLogController.js +1 -1
  15. package/src/all/background_page/{event → controller/actionLog}/findAllForActionLogController.test.js +4 -4
  16. package/src/all/background_page/controller/export/exportResourcesFileController.test.js +7 -2
  17. package/src/all/background_page/controller/folder/folderCreateController.js +3 -1
  18. package/src/all/background_page/controller/group/findMyGroupsController.test.js +2 -2
  19. package/src/all/background_page/controller/group/getOrFindGroupsController.js +61 -0
  20. package/src/all/background_page/controller/group/getOrFindGroupsController.test.js +69 -0
  21. package/src/all/background_page/controller/group/getOrFindGroupsUsersController.js +62 -0
  22. package/src/all/background_page/controller/group/getOrFindGroupsUsersController.test.js +69 -0
  23. package/src/all/background_page/controller/group/groupCreateController.js +1 -1
  24. package/src/all/background_page/controller/group/groupCreateController.test.js +1 -1
  25. package/src/all/background_page/controller/group/groupUpdateController.js +1 -1
  26. package/src/all/background_page/controller/group/updateAllGroupsLocalStorageController.test.js +1 -1
  27. package/src/all/background_page/controller/keyring/synchroniseKeyringController.js +51 -0
  28. package/src/all/background_page/controller/keyring/synchroniseKeyringController.test.js +49 -0
  29. package/src/all/background_page/controller/metadata/shareMetadataKeyPrivateController.test.js +1 -1
  30. package/src/all/background_page/controller/move/moveFolderController.js +0 -2
  31. package/src/all/background_page/controller/permission/FindAcoPermissionsForDisplayController.js +1 -1
  32. package/src/all/background_page/controller/permission/FindAcoPermissionsForDisplayController.test.js +2 -2
  33. package/src/all/background_page/controller/resource/findAllByIdsForDisplayPermissionsController.test.js +8 -3
  34. package/src/all/background_page/controller/resource/findAllIdsByIsSharedWithGroupController.test.js +9 -4
  35. package/src/all/background_page/controller/resource/resourceUpdateController.test.js +1 -2
  36. package/src/all/background_page/controller/resourceLocalStorage/resourceUpdateLocalStorageController.test.js +5 -2
  37. package/src/all/background_page/controller/share/findFoldersForShareController.js +66 -0
  38. package/src/all/background_page/controller/share/findFoldersForShareController.test.js +70 -0
  39. package/src/all/background_page/controller/share/searchUsersAndGroupsController.js +4 -4
  40. package/src/all/background_page/controller/share/searchUsersAndGroupsController.test.js +8 -23
  41. package/src/all/background_page/controller/share/shareResourcesController.test.js +2 -2
  42. package/src/all/background_page/controller/subscription/createSubscriptionKeyController.js +63 -0
  43. package/src/all/background_page/controller/subscription/createSubscriptionKeyController.test.js +56 -0
  44. package/src/all/background_page/controller/subscription/deleteSubscriptionKeyController.js +55 -0
  45. package/src/all/background_page/controller/subscription/deleteSubscriptionKeyController.test.js +50 -0
  46. package/src/all/background_page/controller/user/deleteUserController.test.js +1 -1
  47. package/src/all/background_page/controller/user/getOrFindUsersController.js +61 -0
  48. package/src/all/background_page/controller/user/getOrFindUsersController.test.js +69 -0
  49. package/src/all/background_page/error/deleteDryRunError.js +1 -1
  50. package/src/all/background_page/event/actionLogEvents.js +1 -1
  51. package/src/all/background_page/event/appEvents.js +25 -0
  52. package/src/all/background_page/event/groupEvents.js +26 -0
  53. package/src/all/background_page/event/keyringEvents.js +12 -0
  54. package/src/all/background_page/event/shareEvents.js +3 -9
  55. package/src/all/background_page/event/userEvents.js +13 -0
  56. package/src/all/background_page/model/config.js +12 -2
  57. package/src/all/background_page/model/entity/folder/folderEntity.js +2 -2
  58. package/src/all/background_page/model/entity/folder/folderEntity.test.js +2 -2
  59. package/src/all/background_page/model/entity/folder/foldersCollection.test.js +1 -1
  60. package/src/all/background_page/model/entity/group/update/groupUpdateEntity.js +1 -1
  61. package/src/all/background_page/model/entity/group/update/groupUpdateEntity.test.js +1 -1
  62. package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionEntity.js +2 -2
  63. package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionEntity.test.data.js +1 -1
  64. package/src/all/background_page/model/entity/permission/change/permissionChangeEntity.js +1 -1
  65. package/src/all/background_page/model/entity/permission/change/permissionChangesCollection.js +2 -2
  66. package/src/all/background_page/model/entity/permission/change/permissionChangesCollection.test.js +2 -2
  67. package/src/all/background_page/model/entity/resource/resourceEntity.js +2 -2
  68. package/src/all/background_page/model/entity/resource/resourceEntity.test.js +1 -1
  69. package/src/all/background_page/model/entity/user/userEntity.js +16 -377
  70. package/src/all/background_page/model/entity/user/userEntity.test.js +22 -297
  71. package/src/all/background_page/model/entity/userAndGroupSearchResultEntity/userAndGroupSearchResultEntity.js +1 -1
  72. package/src/all/background_page/model/folder/folderModel.js +5 -154
  73. package/src/all/background_page/model/group/groupModel.js +1 -1
  74. package/src/all/background_page/model/keyring.js +52 -17
  75. package/src/all/background_page/model/keyring.test.js +110 -0
  76. package/src/all/background_page/model/resource/resourceModel.js +2 -55
  77. package/src/all/background_page/model/setup/setupModel.js +2 -2
  78. package/src/all/background_page/model/user/userModel.js +18 -15
  79. package/src/all/background_page/model/user/userModel.test.js +1 -3
  80. package/src/all/background_page/service/api/abstract/abstractService.js +3 -17
  81. package/src/all/background_page/service/api/edition/passboltEditionApiService.js +64 -0
  82. package/src/all/background_page/service/api/edition/passboltEditionApiService.test.js +99 -0
  83. package/src/all/background_page/service/api/group/groupApiService.js +22 -23
  84. package/src/all/background_page/service/api/group/groupApiService.test.js +70 -0
  85. package/src/all/background_page/service/api/resource/resourceService.js +18 -12
  86. package/src/all/background_page/service/api/share/{shareService.js → shareApiService.js} +10 -7
  87. package/src/all/background_page/service/api/share/{shareService.test.js → shareApiService.test.js} +5 -5
  88. package/src/all/background_page/service/group/createGroupService.js +1 -1
  89. package/src/all/background_page/service/group/createGroupService.test.js +1 -1
  90. package/src/all/background_page/service/group/findAndUpdateGroupsLocalStorageService.js +56 -1
  91. package/src/all/background_page/service/group/findAndUpdateGroupsLocalStorageService.test.js +84 -2
  92. package/src/all/background_page/service/group/findGroupsService.js +5 -9
  93. package/src/all/background_page/service/group/findGroupsService.test.data.js +1 -1
  94. package/src/all/background_page/service/group/findGroupsService.test.js +10 -15
  95. package/src/all/background_page/service/group/getOrFindGroupsService.js +65 -0
  96. package/src/all/background_page/service/group/getOrFindGroupsService.test.js +168 -0
  97. package/src/all/background_page/service/group/getOrFindGroupsUsersService.js +51 -0
  98. package/src/all/background_page/service/group/getOrFindGroupsUsersService.test.js +94 -0
  99. package/src/all/background_page/service/group/groupUpdateService.js +5 -3
  100. package/src/all/background_page/service/group/groupUpdateService.test.js +10 -2
  101. package/src/all/background_page/service/local_storage/groupLocalStorage.js +2 -2
  102. package/src/all/background_page/service/local_storage/groupLocalStorage.test.js +3 -3
  103. package/src/all/background_page/service/local_storage/userLocalStorage.js +57 -36
  104. package/src/all/background_page/service/local_storage/userLocalStorage.test.js +282 -0
  105. package/src/all/background_page/service/metadata/createMetadataKeyService.test.js +1 -1
  106. package/src/all/background_page/service/metadata/saveMetadataSettingsService.test.js +1 -1
  107. package/src/all/background_page/service/metadata/shareMetadataKeyPrivateService.test.js +1 -1
  108. package/src/all/background_page/service/migrateMetadata/migrateMetadataResourcesService.js +1 -1
  109. package/src/all/background_page/service/move/calculatePermissionsChangesForMoveService.js +113 -0
  110. package/src/all/background_page/service/move/calculatePermissionsChangesForMoveService.test.data.js +38 -0
  111. package/src/all/background_page/service/move/calculatePermissionsChangesForMoveService.test.js +158 -0
  112. package/src/all/background_page/service/move/moveOneFolderService.js +6 -7
  113. package/src/all/background_page/service/move/moveOneFolderService.test.js +90 -90
  114. package/src/all/background_page/service/move/moveResourcesService.js +2 -5
  115. package/src/all/background_page/service/permission/findPermissionsService.js +1 -1
  116. package/src/all/background_page/service/resource/create/resourceCreateService.js +13 -31
  117. package/src/all/background_page/service/resource/create/resourceCreateService.test.js +25 -18
  118. package/src/all/background_page/service/resource/export/exportResourcesService.test.js +13 -4
  119. package/src/all/background_page/service/resource/findAndUpdateResourcesLocalStorageService.test.js +35 -28
  120. package/src/all/background_page/service/resource/findResourcesService.js +78 -2
  121. package/src/all/background_page/service/resource/findResourcesService.test.data.js +1 -1
  122. package/src/all/background_page/service/resource/findResourcesService.test.js +90 -31
  123. package/src/all/background_page/service/resource/getOrFindResourcesService.test.js +18 -8
  124. package/src/all/background_page/service/session_storage/keepSessionAliveService.js +3 -3
  125. package/src/all/background_page/service/session_storage/keepSessionAliveService.test.js +5 -3
  126. package/src/all/background_page/service/share/searchUsersAndGroupsService.js +41 -0
  127. package/src/all/background_page/service/share/searchUsersAndGroupsService.test.js +64 -0
  128. package/src/all/background_page/service/share/shareFoldersService.js +3 -3
  129. package/src/all/background_page/service/share/shareFoldersService.test.js +3 -3
  130. package/src/all/background_page/service/share/shareResourceService.js +4 -4
  131. package/src/all/background_page/service/share/shareResourceService.test.js +8 -8
  132. package/src/all/background_page/service/subscription/createSubscriptionKeyService.js +57 -0
  133. package/src/all/background_page/service/subscription/createSubscriptionKeyService.test.js +111 -0
  134. package/src/all/background_page/service/subscription/deleteSubscriptionKeyService.js +35 -0
  135. package/src/all/background_page/service/subscription/deleteSubscriptionKeyService.test.js +55 -0
  136. package/src/all/background_page/service/user/deleteUserService.js +4 -4
  137. package/src/all/background_page/service/user/deleteUserService.test.js +10 -10
  138. package/src/all/background_page/service/user/findAndUpdateUsersLocalStorageService.js +81 -0
  139. package/src/all/background_page/service/user/findAndUpdateUsersLocalStorageService.test.js +132 -0
  140. package/src/all/background_page/service/user/findUsersService.js +6 -6
  141. package/src/all/background_page/service/user/findUsersService.test.js +39 -38
  142. package/src/all/background_page/service/user/getOrFindUsersService.js +60 -0
  143. package/src/all/background_page/service/user/getOrFindUsersService.test.js +110 -0
  144. package/src/all/background_page/utils/assertions.js +1 -0
  145. package/src/all/locales/ko-KR/common.json +1 -1
  146. package/src/chrome/manifest.json +1 -1
  147. package/src/chrome-mv3/manifest.json +1 -1
  148. package/src/firefox/manifest.json +3 -3
  149. package/src/safari/manifest.json +2 -2
  150. package/test/jest.env-setup.js +31 -0
  151. package/webpack/applyOutputClean.js +69 -0
  152. package/webpack/base.config.js +33 -0
  153. package/webpack/common-blocks.js +91 -0
  154. package/webpack/expectedBuildArtifacts.js +51 -0
  155. package/webpack/i18nextExtractionPlugin.js +43 -0
  156. package/webpack/passboltEnvPlugin.js +41 -0
  157. package/webpack/webExtPlugin/index.js +75 -0
  158. package/webpack.chromium-mv2.config.js +40 -0
  159. package/webpack.chromium-mv3.config.js +40 -0
  160. package/webpack.common.config.js +186 -0
  161. package/webpack.config.js +38 -0
  162. package/webpack.firefox.config.js +40 -0
  163. package/webpack.mv2.config.js +65 -0
  164. package/webpack.mv3.config.js +99 -0
  165. package/webpack.safari-background-page.config.js +66 -57
  166. package/webpack.safari.config.js +44 -0
  167. package/Gruntfile.js +0 -471
  168. package/am_i_compromised.py +0 -1036
  169. package/am_i_compromised.sh +0 -688
  170. package/i18next-parser.config.js +0 -22
  171. package/src/all/background_page/config/config.json +0 -7
  172. package/src/all/background_page/config/config.json.debug +0 -7
  173. package/src/all/background_page/config/config.json.default +0 -7
  174. package/src/all/background_page/model/entity/group/groupEntity.js +0 -241
  175. package/src/all/background_page/model/entity/group/groupEntity.test.js +0 -136
  176. package/src/all/background_page/model/entity/group/groupsCollection.js +0 -166
  177. package/src/all/background_page/model/entity/group/groupsCollection.test.data.js +0 -34
  178. package/src/all/background_page/model/entity/group/groupsCollection.test.js +0 -227
  179. package/src/all/background_page/model/entity/permission/permissionEntity.js +0 -485
  180. package/src/all/background_page/model/entity/permission/permissionEntity.test.js +0 -263
  181. package/src/all/background_page/model/entity/permission/permissionsCollection.js +0 -486
  182. package/src/all/background_page/model/entity/permission/permissionsCollection.test.js +0 -700
  183. package/src/all/background_page/model/entity/user/usersCollection.js +0 -147
  184. package/src/all/background_page/model/entity/user/usersCollection.test.js +0 -223
  185. package/src/all/background_page/model/share/shareModel.js +0 -183
  186. package/src/all/background_page/model/share/shareModel.test.js +0 -61
  187. package/src/all/background_page/service/api/user/userService.js +0 -260
  188. package/src/all/background_page/service/resource/create/resourceCreateService.test.data.js +0 -55
  189. package/webpack-content-scripts.browser-integration.config.js +0 -57
  190. package/webpack-content-scripts.config.js +0 -61
  191. package/webpack-content-scripts.public-website-sign-in.config.js +0 -57
  192. package/webpack-data.config.js +0 -102
  193. package/webpack-data.download.config.js +0 -59
  194. package/webpack-data.in-form-call-to-action.config.js +0 -97
  195. package/webpack-data.in-form-menu.config.js +0 -97
  196. package/webpack-offscreens.config.js +0 -55
  197. package/webpack.background-page.config.js +0 -62
  198. package/webpack.service-worker.config.js +0 -65
@@ -1,227 +0,0 @@
1
- /**
2
- * Passbolt ~ Open source password manager for teams
3
- * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
- *
5
- * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
- * For full copyright and license information, please see the LICENSE.txt
7
- * Redistributions of files must retain the above copyright notice.
8
- *
9
- * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
- * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
- * @link https://www.passbolt.com Passbolt(tm)
12
- * @since 3.0.4
13
- */
14
- import EntitySchema from "passbolt-styleguide/src/shared/models/entity/abstract/entitySchema";
15
- import GroupsCollection from "./groupsCollection";
16
- import { defaultGroupDto } from "passbolt-styleguide/src/shared/models/entity/group/groupEntity.test.data";
17
- import { defaultGroupUser } from "passbolt-styleguide/src/shared/models/entity/groupUser/groupUserEntity.test.data.js";
18
- import GroupEntity from "./groupEntity";
19
- import { defaultGroupsDtos } from "./groupsCollection.test.data";
20
-
21
- describe("GroupsCollection", () => {
22
- it("schema must validate", () => {
23
- EntitySchema.validateSchema(GroupsCollection.ENTITY_NAME, GroupsCollection.getSchema());
24
- });
25
-
26
- describe("GroupsCollection::constructor", () => {
27
- it("works with empty collection", () => {
28
- new GroupsCollection([]);
29
- });
30
-
31
- it("works if valid minimal DTO is provided", () => {
32
- const dto1 = defaultGroupDto({ name: "group1" });
33
- const dto2 = defaultGroupDto({ name: "group2" });
34
- const dto3 = defaultGroupDto({ name: "group3" });
35
- const dtos = [dto1, dto2, dto3];
36
- const collection = new GroupsCollection(dtos);
37
-
38
- expect.assertions(10);
39
- expect(collection.items).toHaveLength(3);
40
- expect(collection.items[0]).toBeInstanceOf(GroupEntity);
41
- expect(collection.items[0]._props.id).toEqual(dto1.id);
42
- expect(collection.items[0]._props.name).toEqual(dto1.name);
43
- expect(collection.items[1]).toBeInstanceOf(GroupEntity);
44
- expect(collection.items[1]._props.id).toEqual(dto2.id);
45
- expect(collection.items[1]._props.name).toEqual(dto2.name);
46
- expect(collection.items[2]).toBeInstanceOf(GroupEntity);
47
- expect(collection.items[2]._props.id).toEqual(dto3.id);
48
- expect(collection.items[2]._props.name).toEqual(dto3.name);
49
- });
50
-
51
- it("works if valid group entities are provided", () => {
52
- const entity1 = new GroupEntity(defaultGroupDto({ name: "group1" }));
53
- const entity2 = new GroupEntity(defaultGroupDto({ name: "group2" }));
54
- const entities = [entity1, entity2];
55
- const collection = new GroupsCollection(entities);
56
-
57
- expect.assertions(5);
58
- expect(collection.items).toHaveLength(2);
59
- expect(collection.items[0]).toBeInstanceOf(GroupEntity);
60
- expect(collection.items[0]._props.name).toEqual(entity1.name);
61
- expect(collection.items[1]).toBeInstanceOf(GroupEntity);
62
- expect(collection.items[1]._props.name).toEqual(entity2.name);
63
- });
64
-
65
- it("works if valid maximum DTO is provided", () => {
66
- const dto1 = defaultGroupDto({ name: "group1" }, { withGroupsUsers: true });
67
- const dto2 = defaultGroupDto({ name: "group2" }, { withGroupsUsers: true });
68
- const dto3 = defaultGroupDto({ name: "group3" }, { withGroupsUsers: true });
69
- const dtos = [dto1, dto2, dto3];
70
- const collection = new GroupsCollection(dtos);
71
-
72
- expect.assertions(13);
73
- expect(collection.items).toHaveLength(3);
74
- expect(collection.items[0]._props.id).toEqual(dto1.id);
75
- expect(collection.items[0]._props.name).toEqual(dto1.name);
76
- expect(collection.items[0]._groups_users).toHaveLength(1);
77
- expect(collection.items[0]._groups_users.items[0].id).toEqual(dto1.groups_users[0].id);
78
- expect(collection.items[1]._props.id).toEqual(dto2.id);
79
- expect(collection.items[1]._props.name).toEqual(dto2.name);
80
- expect(collection.items[1]._groups_users).toHaveLength(1);
81
- expect(collection.items[1]._groups_users.items[0].id).toEqual(dto2.groups_users[0].id);
82
- expect(collection.items[2]._props.id).toEqual(dto3.id);
83
- expect(collection.items[2]._props.name).toEqual(dto3.name);
84
- expect(collection.items[2]._groups_users).toHaveLength(1);
85
- expect(collection.items[2]._groups_users.items[0].id).toEqual(dto3.groups_users[0].id);
86
- });
87
-
88
- it("should throw if the collection schema does not validate", () => {
89
- expect.assertions(1);
90
- expect(() => new GroupsCollection({})).toThrowEntityValidationError("items");
91
- });
92
-
93
- it("should throw if one of data item does not validate the collection entity schema", () => {
94
- const dto1 = defaultGroupDto();
95
- const dto2 = defaultGroupDto({ name: 42 });
96
-
97
- expect.assertions(1);
98
- expect(() => new GroupsCollection([dto1, dto2])).toThrowCollectionValidationError("1.name.type");
99
- });
100
-
101
- /*
102
- * @todo Associated entities validation error details to review when collection will aggregate them.
103
- * @see EntityV2Collection.pushMany
104
- */
105
- it("should throw if one of item has an associated item that does not validate the collection associated entity schema", () => {
106
- const dto1 = defaultGroupDto();
107
- const dto2 = defaultGroupDto({
108
- name: "group 2",
109
- groups_users: [defaultGroupUser({ group_id: 42, is_admin: true })],
110
- });
111
-
112
- expect.assertions(2);
113
- // Should not throw
114
- expect(() => new GroupsCollection([dto1, dto2])).toThrowCollectionValidationError("1.0.group_id.type");
115
- // Should throw
116
- expect(() => new GroupsCollection([dto1, dto2])).not.toThrowCollectionValidationError(
117
- "1.groups_users.0.group_id.type",
118
- );
119
- });
120
-
121
- it("should throw if one of data item does not validate the unique id build rule", () => {
122
- const dto1 = defaultGroupDto();
123
- const dto2 = defaultGroupDto({ name: "group 1" });
124
- const dto3 = defaultGroupDto({ id: dto2.id, name: "group 2" });
125
-
126
- expect.assertions(1);
127
- expect(() => new GroupsCollection([dto1, dto2, dto3])).toThrowCollectionValidationError("2.id.unique");
128
- });
129
-
130
- it("should throw if one of data item does not validate the unique name build rule", () => {
131
- const dto1 = defaultGroupDto();
132
- const dto2 = defaultGroupDto({ name: "group 1" });
133
- const dto3 = defaultGroupDto({ name: "group 1" });
134
-
135
- expect.assertions(1);
136
- expect(() => new GroupsCollection([dto1, dto2, dto3])).toThrowCollectionValidationError("2.name.unique");
137
- });
138
-
139
- it("should, with enabling the ignore invalid option, ignore items which do not validate their schema", () => {
140
- const dto1 = defaultGroupDto();
141
- const dto2 = defaultGroupDto({ name: 42 });
142
- const dto3 = defaultGroupDto({ name: "group 3" });
143
-
144
- expect.assertions(3);
145
- const collection = new GroupsCollection([dto1, dto2, dto3], { ignoreInvalidEntity: true });
146
- expect(collection.items).toHaveLength(2);
147
- expect(collection.items[0].id).toEqual(dto1.id);
148
- expect(collection.items[1].id).toEqual(dto3.id);
149
- });
150
-
151
- it("should, with enabling the ignore invalid option, ignore items which do not validate the unique id build rule", () => {
152
- const dto1 = defaultGroupDto();
153
- const dto2 = defaultGroupDto({ id: dto1.id, name: "group 2" });
154
- const dto3 = defaultGroupDto({ name: "group 3" });
155
-
156
- expect.assertions(3);
157
- const collection = new GroupsCollection([dto1, dto2, dto3], { ignoreInvalidEntity: true });
158
- expect(collection.items).toHaveLength(2);
159
- expect(collection.items[0].id).toEqual(dto1.id);
160
- expect(collection.items[1].id).toEqual(dto3.id);
161
- });
162
-
163
- it("should, with enabling the ignore invalid option, ignore items which do not validate the unique name build rule", () => {
164
- const dto1 = defaultGroupDto();
165
- const dto2 = defaultGroupDto({ name: dto1.name });
166
- const dto3 = defaultGroupDto({ name: "group 3" });
167
-
168
- expect.assertions(3);
169
- const collection = new GroupsCollection([dto1, dto2, dto3], { ignoreInvalidEntity: true });
170
- expect(collection.items).toHaveLength(2);
171
- expect(collection.items[0].id).toEqual(dto1.id);
172
- expect(collection.items[1].id).toEqual(dto3.id);
173
- });
174
-
175
- it("should, with enabling the ignore invalid option, ignore items associated groups users entities which do not validate the group users same id build rule", () => {
176
- const dto1 = defaultGroupDto({}, { withGroupsUsers: true });
177
- const dto2 = defaultGroupDto({
178
- name: "group 2",
179
- groups_users: [defaultGroupUser({ group_id: 42, is_admin: true })],
180
- });
181
- const dto3 = defaultGroupDto({ name: "group 3" }, { withGroupsUsers: true });
182
-
183
- expect.assertions(7);
184
- const collection = new GroupsCollection([dto1, dto2, dto3], { ignoreInvalidEntity: true });
185
- expect(collection.items).toHaveLength(3);
186
- expect(collection.items[0].id).toEqual(dto1.id);
187
- expect(collection.items[0]._groups_users).toHaveLength(1);
188
- expect(collection.items[1].id).toEqual(dto2.id);
189
- expect(collection.items[1]._groups_users).toHaveLength(0);
190
- expect(collection.items[2].id).toEqual(dto3.id);
191
- expect(collection.items[2]._groups_users).toHaveLength(1);
192
- });
193
- });
194
-
195
- describe("GroupsCollection:pushMany", () => {
196
- it("[performance] should ensure performance adding large dataset remains effective.", async () => {
197
- const groupsCount = 10_000;
198
- const groupsUsersPerGroupCount = 5;
199
- const groupsDtos = defaultGroupsDtos(groupsCount, {
200
- withModifier: true,
201
- withCreator: true,
202
- withMyGroupUser: true,
203
- withGroupsUsers: groupsUsersPerGroupCount,
204
- });
205
-
206
- const start = performance.now();
207
- const collection = new GroupsCollection(groupsDtos, { ignoreInvalidEntity: true });
208
- const time = performance.now() - start;
209
- expect(collection).toHaveLength(groupsCount);
210
- expect(time).toBeLessThan(5_000);
211
- });
212
- });
213
-
214
- describe("GroupsCollection:toDto", () => {
215
- it("should transform the collection items in dto format", () => {
216
- const dto1 = defaultGroupDto({ name: "group1" }, { withGroupsUsers: true });
217
- const dto2p = defaultGroupDto({ name: "group2" }, { withGroupsUsers: true });
218
- const dto3 = defaultGroupDto({ name: "group3" }, { withGroupsUsers: true });
219
- const dtos = [dto1, dto2p, dto3];
220
- const collection = new GroupsCollection(dtos);
221
-
222
- expect.assertions(2);
223
- expect(collection.toDto()).toEqual(dtos);
224
- expect(JSON.stringify(collection)).toEqual(JSON.stringify(dtos));
225
- });
226
- });
227
- });
@@ -1,485 +0,0 @@
1
- /**
2
- * Passbolt ~ Open source password manager for teams
3
- * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
- *
5
- * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
- * For full copyright and license information, please see the LICENSE.txt
7
- * Redistributions of files must retain the above copyright notice.
8
- *
9
- * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
- * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
- * @link https://www.passbolt.com Passbolt(tm)
12
- * @since 2.13.0
13
- */
14
- import GroupEntity from "../group/groupEntity";
15
- import UserEntity from "../user/userEntity";
16
- import Validator from "validator";
17
- import EntityV2 from "passbolt-styleguide/src/shared/models/entity/abstract/entityV2";
18
-
19
- const ENTITY_NAME = "Permission";
20
- const PERMISSION_OWNER = 15;
21
- const PERMISSION_UPDATE = 7;
22
- const PERMISSION_READ = 1;
23
- const ARO_GROUP = "Group";
24
- const ARO_USER = "User";
25
- const ACO_RESOURCE = "Resource";
26
- const ACO_FOLDER = "Folder";
27
-
28
- class PermissionEntity extends EntityV2 {
29
- /**
30
- * @inheritDoc
31
- */
32
- constructor(dto, options = {}) {
33
- super(dto, options);
34
-
35
- // Associated models
36
- if (this._props.user) {
37
- this._user = new UserEntity(this._props.user, { ...options, clone: false });
38
- delete this._props.user;
39
- }
40
- if (this._props.group) {
41
- this._group = new GroupEntity(this._props.group, { ...options, clone: false });
42
- delete this._props.group;
43
- }
44
- }
45
-
46
- /**
47
- * Get permission entity schema
48
- *
49
- * @returns {Object} schema
50
- */
51
- static getSchema() {
52
- return {
53
- type: "object",
54
- required: ["aco", "aro", "aco_foreign_key", "aro_foreign_key", "type"],
55
- properties: {
56
- id: {
57
- type: "string",
58
- format: "uuid",
59
- },
60
- aco: {
61
- type: "string",
62
- enum: [PermissionEntity.ACO_FOLDER, PermissionEntity.ACO_RESOURCE],
63
- },
64
- aco_foreign_key: {
65
- type: "string",
66
- format: "uuid",
67
- },
68
- aro: {
69
- type: "string",
70
- enum: [PermissionEntity.ARO_GROUP, PermissionEntity.ARO_USER],
71
- },
72
- aro_foreign_key: {
73
- type: "string",
74
- format: "uuid",
75
- },
76
- type: {
77
- type: "integer",
78
- enum: PermissionEntity.PERMISSION_TYPES,
79
- },
80
- created: {
81
- type: "string",
82
- format: "date-time",
83
- },
84
- modified: {
85
- type: "string",
86
- format: "date-time",
87
- },
88
- // Associated models
89
- user: UserEntity.getSchema(),
90
- group: GroupEntity.getSchema(),
91
- },
92
- };
93
- }
94
-
95
- /*
96
- * ==================================================
97
- * Serialization
98
- * ==================================================
99
- */
100
- /**
101
- * Return a DTO ready to be sent to API
102
- *
103
- * @param {object} [contain] optional
104
- * @returns {object}
105
- */
106
- toDto(contain) {
107
- const result = Object.assign({}, this._props);
108
- if (!contain) {
109
- return result;
110
- }
111
- if (this._user && contain.user) {
112
- if (contain.user === true) {
113
- result.user = this._user.toDto();
114
- } else {
115
- result.user = this._user.toDto(contain.user);
116
- }
117
- }
118
- if (this._group && contain.group) {
119
- result.group = this._group.toDto();
120
- }
121
- return result;
122
- }
123
-
124
- /**
125
- * Customizes JSON stringification behavior
126
- * @returns {*}
127
- */
128
- toJSON() {
129
- return this.toDto(PermissionEntity.ALL_CONTAIN_OPTIONS);
130
- }
131
-
132
- /*
133
- * ==================================================
134
- * Dynamic properties getters
135
- * ==================================================
136
- */
137
- /**
138
- * Get permission id
139
- * @returns {(string|null)} uuid if set
140
- */
141
- get id() {
142
- return this._props.id || null;
143
- }
144
-
145
- /**
146
- * Get ACO - Access Control Object
147
- * @returns {string} Folder or Resource
148
- */
149
- get aco() {
150
- return this._props.aco;
151
- }
152
-
153
- /**
154
- * Get ARO - Access Request Object
155
- * @returns {string} Groups or User
156
- */
157
- get aro() {
158
- return this._props.aro;
159
- }
160
-
161
- /**
162
- * Get ARO id
163
- * @returns {string} uuid
164
- */
165
- get aroForeignKey() {
166
- return this._props.aro_foreign_key;
167
- }
168
-
169
- /**
170
- * Get ACO id
171
- * @returns {string} uuid
172
- */
173
- get acoForeignKey() {
174
- return this._props.aco_foreign_key;
175
- }
176
-
177
- /**
178
- * Get permission type
179
- * @returns {int} 1: read, 5: update, 15: admin
180
- */
181
- get type() {
182
- return this._props.type;
183
- }
184
-
185
- /**
186
- * Return true if owner permission
187
- * @returns {boolean}
188
- */
189
- isOwner() {
190
- return this.type === PermissionEntity.PERMISSION_OWNER;
191
- }
192
-
193
- /*
194
- * ==================================================
195
- * Static properties getters
196
- * ==================================================
197
- */
198
- /**
199
- * PermissionEntity.ENTITY_NAME
200
- * @returns {string}
201
- */
202
- static get ENTITY_NAME() {
203
- return ENTITY_NAME;
204
- }
205
-
206
- /**
207
- * PermissionEntity.PERMISSION_OWNER
208
- * @returns {number}
209
- */
210
- static get PERMISSION_OWNER() {
211
- return PERMISSION_OWNER;
212
- }
213
-
214
- /**
215
- * PermissionEntity.PERMISSION_UPDATE
216
- * @returns {number}
217
- */
218
- static get PERMISSION_UPDATE() {
219
- return PERMISSION_UPDATE;
220
- }
221
-
222
- /**
223
- * PermissionEntity.PERMISSION_READ
224
- * @returns {number}
225
- */
226
- static get PERMISSION_READ() {
227
- return PERMISSION_READ;
228
- }
229
-
230
- /**
231
- * PermissionEntity.ARO_GROUP
232
- * @returns {string}
233
- */
234
- static get ARO_GROUP() {
235
- return ARO_GROUP;
236
- }
237
-
238
- /**
239
- * PermissionEntity.ARO_USER
240
- * @returns {string}
241
- */
242
- static get ARO_USER() {
243
- return ARO_USER;
244
- }
245
-
246
- /**
247
- * PermissionEntity.ACO_RESOURCE
248
- * @returns {string}
249
- */
250
- static get ACO_RESOURCE() {
251
- return ACO_RESOURCE;
252
- }
253
-
254
- /**
255
- * PermissionEntity.ACO_FOLDER
256
- * @returns {string}
257
- */
258
- static get ACO_FOLDER() {
259
- return ACO_FOLDER;
260
- }
261
-
262
- /**
263
- * PermissionEntity.ALL_CONTAIN_OPTIONS
264
- * @returns {object} all contain options that can be used in toDto()
265
- */
266
- static get ALL_CONTAIN_OPTIONS() {
267
- return { user: { profile: { avatar: true } }, group: true };
268
- }
269
-
270
- /**
271
- * PermissionEntity.PERMISSION_TYPES
272
- * @returns {number[]}
273
- */
274
- static get PERMISSION_TYPES() {
275
- return [PermissionEntity.PERMISSION_READ, PermissionEntity.PERMISSION_UPDATE, PermissionEntity.PERMISSION_OWNER];
276
- }
277
-
278
- /*
279
- * ==================================================
280
- * Associated properties getters
281
- * ==================================================
282
- */
283
- /**
284
- * Get associated user data
285
- * @returns {(UserEntity|null)} user
286
- */
287
- get user() {
288
- return this._user || null;
289
- }
290
-
291
- /**
292
- * Get associated group data
293
- * @returns {(GroupEntity|null)} group
294
- */
295
- get group() {
296
- return this._group || null;
297
- }
298
-
299
- /*
300
- * ==================================================
301
- * Dynamic properties setters
302
- * ==================================================
303
- */
304
- /**
305
- * Set the permission id
306
- *
307
- * @param {string} id
308
- * @throws {TypeError} if permissions id is not UUID
309
- */
310
- set id(id) {
311
- if (!Validator.isUUID(id)) {
312
- throw new TypeError("The permission id should be a valid UUID.");
313
- }
314
- this._props.id = id;
315
- }
316
-
317
- /**
318
- * Set the permission type
319
- *
320
- * @param {int} type
321
- * @param type
322
- */
323
- set type(type) {
324
- if (!type || !PermissionEntity.PERMISSION_TYPES.includes(type)) {
325
- throw new TypeError("The type should be a valid integer.");
326
- }
327
- this._props.type = type;
328
- }
329
-
330
- /*
331
- * ==================================================
332
- * Assertions
333
- * ==================================================
334
- */
335
- /**
336
- * Basic type assertion helper
337
- *
338
- * @param {PermissionEntity} permission
339
- */
340
- static assertIsPermission(permission) {
341
- if (!permission || !(permission instanceof PermissionEntity)) {
342
- throw new TypeError("Failed to assert the parameter is a valid permission");
343
- }
344
- }
345
-
346
- /**
347
- * Basic type assertion helper
348
- *
349
- * @param {PermissionEntity} p1
350
- * @param {PermissionEntity} p2
351
- */
352
- static assertArePermissions(p1, p2) {
353
- PermissionEntity.assertIsPermission(p1);
354
- PermissionEntity.assertIsPermission(p2);
355
- }
356
-
357
- /*
358
- * ==================================================
359
- * Permission comparison operators
360
- * ==================================================
361
- */
362
- /**
363
- * Return true if two given permission have the same id
364
- *
365
- * @param {PermissionEntity} p1
366
- * @param {PermissionEntity} p2
367
- * @returns {boolean} true if permission ids match
368
- */
369
- static isIdMatching(p1, p2) {
370
- PermissionEntity.assertArePermissions(p1, p2);
371
- return p1.id === p2.id;
372
- }
373
-
374
- /**
375
- * Return true if two given permission are about the same user or group
376
- *
377
- * @param {PermissionEntity} p1
378
- * @param {PermissionEntity} p2
379
- * @returns {boolean} true if permissions match
380
- */
381
- static isAroMatching(p1, p2) {
382
- PermissionEntity.assertArePermissions(p1, p2);
383
- return p1.aro === p2.aro && p1.aroForeignKey === p2.aroForeignKey;
384
- }
385
-
386
- /**
387
- * Return true if two given permission are about the same folder or resource
388
- *
389
- * @param {PermissionEntity} p1
390
- * @param {PermissionEntity} p2
391
- * @returns {boolean} true if permissions match
392
- */
393
- static isAcoMatching(p1, p2) {
394
- PermissionEntity.assertArePermissions(p1, p2);
395
- return p1.aco === p2.aco && p1.acoForeignKey === p2.acoForeignKey;
396
- }
397
-
398
- /**
399
- * Return true if two given permission are about the same folder/resource and group/user
400
- *
401
- * @param {PermissionEntity} p1
402
- * @param {PermissionEntity} p2
403
- * @returns {boolean} true if permissions match
404
- */
405
- static isAcoAndAroMatching(p1, p2) {
406
- PermissionEntity.assertArePermissions(p1, p2);
407
- return PermissionEntity.isAcoMatching(p1, p2) && PermissionEntity.isAroMatching(p1, p2);
408
- }
409
-
410
- /**
411
- * Return true if two given permission are the same type
412
- * Example both permission are about an update right
413
- *
414
- * @param {PermissionEntity} p1
415
- * @param {PermissionEntity} p2
416
- * @returns {boolean} true if permissions match
417
- */
418
- static isTypeMatching(p1, p2) {
419
- PermissionEntity.assertArePermissions(p1, p2);
420
- return p1.type === p2.type;
421
- }
422
-
423
- /**
424
- * Return true if two given permission aco, aro and type matches
425
- *
426
- * @param {PermissionEntity} p1
427
- * @param {PermissionEntity} p2
428
- * @returns {boolean} true if permissions match
429
- */
430
- static isMatchingAroAcoType(p1, p2) {
431
- PermissionEntity.assertArePermissions(p1, p2);
432
- return PermissionEntity.isAcoAndAroMatching(p1, p2) && PermissionEntity.isTypeMatching(p1, p2);
433
- }
434
-
435
- /**
436
- * Return the highest permission type
437
- *
438
- * @param {PermissionEntity} p1
439
- * @param {PermissionEntity} p2
440
- * @returns {int} highest permission type
441
- */
442
- static getHighestPermissionType(p1, p2) {
443
- PermissionEntity.assertArePermissions(p1, p2);
444
- return p1.type > p2.type ? p1.type : p2.type;
445
- }
446
-
447
- /**
448
- * Return true if two given permission are the same type
449
- * Example both permission are about an update right
450
- *
451
- * @param {PermissionEntity} p1
452
- * @param {PermissionEntity} p2
453
- * @returns {PermissionEntity} the permission with highest type
454
- */
455
- static getHighestPermission(p1, p2) {
456
- PermissionEntity.assertArePermissions(p1, p2);
457
- return p1.type > p2.type ? p1 : p2;
458
- }
459
-
460
- /*
461
- * ==================================================
462
- * Permission factories
463
- * ==================================================
464
- */
465
- /**
466
- * Create a permission copy to be used by another aco
467
- * Useful for example when you want to reuse a permission from a folder
468
- * and apply it to a resource. For example on a move or a share operation.
469
- *
470
- * @param aco
471
- * @param acoForeignKey
472
- * @returns {PermissionEntity}
473
- */
474
- copyForAnotherAco(aco, acoForeignKey) {
475
- return new PermissionEntity({
476
- aro: this.aro,
477
- aro_foreign_key: this.aroForeignKey,
478
- aco: aco,
479
- aco_foreign_key: acoForeignKey,
480
- type: this.type,
481
- });
482
- }
483
- }
484
-
485
- export default PermissionEntity;