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.
- package/.devcontainer/safe-chain-config.json +2 -1
- package/.github/ISSUE_TEMPLATE/bug_report.md +30 -22
- package/.github/ISSUE_TEMPLATE/config.yml +11 -0
- package/.jpmignore +0 -1
- package/CHANGELOG.md +82 -1
- package/CONTRIBUTING.md +1 -12
- package/README.md +5 -16
- package/RELEASE_NOTES.md +2 -3
- package/SECURITY.md +7 -0
- package/i18next.config.js +28 -0
- package/jest.config.json +1 -0
- package/package.json +20 -40
- package/src/all/background_page/controller/accountRecovery/reviewRequestController.test.js +1 -1
- package/src/all/background_page/{event → controller/actionLog}/findAllForActionLogController.js +1 -1
- package/src/all/background_page/{event → controller/actionLog}/findAllForActionLogController.test.js +4 -4
- package/src/all/background_page/controller/export/exportResourcesFileController.test.js +7 -2
- package/src/all/background_page/controller/folder/folderCreateController.js +3 -1
- package/src/all/background_page/controller/group/findMyGroupsController.test.js +2 -2
- package/src/all/background_page/controller/group/getOrFindGroupsController.js +61 -0
- package/src/all/background_page/controller/group/getOrFindGroupsController.test.js +69 -0
- package/src/all/background_page/controller/group/getOrFindGroupsUsersController.js +62 -0
- package/src/all/background_page/controller/group/getOrFindGroupsUsersController.test.js +69 -0
- package/src/all/background_page/controller/group/groupCreateController.js +1 -1
- package/src/all/background_page/controller/group/groupCreateController.test.js +1 -1
- package/src/all/background_page/controller/group/groupUpdateController.js +1 -1
- package/src/all/background_page/controller/group/updateAllGroupsLocalStorageController.test.js +1 -1
- package/src/all/background_page/controller/keyring/synchroniseKeyringController.js +51 -0
- package/src/all/background_page/controller/keyring/synchroniseKeyringController.test.js +49 -0
- package/src/all/background_page/controller/metadata/shareMetadataKeyPrivateController.test.js +1 -1
- package/src/all/background_page/controller/move/moveFolderController.js +0 -2
- package/src/all/background_page/controller/permission/FindAcoPermissionsForDisplayController.js +1 -1
- package/src/all/background_page/controller/permission/FindAcoPermissionsForDisplayController.test.js +2 -2
- package/src/all/background_page/controller/resource/findAllByIdsForDisplayPermissionsController.test.js +8 -3
- package/src/all/background_page/controller/resource/findAllIdsByIsSharedWithGroupController.test.js +9 -4
- package/src/all/background_page/controller/resource/resourceUpdateController.test.js +1 -2
- package/src/all/background_page/controller/resourceLocalStorage/resourceUpdateLocalStorageController.test.js +5 -2
- package/src/all/background_page/controller/share/findFoldersForShareController.js +66 -0
- package/src/all/background_page/controller/share/findFoldersForShareController.test.js +70 -0
- package/src/all/background_page/controller/share/searchUsersAndGroupsController.js +4 -4
- package/src/all/background_page/controller/share/searchUsersAndGroupsController.test.js +8 -23
- package/src/all/background_page/controller/share/shareResourcesController.test.js +2 -2
- package/src/all/background_page/controller/subscription/createSubscriptionKeyController.js +63 -0
- package/src/all/background_page/controller/subscription/createSubscriptionKeyController.test.js +56 -0
- package/src/all/background_page/controller/subscription/deleteSubscriptionKeyController.js +55 -0
- package/src/all/background_page/controller/subscription/deleteSubscriptionKeyController.test.js +50 -0
- package/src/all/background_page/controller/user/deleteUserController.test.js +1 -1
- package/src/all/background_page/controller/user/getOrFindUsersController.js +61 -0
- package/src/all/background_page/controller/user/getOrFindUsersController.test.js +69 -0
- package/src/all/background_page/error/deleteDryRunError.js +1 -1
- package/src/all/background_page/event/actionLogEvents.js +1 -1
- package/src/all/background_page/event/appEvents.js +25 -0
- package/src/all/background_page/event/groupEvents.js +26 -0
- package/src/all/background_page/event/keyringEvents.js +12 -0
- package/src/all/background_page/event/shareEvents.js +3 -9
- package/src/all/background_page/event/userEvents.js +13 -0
- package/src/all/background_page/model/config.js +12 -2
- package/src/all/background_page/model/entity/folder/folderEntity.js +2 -2
- package/src/all/background_page/model/entity/folder/folderEntity.test.js +2 -2
- package/src/all/background_page/model/entity/folder/foldersCollection.test.js +1 -1
- package/src/all/background_page/model/entity/group/update/groupUpdateEntity.js +1 -1
- package/src/all/background_page/model/entity/group/update/groupUpdateEntity.test.js +1 -1
- package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionEntity.js +2 -2
- package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionEntity.test.data.js +1 -1
- package/src/all/background_page/model/entity/permission/change/permissionChangeEntity.js +1 -1
- package/src/all/background_page/model/entity/permission/change/permissionChangesCollection.js +2 -2
- package/src/all/background_page/model/entity/permission/change/permissionChangesCollection.test.js +2 -2
- package/src/all/background_page/model/entity/resource/resourceEntity.js +2 -2
- package/src/all/background_page/model/entity/resource/resourceEntity.test.js +1 -1
- package/src/all/background_page/model/entity/user/userEntity.js +16 -377
- package/src/all/background_page/model/entity/user/userEntity.test.js +22 -297
- package/src/all/background_page/model/entity/userAndGroupSearchResultEntity/userAndGroupSearchResultEntity.js +1 -1
- package/src/all/background_page/model/folder/folderModel.js +5 -154
- package/src/all/background_page/model/group/groupModel.js +1 -1
- package/src/all/background_page/model/keyring.js +52 -17
- package/src/all/background_page/model/keyring.test.js +110 -0
- package/src/all/background_page/model/resource/resourceModel.js +2 -55
- package/src/all/background_page/model/setup/setupModel.js +2 -2
- package/src/all/background_page/model/user/userModel.js +18 -15
- package/src/all/background_page/model/user/userModel.test.js +1 -3
- package/src/all/background_page/service/api/abstract/abstractService.js +3 -17
- package/src/all/background_page/service/api/edition/passboltEditionApiService.js +64 -0
- package/src/all/background_page/service/api/edition/passboltEditionApiService.test.js +99 -0
- package/src/all/background_page/service/api/group/groupApiService.js +22 -23
- package/src/all/background_page/service/api/group/groupApiService.test.js +70 -0
- package/src/all/background_page/service/api/resource/resourceService.js +18 -12
- package/src/all/background_page/service/api/share/{shareService.js → shareApiService.js} +10 -7
- package/src/all/background_page/service/api/share/{shareService.test.js → shareApiService.test.js} +5 -5
- package/src/all/background_page/service/group/createGroupService.js +1 -1
- package/src/all/background_page/service/group/createGroupService.test.js +1 -1
- package/src/all/background_page/service/group/findAndUpdateGroupsLocalStorageService.js +56 -1
- package/src/all/background_page/service/group/findAndUpdateGroupsLocalStorageService.test.js +84 -2
- package/src/all/background_page/service/group/findGroupsService.js +5 -9
- package/src/all/background_page/service/group/findGroupsService.test.data.js +1 -1
- package/src/all/background_page/service/group/findGroupsService.test.js +10 -15
- package/src/all/background_page/service/group/getOrFindGroupsService.js +65 -0
- package/src/all/background_page/service/group/getOrFindGroupsService.test.js +168 -0
- package/src/all/background_page/service/group/getOrFindGroupsUsersService.js +51 -0
- package/src/all/background_page/service/group/getOrFindGroupsUsersService.test.js +94 -0
- package/src/all/background_page/service/group/groupUpdateService.js +5 -3
- package/src/all/background_page/service/group/groupUpdateService.test.js +10 -2
- package/src/all/background_page/service/local_storage/groupLocalStorage.js +2 -2
- package/src/all/background_page/service/local_storage/groupLocalStorage.test.js +3 -3
- package/src/all/background_page/service/local_storage/userLocalStorage.js +57 -36
- package/src/all/background_page/service/local_storage/userLocalStorage.test.js +282 -0
- package/src/all/background_page/service/metadata/createMetadataKeyService.test.js +1 -1
- package/src/all/background_page/service/metadata/saveMetadataSettingsService.test.js +1 -1
- package/src/all/background_page/service/metadata/shareMetadataKeyPrivateService.test.js +1 -1
- package/src/all/background_page/service/migrateMetadata/migrateMetadataResourcesService.js +1 -1
- package/src/all/background_page/service/move/calculatePermissionsChangesForMoveService.js +113 -0
- package/src/all/background_page/service/move/calculatePermissionsChangesForMoveService.test.data.js +38 -0
- package/src/all/background_page/service/move/calculatePermissionsChangesForMoveService.test.js +158 -0
- package/src/all/background_page/service/move/moveOneFolderService.js +6 -7
- package/src/all/background_page/service/move/moveOneFolderService.test.js +90 -90
- package/src/all/background_page/service/move/moveResourcesService.js +2 -5
- package/src/all/background_page/service/permission/findPermissionsService.js +1 -1
- package/src/all/background_page/service/resource/create/resourceCreateService.js +13 -31
- package/src/all/background_page/service/resource/create/resourceCreateService.test.js +25 -18
- package/src/all/background_page/service/resource/export/exportResourcesService.test.js +13 -4
- package/src/all/background_page/service/resource/findAndUpdateResourcesLocalStorageService.test.js +35 -28
- package/src/all/background_page/service/resource/findResourcesService.js +78 -2
- package/src/all/background_page/service/resource/findResourcesService.test.data.js +1 -1
- package/src/all/background_page/service/resource/findResourcesService.test.js +90 -31
- package/src/all/background_page/service/resource/getOrFindResourcesService.test.js +18 -8
- package/src/all/background_page/service/session_storage/keepSessionAliveService.js +3 -3
- package/src/all/background_page/service/session_storage/keepSessionAliveService.test.js +5 -3
- package/src/all/background_page/service/share/searchUsersAndGroupsService.js +41 -0
- package/src/all/background_page/service/share/searchUsersAndGroupsService.test.js +64 -0
- package/src/all/background_page/service/share/shareFoldersService.js +3 -3
- package/src/all/background_page/service/share/shareFoldersService.test.js +3 -3
- package/src/all/background_page/service/share/shareResourceService.js +4 -4
- package/src/all/background_page/service/share/shareResourceService.test.js +8 -8
- package/src/all/background_page/service/subscription/createSubscriptionKeyService.js +57 -0
- package/src/all/background_page/service/subscription/createSubscriptionKeyService.test.js +111 -0
- package/src/all/background_page/service/subscription/deleteSubscriptionKeyService.js +35 -0
- package/src/all/background_page/service/subscription/deleteSubscriptionKeyService.test.js +55 -0
- package/src/all/background_page/service/user/deleteUserService.js +4 -4
- package/src/all/background_page/service/user/deleteUserService.test.js +10 -10
- package/src/all/background_page/service/user/findAndUpdateUsersLocalStorageService.js +81 -0
- package/src/all/background_page/service/user/findAndUpdateUsersLocalStorageService.test.js +132 -0
- package/src/all/background_page/service/user/findUsersService.js +6 -6
- package/src/all/background_page/service/user/findUsersService.test.js +39 -38
- package/src/all/background_page/service/user/getOrFindUsersService.js +60 -0
- package/src/all/background_page/service/user/getOrFindUsersService.test.js +110 -0
- package/src/all/background_page/utils/assertions.js +1 -0
- package/src/all/locales/ko-KR/common.json +1 -1
- package/src/chrome/manifest.json +1 -1
- package/src/chrome-mv3/manifest.json +1 -1
- package/src/firefox/manifest.json +3 -3
- package/src/safari/manifest.json +2 -2
- package/test/jest.env-setup.js +31 -0
- package/webpack/applyOutputClean.js +69 -0
- package/webpack/base.config.js +33 -0
- package/webpack/common-blocks.js +91 -0
- package/webpack/expectedBuildArtifacts.js +51 -0
- package/webpack/i18nextExtractionPlugin.js +43 -0
- package/webpack/passboltEnvPlugin.js +41 -0
- package/webpack/webExtPlugin/index.js +75 -0
- package/webpack.chromium-mv2.config.js +40 -0
- package/webpack.chromium-mv3.config.js +40 -0
- package/webpack.common.config.js +186 -0
- package/webpack.config.js +38 -0
- package/webpack.firefox.config.js +40 -0
- package/webpack.mv2.config.js +65 -0
- package/webpack.mv3.config.js +99 -0
- package/webpack.safari-background-page.config.js +66 -57
- package/webpack.safari.config.js +44 -0
- package/Gruntfile.js +0 -471
- package/am_i_compromised.py +0 -1036
- package/am_i_compromised.sh +0 -688
- package/i18next-parser.config.js +0 -22
- package/src/all/background_page/config/config.json +0 -7
- package/src/all/background_page/config/config.json.debug +0 -7
- package/src/all/background_page/config/config.json.default +0 -7
- package/src/all/background_page/model/entity/group/groupEntity.js +0 -241
- package/src/all/background_page/model/entity/group/groupEntity.test.js +0 -136
- package/src/all/background_page/model/entity/group/groupsCollection.js +0 -166
- package/src/all/background_page/model/entity/group/groupsCollection.test.data.js +0 -34
- package/src/all/background_page/model/entity/group/groupsCollection.test.js +0 -227
- package/src/all/background_page/model/entity/permission/permissionEntity.js +0 -485
- package/src/all/background_page/model/entity/permission/permissionEntity.test.js +0 -263
- package/src/all/background_page/model/entity/permission/permissionsCollection.js +0 -486
- package/src/all/background_page/model/entity/permission/permissionsCollection.test.js +0 -700
- package/src/all/background_page/model/entity/user/usersCollection.js +0 -147
- package/src/all/background_page/model/entity/user/usersCollection.test.js +0 -223
- package/src/all/background_page/model/share/shareModel.js +0 -183
- package/src/all/background_page/model/share/shareModel.test.js +0 -61
- package/src/all/background_page/service/api/user/userService.js +0 -260
- package/src/all/background_page/service/resource/create/resourceCreateService.test.data.js +0 -55
- package/webpack-content-scripts.browser-integration.config.js +0 -57
- package/webpack-content-scripts.config.js +0 -61
- package/webpack-content-scripts.public-website-sign-in.config.js +0 -57
- package/webpack-data.config.js +0 -102
- package/webpack-data.download.config.js +0 -59
- package/webpack-data.in-form-call-to-action.config.js +0 -97
- package/webpack-data.in-form-menu.config.js +0 -97
- package/webpack-offscreens.config.js +0 -55
- package/webpack.background-page.config.js +0 -62
- 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
|
|
15
|
-
import
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
48
|
-
assertEntityProperty.string(
|
|
49
|
-
assertEntityProperty.email(
|
|
50
|
-
assertEntityProperty.required(
|
|
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
|
|
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
|
|
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("
|
|
127
|
-
it("
|
|
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
|
|
244
|
-
|
|
245
|
-
expect(entity.
|
|
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 "
|
|
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 "
|
|
15
|
-
import PermissionsCollection from "
|
|
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
|
|
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.
|
|
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.
|
|
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 "
|
|
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";
|