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,6 +11,7 @@ import GetKeyInfoController from "../controller/crypto/getKeyInfoController";
11
11
  import DownloadUserPublicKeyController from "../controller/crypto/downloadUserPublicKeyController";
12
12
  import DownloadUserPrivateKeyController from "../controller/crypto/downloadUserPrivateKeyController";
13
13
  import GetUserPrivateKeyController from "../controller/crypto/getUserPrivateKeyController";
14
+ import SynchroniseKeyringController from "../controller/keyring/synchroniseKeyringController";
14
15
 
15
16
  const listen = function (worker, _, account) {
16
17
  /*
@@ -61,6 +62,17 @@ const listen = function (worker, _, account) {
61
62
  await controller._exec(passphrase);
62
63
  });
63
64
 
65
+ /*
66
+ * Synchronise the keyring with the API.
67
+ *
68
+ * @listens passbolt.keyring.sync
69
+ * @param requestId {uuid} The request identifier
70
+ */
71
+ worker.port.on("passbolt.keyring.sync", async (requestId) => {
72
+ const controller = new SynchroniseKeyringController(worker, requestId);
73
+ await controller._exec();
74
+ });
75
+
64
76
  /*
65
77
  * ==================================================================================
66
78
  * Backups key events
@@ -12,10 +12,10 @@
12
12
  * @since 1.0.0
13
13
  */
14
14
 
15
- import FolderModel from "../model/folder/folderModel";
16
15
  import ShareResourcesController from "../controller/share/shareResourcesController";
17
16
  import ShareOneFolderController from "../controller/share/shareOneFolderController";
18
17
  import SearchUsersAndGroupsController from "../controller/share/searchUsersAndGroupsController";
18
+ import FindFoldersForShareController from "../controller/share/findFoldersForShareController";
19
19
 
20
20
  /**
21
21
  * Listens the share events
@@ -30,14 +30,8 @@ const listen = function (worker, apiClientOptions, account) {
30
30
  * @param {array} foldersIds The ids of the folders to retrieve.
31
31
  */
32
32
  worker.port.on("passbolt.share.get-folders", async (requestId, foldersIds) => {
33
- try {
34
- const folderModel = new FolderModel(apiClientOptions, account);
35
- const foldersCollection = await folderModel.findAllForShare(foldersIds);
36
- worker.port.emit(requestId, "SUCCESS", foldersCollection);
37
- } catch (error) {
38
- console.error(error);
39
- worker.port.emit(requestId, "ERROR", error);
40
- }
33
+ const controller = new FindFoldersForShareController(worker, requestId, apiClientOptions);
34
+ await controller._exec(foldersIds);
41
35
  });
42
36
 
43
37
  /*
@@ -14,6 +14,7 @@ import SecurityTokenEntity from "../model/entity/securityToken/securityTokenEnti
14
14
  import AvatarUpdateEntity from "../model/entity/avatar/update/avatarUpdateEntity";
15
15
  import UpdateUserLocalStorageController from "../controller/user/updateUserLocalStorageController";
16
16
  import GetOrFindLoggedInUserController from "../controller/user/getOrFindLoggedInUserController";
17
+ import GetOrFindUsersController from "../controller/user/getOrFindUsersController";
17
18
  import UpdateUserController from "../controller/user/updateUserController";
18
19
  import DeleteDryRunUserController from "../controller/user/deleteDryRunUserController";
19
20
  import DeleteUserController from "../controller/user/deleteUserController";
@@ -46,6 +47,18 @@ const listen = function (worker, apiClientOptions, account) {
46
47
  }
47
48
  });
48
49
 
50
+ /*
51
+ * Find users by their ids.
52
+ *
53
+ * @listens passbolt.users.get-by-ids
54
+ * @param {uuid} requestId The request identifier
55
+ * @param {Array<uuid>} userIds The ids of the users to retrieve
56
+ */
57
+ worker.port.on("passbolt.users.get-by-ids", async (requestId, userIds) => {
58
+ const controller = new GetOrFindUsersController(worker, requestId, apiClientOptions, account);
59
+ controller._exec(userIds);
60
+ });
61
+
49
62
  /*
50
63
  * ==================================================================================
51
64
  * CRUD
@@ -1,14 +1,24 @@
1
1
  /**
2
2
  * Config model.
3
3
  *
4
+ * Build-time keys (debug, log.*) are injected by webpack's EnvironmentPlugin
5
+ * (see webpack/passboltEnvPlugin.js). Other keys (user.*) are runtime-only and
6
+ * persisted in local storage.
7
+ *
4
8
  * @copyright (c) 2017 Passbolt SARL
5
9
  * @licence GNU Affero General Public License http://www.gnu.org/licenses/agpl-3.0.en.html
6
10
  */
11
+ import storage from "../sdk/storage";
7
12
 
8
- import _config from "../config/config.json";
13
+ const _config = {
14
+ debug: process.env.PASSBOLT_DEBUG === "true",
15
+ log: {
16
+ level: Number.parseInt(process.env.PASSBOLT_LOG_LEVEL, 10) || 0,
17
+ console: process.env.PASSBOLT_LOG_CONSOLE === "true",
18
+ },
19
+ };
9
20
 
10
21
  const defaultConfig = { ..._config };
11
- import storage from "../sdk/storage";
12
22
 
13
23
  /**
14
24
  * Init the configuration.
@@ -13,8 +13,8 @@
13
13
  */
14
14
  import EntitySchema from "passbolt-styleguide/src/shared/models/entity/abstract/entitySchema";
15
15
  import EntityValidationError from "passbolt-styleguide/src/shared/models/entity/abstract/entityValidationError";
16
- import PermissionEntity from "../permission/permissionEntity";
17
- import PermissionsCollection from "../permission/permissionsCollection";
16
+ import PermissionEntity from "passbolt-styleguide/src/shared/models/entity/permission/permissionEntity";
17
+ import PermissionsCollection from "passbolt-styleguide/src/shared/models/entity/permission/permissionsCollection";
18
18
  import EntityV2 from "passbolt-styleguide/src/shared/models/entity/abstract/entityV2";
19
19
  import UserEntity from "../user/userEntity";
20
20
 
@@ -14,7 +14,7 @@
14
14
  import FolderEntity from "./folderEntity";
15
15
  import EntityValidationError from "passbolt-styleguide/src/shared/models/entity/abstract/entityValidationError";
16
16
  import EntitySchema from "passbolt-styleguide/src/shared/models/entity/abstract/entitySchema";
17
- import PermissionEntity from "../permission/permissionEntity";
17
+ import PermissionEntity from "passbolt-styleguide/src/shared/models/entity/permission/permissionEntity";
18
18
  import {
19
19
  defaultFolderDto,
20
20
  folderWithReadPermissionDto,
@@ -22,7 +22,7 @@ import {
22
22
  minimalFolderDto,
23
23
  } from "passbolt-styleguide/src/shared/models/entity/folder/folderEntity.test.data";
24
24
  import { ownerPermissionDto } from "passbolt-styleguide/src/shared/models/entity/permission/permissionEntity.test.data";
25
- import PermissionsCollection from "../permission/permissionsCollection";
25
+ import PermissionsCollection from "passbolt-styleguide/src/shared/models/entity/permission/permissionsCollection";
26
26
  import * as assertEntityProperty from "passbolt-styleguide/test/assert/assertEntityProperty";
27
27
  import UserEntity from "../user/userEntity";
28
28
 
@@ -21,7 +21,7 @@ import {
21
21
  updatePermissionDto,
22
22
  } from "passbolt-styleguide/src/shared/models/entity/permission/permissionEntity.test.data";
23
23
  import { v4 as uuidv4 } from "uuid";
24
- import PermissionEntity from "../permission/permissionEntity";
24
+ import PermissionEntity from "passbolt-styleguide/src/shared/models/entity/permission/permissionEntity";
25
25
 
26
26
  describe("Folders collection entity", () => {
27
27
  it("schema must validate", () => {
@@ -10,7 +10,7 @@
10
10
  * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
11
  * @link https://www.passbolt.com Passbolt(tm)
12
12
  */
13
- import GroupEntity from "../groupEntity";
13
+ import GroupEntity from "passbolt-styleguide/src/shared/models/entity/group/groupEntity";
14
14
  import Entity from "passbolt-styleguide/src/shared/models/entity/abstract/entity";
15
15
  import GroupUpdateSecretsCollection from "../../secret/groupUpdate/groupUpdateSecretsCollection";
16
16
  import GroupUserChangesCollection from "../../groupUser/change/groupUserChangesCollection";
@@ -12,7 +12,7 @@
12
12
  */
13
13
  import EntityValidationError from "passbolt-styleguide/src/shared/models/entity/abstract/entityValidationError";
14
14
  import GroupUpdateEntity from "./groupUpdateEntity";
15
- import GroupEntity from "../groupEntity";
15
+ import GroupEntity from "passbolt-styleguide/src/shared/models/entity/group/groupEntity";
16
16
  import EntitySchema from "passbolt-styleguide/src/shared/models/entity/abstract/entitySchema";
17
17
 
18
18
  describe("Group update entity", () => {
@@ -10,8 +10,8 @@
10
10
  * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
11
  * @link https://www.passbolt.com Passbolt(tm)
12
12
  */
13
- import GroupEntity from "../../group/groupEntity";
14
- import PermissionEntity from "../permissionEntity";
13
+ import GroupEntity from "passbolt-styleguide/src/shared/models/entity/group/groupEntity";
14
+ import PermissionEntity from "passbolt-styleguide/src/shared/models/entity/permission/permissionEntity";
15
15
  import Entity from "passbolt-styleguide/src/shared/models/entity/abstract/entity";
16
16
  import LoggedUserEntity from "../../user/actionLog/loggedUserEntity";
17
17
  import EntitySchema from "passbolt-styleguide/src/shared/models/entity/abstract/entitySchema";
@@ -12,7 +12,7 @@
12
12
  * @since 5.4.0
13
13
  */
14
14
  import { defaultUserDto } from "passbolt-styleguide/src/shared/models/entity/user/userEntity.test.data";
15
- import PermissionEntity from "../permissionEntity";
15
+ import PermissionEntity from "passbolt-styleguide/src/shared/models/entity/permission/permissionEntity";
16
16
  import { v4 as uuidv4 } from "uuid";
17
17
 
18
18
  export const defaultUpdatePermissionDto = (data) => ({
@@ -11,7 +11,7 @@
11
11
  * @link https://www.passbolt.com Passbolt(tm)
12
12
  * @since 2.13.0
13
13
  */
14
- import PermissionEntity from "../permissionEntity";
14
+ import PermissionEntity from "passbolt-styleguide/src/shared/models/entity/permission/permissionEntity";
15
15
  import Entity from "passbolt-styleguide/src/shared/models/entity/abstract/entity";
16
16
  import EntitySchema from "passbolt-styleguide/src/shared/models/entity/abstract/entitySchema";
17
17
 
@@ -11,8 +11,8 @@
11
11
  * @link https://www.passbolt.com Passbolt(tm)
12
12
  * @since 2.13.0
13
13
  */
14
- import PermissionEntity from "../permissionEntity";
15
- import PermissionsCollection from "../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 PermissionChangeEntity from "./permissionChangeEntity";
17
17
  import EntityCollection from "passbolt-styleguide/src/shared/models/entity/abstract/entityCollection";
18
18
  import EntitySchema from "passbolt-styleguide/src/shared/models/entity/abstract/entitySchema";
@@ -13,8 +13,8 @@
13
13
  */
14
14
  import PermissionChangesCollection from "./permissionChangesCollection";
15
15
  import EntitySchema from "passbolt-styleguide/src/shared/models/entity/abstract/entitySchema";
16
- import PermissionEntity from "../permissionEntity";
17
- import PermissionsCollection from "../permissionsCollection";
16
+ import PermissionEntity from "passbolt-styleguide/src/shared/models/entity/permission/permissionEntity";
17
+ import PermissionsCollection from "passbolt-styleguide/src/shared/models/entity/permission/permissionsCollection";
18
18
 
19
19
  describe("PermissionChangesCollection", () => {
20
20
  it("schema must validate", () => {
@@ -11,8 +11,8 @@
11
11
  * @link https://www.passbolt.com Passbolt(tm)
12
12
  * @since 2.13.0
13
13
  */
14
- import PermissionEntity from "../permission/permissionEntity";
15
- import PermissionsCollection from "../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 FavoriteEntity from "../favorite/favoriteEntity";
17
17
  import ResourceTypeEntity from "passbolt-styleguide/src/shared/models/entity/resourceType/resourceTypeEntity";
18
18
  import TagsCollection from "../tag/tagsCollection";
@@ -24,7 +24,7 @@ import { defaultResourceMetadataDto } from "passbolt-styleguide/src/shared/model
24
24
  import ResourceMetadataEntity from "passbolt-styleguide/src/shared/models/entity/resource/metadata/resourceMetadataEntity";
25
25
  import { v4 as uuidv4 } from "uuid";
26
26
  import { metadata } from "passbolt-styleguide/test/fixture/encryptedMetadata/metadata";
27
- import PermissionEntity from "../permission/permissionEntity";
27
+ import PermissionEntity from "passbolt-styleguide/src/shared/models/entity/permission/permissionEntity";
28
28
 
29
29
  describe("Resource entity", () => {
30
30
  describe("ResourceEntity::getSchema", () => {
@@ -11,389 +11,28 @@
11
11
  * @link https://www.passbolt.com Passbolt(tm)
12
12
  * @since 2.13.0
13
13
  */
14
- import EntityV2 from "passbolt-styleguide/src/shared/models/entity/abstract/entityV2";
15
- import RoleEntity from "passbolt-styleguide/src/shared/models/entity/role/roleEntity";
16
- import PendingAccountRecoveryRequestEntity from "passbolt-styleguide/src/shared/models/entity/accountRecovery/pendingAccountRecoveryRequestEntity";
17
- import GpgkeyEntity from "passbolt-styleguide/src/shared/models/entity/gpgkey/gpgkeyEntity";
18
- import ProfileEntity from "passbolt-styleguide/src/shared/models/entity/profile/profileEntity";
19
- import GroupsUsersCollection from "passbolt-styleguide/src/shared/models/entity/groupUser/groupsUsersCollection";
20
- import AccountRecoveryUserSettingEntity from "passbolt-styleguide/src/shared/models/entity/accountRecovery/accountRecoveryUserSettingEntity";
14
+ import UserEntity from "passbolt-styleguide/src/shared/models/entity/user/userEntity";
21
15
  import AppEmailValidatorService from "../../../service/validator/appEmailValidatorService";
22
16
 
23
- const ENTITY_NAME = "User";
24
-
25
- class UserEntity extends EntityV2 {
26
- /**
27
- * @inheritDoc
28
- */
29
- constructor(dto, options = {}) {
30
- super(dto, options);
31
-
32
- // Associations
33
- if (this._props.profile) {
34
- this._profile = new ProfileEntity(this._props.profile, { ...options, clone: false });
35
- delete this._props.profile;
36
- }
37
- if (this._props.role) {
38
- this._role = new RoleEntity(this._props.role, { ...options, clone: false });
39
- delete this._props.role;
40
- }
41
- if (this._props.gpgkey) {
42
- this._gpgkey = new GpgkeyEntity(this._props.gpgkey, { ...options, clone: false });
43
- delete this._props.gpgkey;
44
- }
45
- if (this._props.groups_users) {
46
- this._groups_users = new GroupsUsersCollection(this._props.groups_users, { ...options, clone: false });
47
- delete this._props.groups_users;
48
- }
49
- if (this._props.account_recovery_user_setting) {
50
- this._account_recovery_user_setting = new AccountRecoveryUserSettingEntity(
51
- this._props.account_recovery_user_setting,
52
- { ...options, clone: false },
53
- );
54
- delete this._props.account_recovery_user_setting;
55
- }
56
- if (this._props.pending_account_recovery_request) {
57
- this._pending_account_recovery_request = new PendingAccountRecoveryRequestEntity(
58
- this._props.pending_account_recovery_request,
59
- { ...options, clone: false },
60
- );
61
- delete this._props.pending_account_recovery_request;
62
- }
63
- }
64
-
17
+ /**
18
+ * Browser-extension flavour of UserEntity.
19
+ *
20
+ * Injects the application email validator on the `username` schema property. The validator
21
+ * depends on OrganizationSettingsModel, a bext-only static cache that cannot be hosted in
22
+ * the styleguide. All other behaviour (associations, marshalling, serialization, getters)
23
+ * is inherited from the styleguide source of truth.
24
+ */
25
+ class BextUserEntity extends UserEntity {
65
26
  /**
66
27
  * @inheritDoc
67
- * Marshall the last_logged_in to null if empty string given
68
- */
69
- marshall() {
70
- if (this._props.last_logged_in === "") {
71
- this._props.last_logged_in = null;
72
- }
73
- super.marshall();
74
- }
75
-
76
- /**
77
- * Get user entity schema
78
- * @returns {Object} schema
28
+ * Override the schema to attach the custom email validator on `username`.
29
+ * `super.getSchema()` returns a fresh object literal each call, so mutating is safe.
79
30
  */
80
31
  static getSchema() {
81
- return {
82
- type: "object",
83
- required: [
84
- "username",
85
- // "role_id",
86
- ],
87
- properties: {
88
- id: {
89
- type: "string",
90
- format: "uuid",
91
- },
92
- role_id: {
93
- type: "string",
94
- format: "uuid",
95
- },
96
- username: {
97
- type: "string",
98
- custom: AppEmailValidatorService.validate,
99
- },
100
- active: {
101
- type: "boolean",
102
- },
103
- deleted: {
104
- type: "boolean",
105
- },
106
- disabled: {
107
- type: "string",
108
- format: "date-time",
109
- nullable: true,
110
- },
111
- missing_metadata_key_ids: {
112
- type: "array",
113
- items: {
114
- type: "string",
115
- format: "uuid",
116
- },
117
- },
118
- created: {
119
- type: "string",
120
- format: "date-time",
121
- },
122
- modified: {
123
- type: "string",
124
- format: "date-time",
125
- },
126
- last_logged_in: {
127
- type: "string",
128
- format: "date-time",
129
- nullable: true,
130
- },
131
- is_mfa_enabled: {
132
- type: "boolean",
133
- nullable: true,
134
- },
135
- locale: {
136
- type: "string",
137
- pattern: /^[a-z]{2}-[A-Z]{2}$/,
138
- nullable: true,
139
- },
140
- // Associated models
141
- role: RoleEntity.getSchema(),
142
- profile: ProfileEntity.getSchema(),
143
- gpgkey: GpgkeyEntity.getSchema(),
144
- groups_users: GroupsUsersCollection.getSchema(),
145
- account_recovery_user_setting: AccountRecoveryUserSettingEntity.getSchema(),
146
- pending_account_recovery_request: PendingAccountRecoveryRequestEntity.getSchema(),
147
- },
148
- };
149
- }
150
-
151
- /*
152
- * ==================================================
153
- * Serialization
154
- * ==================================================
155
- */
156
- /**
157
- * Return a DTO ready to be sent to API
158
- * @param {object} [contain] optional for example {profile: {avatar:true}}
159
- * @returns {*}
160
- */
161
- toDto(contain) {
162
- const result = Object.assign({}, this._props);
163
- if (!contain) {
164
- return result;
165
- }
166
- if (this.role && contain.role) {
167
- result.role = this.role.toDto();
168
- }
169
- if (this.profile && contain.profile) {
170
- if (contain.profile === true) {
171
- result.profile = this.profile.toDto();
172
- } else {
173
- result.profile = this.profile.toDto(contain.profile);
174
- }
175
- }
176
- if (this.gpgkey && contain.gpgkey) {
177
- result.gpgkey = this.gpgkey.toDto();
178
- }
179
- if (this.groupsUsers && contain.groups_users) {
180
- result.groups_users = this.groupsUsers.toDto();
181
- }
182
- if (this.accountRecoveryUserSetting && contain.account_recovery_user_setting) {
183
- result.account_recovery_user_setting = this.accountRecoveryUserSetting.toDto();
184
- }
185
- if (this.pendingAccountRecoveryUserRequest && contain.pending_account_recovery_request) {
186
- result.pending_account_recovery_request = this.pendingAccountRecoveryUserRequest.toDto();
187
- }
188
- return result;
189
- }
190
-
191
- /**
192
- * Customizes JSON stringification behavior
193
- * @returns {*}
194
- */
195
- toJSON() {
196
- return this.toDto(UserEntity.ALL_CONTAIN_OPTIONS);
197
- }
198
-
199
- /*
200
- * ==================================================
201
- * Dynamic properties getters
202
- * ==================================================
203
- */
204
- /**
205
- * Get user id
206
- * @returns {(string|null)} uuid
207
- */
208
- get id() {
209
- return this._props.id || null;
210
- }
211
-
212
- /**
213
- * Get user role id
214
- * @returns {(string|null)} uuid
215
- */
216
- get roleId() {
217
- return this._props.role_id || null;
218
- }
219
-
220
- /**
221
- * Get user username
222
- * @returns {string} email
223
- */
224
- get username() {
225
- return this._props.username;
226
- }
227
-
228
- /**
229
- * Get user activation status
230
- * @returns {(boolean|null)} true if user completed the setup
231
- */
232
- get isActive() {
233
- if (typeof this._props.active === "undefined") {
234
- return null;
235
- }
236
- return this._props.active;
237
- }
238
-
239
- /**
240
- * Get user deleted status
241
- * @returns {(boolean|null)} true if user is deleted
242
- */
243
- get isDeleted() {
244
- if (typeof this._props.deleted === "undefined") {
245
- return null;
246
- }
247
- return this._props.deleted;
248
- }
249
-
250
- /**
251
- * Get missing metadata keys ids for a user
252
- * @returns {(array)} the list of missing metadata keys
253
- */
254
- get missingMetadataKeysIds() {
255
- return this._props.missing_metadata_key_ids || [];
256
- }
257
-
258
- /**
259
- * Get user creation date
260
- * @returns {(string|null)} date
261
- */
262
- get created() {
263
- return this._props.created || null;
264
- }
265
-
266
- /**
267
- * Get user modification date
268
- * @returns {(string|null)} date
269
- */
270
- get modified() {
271
- return this._props.modified || null;
272
- }
273
-
274
- /**
275
- * Get user last login date
276
- * @returns {(string|null)} date
277
- */
278
- get lastLoggedIn() {
279
- return this._props.last_logged_in || null;
280
- }
281
-
282
- /**
283
- * Get mfa enabled flag
284
- * @returns {(boolean|null)} true if mfa is enabled
285
- */
286
- get isMfaEnabled() {
287
- if (typeof this._props.is_mfa_enabled === "undefined") {
288
- return null;
289
- }
290
- return this._props.is_mfa_enabled;
291
- }
292
-
293
- /**
294
- * Get the user locale.
295
- * @returns {(string|null)}
296
- */
297
- get locale() {
298
- return this._props.locale || null;
299
- }
300
-
301
- /**
302
- * Set the user locale
303
- * @params {string} locale The locale to set
304
- */
305
- set locale(locale) {
306
- this._props.locale = locale;
307
- }
308
-
309
- /**
310
- * Set the user missing metadata keys ids
311
- * @params {array} the missing metadata keys ids
312
- */
313
- set missingMetadataKeysIds(missingMetadataKeysIds) {
314
- this._props.missing_metadata_key_ids = missingMetadataKeysIds;
315
- }
316
-
317
- /**
318
- * UserEntity.ALL_CONTAIN_OPTIONS
319
- * @returns {object} all contain options that can be used in toDto()
320
- */
321
- static get ALL_CONTAIN_OPTIONS() {
322
- return {
323
- profile: ProfileEntity.ALL_CONTAIN_OPTIONS,
324
- role: true,
325
- gpgkey: true,
326
- groups_users: true,
327
- account_recovery_user_setting: true,
328
- pending_account_recovery_request: true,
329
- };
330
- }
331
-
332
- /*
333
- * ==================================================
334
- * Static properties getters
335
- * ==================================================
336
- */
337
- /**
338
- * ProfileEntity.ENTITY_NAME
339
- * @returns {string}
340
- */
341
- static get ENTITY_NAME() {
342
- return ENTITY_NAME;
343
- }
344
-
345
- /*
346
- * ==================================================
347
- * Associated properties getters
348
- * ==================================================
349
- */
350
- /**
351
- * Get user profile
352
- * @returns {(ProfileEntity|null)} profile
353
- */
354
- get profile() {
355
- return this._profile || null;
356
- }
357
-
358
- /**
359
- * Get user role
360
- * @returns {(RoleEntity|null)} role
361
- */
362
- get role() {
363
- return this._role || null;
364
- }
365
-
366
- /**
367
- * Get user gpgkey
368
- * @returns {(GpgkeyEntity|null)} key
369
- */
370
- get gpgkey() {
371
- return this._gpgkey || null;
372
- }
373
-
374
- /**
375
- * Get user groups
376
- * @returns {(GroupsUsersCollection|null)} users groups
377
- */
378
- get groupsUsers() {
379
- return this._groups_users || null;
380
- }
381
-
382
- /**
383
- * Get user account recover setting
384
- * @returns {(AccountRecoveryUserSettingEntity|null)} account recover setting
385
- */
386
- get accountRecoveryUserSetting() {
387
- return this._account_recovery_user_setting || null;
388
- }
389
-
390
- /**
391
- * Get the pending account recovery request
392
- * @returns {AccountRecoveryRequestEntity|null} pending account recovery request
393
- */
394
- get pendingAccountRecoveryUserRequest() {
395
- return this._pending_account_recovery_request || null;
32
+ const schema = super.getSchema();
33
+ schema.properties.username.custom = AppEmailValidatorService.validate;
34
+ return schema;
396
35
  }
397
36
  }
398
37
 
399
- export default UserEntity;
38
+ export default BextUserEntity;