passbolt-browser-extension 5.13.0 → 5.14.2
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/Dockerfile +33 -3
- package/.devcontainer/devcontainer-lock.json +9 -0
- package/.devcontainer/post-start.sh +1 -2
- package/.github/workflows/codeql-analysis.yml +2 -1
- package/.github/workflows/release_candidate.yaml +3 -1
- package/.gitlab-ci.yml +1 -0
- package/CHANGELOG.md +202 -70
- package/CODEOWNERS +2 -0
- package/RELEASE_NOTES.md +4 -2
- package/package.json +9 -7
- package/renovate.json +6 -0
- package/src/all/background_page/controller/InformMenuController/InformMenuController.js +2 -5
- package/src/all/background_page/controller/InformMenuController/InformMenuController.test.js +31 -1
- package/src/all/background_page/controller/account/getAndInitializeAccountLocaleController.js +1 -1
- package/src/all/background_page/controller/account/getAndInitializeAccountLocaleController.test.js +6 -14
- package/src/all/background_page/controller/account/updatePrivateKeyController.js +7 -5
- package/src/all/background_page/controller/account/updatePrivateKeyController.test.js +18 -13
- package/src/all/background_page/controller/accountRecovery/accountRecoveryGenerateOrganizationKeyController.js +4 -2
- package/src/all/background_page/controller/accountRecovery/accountRecoveryGenerateOrganizationKeyController.test.js +25 -2
- package/src/all/background_page/controller/accountRecovery/accountRecoveryLoginController.js +1 -1
- package/src/all/background_page/controller/accountRecovery/accountRecoveryLoginController.test.js +10 -5
- package/src/all/background_page/controller/accountRecovery/recoverAccountController.js +6 -2
- package/src/all/background_page/controller/accountRecovery/recoverAccountController.test.js +11 -4
- package/src/all/background_page/controller/auth/authCheckStatus.test.data.js +6 -6
- package/src/all/background_page/controller/auth/authCheckStatusController.js +11 -3
- package/src/all/background_page/controller/auth/authCheckStatusController.test.js +74 -44
- package/src/all/background_page/controller/auth/authIsMfaRequiredController.js +11 -3
- package/src/all/background_page/controller/auth/authIsMfaRequiredController.test.js +18 -9
- package/src/all/background_page/controller/auth/authLoginController.js +1 -1
- package/src/all/background_page/controller/auth/authLoginController.test.js +10 -5
- package/src/all/background_page/controller/autofill/AutofillController.js +3 -3
- package/src/all/background_page/controller/autofill/AutofillController.test.js +20 -12
- package/src/all/background_page/controller/export/exportResourcesFileController.js +6 -3
- package/src/all/background_page/controller/export/exportResourcesFileController.test.js +34 -4
- package/src/all/background_page/controller/extension/onExtensionInstalledController.js +8 -2
- package/src/all/background_page/controller/extension/onExtensionInstalledController.test.js +5 -1
- package/src/all/background_page/controller/group/{getOrFindGroupsController.js → findGroupsByIdsForShareController.js} +9 -10
- package/src/all/background_page/controller/group/{getOrFindGroupsController.test.js → findGroupsByIdsForShareController.test.js} +8 -8
- package/src/all/background_page/controller/group/groupUpdateController.test.js +1 -0
- package/src/all/background_page/controller/import/importResourcesFileController.test.js +8 -1
- package/src/all/background_page/controller/informCallToActionController/informCallToActionController.js +2 -2
- package/src/all/background_page/controller/informCallToActionController/informCallToActionController.test.js +7 -4
- package/src/all/background_page/controller/locale/getLocaleController.js +3 -2
- package/src/all/background_page/controller/metadata/findMetadataTypesSettingsController.test.js +9 -15
- package/src/all/background_page/controller/metadata/getMetadataTypesSettingsController.test.js +9 -15
- package/src/all/background_page/controller/metadata/getOrFindMetadataKeysSettingsController.test.js +12 -22
- package/src/all/background_page/controller/metadata/shareMetadataKeyPrivateController.test.js +14 -2
- package/src/all/background_page/controller/move/moveFolderController.test.js +8 -0
- package/src/all/background_page/controller/move/moveResourcesController.test.js +8 -0
- package/src/all/background_page/controller/passwordExpiry/getOrFindPasswordExpirySettingsController.test.js +13 -8
- package/src/all/background_page/controller/passwordExpiry/savePasswordExpirySettingsController.js +4 -4
- package/src/all/background_page/controller/passwordExpiry/savePasswordExpirySettingsController.test.js +8 -10
- package/src/all/background_page/controller/permission/findPermissionsByIdsForShareController.js +62 -0
- package/src/all/background_page/controller/permission/findPermissionsByIdsForShareController.test.js +71 -0
- package/src/all/background_page/controller/recover/generateRecoverAccountRecoveryRequestKeyController.js +1 -1
- package/src/all/background_page/controller/resource/resourceCreateController.js +11 -4
- package/src/all/background_page/controller/resource/resourceCreateController.test.js +12 -1
- package/src/all/background_page/controller/resource/resourceUpdateController.js +11 -4
- package/src/all/background_page/controller/resource/resourceUpdateController.test.js +35 -2
- package/src/all/background_page/controller/resourceType/getResourceTypesController.js +5 -4
- package/src/all/background_page/controller/resourceType/getResourceTypesController.test.js +5 -2
- package/src/all/background_page/controller/resourceType/updateAllResourceTypesDeletedStatusController.js +3 -2
- package/src/all/background_page/controller/resourceType/updateAllResourceTypesDeletedStatusController.test.js +16 -3
- package/src/all/background_page/controller/secret/findSecretByResourceIdController.js +3 -3
- package/src/all/background_page/controller/secret/findSecretByResourceIdController.test.js +24 -0
- package/src/all/background_page/controller/secretRevision/findResourceSecretRevisionsForDisplayController.js +2 -1
- package/src/all/background_page/controller/setup/generateSetupKeyPairController.js +6 -3
- package/src/all/background_page/controller/setup/generateSetupKeyPairController.test.js +11 -1
- package/src/all/background_page/controller/setup/getAndInitSetupLocaleController.js +1 -1
- package/src/all/background_page/controller/setup/getAndInitSetupLocaleController.test.js +14 -18
- package/src/all/background_page/controller/setup/setSetupLocaleController.js +1 -1
- package/src/all/background_page/controller/setup/setSetupLocaleController.test.js +6 -10
- package/src/all/background_page/controller/setup/signInSetupController.js +6 -2
- package/src/all/background_page/controller/setup/signInSetupController.test.js +10 -5
- package/src/all/background_page/controller/share/shareOneFolderController.test.js +8 -0
- package/src/all/background_page/controller/share/shareResourcesController.test.js +9 -1
- package/src/all/background_page/controller/siteSettings/getOrFindSiteSettingsController.js +59 -0
- package/src/all/background_page/controller/siteSettings/getOrFindSiteSettingsController.test.js +150 -0
- package/src/all/background_page/controller/{group/getOrFindGroupsUsersController.js → user/getOrFindAllUsersController.js} +12 -17
- package/src/all/background_page/controller/user/getOrFindAllUsersController.test.js +55 -0
- package/src/all/background_page/controller/user/getOrFindLoggedInUserController.js +3 -3
- package/src/all/background_page/controller/user/getOrFindLoggedInUserController.test.js +19 -15
- package/src/all/background_page/controller/user/updateUserLocalStorageController.test.js +8 -5
- package/src/all/background_page/event/accountRecoveryEvents.js +4 -4
- package/src/all/background_page/event/appEvents.js +7 -2
- package/src/all/background_page/event/authEvents.js +2 -2
- package/src/all/background_page/event/groupEvents.js +4 -17
- package/src/all/background_page/event/informCallToActionEvents.js +1 -1
- package/src/all/background_page/event/informMenuEvents.js +1 -1
- package/src/all/background_page/event/localeEvents.js +4 -3
- package/src/all/background_page/event/permissionEvents.js +13 -0
- package/src/all/background_page/event/recoverEvents.js +4 -4
- package/src/all/background_page/event/resourceEvents.js +6 -15
- package/src/all/background_page/event/resourceTypeEvents.js +4 -3
- package/src/all/background_page/event/setupEvents.js +4 -4
- package/src/all/background_page/event/siteSettingsEvents.js +29 -0
- package/src/all/background_page/event/userEvents.js +4 -8
- package/src/all/background_page/index.js +0 -37
- package/src/all/background_page/model/entity/account/abstractAccountEntity.js +2 -2
- package/src/all/background_page/model/entity/account/accountAccountRecoveryEntity.js +7 -17
- package/src/all/background_page/model/entity/account/accountEntity.js +7 -14
- package/src/all/background_page/model/entity/account/accountKitEntity.js +1 -2
- package/src/all/background_page/model/entity/account/accountRecoverEntity.js +4 -14
- package/src/all/background_page/model/entity/account/accountSetupEntity.js +4 -14
- package/src/all/background_page/model/entity/account/accountTemporaryEntity.js +2 -5
- package/src/all/background_page/model/entity/gpgkey/generate/generateGpgKeyPairOptionsEntity.test.js +5 -5
- package/src/all/background_page/model/entity/localStorage/localStorageMetadataEntity.js +49 -0
- package/src/all/background_page/model/entity/localStorage/localStorageMetadataEntity.test.data.js +23 -0
- package/src/all/background_page/model/entity/localStorage/localStorageMetadataEntity.test.js +51 -0
- package/src/all/background_page/model/entity/{organizationSettings/organizationSettingsEntity.js → siteSettings/siteSettingsEntity.js} +17 -24
- package/src/all/background_page/model/entity/{organizationSettings/organizationSettingsEntity.test.data.js → siteSettings/siteSettingsEntity.test.data.js} +9 -9
- package/src/all/background_page/model/entity/{organizationSettings/organizationSettingsEntity.test.js → siteSettings/siteSettingsEntity.test.js} +30 -39
- package/src/all/background_page/model/entity/user/userEntity.test.js +6 -6
- package/src/all/background_page/model/export/resources/resourcesKdbxExporter.js +40 -3
- package/src/all/background_page/model/export/resources/resourcesKdbxExporter.test.js +122 -0
- package/src/all/background_page/model/import/resources/resourcesKdbxImportParser.js +1 -1
- package/src/all/background_page/model/locale/localeModel.js +13 -8
- package/src/all/background_page/model/passwordExpiry/passwordExpirySettingsModel.js +6 -6
- package/src/all/background_page/model/passwordExpiry/passwordExpirySettingsModel.test.js +3 -2
- package/src/all/background_page/model/resource/resourceModel.js +4 -4
- package/src/all/background_page/model/user/userModel.js +7 -28
- package/src/all/background_page/model/user/userModel.test.js +51 -99
- package/src/all/background_page/pagemod/appBootstrapPagemod.js +4 -1
- package/src/all/background_page/pagemod/appBootstrapPagemod.test.js +5 -2
- package/src/all/background_page/pagemod/appPagemod.js +32 -6
- package/src/all/background_page/pagemod/appPagemod.test.js +22 -10
- package/src/all/background_page/pagemod/authPagemod.js +2 -10
- package/src/all/background_page/pagemod/authPagemod.test.js +4 -4
- package/src/all/background_page/pagemod/pagemodManager.test.js +5 -2
- package/src/all/background_page/pagemod/quickAccessPagemod.js +2 -2
- package/src/all/background_page/pagemod/quickAccessPagemod.test.js +4 -4
- package/src/all/background_page/pagemod/recoverPagemod.js +2 -2
- package/src/all/background_page/pagemod/recoverPagemod.test.js +6 -0
- package/src/all/background_page/pagemod/setupPagemod.js +2 -2
- package/src/all/background_page/pagemod/setupPagemod.test.js +6 -0
- package/src/all/background_page/pagemod/webIntegrationPagemod.js +21 -2
- package/src/all/background_page/pagemod/webIntegrationPagemod.test.js +16 -25
- package/src/all/background_page/service/account/getActiveAccountService.js +2 -3
- package/src/all/background_page/service/account/getLegacyAccountService.js +3 -14
- package/src/all/background_page/service/account/updateSsoCredentialsService.js +9 -5
- package/src/all/background_page/service/api/group/groupApiService.js +9 -16
- package/src/all/background_page/service/api/group/groupApiService.test.js +59 -26
- package/src/all/background_page/service/api/siteSettings/siteSettingsApiService.js +46 -0
- package/src/all/background_page/service/api/siteSettings/siteSettingsApiService.test.js +63 -0
- package/src/all/background_page/service/auth/checkAuthStatusService.js +27 -14
- package/src/all/background_page/service/auth/checkAuthStatusService.test.js +80 -62
- package/src/all/background_page/service/auth/postLoginService.js +3 -3
- package/src/all/background_page/service/auth/postLoginService.test.js +4 -4
- package/src/all/background_page/service/auth/startLoopAuthSessionCheckService.js +5 -1
- package/src/all/background_page/service/auth/startLoopAuthSessionCheckService.test.js +14 -8
- package/src/all/background_page/service/authenticationStatusService.js +13 -18
- package/src/all/background_page/service/authenticationStatusService.test.js +9 -6
- package/src/all/background_page/service/crypto/generateGpgKeyPairService.test.js +5 -5
- package/src/all/background_page/service/crypto/getGpgKeyCreationDateService.js +7 -6
- package/src/all/background_page/service/crypto/getGpgKeyCreationDateService.test.js +10 -7
- package/src/all/background_page/service/extension/onExtensionUpdateAvailableService.js +7 -2
- package/src/all/background_page/service/extension/onExtensionUpdateAvailableService.test.js +5 -5
- package/src/all/background_page/service/group/findGroupsService.js +42 -1
- package/src/all/background_page/service/group/findGroupsService.test.js +82 -0
- package/src/all/background_page/service/group/groupUpdateSecretsCryptoService.js +82 -0
- package/src/all/background_page/service/group/groupUpdateSecretsCryptoService.test.js +102 -0
- package/src/all/background_page/service/group/groupUpdateService.js +49 -78
- package/src/all/background_page/service/group/groupUpdateService.test.js +136 -0
- package/src/all/background_page/service/localStorage/localStorageService.js +8 -6
- package/src/all/background_page/service/localStorage/localStorageService.test.js +33 -15
- package/src/all/background_page/service/local_storage/abstractLocalStorage.js +193 -0
- package/src/all/background_page/service/local_storage/abstractLocalStorage.test.data.js +45 -0
- package/src/all/background_page/service/local_storage/abstractLocalStorage.test.js +271 -0
- package/src/all/background_page/service/local_storage/activeSessionLocalStorage.js +105 -0
- package/src/all/background_page/service/local_storage/activeSessionLocalStorage.test.js +153 -0
- package/src/all/background_page/service/local_storage/rbacLocalStorage.js +10 -82
- package/src/all/background_page/service/local_storage/rbacLocalStorage.test.js +8 -8
- package/src/all/background_page/service/local_storage/resourceTypeLocalStorage.js +10 -43
- package/src/all/background_page/service/local_storage/resourceTypeLocalStorage.test.js +68 -0
- package/src/all/background_page/service/local_storage/siteSettingsLocalStorage.js +104 -0
- package/src/all/background_page/service/local_storage/siteSettingsLocalStorage.test.js +114 -0
- package/src/all/background_page/service/local_storage/userMeLocalStorage.js +50 -0
- package/src/all/background_page/service/{sessionStorage/userMeSessionStorageService.test.js → local_storage/userMeLocalStorage.test.js} +55 -36
- package/src/all/background_page/service/metadata/encryptMetadataService.js +3 -3
- package/src/all/background_page/service/metadata/encryptMetadataService.test.js +11 -11
- package/src/all/background_page/service/metadata/findAndUpdateMetadataSettingsLocalStorageService.js +4 -4
- package/src/all/background_page/service/metadata/findAndUpdateMetadataSettingsLocalStorageService.test.js +18 -16
- package/src/all/background_page/service/metadata/getOrFindMetadataSettingsService.test.js +6 -8
- package/src/all/background_page/service/metadata/rotateMetadata/rotateResourcesMetadataKeyService.test.js +4 -4
- package/src/all/background_page/service/metadata/shareMetadataKeyPrivateService.js +3 -3
- package/src/all/background_page/service/metadata/shareMetadataKeyPrivateService.test.js +1 -1
- package/src/all/background_page/service/metadata/verifyOrTrustMetadataKeyService.js +4 -4
- package/src/all/background_page/service/metadata/verifyOrTrustMetadataKeyService.test.js +9 -7
- package/src/all/background_page/service/migrateMetadata/migrateMetadataResourcesService.js +4 -4
- package/src/all/background_page/service/migrateMetadata/migrateMetadataResourcesService.test.js +6 -6
- package/src/all/background_page/service/rbac/findAndUpdateRbacsLocalStorageService.js +2 -2
- package/src/all/background_page/service/rbac/getOrFindRbacService.js +1 -1
- package/src/all/background_page/service/resource/create/resourceCreateService.js +41 -51
- package/src/all/background_page/service/resource/create/resourceCreateService.test.js +100 -98
- package/src/all/background_page/service/resource/export/exportResourcesService.js +7 -7
- package/src/all/background_page/service/resource/findAndUpdateResourcesLocalStorageService.js +4 -4
- package/src/all/background_page/service/resource/findResourcesService.js +13 -16
- package/src/all/background_page/service/resource/findResourcesService.test.js +12 -11
- package/src/all/background_page/service/resource/getOrFindResourcesService.js +3 -3
- package/src/all/background_page/service/resource/import/ImportResourcesService.js +9 -9
- package/src/all/background_page/service/resource/import/ImportResourcesService.test.js +30 -15
- package/src/all/background_page/service/resource/update/resourceUpdateService.js +38 -19
- package/src/all/background_page/service/resource/update/resourceUpdateService.test.js +64 -31
- package/src/all/background_page/service/resourceType/getOrFindResourceTypesService.js +49 -0
- package/src/all/background_page/service/resourceType/getOrFindResourceTypesService.test.js +61 -0
- package/src/all/background_page/service/resourceType/getSecretSchemaResourceTypeService.js +44 -0
- package/src/all/background_page/service/resourceType/updateResourceTypesService.js +6 -4
- package/src/all/background_page/service/resourceType/updateResourceTypesService.test.js +19 -14
- package/src/all/background_page/service/secretRevisions/findAndDecryptSecretRevisionsService.js +5 -4
- package/src/all/background_page/service/secretRevisions/findAndDecryptSecretRevisionsService.test.js +16 -9
- package/src/all/background_page/service/share/shareResourceService.js +4 -4
- package/src/all/background_page/service/share/shareResourceService.test.js +6 -6
- package/src/all/background_page/service/siteSettings/findAndUpdateSiteSettingsLocalStorageService.js +77 -0
- package/src/all/background_page/service/siteSettings/findAndUpdateSiteSettingsLocalStorageService.test.js +130 -0
- package/src/all/background_page/service/siteSettings/findSiteSettingsService.js +47 -0
- package/src/all/background_page/service/siteSettings/findSiteSettingsService.test.js +68 -0
- package/src/all/background_page/service/siteSettings/getOrFindSiteSettingsService.js +84 -0
- package/src/all/background_page/service/siteSettings/getOrFindSiteSettingsService.test.js +175 -0
- package/src/all/background_page/service/siteSettings/siteSettingsRuntimeCache.js +70 -0
- package/src/all/background_page/service/sso/generateSsoKitService.test.js +2 -2
- package/src/all/background_page/service/toolbar/toolbarService.js +6 -4
- package/src/all/background_page/service/toolbar/toolbarService.test.js +14 -13
- package/src/all/background_page/service/user/findAndUpdateUsersLocalStorageService.js +4 -4
- package/src/all/background_page/service/user/findAndUpdateUsersLocalStorageService.test.js +3 -3
- package/src/all/background_page/service/user/getOrFindMeService.js +64 -0
- package/src/all/background_page/service/user/getOrFindMeService.test.js +65 -0
- package/src/all/background_page/service/userKeyPolicies/findUserKeyPoliciesSettingsService.js +5 -4
- package/src/all/background_page/service/userKeyPolicies/findUserKeyPoliciesSettingsService.test.js +12 -11
- package/src/all/background_page/service/validator/appEmailValidatorService.js +11 -6
- package/src/all/background_page/service/validator/appEmailValidatorService.test.js +11 -11
- package/src/all/common/polyfill/browserPolyfill.js +8 -8
- package/src/all/locales/cs-CZ/common.json +1 -4
- package/src/all/locales/de-DE/common.json +1 -4
- package/src/all/locales/en-UK/common.json +0 -3
- package/src/all/locales/es-ES/common.json +1 -4
- package/src/all/locales/fr-FR/common.json +1 -4
- package/src/all/locales/it-IT/common.json +1 -4
- package/src/all/locales/ja-JP/common.json +1 -4
- package/src/all/locales/ko-KR/common.json +0 -3
- package/src/all/locales/lt-LT/common.json +1 -4
- package/src/all/locales/nl-NL/common.json +1 -4
- package/src/all/locales/pl-PL/common.json +1 -4
- package/src/all/locales/pt-BR/common.json +1 -4
- package/src/all/locales/ro-RO/common.json +1 -4
- package/src/all/locales/ru-RU/common.json +1 -4
- package/src/all/locales/sl-SI/common.json +1 -4
- package/src/all/locales/sv-SE/common.json +1 -4
- package/src/all/locales/uk-UA/common.json +1 -4
- package/src/all/webAccessibleResources/js/app/QuickAccess.js +7 -0
- package/src/chrome/manifest.json +1 -1
- package/src/chrome-mv3/manifest.json +1 -1
- package/src/chrome-mv3/offscreens/service/group/addUsersToGroupOffscreenService.js +132 -0
- package/src/chrome-mv3/offscreens/service/group/addUsersToGroupOffscreenService.test.js +125 -0
- package/src/chrome-mv3/offscreens/service/offscreen/handleOffscreenRequestService.js +4 -0
- package/src/chrome-mv3/serviceWorker/service/addUsersToGroup/requestAddUsersToGroupOffscreenService.js +83 -0
- package/src/chrome-mv3/serviceWorker/service/addUsersToGroup/requestAddUsersToGroupOffscreenService.test.js +116 -0
- package/src/chrome-mv3/serviceWorker/service/addUsersToGroup/responseAddUsersToGroupOffscreenService.js +99 -0
- package/src/chrome-mv3/serviceWorker/service/addUsersToGroup/responseAddUsersToGroupOffscreenService.test.data.js +45 -0
- package/src/chrome-mv3/serviceWorker/service/addUsersToGroup/responseAddUsersToGroupOffscreenService.test.js +87 -0
- package/src/chrome-mv3/serviceWorker/service/network/requestFetchOffscreenService.js +0 -1
- package/src/chrome-mv3/serviceWorker/service/offscreen/handleOffscreenResponseService.js +15 -0
- package/src/firefox/manifest.json +1 -1
- package/src/safari/background_page/index.js +0 -37
- package/src/safari/common/polyfill/safariBrowserPolyfill.js +10 -10
- package/src/safari/manifest.json +1 -1
- package/test/jest.setup.js +4 -2
- package/src/all/background_page/controller/group/getOrFindGroupsUsersController.test.js +0 -69
- package/src/all/background_page/controller/organizationSettings/getOrganizationSettingsController.js +0 -55
- package/src/all/background_page/controller/organizationSettings/getOrganizationSettingsController.test.js +0 -45
- package/src/all/background_page/controller/resource/findAllByIdsForDisplayPermissionsController.js +0 -76
- package/src/all/background_page/controller/resource/findAllByIdsForDisplayPermissionsController.test.js +0 -102
- package/src/all/background_page/event/organizationSettingsEvents.js +0 -37
- package/src/all/background_page/model/organizationSettings/organizationSettingsModel.js +0 -93
- package/src/all/background_page/model/resourceType/resourceTypeModel.js +0 -72
- package/src/all/background_page/model/resourceType/resourceTypeModel.test.js +0 -101
- package/src/all/background_page/service/api/organizationSettings/organizationSettingsService.js +0 -58
- package/src/all/background_page/service/group/getOrFindGroupsService.js +0 -65
- package/src/all/background_page/service/group/getOrFindGroupsService.test.js +0 -168
- package/src/all/background_page/service/group/getOrFindGroupsUsersService.js +0 -51
- package/src/all/background_page/service/group/getOrFindGroupsUsersService.test.js +0 -94
- package/src/all/background_page/service/local_storage/authStatusLocalStorage.js +0 -70
- package/src/all/background_page/service/sessionStorage/userMeSessionStorageService.js +0 -94
|
@@ -19,7 +19,7 @@ import { QuickAccessEvents } from "../event/quickAccessEvents";
|
|
|
19
19
|
import { GroupEvents } from "../event/groupEvents";
|
|
20
20
|
import { ResourceEvents } from "../event/resourceEvents";
|
|
21
21
|
import { SecretEvents } from "../event/secretEvents";
|
|
22
|
-
import {
|
|
22
|
+
import { SiteSettingsEvents } from "../event/siteSettingsEvents";
|
|
23
23
|
import { TabEvents } from "../event/tabEvents";
|
|
24
24
|
import { LocaleEvents } from "../event/localeEvents";
|
|
25
25
|
import { PownedPasswordEvents } from "../event/pownedPasswordEvents";
|
|
@@ -38,7 +38,7 @@ jest.spyOn(QuickAccessEvents, "listen").mockImplementation(jest.fn());
|
|
|
38
38
|
jest.spyOn(GroupEvents, "listen").mockImplementation(jest.fn());
|
|
39
39
|
jest.spyOn(ResourceEvents, "listen").mockImplementation(jest.fn());
|
|
40
40
|
jest.spyOn(SecretEvents, "listen").mockImplementation(jest.fn());
|
|
41
|
-
jest.spyOn(
|
|
41
|
+
jest.spyOn(SiteSettingsEvents, "listen").mockImplementation(jest.fn());
|
|
42
42
|
jest.spyOn(TabEvents, "listen").mockImplementation(jest.fn());
|
|
43
43
|
jest.spyOn(LocaleEvents, "listen").mockImplementation(jest.fn());
|
|
44
44
|
jest.spyOn(PownedPasswordEvents, "listen").mockImplementation(jest.fn());
|
|
@@ -78,7 +78,7 @@ describe("QuickAccess", () => {
|
|
|
78
78
|
expect(GroupEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
|
|
79
79
|
expect(ResourceEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
|
|
80
80
|
expect(SecretEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
|
|
81
|
-
expect(
|
|
81
|
+
expect(SiteSettingsEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
|
|
82
82
|
expect(TabEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
|
|
83
83
|
expect(LocaleEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
|
|
84
84
|
expect(PownedPasswordEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
|
|
@@ -93,7 +93,7 @@ describe("QuickAccess", () => {
|
|
|
93
93
|
GroupEvents,
|
|
94
94
|
ResourceEvents,
|
|
95
95
|
SecretEvents,
|
|
96
|
-
|
|
96
|
+
SiteSettingsEvents,
|
|
97
97
|
TabEvents,
|
|
98
98
|
LocaleEvents,
|
|
99
99
|
PownedPasswordEvents,
|
|
@@ -17,7 +17,7 @@ import { RecoverEvents } from "../event/recoverEvents";
|
|
|
17
17
|
import BuildAccountRecoverService from "../service/recover/buildAccountRecoverService";
|
|
18
18
|
import BuildApiClientOptionsService from "../service/account/buildApiClientOptionsService";
|
|
19
19
|
import { PownedPasswordEvents } from "../event/pownedPasswordEvents";
|
|
20
|
-
import
|
|
20
|
+
import GetOrFindSiteSettingsService from "../service/siteSettings/getOrFindSiteSettingsService";
|
|
21
21
|
|
|
22
22
|
class Recover extends Pagemod {
|
|
23
23
|
/**
|
|
@@ -45,7 +45,7 @@ class Recover extends Pagemod {
|
|
|
45
45
|
const tab = port._port.sender.tab;
|
|
46
46
|
const account = BuildAccountRecoverService.buildFromRecoverUrl(tab.url);
|
|
47
47
|
const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
|
|
48
|
-
await new
|
|
48
|
+
await new GetOrFindSiteSettingsService(account, apiClientOptions).getOrFind(true);
|
|
49
49
|
for (const event of this.events) {
|
|
50
50
|
event.listen({ port, tab }, apiClientOptions, account);
|
|
51
51
|
}
|
|
@@ -18,6 +18,9 @@ import { ConfigEvents } from "../event/configEvents";
|
|
|
18
18
|
import BuildApiClientOptionsService from "../service/account/buildApiClientOptionsService";
|
|
19
19
|
import { PownedPasswordEvents } from "../event/pownedPasswordEvents";
|
|
20
20
|
import { enableFetchMocks } from "jest-fetch-mock";
|
|
21
|
+
import { anonymousSiteSettings } from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity.test.data";
|
|
22
|
+
import SiteSettingsEntity from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity";
|
|
23
|
+
import GetOrFindSiteSettingsService from "../service/siteSettings/getOrFindSiteSettingsService";
|
|
21
24
|
|
|
22
25
|
jest.spyOn(BuildAccountRecoverService, "buildFromRecoverUrl");
|
|
23
26
|
jest.spyOn(BuildApiClientOptionsService, "buildFromAccount");
|
|
@@ -30,6 +33,9 @@ describe("Recover", () => {
|
|
|
30
33
|
jest.resetModules();
|
|
31
34
|
jest.clearAllMocks();
|
|
32
35
|
enableFetchMocks();
|
|
36
|
+
jest
|
|
37
|
+
.spyOn(GetOrFindSiteSettingsService.prototype, "getOrFind")
|
|
38
|
+
.mockImplementation(() => new SiteSettingsEntity(anonymousSiteSettings()));
|
|
33
39
|
});
|
|
34
40
|
|
|
35
41
|
describe("Recover::attachEvents", () => {
|
|
@@ -17,7 +17,7 @@ import BuildApiClientOptionsService from "../service/account/buildApiClientOptio
|
|
|
17
17
|
import { SetupEvents } from "../event/setupEvents";
|
|
18
18
|
import BuildAccountSetupService from "../service/setup/buildAccountSetupService";
|
|
19
19
|
import { PownedPasswordEvents } from "../event/pownedPasswordEvents";
|
|
20
|
-
import
|
|
20
|
+
import GetOrFindSiteSettingsService from "../service/siteSettings/getOrFindSiteSettingsService";
|
|
21
21
|
|
|
22
22
|
class Setup extends Pagemod {
|
|
23
23
|
/**
|
|
@@ -43,7 +43,7 @@ class Setup extends Pagemod {
|
|
|
43
43
|
const tab = port._port.sender.tab;
|
|
44
44
|
const account = BuildAccountSetupService.buildFromSetupUrl(tab.url);
|
|
45
45
|
const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
|
|
46
|
-
await new
|
|
46
|
+
await new GetOrFindSiteSettingsService(account, apiClientOptions).getOrFind(true);
|
|
47
47
|
for (const event of this.events) {
|
|
48
48
|
event.listen({ port, tab }, apiClientOptions, account);
|
|
49
49
|
}
|
|
@@ -18,6 +18,9 @@ import BuildApiClientOptionsService from "../service/account/buildApiClientOptio
|
|
|
18
18
|
import BuildAccountSetupService from "../service/setup/buildAccountSetupService";
|
|
19
19
|
import { PownedPasswordEvents } from "../event/pownedPasswordEvents";
|
|
20
20
|
import { enableFetchMocks } from "jest-fetch-mock";
|
|
21
|
+
import { anonymousSiteSettings } from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity.test.data";
|
|
22
|
+
import SiteSettingsEntity from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity";
|
|
23
|
+
import GetOrFindSiteSettingsService from "../service/siteSettings/getOrFindSiteSettingsService";
|
|
21
24
|
|
|
22
25
|
jest.spyOn(BuildAccountSetupService, "buildFromSetupUrl");
|
|
23
26
|
jest.spyOn(BuildApiClientOptionsService, "buildFromAccount");
|
|
@@ -30,6 +33,9 @@ describe("Setup", () => {
|
|
|
30
33
|
jest.resetModules();
|
|
31
34
|
jest.clearAllMocks();
|
|
32
35
|
enableFetchMocks();
|
|
36
|
+
jest
|
|
37
|
+
.spyOn(GetOrFindSiteSettingsService.prototype, "getOrFind")
|
|
38
|
+
.mockImplementation(() => new SiteSettingsEntity(anonymousSiteSettings()));
|
|
33
39
|
});
|
|
34
40
|
|
|
35
41
|
describe("Setup::attachEvents", () => {
|
|
@@ -14,10 +14,11 @@
|
|
|
14
14
|
import Pagemod from "./pagemod";
|
|
15
15
|
import { ConfigEvents } from "../event/configEvents";
|
|
16
16
|
import { WebIntegrationEvents } from "../event/webIntegrationEvents";
|
|
17
|
-
import {
|
|
17
|
+
import { SiteSettingsEvents } from "../event/siteSettingsEvents";
|
|
18
18
|
import { PortEvents } from "../event/portEvents";
|
|
19
19
|
import ParseWebIntegrationUrlService from "../service/webIntegration/parseWebIntegrationUrlService";
|
|
20
20
|
import GetActiveAccountService from "../service/account/getActiveAccountService";
|
|
21
|
+
import BuildApiClientOptionsService from "../service/account/buildApiClientOptionsService";
|
|
21
22
|
|
|
22
23
|
class WebIntegration extends Pagemod {
|
|
23
24
|
/**
|
|
@@ -49,7 +50,25 @@ class WebIntegration extends Pagemod {
|
|
|
49
50
|
* @inheritDoc
|
|
50
51
|
*/
|
|
51
52
|
get events() {
|
|
52
|
-
return [ConfigEvents, WebIntegrationEvents,
|
|
53
|
+
return [ConfigEvents, WebIntegrationEvents, SiteSettingsEvents, PortEvents];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* @inheritDoc
|
|
58
|
+
*/
|
|
59
|
+
async attachEvents(port) {
|
|
60
|
+
try {
|
|
61
|
+
const tab = port._port.sender.tab;
|
|
62
|
+
const account = await GetActiveAccountService.get();
|
|
63
|
+
const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
|
|
64
|
+
const name = this.appName;
|
|
65
|
+
for (const event of this.events) {
|
|
66
|
+
event.listen({ port, tab, name }, apiClientOptions, account);
|
|
67
|
+
}
|
|
68
|
+
} catch (error) {
|
|
69
|
+
// Unexpected error.
|
|
70
|
+
console.error(error);
|
|
71
|
+
}
|
|
53
72
|
}
|
|
54
73
|
|
|
55
74
|
/**
|
|
@@ -19,9 +19,12 @@ import WorkerEntity from "../model/entity/worker/workerEntity";
|
|
|
19
19
|
import ScriptExecution from "../sdk/scriptExecution";
|
|
20
20
|
import Pagemod from "./pagemod";
|
|
21
21
|
import { ConfigEvents } from "../event/configEvents";
|
|
22
|
-
import {
|
|
22
|
+
import { SiteSettingsEvents } from "../event/siteSettingsEvents";
|
|
23
23
|
import { WebIntegrationEvents } from "../event/webIntegrationEvents";
|
|
24
24
|
import { PortEvents } from "../event/portEvents";
|
|
25
|
+
import GetActiveAccountService from "../service/account/getActiveAccountService";
|
|
26
|
+
import BuildApiClientOptionsService from "../service/account/buildApiClientOptionsService";
|
|
27
|
+
import { v4 as uuid } from "uuid";
|
|
25
28
|
|
|
26
29
|
const spyAddWorker = jest.spyOn(WorkersSessionStorage, "addWorker");
|
|
27
30
|
jest.spyOn(ScriptExecution.prototype, "injectPortname").mockImplementation(jest.fn());
|
|
@@ -29,7 +32,7 @@ jest.spyOn(ScriptExecution.prototype, "injectCss").mockImplementation(jest.fn())
|
|
|
29
32
|
jest.spyOn(ScriptExecution.prototype, "injectJs").mockImplementation(jest.fn());
|
|
30
33
|
jest.spyOn(ConfigEvents, "listen").mockImplementation(jest.fn());
|
|
31
34
|
jest.spyOn(WebIntegrationEvents, "listen").mockImplementation(jest.fn());
|
|
32
|
-
jest.spyOn(
|
|
35
|
+
jest.spyOn(SiteSettingsEvents, "listen").mockImplementation(jest.fn());
|
|
33
36
|
jest.spyOn(PortEvents, "listen").mockImplementation(jest.fn());
|
|
34
37
|
|
|
35
38
|
describe("WebIntegration", () => {
|
|
@@ -54,12 +57,7 @@ describe("WebIntegration", () => {
|
|
|
54
57
|
"contentScripts/js/dist/browser-integration/vendors.js",
|
|
55
58
|
"contentScripts/js/dist/browser-integration/browser-integration.js",
|
|
56
59
|
]);
|
|
57
|
-
expect(WebIntegration.events).toStrictEqual([
|
|
58
|
-
ConfigEvents,
|
|
59
|
-
WebIntegrationEvents,
|
|
60
|
-
OrganizationSettingsEvents,
|
|
61
|
-
PortEvents,
|
|
62
|
-
]);
|
|
60
|
+
expect(WebIntegration.events).toStrictEqual([ConfigEvents, WebIntegrationEvents, SiteSettingsEvents, PortEvents]);
|
|
63
61
|
expect(WebIntegration.mustReloadOnExtensionUpdate).toBeFalsy();
|
|
64
62
|
expect(WebIntegration.appName).toBe("WebIntegration");
|
|
65
63
|
});
|
|
@@ -114,29 +112,22 @@ describe("WebIntegration", () => {
|
|
|
114
112
|
},
|
|
115
113
|
},
|
|
116
114
|
};
|
|
115
|
+
// mock functions
|
|
116
|
+
const mockedAccount = { user_id: uuid(), domain: "https://test.passbolt.local" };
|
|
117
|
+
const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(mockedAccount);
|
|
118
|
+
jest.spyOn(GetActiveAccountService, "get").mockImplementation(() => mockedAccount);
|
|
117
119
|
// process
|
|
118
120
|
await WebIntegration.attachEvents(port);
|
|
119
121
|
// expectations
|
|
120
|
-
|
|
121
|
-
port: port,
|
|
122
|
-
tab: port._port.sender.tab,
|
|
123
|
-
name: WebIntegration.appName,
|
|
124
|
-
});
|
|
125
|
-
expect(WebIntegrationEvents.listen).toHaveBeenCalledWith({
|
|
126
|
-
port: port,
|
|
127
|
-
tab: port._port.sender.tab,
|
|
128
|
-
name: WebIntegration.appName,
|
|
129
|
-
});
|
|
130
|
-
expect(OrganizationSettingsEvents.listen).toHaveBeenCalledWith({
|
|
131
|
-
port: port,
|
|
132
|
-
tab: port._port.sender.tab,
|
|
133
|
-
name: WebIntegration.appName,
|
|
134
|
-
});
|
|
135
|
-
expect(PortEvents.listen).toHaveBeenCalledWith({
|
|
122
|
+
const expectedWorker = {
|
|
136
123
|
port: port,
|
|
137
124
|
tab: port._port.sender.tab,
|
|
138
125
|
name: WebIntegration.appName,
|
|
139
|
-
}
|
|
126
|
+
};
|
|
127
|
+
expect(ConfigEvents.listen).toHaveBeenCalledWith(expectedWorker, apiClientOptions, mockedAccount);
|
|
128
|
+
expect(WebIntegrationEvents.listen).toHaveBeenCalledWith(expectedWorker, apiClientOptions, mockedAccount);
|
|
129
|
+
expect(SiteSettingsEvents.listen).toHaveBeenCalledWith(expectedWorker, apiClientOptions, mockedAccount);
|
|
130
|
+
expect(PortEvents.listen).toHaveBeenCalledWith(expectedWorker, apiClientOptions, mockedAccount);
|
|
140
131
|
});
|
|
141
132
|
});
|
|
142
133
|
});
|
|
@@ -20,11 +20,10 @@ const ACTIVE_ACCOUNT_KEY = "active-account";
|
|
|
20
20
|
class GetActiveAccountService {
|
|
21
21
|
/**
|
|
22
22
|
* Get the active account associated with this extension.
|
|
23
|
-
* @param {Object} options The option to add more data in the account
|
|
24
23
|
* @return {Promise<AccountEntity>}
|
|
25
24
|
* @throw {Error} if no account yet associated with this extension.
|
|
26
25
|
*/
|
|
27
|
-
get(
|
|
26
|
+
get() {
|
|
28
27
|
return navigator.locks.request(ACTIVE_ACCOUNT_KEY, async () => {
|
|
29
28
|
// Check if the storage have some data
|
|
30
29
|
if (Object.keys(storage._data).length === 0) {
|
|
@@ -33,7 +32,7 @@ class GetActiveAccountService {
|
|
|
33
32
|
// Initialization of the config to get the user information
|
|
34
33
|
Config.init();
|
|
35
34
|
}
|
|
36
|
-
return
|
|
35
|
+
return GetLegacyAccountService.get();
|
|
37
36
|
});
|
|
38
37
|
}
|
|
39
38
|
}
|
|
@@ -16,31 +16,20 @@ import Keyring from "../../model/keyring";
|
|
|
16
16
|
import { Uuid } from "../../utils/uuid";
|
|
17
17
|
import AccountEntity from "../../model/entity/account/accountEntity";
|
|
18
18
|
import User from "../../model/user";
|
|
19
|
-
import BuildApiClientOptionsService from "./buildApiClientOptionsService";
|
|
20
|
-
import UserModel from "../../model/user/userModel";
|
|
21
19
|
|
|
22
20
|
class GetLegacyAccountService {
|
|
23
21
|
/**
|
|
24
22
|
* Get the account associated with this extension.
|
|
25
|
-
* @
|
|
26
|
-
* @return {Promise<AccountEntity>}
|
|
23
|
+
* @return {AccountEntity}
|
|
27
24
|
* @throw {Error} if no account yet associated with this extension.
|
|
28
25
|
*/
|
|
29
|
-
static
|
|
26
|
+
static get() {
|
|
30
27
|
const keyring = new Keyring();
|
|
31
28
|
const user = User.getInstance().get();
|
|
32
29
|
const serverPublicKeyInfo = keyring.findPublic(Uuid.get(user.settings.domain));
|
|
33
30
|
const userPublicKeyInfo = keyring.findPublic(user.id);
|
|
34
31
|
const userPrivateKeyInfo = keyring.findPrivate();
|
|
35
32
|
|
|
36
|
-
// Add in the account the role name if the option object have role (only for authenticated user)
|
|
37
|
-
let userEntity;
|
|
38
|
-
if (option?.role) {
|
|
39
|
-
// Load the application settings, necessary to validate the account username.
|
|
40
|
-
const apiClientOptions = BuildApiClientOptionsService.buildFromDomain(user.settings.domain);
|
|
41
|
-
userEntity = await new UserModel(apiClientOptions).findOne(user.id, { role: true });
|
|
42
|
-
}
|
|
43
|
-
|
|
44
33
|
const accountDto = {
|
|
45
34
|
domain: user.settings.domain,
|
|
46
35
|
user_id: user.id,
|
|
@@ -52,7 +41,7 @@ class GetLegacyAccountService {
|
|
|
52
41
|
user_public_armored_key: userPublicKeyInfo.armoredKey,
|
|
53
42
|
user_private_armored_key: userPrivateKeyInfo.armoredKey,
|
|
54
43
|
security_token: user.settings.securityToken,
|
|
55
|
-
role_name:
|
|
44
|
+
role_name: null, // This property should be updated later as the user should be authenticated to get his role
|
|
56
45
|
};
|
|
57
46
|
|
|
58
47
|
/*
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* @link https://www.passbolt.com Passbolt(tm)
|
|
12
12
|
* @since 3.9.0
|
|
13
13
|
*/
|
|
14
|
-
import
|
|
14
|
+
import GetOrFindSiteSettingsService from "../siteSettings/getOrFindSiteSettingsService";
|
|
15
15
|
import SsoSettingsModel from "../../model/sso/ssoSettingsModel";
|
|
16
16
|
import SsoDataStorage from "../indexedDB_storage/ssoDataStorage";
|
|
17
17
|
import GenerateSsoKitService from "../sso/generateSsoKitService";
|
|
@@ -19,8 +19,12 @@ import SsoKitServerPartModel from "../../model/sso/ssoKitServerPartModel";
|
|
|
19
19
|
import EntityValidationError from "passbolt-styleguide/src/shared/models/entity/abstract/entityValidationError";
|
|
20
20
|
|
|
21
21
|
class UpdateSsoCredentialsService {
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
/**
|
|
23
|
+
* @param {ApiClientOptions} apiClientOption the api client options
|
|
24
|
+
* @param {AccountEntity} account the user account
|
|
25
|
+
*/
|
|
26
|
+
constructor(apiClientOption, account) {
|
|
27
|
+
this.getOrFindSiteSettingsService = new GetOrFindSiteSettingsService(account, apiClientOption);
|
|
24
28
|
this.ssoSettingsModel = new SsoSettingsModel(apiClientOption);
|
|
25
29
|
this.ssoKitServerPartModel = new SsoKitServerPartModel(apiClientOption);
|
|
26
30
|
}
|
|
@@ -44,8 +48,8 @@ class UpdateSsoCredentialsService {
|
|
|
44
48
|
*/
|
|
45
49
|
async updateSsoKitIfNeeded(passphrase) {
|
|
46
50
|
const localSsoKit = await SsoDataStorage.get();
|
|
47
|
-
const
|
|
48
|
-
if (!
|
|
51
|
+
const siteSettings = await this.getOrFindSiteSettingsService.getOrFind(false);
|
|
52
|
+
if (!siteSettings.isPluginEnabled("sso")) {
|
|
49
53
|
/*
|
|
50
54
|
* If the plugin is disabled there is no reason to keep an SSO kit
|
|
51
55
|
* Plus, if we have an SSO kit locally, the login page will continue display the SSO login
|
|
@@ -66,21 +66,23 @@ class GroupApiService extends AbstractService {
|
|
|
66
66
|
* @returns {Array<string>} list of supported option
|
|
67
67
|
*/
|
|
68
68
|
static getSupportedFiltersOptions() {
|
|
69
|
-
return ["has-users", "has-managers"
|
|
69
|
+
return ["has-users", "has-managers"];
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
/**
|
|
73
73
|
* Get a group for a given id
|
|
74
74
|
*
|
|
75
75
|
* @param {string} id group uuid
|
|
76
|
+
* @param {Object} [contains] optional example: { ["groups_users.user.profile"]: true }
|
|
76
77
|
* @throws {Error} if API call fails, service unreachable, etc.
|
|
77
78
|
* @throws {TypeError} if group id is not a valid uuid
|
|
78
|
-
* @returns {
|
|
79
|
+
* @returns {Promise<PassboltResponseEntity>} groupDto
|
|
79
80
|
*/
|
|
80
|
-
async get(id) {
|
|
81
|
+
async get(id, contains) {
|
|
81
82
|
this.assertValidId(id);
|
|
82
|
-
const
|
|
83
|
-
|
|
83
|
+
const options = contains ? this.formatContainOptions(contains, GroupApiService.getSupportedContainOptions()) : null;
|
|
84
|
+
const response = await this.apiClient.get(id, options);
|
|
85
|
+
return new PassboltResponseEntity(response);
|
|
84
86
|
}
|
|
85
87
|
|
|
86
88
|
/**
|
|
@@ -93,23 +95,14 @@ class GroupApiService extends AbstractService {
|
|
|
93
95
|
* @public
|
|
94
96
|
*/
|
|
95
97
|
async findAll(contains, filters) {
|
|
96
|
-
const hasIdFilter = filters?.["has-id"];
|
|
97
98
|
const legacyContain = GroupApiService.remapLegacyContain(contains); // crassette
|
|
98
99
|
contains = legacyContain
|
|
99
100
|
? this.formatContainOptions(legacyContain, GroupApiService.getSupportedContainOptions())
|
|
100
101
|
: null;
|
|
101
102
|
filters = filters ? this.formatFilterOptions(filters, GroupApiService.getSupportedFiltersOptions()) : null;
|
|
102
103
|
const options = { ...contains, ...filters };
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
* Ensure backward compatibility with servers that do not yet support the has-id filter:
|
|
106
|
-
* post-filter the results in memory so the caller always receives only the requested groups.
|
|
107
|
-
*/
|
|
108
|
-
if (hasIdFilter && rawResponse.body) {
|
|
109
|
-
const idsMap = new Set(Array.isArray(hasIdFilter) ? hasIdFilter : [hasIdFilter]);
|
|
110
|
-
rawResponse.body = rawResponse.body.filter((group) => idsMap.has(group.id));
|
|
111
|
-
}
|
|
112
|
-
return new PassboltResponseEntity(rawResponse);
|
|
104
|
+
const response = await this.apiClient.findAll(options);
|
|
105
|
+
return new PassboltResponseEntity(response);
|
|
113
106
|
}
|
|
114
107
|
|
|
115
108
|
/**
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
* @since 2.13.0
|
|
13
13
|
*/
|
|
14
14
|
import { enableFetchMocks } from "jest-fetch-mock";
|
|
15
|
-
import {
|
|
15
|
+
import { v4 as uuidv4 } from "uuid";
|
|
16
|
+
import { mockApiResponse, mockApiResponseError } from "../../../../../../test/mocks/mockApiResponse";
|
|
16
17
|
import GroupApiService from "./groupApiService";
|
|
17
18
|
import { defaultApiClientOptions } from "passbolt-styleguide/src/shared/lib/apiClient/apiClientOptions.test.data";
|
|
18
19
|
import { defaultGroupDto } from "passbolt-styleguide/src/shared/models/entity/group/groupEntity.test.data";
|
|
@@ -25,7 +26,7 @@ beforeEach(() => {
|
|
|
25
26
|
|
|
26
27
|
describe("GroupApiService", () => {
|
|
27
28
|
describe("::findAll", () => {
|
|
28
|
-
it("should return a PassboltResponseEntity containing all groups
|
|
29
|
+
it("should return a PassboltResponseEntity containing all groups", async () => {
|
|
29
30
|
expect.assertions(3);
|
|
30
31
|
const groupsDto = [defaultGroupDto(), defaultGroupDto()];
|
|
31
32
|
fetch.doMockOnceIf(/groups\.json/, () => mockApiResponse(groupsDto));
|
|
@@ -37,48 +38,80 @@ describe("GroupApiService", () => {
|
|
|
37
38
|
expect(response.body).toHaveLength(2);
|
|
38
39
|
expect(response.body).toStrictEqual(groupsDto);
|
|
39
40
|
});
|
|
41
|
+
});
|
|
40
42
|
|
|
41
|
-
|
|
43
|
+
describe("::get", () => {
|
|
44
|
+
it("should return a PassboltResponseEntity containing the group for the given id", async () => {
|
|
42
45
|
expect.assertions(3);
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
const groupDto = defaultGroupDto();
|
|
47
|
+
let request;
|
|
48
|
+
fetch.doMockOnceIf(new RegExp(`/groups/${groupDto.id}.json`), (req) => {
|
|
49
|
+
request = req;
|
|
50
|
+
return mockApiResponse(groupDto);
|
|
51
|
+
});
|
|
47
52
|
|
|
48
53
|
const service = new GroupApiService(defaultApiClientOptions());
|
|
49
|
-
const response = await service.
|
|
54
|
+
const response = await service.get(groupDto.id);
|
|
50
55
|
|
|
51
56
|
expect(response).toBeInstanceOf(PassboltResponseEntity);
|
|
52
|
-
expect(response.body).
|
|
53
|
-
|
|
57
|
+
expect(response.body).toStrictEqual(groupDto);
|
|
58
|
+
// No contain params should be sent when no contains is given.
|
|
59
|
+
const containParams = [...new URL(request.url).searchParams.keys()].filter((key) => key.startsWith("contain"));
|
|
60
|
+
expect(containParams).toStrictEqual([]);
|
|
54
61
|
});
|
|
55
62
|
|
|
56
|
-
it("should
|
|
63
|
+
it("should request the given contain options", async () => {
|
|
57
64
|
expect.assertions(3);
|
|
58
|
-
const
|
|
59
|
-
const
|
|
60
|
-
|
|
65
|
+
const groupDto = defaultGroupDto();
|
|
66
|
+
const contains = { groups_users: true, my_group_user: true, modifier: false };
|
|
67
|
+
let request;
|
|
68
|
+
fetch.doMockOnceIf(new RegExp(`/groups/${groupDto.id}.json`), (req) => {
|
|
69
|
+
request = req;
|
|
70
|
+
return mockApiResponse(groupDto);
|
|
71
|
+
});
|
|
61
72
|
|
|
62
73
|
const service = new GroupApiService(defaultApiClientOptions());
|
|
63
|
-
|
|
74
|
+
await service.get(groupDto.id, contains);
|
|
64
75
|
|
|
65
|
-
|
|
66
|
-
expect(
|
|
67
|
-
expect(
|
|
76
|
+
const url = new URL(request.url);
|
|
77
|
+
expect(url.searchParams.get("contain[groups_users]")).toStrictEqual("1");
|
|
78
|
+
expect(url.searchParams.get("contain[my_group_user]")).toStrictEqual("1");
|
|
79
|
+
expect(url.searchParams.get("contain[modifier]")).toStrictEqual("0");
|
|
68
80
|
});
|
|
69
81
|
|
|
70
|
-
it("should
|
|
82
|
+
it("should ignore unsupported contain options", async () => {
|
|
71
83
|
expect.assertions(2);
|
|
72
|
-
const
|
|
73
|
-
const
|
|
74
|
-
|
|
84
|
+
const groupDto = defaultGroupDto();
|
|
85
|
+
const contains = { groups_users: true, unsupported_option: true };
|
|
86
|
+
let request;
|
|
87
|
+
fetch.doMockOnceIf(new RegExp(`/groups/${groupDto.id}.json`), (req) => {
|
|
88
|
+
request = req;
|
|
89
|
+
return mockApiResponse(groupDto);
|
|
90
|
+
});
|
|
75
91
|
|
|
76
|
-
const unrelatedId = defaultGroupDto().id;
|
|
77
92
|
const service = new GroupApiService(defaultApiClientOptions());
|
|
78
|
-
|
|
93
|
+
await service.get(groupDto.id, contains);
|
|
79
94
|
|
|
80
|
-
|
|
81
|
-
expect(
|
|
95
|
+
const url = new URL(request.url);
|
|
96
|
+
expect(url.searchParams.get("contain[groups_users]")).toStrictEqual("1");
|
|
97
|
+
expect(url.searchParams.has("contain[unsupported_option]")).toStrictEqual(false);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("should throw an error if the API returns a 404", async () => {
|
|
101
|
+
expect.assertions(1);
|
|
102
|
+
const groupId = uuidv4();
|
|
103
|
+
fetch.doMockOnceIf(new RegExp(`/groups/${groupId}.json`), () => mockApiResponseError(404, "Group not found"));
|
|
104
|
+
|
|
105
|
+
const service = new GroupApiService(defaultApiClientOptions());
|
|
106
|
+
|
|
107
|
+
await expect(service.get(groupId)).rejects.toThrow("Group not found");
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("should throw a TypeError if the id is not a valid uuid", async () => {
|
|
111
|
+
expect.assertions(1);
|
|
112
|
+
const service = new GroupApiService(defaultApiClientOptions());
|
|
113
|
+
|
|
114
|
+
await expect(service.get("not-a-uuid")).rejects.toThrow(TypeError);
|
|
82
115
|
});
|
|
83
116
|
});
|
|
84
117
|
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passbolt ~ Open source password manager for teams
|
|
3
|
+
* Copyright (c) Passbolt SA (https://www.passbolt.com)
|
|
4
|
+
*
|
|
5
|
+
* Licensed under GNU Affero General Public License version 3 of the or any later version.
|
|
6
|
+
* For full copyright and license information, please see the LICENSE.txt
|
|
7
|
+
* Redistributions of files must retain the above copyright notice.
|
|
8
|
+
*
|
|
9
|
+
* @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
|
|
10
|
+
* @license https://opensource.org/licenses/AGPL-3.0 AGPL License
|
|
11
|
+
* @link https://www.passbolt.com Passbolt(tm)
|
|
12
|
+
* @since 6.0.0
|
|
13
|
+
*/
|
|
14
|
+
import AbstractService from "../abstract/abstractService";
|
|
15
|
+
|
|
16
|
+
const SITE_SETTINGS_SERVICE_RESOURCE_NAME = "settings";
|
|
17
|
+
|
|
18
|
+
class SiteSettingsApiService extends AbstractService {
|
|
19
|
+
/**
|
|
20
|
+
* @param {ApiClientOptions} apiClientOptions
|
|
21
|
+
*/
|
|
22
|
+
constructor(apiClientOptions) {
|
|
23
|
+
super(apiClientOptions, SiteSettingsApiService.RESOURCE_NAME);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
static get RESOURCE_NAME() {
|
|
27
|
+
return SITE_SETTINGS_SERVICE_RESOURCE_NAME;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Fetch the site settings.
|
|
32
|
+
* Merges the response server-time header into the dto as `serverTimeDiff` (ms).
|
|
33
|
+
* @returns {Promise<object>} The site settings dto.
|
|
34
|
+
*/
|
|
35
|
+
async findSiteSettings() {
|
|
36
|
+
const response = await this.apiClient.findAll();
|
|
37
|
+
const dto = JSON.parse(JSON.stringify(response.body));
|
|
38
|
+
dto.serverTimeDiff = null;
|
|
39
|
+
if (response.header?.servertime) {
|
|
40
|
+
dto.serverTimeDiff = response.header.servertime * 1000 - new Date().getTime();
|
|
41
|
+
}
|
|
42
|
+
return dto;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default SiteSettingsApiService;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passbolt ~ Open source password manager for teams
|
|
3
|
+
* Copyright (c) Passbolt SA (https://www.passbolt.com)
|
|
4
|
+
*
|
|
5
|
+
* Licensed under GNU Affero General Public License version 3 of the or any later version.
|
|
6
|
+
* For full copyright and license information, please see the LICENSE.txt
|
|
7
|
+
* Redistributions of files must retain the above copyright notice.
|
|
8
|
+
*
|
|
9
|
+
* @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
|
|
10
|
+
* @license https://opensource.org/licenses/AGPL-3.0 AGPL License
|
|
11
|
+
* @link https://www.passbolt.com Passbolt(tm)
|
|
12
|
+
* @since 6.0.0
|
|
13
|
+
*/
|
|
14
|
+
import { enableFetchMocks } from "jest-fetch-mock";
|
|
15
|
+
import { mockApiResponse, mockApiResponseError } from "passbolt-styleguide/test/mocks/mockApiResponse";
|
|
16
|
+
import { defaultApiClientOptions } from "passbolt-styleguide/src/shared/lib/apiClient/apiClientOptions.test.data";
|
|
17
|
+
import PassboltApiFetchError from "passbolt-styleguide/src/shared/lib/Error/PassboltApiFetchError";
|
|
18
|
+
import { defaultProSiteSettings } from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity.test.data";
|
|
19
|
+
import SiteSettingsApiService from "./siteSettingsApiService";
|
|
20
|
+
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
enableFetchMocks();
|
|
23
|
+
fetch.resetMocks();
|
|
24
|
+
jest.clearAllMocks();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe("SiteSettingsApiService", () => {
|
|
28
|
+
describe("::findSiteSettings", () => {
|
|
29
|
+
it("issues a GET /settings.json request and returns the body", async () => {
|
|
30
|
+
expect.assertions(3);
|
|
31
|
+
const expectedDto = defaultProSiteSettings();
|
|
32
|
+
fetch.doMockOnceIf(/settings\.json/, () => mockApiResponse(expectedDto));
|
|
33
|
+
|
|
34
|
+
const service = new SiteSettingsApiService(defaultApiClientOptions());
|
|
35
|
+
const result = await service.findSiteSettings();
|
|
36
|
+
|
|
37
|
+
expect(result.app).toEqual(expectedDto.app);
|
|
38
|
+
expect(result.passbolt).toEqual(expectedDto.passbolt);
|
|
39
|
+
expect(result.serverTimeDiff).toBeNull();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("merges the servertime header into serverTimeDiff (ms)", async () => {
|
|
43
|
+
expect.assertions(1);
|
|
44
|
+
const expectedDto = defaultProSiteSettings();
|
|
45
|
+
const nowSec = Math.floor(Date.now() / 1000);
|
|
46
|
+
const serverAheadSec = nowSec + 60;
|
|
47
|
+
fetch.doMockOnceIf(/settings\.json/, () => mockApiResponse(expectedDto, { servertime: serverAheadSec }));
|
|
48
|
+
|
|
49
|
+
const service = new SiteSettingsApiService(defaultApiClientOptions());
|
|
50
|
+
const result = await service.findSiteSettings();
|
|
51
|
+
|
|
52
|
+
// serverTimeDiff should be positive (server ahead). Allow ~5s of fuzz for test runtime.
|
|
53
|
+
expect(result.serverTimeDiff).toBeGreaterThan(55_000);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("throws PassboltApiFetchError on API error", async () => {
|
|
57
|
+
expect.assertions(1);
|
|
58
|
+
fetch.doMockOnceIf(/settings\.json/, () => mockApiResponseError(500, "boom"));
|
|
59
|
+
const service = new SiteSettingsApiService(defaultApiClientOptions());
|
|
60
|
+
await expect(() => service.findSiteSettings()).rejects.toThrow(PassboltApiFetchError);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|