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
@@ -11,43 +11,27 @@
11
11
  * @link https://www.passbolt.com Passbolt(tm)
12
12
  * @since 2.13.0
13
13
  */
14
- import UserEntity from "./userEntity";
15
- import EntitySchema from "passbolt-styleguide/src/shared/models/entity/abstract/entitySchema";
16
- import { customEmailValidationProOrganizationSettings } from "../organizationSettings/organizationSettingsEntity.test.data";
14
+ import BextUserEntity from "./userEntity";
15
+ import AppEmailValidatorService from "../../../service/validator/appEmailValidatorService";
17
16
  import OrganizationSettingsModel from "../../organizationSettings/organizationSettingsModel";
18
17
  import OrganizationSettingsEntity from "../organizationSettings/organizationSettingsEntity";
18
+ import { customEmailValidationProOrganizationSettings } from "../organizationSettings/organizationSettingsEntity.test.data";
19
19
  import { defaultUserDto } from "passbolt-styleguide/src/shared/models/entity/user/userEntity.test.data";
20
+ import GroupsUsersCollection from "passbolt-styleguide/src/shared/models/entity/groupUser/groupsUsersCollection";
20
21
  import * as assertEntityProperty from "passbolt-styleguide/test/assert/assertEntityProperty";
21
- import RoleEntity from "passbolt-styleguide/src/shared/models/entity/role/roleEntity";
22
- import ProfileEntity from "passbolt-styleguide/src/shared/models/entity/profile/profileEntity";
23
- import GpgkeyEntity from "passbolt-styleguide/src/shared/models/entity/gpgkey/gpgkeyEntity";
24
- import AccountRecoveryUserSettingEntity from "passbolt-styleguide/src/shared/models/entity/accountRecovery/accountRecoveryUserSettingEntity";
25
- import PendingAccountRecoveryRequestEntity from "passbolt-styleguide/src/shared/models/entity/accountRecovery/pendingAccountRecoveryRequestEntity";
26
- import { defaultGroupUser } from "passbolt-styleguide/src/shared/models/entity/groupUser/groupUserEntity.test.data.js";
27
- import { v4 as uuid } from "uuid";
28
-
29
- describe("UserEntity", () => {
30
- describe("UserEntity::getSchema", () => {
31
- it("schema must validate", () => {
32
- EntitySchema.validateSchema(UserEntity.ENTITY_NAME, UserEntity.getSchema());
33
- });
34
22
 
35
- it("validates id property", () => {
36
- assertEntityProperty.string(UserEntity, "id");
37
- assertEntityProperty.uuid(UserEntity, "id");
38
- assertEntityProperty.notRequired(UserEntity, "id");
39
- });
40
-
41
- it("validates role_id property", () => {
42
- assertEntityProperty.string(UserEntity, "role_id");
43
- assertEntityProperty.uuid(UserEntity, "role_id");
44
- assertEntityProperty.notRequired(UserEntity, "role_id");
23
+ describe("BextUserEntity", () => {
24
+ describe("BextUserEntity::getSchema", () => {
25
+ it("injects AppEmailValidatorService.validate on username.custom", () => {
26
+ expect.assertions(1);
27
+ const schema = BextUserEntity.getSchema();
28
+ expect(schema.properties.username.custom).toBe(AppEmailValidatorService.validate);
45
29
  });
46
30
 
47
- it("validates username property", () => {
48
- assertEntityProperty.string(UserEntity, "username");
49
- assertEntityProperty.email(UserEntity, "username");
50
- assertEntityProperty.required(UserEntity, "username");
31
+ it("validates username with email format when no custom regex is configured", () => {
32
+ assertEntityProperty.string(BextUserEntity, "username");
33
+ assertEntityProperty.email(BextUserEntity, "username");
34
+ assertEntityProperty.required(BextUserEntity, "username");
51
35
  });
52
36
 
53
37
  it("validates username with custom validation rule", () => {
@@ -55,283 +39,24 @@ describe("UserEntity", () => {
55
39
  const organizationSettings = customEmailValidationProOrganizationSettings();
56
40
  OrganizationSettingsModel.set(new OrganizationSettingsEntity(organizationSettings));
57
41
  const dto = defaultUserDto({ username: "ada@passbolt.c" });
58
- const entity = new UserEntity(dto);
42
+ const entity = new BextUserEntity(dto);
59
43
  expect(entity.username).toEqual("ada@passbolt.c");
60
44
  /*
61
45
  * Ensure that the custom formula used to validate the format of the email is dynamic, and can be changed even if the
62
46
  * entity schema is cached. This formula might loaded after the schema was cached and could lead to user not valid.
63
47
  */
64
48
  OrganizationSettingsModel.flushCache();
65
- expect(() => new UserEntity(dto)).toThrowEntityValidationError("username", "custom");
66
- });
67
-
68
- it("validates active property", () => {
69
- assertEntityProperty.boolean(UserEntity, "active");
70
- assertEntityProperty.notRequired(UserEntity, "active");
71
- });
72
-
73
- it("validates deleted property", () => {
74
- assertEntityProperty.boolean(UserEntity, "deleted");
75
- assertEntityProperty.notRequired(UserEntity, "deleted");
76
- });
77
-
78
- it("validates disabled property", () => {
79
- assertEntityProperty.dateTime(UserEntity, "disabled");
80
- assertEntityProperty.nullable(UserEntity, "disabled");
81
- assertEntityProperty.notRequired(UserEntity, "disabled");
82
- });
83
-
84
- it("validates created property", () => {
85
- assertEntityProperty.string(UserEntity, "created");
86
- assertEntityProperty.dateTime(UserEntity, "created");
87
- assertEntityProperty.notRequired(UserEntity, "created");
88
- });
89
-
90
- it("validates modified property", () => {
91
- assertEntityProperty.string(UserEntity, "modified");
92
- assertEntityProperty.dateTime(UserEntity, "modified");
93
- assertEntityProperty.notRequired(UserEntity, "modified");
94
- });
95
-
96
- it("validates last_logged_in property", () => {
97
- const failDatetimeScenario = [
98
- { scenario: "not a date", value: "not-a-date" },
99
- { scenario: "year, month, day, time and zulu", value: "2018-10-18T08:04:30+00:00Z" },
100
- ];
101
-
102
- assertEntityProperty.assert(
103
- UserEntity,
104
- "last_logged_in",
105
- assertEntityProperty.SUCCESS_DATETIME_SCENARIO,
106
- failDatetimeScenario,
107
- "format",
108
- );
109
- assertEntityProperty.nullable(UserEntity, "last_logged_in");
110
- assertEntityProperty.notRequired(UserEntity, "last_logged_in");
111
- });
112
-
113
- it("validates is_mfa_enabled property", () => {
114
- assertEntityProperty.boolean(UserEntity, "is_mfa_enabled");
115
- assertEntityProperty.nullable(UserEntity, "is_mfa_enabled");
116
- assertEntityProperty.notRequired(UserEntity, "is_mfa_enabled");
117
- });
118
-
119
- it("validates locale property", () => {
120
- assertEntityProperty.locale(UserEntity, "locale");
121
- assertEntityProperty.nullable(UserEntity, "locale");
122
- assertEntityProperty.notRequired(UserEntity, "locale");
49
+ expect(() => new BextUserEntity(dto)).toThrowEntityValidationError("username", "custom");
123
50
  });
124
51
  });
125
52
 
126
- describe("UserEntity::constructor", () => {
127
- it("works if valid minimal DTO is provided", () => {
128
- const dto = {
129
- username: "ada@passbolt.com",
130
- };
131
- const entity = new UserEntity(dto);
132
- expect(entity.toDto()).toEqual(dto);
133
- expect(entity.id).toBe(null);
134
- expect(entity.username).toEqual(dto.username);
135
- expect(entity.roleId).toBeNull();
136
- expect(entity.isActive).toBeNull();
137
- expect(entity.isDeleted).toBeNull();
138
- expect(entity.created).toBeNull();
139
- expect(entity.modified).toBeNull();
140
- expect(entity.lastLoggedIn).toBeNull();
141
- expect(entity.isMfaEnabled).toBeNull();
142
- expect(entity.locale).toBeNull();
143
- expect(entity.profile).toBeNull();
144
- expect(entity.gpgkey).toBeNull();
145
- expect(entity.groupsUsers).toBeNull();
146
- expect(entity.accountRecoveryUserSetting).toBeNull();
147
- expect(entity.pendingAccountRecoveryUserRequest).toBeNull();
148
- });
149
-
150
- it("works if valid DTO with associated entity data is provided", () => {
151
- const dto = defaultUserDto(
152
- {},
153
- {
154
- withGroupsUsers: true,
155
- withRole: true,
156
- withGpgkey: true,
157
- withAccountRecoveryUserSetting: true,
158
- withPendingAccountRecoveryUserRequest: true,
159
- },
160
- );
161
- const filtered = {
162
- id: dto.id,
163
- role_id: dto.role_id,
164
- username: dto.username,
165
- active: dto.active,
166
- deleted: dto.deleted,
167
- disabled: dto.disabled,
168
- created: dto.created,
169
- modified: dto.modified,
170
- last_logged_in: dto.last_logged_in,
171
- is_mfa_enabled: dto.is_mfa_enabled,
172
- };
173
-
174
- const entity = new UserEntity(dto);
175
- expect(entity.toDto()).toEqual(filtered);
176
- expect(entity.profile.firstName).toEqual(dto.profile.first_name);
177
- expect(entity.profile.lastName).toEqual(dto.profile.last_name);
178
- expect(entity.role).toBeInstanceOf(RoleEntity);
179
- expect(entity.profile).toBeInstanceOf(ProfileEntity);
180
- expect(entity.gpgkey).toBeInstanceOf(GpgkeyEntity);
181
- expect(entity.accountRecoveryUserSetting).toBeInstanceOf(AccountRecoveryUserSettingEntity);
182
- expect(entity.role.name).toEqual("user");
183
- expect(entity.isMfaEnabled).toBe(false);
184
- expect(entity.gpgkey.armoredKey.startsWith("-----BEGIN PGP PUBLIC KEY BLOCK-----")).toBe(true);
185
- expect(entity.accountRecoveryUserSetting.status).toEqual("approved");
186
- expect(entity.pendingAccountRecoveryUserRequest).toBeInstanceOf(PendingAccountRecoveryRequestEntity);
187
- expect(entity.pendingAccountRecoveryUserRequest.status).toEqual("pending");
188
-
189
- const dtoWithContain = entity.toDto({
190
- role: true,
191
- profile: true,
192
- gpgkey: true,
193
- account_recovery_user_setting: true,
194
- pending_account_recovery_request: true,
195
- });
196
- expect(dtoWithContain.role.name).toEqual("user");
197
- expect(dtoWithContain.profile.first_name).toEqual(dto.profile.first_name);
198
- expect(dtoWithContain.gpgkey.armored_key.startsWith("-----BEGIN PGP PUBLIC KEY BLOCK-----")).toBe(true);
199
- expect(dtoWithContain.is_mfa_enabled).toBe(false);
200
- expect(dtoWithContain.pending_account_recovery_request.status).toBe("pending");
201
- });
202
-
203
- it("should marshall last_logged_in if empty string given", () => {
204
- expect.assertions(1);
205
- const dto = defaultUserDto({ last_logged_in: "" });
206
- const entity = new UserEntity(dto);
207
- expect(entity.lastLoggedIn).toBeNull();
208
- });
209
-
210
- it("should, with enabling the ignore invalid option, ignore groups users which do not validate their schema", () => {
211
- const dto = defaultUserDto({
212
- groups_users: [defaultGroupUser({ group_id: 42 }), defaultGroupUser()],
213
- });
214
-
215
- expect.assertions(2);
216
- const entity = new UserEntity(dto, { ignoreInvalidEntity: true });
217
- expect(entity._groups_users).toHaveLength(1);
218
- expect(entity._groups_users.items[0]._props.id).toEqual(dto.groups_users[1].id);
219
- });
220
-
221
- /*
222
- * @todo Associated entities validation error details to review when entity will aggregate them.
223
- * @see EntityV2.constructor
224
- */
225
- it("should throw if one of associated collection data item does not validate their schema", () => {
226
- const dto = defaultUserDto({
227
- groups_users: [defaultGroupUser({ group_id: 42 }), defaultGroupUser()],
228
- });
229
-
230
- expect.assertions(2);
231
- // Currently throw
232
- expect(() => new UserEntity(dto)).toThrowCollectionValidationError("0.group_id.type");
233
- // Should throw, or similar fashion, path is important.
234
- expect(() => new UserEntity(dto)).not.toThrowCollectionValidationError("groups_users.0.group_id.type");
235
- });
236
-
237
- it("should, with enabling the ignore invalid option, ignore groups users which do not validate their schema", () => {
238
- const dto = defaultUserDto({
239
- groups_users: [defaultGroupUser({ group_id: 42 }), defaultGroupUser()],
240
- });
241
-
53
+ describe("BextUserEntity::constructor", () => {
54
+ it("constructs from a valid default DTO and inherits parent associations", () => {
242
55
  expect.assertions(2);
243
- const entity = new UserEntity(dto, { ignoreInvalidEntity: true });
244
- expect(entity._groups_users).toHaveLength(1);
245
- expect(entity._groups_users.items[0]._props.id).toEqual(dto.groups_users[1].id);
246
- });
247
- });
248
-
249
- describe("UserEntity::toDto", () => {
250
- it("serialization works with full object inside collection", () => {
251
- const dto = defaultUserDto(
252
- {},
253
- {
254
- withGroupsUsers: true,
255
- withRole: true,
256
- withGpgkey: true,
257
- withAccountRecoveryUserSetting: true,
258
- withPendingAccountRecoveryUserRequest: true,
259
- },
260
- );
261
- const entity = new UserEntity(dto);
262
- expect(entity.toDto(UserEntity.ALL_CONTAIN_OPTIONS)).toEqual(dto);
263
- });
264
- });
265
-
266
- describe("UserEntity::getters", () => {
267
- it("mfa enabled can be null or ommited", () => {
268
- const dto = {
269
- role_id: "a58de6d3-f52c-5080-b79b-a601a647ac85",
270
- username: "dame@passbolt.com",
271
- is_mfa_enabled: null,
272
- };
273
- const entity = new UserEntity(dto);
274
- expect(entity.isMfaEnabled).toBeNull();
275
-
276
- const dto2 = {
277
- role_id: "a58de6d3-f52c-5080-b79b-a601a647ac85",
278
- username: "dame@passbolt.com",
279
- };
280
- const entity2 = new UserEntity(dto2);
281
- expect(entity2.isMfaEnabled).toBeNull();
282
- });
283
- });
284
- describe("::missingMetadataKeysIds", () => {
285
- it("should return an empty array if missing_metadata_key_ids is not defined", () => {
286
- expect.assertions(1);
287
-
288
- const dto = defaultUserDto(
289
- {},
290
- {
291
- withRole: true,
292
- withGpgkey: true,
293
- },
294
- );
295
- const entity = new UserEntity(dto);
296
-
297
- expect(entity.missingMetadataKeysIds).toEqual([]);
298
- });
299
- it("should return an array of missing_metadata_key_ids", () => {
300
- expect.assertions(1);
301
- const uuid1 = uuid();
302
- const uuid2 = uuid();
303
-
304
- const dto = defaultUserDto(
305
- {
306
- missing_metadata_key_ids: [uuid1, uuid2],
307
- },
308
- {
309
- withRole: true,
310
- withGpgkey: true,
311
- },
312
- );
313
- const entity = new UserEntity(dto);
314
-
315
- expect(entity.missingMetadataKeysIds).toEqual([uuid1, uuid2]);
316
- });
317
-
318
- it("should set the missing_metadata_key_ids", () => {
319
- expect.assertions(1);
320
- const uuid1 = uuid();
321
- const uuid2 = uuid();
322
-
323
- const dto = defaultUserDto(
324
- {
325
- missing_metadata_key_ids: [],
326
- },
327
- {
328
- withRole: true,
329
- withGpgkey: true,
330
- },
331
- );
332
- const entity = new UserEntity(dto);
333
- entity.missingMetadataKeysIds = [uuid1, uuid2];
334
- expect(entity.missingMetadataKeysIds).toEqual([uuid1, uuid2]);
56
+ const dto = defaultUserDto({}, { withGroupsUsers: true });
57
+ const entity = new BextUserEntity(dto);
58
+ expect(entity.username).toEqual(dto.username);
59
+ expect(entity.groupsUsers).toBeInstanceOf(GroupsUsersCollection);
335
60
  });
336
61
  });
337
62
  });
@@ -12,7 +12,7 @@
12
12
  * @since 4.9.0
13
13
  */
14
14
  import EntityV2 from "passbolt-styleguide/src/shared/models/entity/abstract/entityV2";
15
- import GroupEntity from "../group/groupEntity";
15
+ import GroupEntity from "passbolt-styleguide/src/shared/models/entity/group/groupEntity";
16
16
  import UserEntity from "../user/userEntity";
17
17
 
18
18
  const ENTITY_NAME = "UserAndGroupSearchResult";
@@ -11,17 +11,15 @@
11
11
  * @link https://www.passbolt.com Passbolt(tm)
12
12
  */
13
13
  import FolderLocalStorage from "../../service/local_storage/folderLocalStorage";
14
- import PermissionEntity from "../entity/permission/permissionEntity";
15
- import PermissionsCollection from "../entity/permission/permissionsCollection";
14
+ import PermissionEntity from "passbolt-styleguide/src/shared/models/entity/permission/permissionEntity";
15
+ import PermissionsCollection from "passbolt-styleguide/src/shared/models/entity/permission/permissionsCollection";
16
16
  import FolderEntity from "../entity/folder/folderEntity";
17
17
  import FoldersCollection from "../entity/folder/foldersCollection";
18
18
  import PermissionChangesCollection from "../entity/permission/change/permissionChangesCollection";
19
- import MoveService from "../../service/api/move/moveService";
20
19
  import FolderService from "../../service/api/folder/folderService";
21
- import ShareService from "../../service/api/share/shareService";
20
+ import ShareApiService from "../../service/api/share/shareApiService";
22
21
  import splitBySize from "../../utils/array/splitBySize";
23
22
  import FindAndUpdateFoldersLocalStorageService from "../../service/folder/findAndUpdateFoldersLocalStorageService";
24
- import { assertUuid } from "../../utils/assertions";
25
23
 
26
24
  const BULK_OPERATION_SIZE = 5;
27
25
 
@@ -35,8 +33,7 @@ class FolderModel {
35
33
  */
36
34
  constructor(apiClientOptions, account) {
37
35
  this.folderService = new FolderService(apiClientOptions);
38
- this.moveService = new MoveService(apiClientOptions);
39
- this.shareService = new ShareService(apiClientOptions);
36
+ this.shareApiService = new ShareApiService(apiClientOptions);
40
37
  this.findAndUpdateFoldersLocalStorageService = new FindAndUpdateFoldersLocalStorageService(
41
38
  account,
42
39
  apiClientOptions,
@@ -90,113 +87,11 @@ class FolderModel {
90
87
  return outputCollection;
91
88
  }
92
89
 
93
- /**
94
- * Get all the children for the folder provided as input
95
- *
96
- * @param {array} folderIds The folder ids
97
- * @return {FoldersCollection}
98
- * @deprecated should use getOrFindFoldersService and collection filtering. See shareFoldersService usage.
99
- */
100
- async getAllChildren(folderIds) {
101
- const foldersDto = await FolderLocalStorage.get();
102
- const inputCollection = new FoldersCollection(foldersDto);
103
- const outputCollection = new FoldersCollection([]);
104
- for (const i in folderIds) {
105
- const folderId = folderIds[i];
106
- const children = FoldersCollection.getAllChildren(folderId, inputCollection, outputCollection);
107
- outputCollection.merge(children);
108
- }
109
- return outputCollection;
110
- }
111
-
112
- /*
113
- * ============================================
114
- * Finders
115
- * ============================================
116
- */
117
- /**
118
- * Get all folders from API and map API result to folder collection
119
- *
120
- * @returns {Promise<FoldersCollection>}
121
- * @deprecated should use findFoldersService.
122
- */
123
- async findAllForShare(foldersIds) {
124
- const foldersDtos = await this.folderService.findAllForShare(foldersIds);
125
- return new FoldersCollection(foldersDtos);
126
- }
127
-
128
- /**
129
- * Get folder from API and map API result to folder Entity
130
- *
131
- * @returns {Promise<FolderEntity>}
132
- * @deprecated should use findFoldersService.
133
- */
134
- async findForShare(folderId) {
135
- const foldersDtos = await this.folderService.findAllForShare([folderId]);
136
- if (!foldersDtos.length) {
137
- throw new Error(`Folder ${folderId} not found`);
138
- }
139
- return new FolderEntity(foldersDtos[0]);
140
- }
141
-
142
90
  /*
143
91
  * ==============================================================
144
92
  * Permission changes
145
93
  * ==============================================================
146
94
  */
147
- /**
148
- * Calculate permission changes for a move
149
- * From current permissions, remove the parent folder permissions, add the destination permissions
150
- * From this new set of permission and the original permission calculate the needed changed
151
- *
152
- * NOTE: This function requires permissions to be set for all objects
153
- *
154
- * @param {ResourceEntity} folderEntity
155
- * @param {(FolderEntity|null)} parentFolder
156
- * @param {(FolderEntity|null)} destFolder
157
- * @returns {PermissionChangesCollection}
158
- */
159
- calculatePermissionsChangesForMove(folderEntity, parentFolder, destFolder) {
160
- let remainingPermissions = new PermissionsCollection([], { assertAtLeastOneOwner: false });
161
-
162
- // Remove permissions from parent if any
163
- if (parentFolder) {
164
- if (!folderEntity.permissions || !parentFolder.permissions) {
165
- throw new TypeError("Resource model calculatePermissionsChangesForMove requires permissions to be set.");
166
- }
167
- remainingPermissions = PermissionsCollection.diff(folderEntity.permissions, parentFolder.permissions, false);
168
- }
169
- // Add parent permissions
170
- let permissionsFromParent = new PermissionsCollection([], { assertAtLeastOneOwner: false });
171
- if (destFolder) {
172
- if (!destFolder.permissions) {
173
- throw new TypeError(
174
- "Resource model calculatePermissionsChangesForMove requires destination permissions to be set.",
175
- );
176
- }
177
- permissionsFromParent = destFolder.permissions.cloneForAco(PermissionEntity.ACO_FOLDER, folderEntity.id, false);
178
- }
179
-
180
- const newPermissions = PermissionsCollection.sum(remainingPermissions, permissionsFromParent, false);
181
- if (!destFolder) {
182
- /*
183
- * If the move is toward the root
184
- * Reuse highest permission
185
- */
186
- newPermissions.addOrReplace(
187
- new PermissionEntity({
188
- aco: PermissionEntity.ACO_FOLDER,
189
- aco_foreign_key: folderEntity.id,
190
- aro: folderEntity.permission.aro,
191
- aro_foreign_key: folderEntity.permission.aroForeignKey,
192
- type: PermissionEntity.PERMISSION_OWNER,
193
- }),
194
- );
195
- }
196
- newPermissions.assertAtLeastOneOwner();
197
- return PermissionChangesCollection.calculateChanges(folderEntity.permissions, newPermissions);
198
- }
199
-
200
95
  /**
201
96
  * Calculate permission changes for a create
202
97
  * From current permissions add the destination permissions
@@ -240,24 +135,6 @@ class FolderModel {
240
135
  return updatedFolderEntity;
241
136
  }
242
137
 
243
- /**
244
- * Move a folder using Passbolt API
245
- *
246
- * @param {string} folderId the folder to move
247
- * @param {string} folderParentId the destination folder
248
- * @returns {Promise<FolderEntity>}
249
- */
250
- async move(folderId, folderParentId) {
251
- const folderDto = await FolderLocalStorage.getFolderById(folderId);
252
- const folderEntity = new FolderEntity(folderDto);
253
- folderEntity.folderParentId = folderParentId;
254
- await this.moveService.moveFolder(folderId, folderParentId);
255
- // TODO update modified date
256
- await FolderLocalStorage.updateFolder(folderEntity);
257
-
258
- return folderEntity;
259
- }
260
-
261
138
  /**
262
139
  * Update a folder using Passbolt API
263
140
  *
@@ -280,7 +157,7 @@ class FolderModel {
280
157
  * @returns {Promise<FolderEntity>}
281
158
  */
282
159
  async share(folderEntity, changesCollection, updateStorage) {
283
- await this.shareService.shareFolder(folderEntity.id, { permissions: changesCollection.toDto() });
160
+ await this.shareApiService.shareFolder(folderEntity.id, { permissions: changesCollection.toDto() });
284
161
  if (typeof updateStorage === "undefined" || updateStorage) {
285
162
  /*
286
163
  * update storage in case the folder becomes non visible to current user
@@ -370,32 +247,6 @@ class FolderModel {
370
247
  throw error;
371
248
  }
372
249
  }
373
-
374
- /*
375
- * ============================================
376
- * Assertions
377
- * ============================================
378
- */
379
- /**
380
- * Assert for a given folder id that the folder is in the local storage
381
- *
382
- * @param {(string|null)} folderId folderId
383
- * @throws {Error} if the folder does not exist
384
- * @deprecated should use getOrFindFoldersService.
385
- */
386
- async assertFolderExists(folderId) {
387
- if (folderId === null) {
388
- return;
389
- }
390
-
391
- assertUuid(folderId, `Folder exists check expect a uuid.`);
392
-
393
- const folderDto = await FolderLocalStorage.getFolderById(folderId);
394
- if (!folderDto) {
395
- // TODO check remotely?
396
- throw new Error(`Folder with id ${folderId} does not exist.`);
397
- }
398
- }
399
250
  }
400
251
 
401
252
  export default FolderModel;
@@ -13,7 +13,7 @@
13
13
  */
14
14
  import GroupLocalStorage from "../../service/local_storage/groupLocalStorage";
15
15
  import DeleteDryRunError from "../../error/deleteDryRunError";
16
- import GroupEntity from "../entity/group/groupEntity";
16
+ import GroupEntity from "passbolt-styleguide/src/shared/models/entity/group/groupEntity";
17
17
  import GroupApiService from "../../service/api/group/groupApiService";
18
18
  import GroupUpdateDryRunResultEntity from "../entity/group/update/groupUpdateDryRunResultEntity";
19
19
  import GroupDeleteTransferEntity from "../entity/group/transfer/groupDeleteTransferEntity";