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
|
@@ -14,38 +14,51 @@
|
|
|
14
14
|
|
|
15
15
|
import MfaAuthenticationRequiredError from "../../error/mfaAuthenticationRequiredError";
|
|
16
16
|
import AuthenticationStatusService from "../authenticationStatusService";
|
|
17
|
-
import
|
|
17
|
+
import ActiveSessionLocalStorage from "../local_storage/activeSessionLocalStorage";
|
|
18
|
+
import OnlineSessionEntity from "passbolt-styleguide/src/shared/models/entity/session/onlineSessionEntity";
|
|
18
19
|
|
|
19
20
|
class CheckAuthStatusService {
|
|
21
|
+
/**
|
|
22
|
+
* Constructor
|
|
23
|
+
*
|
|
24
|
+
* @param {AccountEntity} account the user account
|
|
25
|
+
* @param {ApiClientOptions} apiClientOptions
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
constructor(account, apiClientOptions) {
|
|
29
|
+
this.account = account;
|
|
30
|
+
this.authenticationStatusService = new AuthenticationStatusService(apiClientOptions);
|
|
31
|
+
this.activeSessionLocalStorage = new ActiveSessionLocalStorage(account);
|
|
32
|
+
}
|
|
33
|
+
|
|
20
34
|
/**
|
|
21
35
|
* Returns the authentication status of the current user.
|
|
22
36
|
* It first interrogates the local storage and if necessary the API afterward.
|
|
23
37
|
* @param {boolean} [flushCache] should the cache be flushed before or not.
|
|
24
|
-
* @return {Promise<
|
|
38
|
+
* @return {Promise<OnlineSessionEntity>}
|
|
25
39
|
* @throws {Error} if something wrong happened on the API
|
|
26
40
|
*/
|
|
27
41
|
async checkAuthStatus(flushCache = false) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return storedStatus;
|
|
32
|
-
}
|
|
42
|
+
const storedSession = await this.activeSessionLocalStorage.get();
|
|
43
|
+
if (!flushCache && storedSession) {
|
|
44
|
+
return new OnlineSessionEntity(storedSession);
|
|
33
45
|
}
|
|
34
46
|
|
|
35
|
-
|
|
47
|
+
const session = { ...storedSession };
|
|
36
48
|
try {
|
|
37
|
-
|
|
38
|
-
|
|
49
|
+
session.is_authenticated = await this.authenticationStatusService.isAuthenticated();
|
|
50
|
+
session.is_mfa_authenticated = true;
|
|
39
51
|
} catch (error) {
|
|
40
52
|
if (!(error instanceof MfaAuthenticationRequiredError)) {
|
|
41
53
|
throw error;
|
|
42
54
|
}
|
|
43
|
-
|
|
44
|
-
|
|
55
|
+
session.is_authenticated = true;
|
|
56
|
+
session.is_mfa_authenticated = false;
|
|
45
57
|
}
|
|
46
58
|
|
|
47
|
-
|
|
48
|
-
|
|
59
|
+
const onlineSessionEntity = new OnlineSessionEntity(session);
|
|
60
|
+
await this.activeSessionLocalStorage.set(onlineSessionEntity);
|
|
61
|
+
return onlineSessionEntity;
|
|
49
62
|
}
|
|
50
63
|
}
|
|
51
64
|
|
|
@@ -13,9 +13,11 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import MfaAuthenticationRequiredError from "../../error/mfaAuthenticationRequiredError";
|
|
16
|
-
import AuthenticationStatusService from "../authenticationStatusService";
|
|
17
|
-
import AuthStatusLocalStorage from "../local_storage/authStatusLocalStorage";
|
|
18
16
|
import CheckAuthStatusService from "./checkAuthStatusService";
|
|
17
|
+
import AccountEntity from "../../model/entity/account/accountEntity";
|
|
18
|
+
import { defaultAccountDto } from "../../model/entity/account/accountEntity.test.data";
|
|
19
|
+
import { defaultApiClientOptions } from "passbolt-styleguide/src/shared/lib/apiClient/apiClientOptions.test.data";
|
|
20
|
+
import OnlineSessionEntity from "passbolt-styleguide/src/shared/models/entity/session/onlineSessionEntity";
|
|
19
21
|
|
|
20
22
|
beforeEach(() => {
|
|
21
23
|
jest.clearAllMocks();
|
|
@@ -24,102 +26,118 @@ beforeEach(() => {
|
|
|
24
26
|
describe("CheckAuthStatusService", () => {
|
|
25
27
|
it("expects the user not to be authenticated", async () => {
|
|
26
28
|
expect.assertions(3);
|
|
27
|
-
jest.spyOn(AuthStatusLocalStorage, "get").mockImplementation(() => undefined);
|
|
28
|
-
jest.spyOn(AuthStatusLocalStorage, "flush");
|
|
29
|
-
jest.spyOn(AuthenticationStatusService, "isAuthenticated").mockImplementation(() => false);
|
|
30
29
|
|
|
31
|
-
const
|
|
30
|
+
const account = new AccountEntity(defaultAccountDto());
|
|
31
|
+
const service = new CheckAuthStatusService(account, defaultApiClientOptions());
|
|
32
|
+
jest.spyOn(service.activeSessionLocalStorage, "get").mockImplementation(() => undefined);
|
|
33
|
+
jest.spyOn(service.activeSessionLocalStorage, "flush");
|
|
34
|
+
jest.spyOn(service.authenticationStatusService, "isAuthenticated").mockImplementation(() => false);
|
|
32
35
|
const authStatus = await service.checkAuthStatus();
|
|
33
36
|
|
|
34
|
-
expect(
|
|
35
|
-
expect(
|
|
36
|
-
expect(authStatus).toStrictEqual(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
expect(service.activeSessionLocalStorage.get).toHaveBeenCalledTimes(1);
|
|
38
|
+
expect(service.activeSessionLocalStorage.flush).not.toHaveBeenCalled();
|
|
39
|
+
expect(authStatus).toStrictEqual(
|
|
40
|
+
new OnlineSessionEntity({
|
|
41
|
+
is_authenticated: false,
|
|
42
|
+
is_mfa_authenticated: true,
|
|
43
|
+
}),
|
|
44
|
+
);
|
|
40
45
|
});
|
|
41
46
|
|
|
42
47
|
it("expects the user to be fully authenticated", async () => {
|
|
43
48
|
expect.assertions(3);
|
|
44
|
-
jest.spyOn(AuthStatusLocalStorage, "get").mockImplementation(() => undefined);
|
|
45
|
-
jest.spyOn(AuthStatusLocalStorage, "flush");
|
|
46
|
-
jest.spyOn(AuthenticationStatusService, "isAuthenticated").mockImplementation(() => true);
|
|
47
49
|
|
|
48
|
-
const
|
|
50
|
+
const account = new AccountEntity(defaultAccountDto());
|
|
51
|
+
const service = new CheckAuthStatusService(account, defaultApiClientOptions());
|
|
52
|
+
jest.spyOn(service.activeSessionLocalStorage, "get").mockImplementation(() => undefined);
|
|
53
|
+
jest.spyOn(service.activeSessionLocalStorage, "flush");
|
|
54
|
+
jest.spyOn(service.authenticationStatusService, "isAuthenticated").mockImplementation(() => true);
|
|
49
55
|
const authStatus = await service.checkAuthStatus();
|
|
50
56
|
|
|
51
|
-
expect(
|
|
52
|
-
expect(
|
|
53
|
-
expect(authStatus).toStrictEqual(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
expect(service.activeSessionLocalStorage.get).toHaveBeenCalledTimes(1);
|
|
58
|
+
expect(service.activeSessionLocalStorage.flush).not.toHaveBeenCalled();
|
|
59
|
+
expect(authStatus).toStrictEqual(
|
|
60
|
+
new OnlineSessionEntity({
|
|
61
|
+
is_authenticated: true,
|
|
62
|
+
is_mfa_authenticated: true,
|
|
63
|
+
}),
|
|
64
|
+
);
|
|
57
65
|
});
|
|
58
66
|
|
|
59
67
|
it("expects the user to require MFA authentication", async () => {
|
|
60
68
|
expect.assertions(3);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
69
|
+
|
|
70
|
+
const account = new AccountEntity(defaultAccountDto());
|
|
71
|
+
const service = new CheckAuthStatusService(account, defaultApiClientOptions());
|
|
72
|
+
jest.spyOn(service.activeSessionLocalStorage, "get").mockImplementation(() => undefined);
|
|
73
|
+
jest.spyOn(service.activeSessionLocalStorage, "flush");
|
|
74
|
+
jest.spyOn(service.authenticationStatusService, "isAuthenticated").mockImplementation(() => {
|
|
64
75
|
throw new MfaAuthenticationRequiredError();
|
|
65
76
|
});
|
|
66
|
-
|
|
67
|
-
const service = new CheckAuthStatusService();
|
|
68
77
|
const authStatus = await service.checkAuthStatus();
|
|
69
78
|
|
|
70
|
-
expect(
|
|
71
|
-
expect(
|
|
72
|
-
expect(authStatus).toStrictEqual(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
79
|
+
expect(service.activeSessionLocalStorage.get).toHaveBeenCalledTimes(1);
|
|
80
|
+
expect(service.activeSessionLocalStorage.flush).not.toHaveBeenCalled();
|
|
81
|
+
expect(authStatus).toStrictEqual(
|
|
82
|
+
new OnlineSessionEntity({
|
|
83
|
+
is_authenticated: true,
|
|
84
|
+
is_mfa_authenticated: false,
|
|
85
|
+
}),
|
|
86
|
+
);
|
|
76
87
|
});
|
|
77
88
|
|
|
78
89
|
it("should ask for an API call to find the authentication status", async () => {
|
|
79
|
-
expect.assertions(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
90
|
+
expect.assertions(4);
|
|
91
|
+
|
|
92
|
+
const account = new AccountEntity(defaultAccountDto());
|
|
93
|
+
const service = new CheckAuthStatusService(account, defaultApiClientOptions());
|
|
94
|
+
jest.spyOn(service.activeSessionLocalStorage, "get").mockImplementation(() => undefined);
|
|
95
|
+
jest.spyOn(service.activeSessionLocalStorage, "set");
|
|
96
|
+
jest.spyOn(service.activeSessionLocalStorage, "flush");
|
|
97
|
+
jest.spyOn(service.authenticationStatusService, "isAuthenticated").mockImplementation(() => true);
|
|
85
98
|
const authStatus = await service.checkAuthStatus(true);
|
|
86
99
|
|
|
87
|
-
expect(
|
|
88
|
-
expect(
|
|
89
|
-
expect(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
100
|
+
expect(service.activeSessionLocalStorage.get).toHaveBeenCalled();
|
|
101
|
+
expect(service.activeSessionLocalStorage.set).toHaveBeenCalled();
|
|
102
|
+
expect(service.activeSessionLocalStorage.flush).not.toHaveBeenCalled();
|
|
103
|
+
expect(authStatus).toStrictEqual(
|
|
104
|
+
new OnlineSessionEntity({
|
|
105
|
+
is_authenticated: true,
|
|
106
|
+
is_mfa_authenticated: true,
|
|
107
|
+
}),
|
|
108
|
+
);
|
|
93
109
|
});
|
|
94
110
|
|
|
95
111
|
it("should return the authentication status from the cache", async () => {
|
|
96
112
|
expect.assertions(3);
|
|
97
|
-
const localStorageData = {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
113
|
+
const localStorageData = new OnlineSessionEntity({
|
|
114
|
+
is_authenticated: false,
|
|
115
|
+
is_mfa_authenticated: true,
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const account = new AccountEntity(defaultAccountDto());
|
|
119
|
+
const service = new CheckAuthStatusService(account, defaultApiClientOptions());
|
|
120
|
+
jest.spyOn(service.activeSessionLocalStorage, "get").mockImplementation(() => localStorageData);
|
|
121
|
+
jest.spyOn(service.activeSessionLocalStorage, "flush");
|
|
105
122
|
const authStatus = await service.checkAuthStatus(false);
|
|
106
123
|
|
|
107
|
-
expect(
|
|
108
|
-
expect(
|
|
124
|
+
expect(service.activeSessionLocalStorage.get).toHaveBeenCalledTimes(1);
|
|
125
|
+
expect(service.activeSessionLocalStorage.flush).not.toHaveBeenCalled();
|
|
109
126
|
expect(authStatus).toStrictEqual(localStorageData);
|
|
110
127
|
});
|
|
111
128
|
|
|
112
129
|
it("should return the authentication status from the API if the cache is empty", async () => {
|
|
113
130
|
expect.assertions(3);
|
|
114
|
-
jest.spyOn(AuthStatusLocalStorage, "get").mockImplementation(() => null);
|
|
115
|
-
jest.spyOn(AuthStatusLocalStorage, "flush");
|
|
116
|
-
jest.spyOn(AuthenticationStatusService, "isAuthenticated").mockImplementation(() => false);
|
|
117
131
|
|
|
118
|
-
const
|
|
132
|
+
const account = new AccountEntity(defaultAccountDto());
|
|
133
|
+
const service = new CheckAuthStatusService(account, defaultApiClientOptions());
|
|
134
|
+
jest.spyOn(service.activeSessionLocalStorage, "get").mockImplementation(() => null);
|
|
135
|
+
jest.spyOn(service.activeSessionLocalStorage, "flush");
|
|
136
|
+
jest.spyOn(service.authenticationStatusService, "isAuthenticated").mockImplementation(() => false);
|
|
119
137
|
const authStatus = await service.checkAuthStatus(false);
|
|
120
138
|
|
|
121
|
-
expect(
|
|
122
|
-
expect(
|
|
123
|
-
expect(authStatus).toStrictEqual({
|
|
139
|
+
expect(service.activeSessionLocalStorage.get).toHaveBeenCalledTimes(1);
|
|
140
|
+
expect(service.activeSessionLocalStorage.flush).not.toHaveBeenCalled();
|
|
141
|
+
expect(authStatus).toStrictEqual(new OnlineSessionEntity({ is_authenticated: false, is_mfa_authenticated: true }));
|
|
124
142
|
});
|
|
125
143
|
});
|
|
@@ -16,7 +16,7 @@ import toolbarService from "../toolbar/toolbarService";
|
|
|
16
16
|
import StartLoopAuthSessionCheckService from "./startLoopAuthSessionCheckService";
|
|
17
17
|
import InformCallToActionPagemod from "../../pagemod/informCallToActionPagemod";
|
|
18
18
|
import WorkerService from "../worker/workerService";
|
|
19
|
-
import
|
|
19
|
+
import SiteSettingsRuntimeCache from "../siteSettings/siteSettingsRuntimeCache";
|
|
20
20
|
|
|
21
21
|
class PostLoginService {
|
|
22
22
|
/**
|
|
@@ -24,8 +24,8 @@ class PostLoginService {
|
|
|
24
24
|
* @returns {Promise<void>}
|
|
25
25
|
*/
|
|
26
26
|
static async exec() {
|
|
27
|
-
// Clear
|
|
28
|
-
|
|
27
|
+
// Clear the in-memory site settings cache so the next authenticated read refetches.
|
|
28
|
+
SiteSettingsRuntimeCache.flushAll();
|
|
29
29
|
await PostLoginService.sendLoginEventForWorkers();
|
|
30
30
|
await StartLoopAuthSessionCheckService.exec();
|
|
31
31
|
toolbarService.handleUserLoggedIn();
|
|
@@ -23,7 +23,7 @@ import PostLoginService from "./postLoginService";
|
|
|
23
23
|
import StartLoopAuthSessionCheckService from "./startLoopAuthSessionCheckService";
|
|
24
24
|
import InformCallToActionPagemod from "../../pagemod/informCallToActionPagemod";
|
|
25
25
|
import toolbarService from "../toolbar/toolbarService";
|
|
26
|
-
import
|
|
26
|
+
import SiteSettingsRuntimeCache from "../siteSettings/siteSettingsRuntimeCache";
|
|
27
27
|
|
|
28
28
|
beforeEach(async () => {
|
|
29
29
|
jest.clearAllMocks();
|
|
@@ -49,7 +49,7 @@ describe("PostLoginService", () => {
|
|
|
49
49
|
jest.spyOn(informCtaPortWrapper, "emit");
|
|
50
50
|
jest.spyOn(toolbarService, "handleUserLoggedIn").mockImplementation(async () => {});
|
|
51
51
|
jest.spyOn(StartLoopAuthSessionCheckService, "exec").mockImplementation(async () => {});
|
|
52
|
-
jest.spyOn(
|
|
52
|
+
jest.spyOn(SiteSettingsRuntimeCache, "flushAll");
|
|
53
53
|
|
|
54
54
|
// execution
|
|
55
55
|
await PostLoginService.exec();
|
|
@@ -62,8 +62,8 @@ describe("PostLoginService", () => {
|
|
|
62
62
|
expect(BrowserTabService.sendMessage).toHaveBeenCalledWith(workerCta, "passbolt.port.connect", workerCta.id);
|
|
63
63
|
expect(informCtaPortWrapper.emit).toHaveBeenCalledWith("passbolt.auth.after-login");
|
|
64
64
|
expect(informCtaPortWrapper.emit).toHaveBeenCalledTimes(1);
|
|
65
|
-
// The
|
|
66
|
-
expect(
|
|
65
|
+
// The site settings runtime cache has been flushed
|
|
66
|
+
expect(SiteSettingsRuntimeCache.flushAll).toHaveBeenCalledTimes(1);
|
|
67
67
|
});
|
|
68
68
|
|
|
69
69
|
it("Should not send messages if no workers needs to receive post logout event", async () => {
|
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import CheckAuthStatusService from "./checkAuthStatusService";
|
|
15
15
|
import PostLogoutService from "./postLogoutService";
|
|
16
|
+
import GetActiveAccountService from "../account/getActiveAccountService";
|
|
17
|
+
import BuildApiClientOptionsService from "../account/buildApiClientOptionsService";
|
|
16
18
|
|
|
17
19
|
const CHECK_IS_AUTHENTICATED_INTERVAL_PERIOD = 60000;
|
|
18
20
|
const AUTH_SESSION_CHECK_ALARM = "AuthSessionCheck";
|
|
@@ -50,7 +52,9 @@ class StartLoopAuthSessionCheckService {
|
|
|
50
52
|
if (alarm.name !== StartLoopAuthSessionCheckService.ALARM_NAME) {
|
|
51
53
|
return;
|
|
52
54
|
}
|
|
53
|
-
const
|
|
55
|
+
const account = await GetActiveAccountService.get();
|
|
56
|
+
const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
|
|
57
|
+
const checkAuthService = new CheckAuthStatusService(account, apiClientOptions);
|
|
54
58
|
const authStatus = await checkAuthService.checkAuthStatus(true);
|
|
55
59
|
if (!authStatus.isAuthenticated) {
|
|
56
60
|
PostLogoutService.exec();
|
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
import CheckAuthStatusService from "./checkAuthStatusService";
|
|
15
15
|
import PostLogoutService from "./postLogoutService";
|
|
16
16
|
import StartLoopAuthSessionCheckService from "./startLoopAuthSessionCheckService";
|
|
17
|
+
import AccountEntity from "../../model/entity/account/accountEntity";
|
|
18
|
+
import { defaultAccountDto } from "../../model/entity/account/accountEntity.test.data";
|
|
19
|
+
import GetActiveAccountService from "../account/getActiveAccountService";
|
|
20
|
+
import OnlineSessionEntity from "passbolt-styleguide/src/shared/models/entity/session/onlineSessionEntity";
|
|
17
21
|
|
|
18
22
|
jest.useFakeTimers();
|
|
19
23
|
|
|
@@ -23,6 +27,8 @@ beforeEach(async () => {
|
|
|
23
27
|
jest.clearAllMocks();
|
|
24
28
|
jest.clearAllTimers();
|
|
25
29
|
await browser.alarms.clearAll();
|
|
30
|
+
const account = new AccountEntity(defaultAccountDto());
|
|
31
|
+
jest.spyOn(GetActiveAccountService, "get").mockImplementation(() => account);
|
|
26
32
|
});
|
|
27
33
|
|
|
28
34
|
describe("StartLoopAuthSessionCheckService", () => {
|
|
@@ -30,10 +36,10 @@ describe("StartLoopAuthSessionCheckService", () => {
|
|
|
30
36
|
expect.assertions(7);
|
|
31
37
|
// Function mocked
|
|
32
38
|
const spyClearAuthSessionCheck = jest.spyOn(StartLoopAuthSessionCheckService, "clearAlarm");
|
|
33
|
-
const
|
|
39
|
+
const sessionEntity = new OnlineSessionEntity({ is_authenticated: true, is_mfa_authenticated: true });
|
|
34
40
|
const spyIsAuthenticated = jest
|
|
35
41
|
.spyOn(CheckAuthStatusService.prototype, "checkAuthStatus")
|
|
36
|
-
.mockImplementation(() => Promise.resolve(
|
|
42
|
+
.mockImplementation(() => Promise.resolve(sessionEntity));
|
|
37
43
|
|
|
38
44
|
//mocking top-level alarm handler
|
|
39
45
|
browser.alarms.onAlarm.addListener(
|
|
@@ -42,15 +48,15 @@ describe("StartLoopAuthSessionCheckService", () => {
|
|
|
42
48
|
|
|
43
49
|
// Process
|
|
44
50
|
await StartLoopAuthSessionCheckService.exec();
|
|
45
|
-
|
|
46
51
|
// Expectation
|
|
47
52
|
expect(spyIsAuthenticated).toHaveBeenCalledTimes(0);
|
|
48
53
|
expect(spyClearAuthSessionCheck).toHaveBeenCalledTimes(0);
|
|
49
|
-
jest.advanceTimersByTime(60000);
|
|
54
|
+
await jest.advanceTimersByTime(60000);
|
|
50
55
|
expect(spyIsAuthenticated).toHaveBeenCalledTimes(1);
|
|
51
56
|
expect(spyClearAuthSessionCheck).toHaveBeenCalledTimes(0);
|
|
52
57
|
|
|
53
|
-
jest.advanceTimersByTime(60000);
|
|
58
|
+
await jest.advanceTimersByTime(60000);
|
|
59
|
+
|
|
54
60
|
expect(spyIsAuthenticated).toHaveBeenCalledTimes(2);
|
|
55
61
|
|
|
56
62
|
await PostLogoutService.exec();
|
|
@@ -62,10 +68,10 @@ describe("StartLoopAuthSessionCheckService", () => {
|
|
|
62
68
|
expect.assertions(4);
|
|
63
69
|
// Function mocked
|
|
64
70
|
const spyClearAuthSessionCheck = jest.spyOn(StartLoopAuthSessionCheckService, "clearAlarm");
|
|
65
|
-
const
|
|
71
|
+
const sessionEntity = new OnlineSessionEntity({ is_authenticated: false, is_mfa_authenticated: true });
|
|
66
72
|
const spyIsAuthenticated = jest
|
|
67
73
|
.spyOn(CheckAuthStatusService.prototype, "checkAuthStatus")
|
|
68
|
-
.mockImplementation(() => Promise.resolve(
|
|
74
|
+
.mockImplementation(() => Promise.resolve(sessionEntity));
|
|
69
75
|
const spyOnPostLogout = jest.spyOn(PostLogoutService, "exec").mockImplementation(async () => {});
|
|
70
76
|
|
|
71
77
|
//mocking top-level alarm handler
|
|
@@ -79,7 +85,7 @@ describe("StartLoopAuthSessionCheckService", () => {
|
|
|
79
85
|
expect(spyIsAuthenticated).toHaveBeenCalledTimes(0);
|
|
80
86
|
expect(spyClearAuthSessionCheck).toHaveBeenCalledTimes(0);
|
|
81
87
|
|
|
82
|
-
jest.advanceTimersByTime(60000);
|
|
88
|
+
await jest.advanceTimersByTime(60000);
|
|
83
89
|
await Promise.resolve();
|
|
84
90
|
|
|
85
91
|
expect(spyIsAuthenticated).toHaveBeenCalledTimes(1);
|
|
@@ -13,22 +13,27 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import MfaAuthenticationRequiredError from "../error/mfaAuthenticationRequiredError";
|
|
15
15
|
import NotFoundError from "../error/notFoundError";
|
|
16
|
-
import { ApiClient } from "passbolt-styleguide/src/shared/lib/apiClient/apiClient";
|
|
17
16
|
import PassboltBadResponseError from "../error/passboltBadResponseError";
|
|
18
|
-
import
|
|
19
|
-
import BuildApiClientOptionsService from "./account/buildApiClientOptionsService";
|
|
17
|
+
import AbstractService from "passbolt-styleguide/src/shared/services/api/abstract/abstractService";
|
|
20
18
|
|
|
21
19
|
const AUTH_RESOURCE_NAME = "/auth";
|
|
22
20
|
const MFA_VERIFY_ERROR_REGEXP = /mfa\/verify\/error\.json$/;
|
|
23
21
|
|
|
24
|
-
class AuthenticationStatusService {
|
|
22
|
+
class AuthenticationStatusService extends AbstractService {
|
|
23
|
+
/**
|
|
24
|
+
* @constructor
|
|
25
|
+
* @param {ApiClientOptions} apiClientOptions
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
constructor(apiClientOptions) {
|
|
29
|
+
super(apiClientOptions, AUTH_RESOURCE_NAME);
|
|
30
|
+
}
|
|
25
31
|
/**
|
|
26
32
|
* Check if the current user is authenticated.
|
|
27
33
|
* @returns {Promise<boolean>}
|
|
28
34
|
*/
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
const url = apiClient.buildUrl(`${apiClient.baseUrl.toString()}/is-authenticated`, null);
|
|
35
|
+
async isAuthenticated() {
|
|
36
|
+
const url = this.apiClient.buildUrl(`${this.apiClient.baseUrl.toString()}/is-authenticated`, null);
|
|
32
37
|
|
|
33
38
|
const fetchOptions = {
|
|
34
39
|
credentials: "include",
|
|
@@ -37,7 +42,7 @@ class AuthenticationStatusService {
|
|
|
37
42
|
"content-type": "application/json",
|
|
38
43
|
},
|
|
39
44
|
};
|
|
40
|
-
const response = await apiClient.sendRequest("GET", url, null, fetchOptions);
|
|
45
|
+
const response = await this.apiClient.sendRequest("GET", url, null, fetchOptions);
|
|
41
46
|
|
|
42
47
|
let responseJson;
|
|
43
48
|
try {
|
|
@@ -64,16 +69,6 @@ class AuthenticationStatusService {
|
|
|
64
69
|
|
|
65
70
|
return false;
|
|
66
71
|
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Return a built ApiClientOptions for requesting the API.
|
|
70
|
-
* @returns {ApiClientOptions}
|
|
71
|
-
* @private
|
|
72
|
-
*/
|
|
73
|
-
static async getApiClientOptions() {
|
|
74
|
-
const account = await GetActiveAccountService.get();
|
|
75
|
-
return BuildApiClientOptionsService.buildFromAccount(account).setResourceName(AUTH_RESOURCE_NAME);
|
|
76
|
-
}
|
|
77
72
|
}
|
|
78
73
|
|
|
79
74
|
export default AuthenticationStatusService;
|
|
@@ -15,7 +15,7 @@ import AuthenticationStatusService from "./authenticationStatusService";
|
|
|
15
15
|
import { enableFetchMocks } from "jest-fetch-mock";
|
|
16
16
|
import { mockApiResponse, mockApiResponseError, mockApiRedirectResponse } from "../../../../test/mocks/mockApiResponse";
|
|
17
17
|
import NotFoundError from "../error/notFoundError";
|
|
18
|
-
import
|
|
18
|
+
import { defaultApiClientOptions } from "passbolt-styleguide/src/shared/lib/apiClient/apiClientOptions.test.data";
|
|
19
19
|
import MfaAuthenticationRequiredError from "../error/mfaAuthenticationRequiredError";
|
|
20
20
|
|
|
21
21
|
beforeAll(() => {
|
|
@@ -24,7 +24,6 @@ beforeAll(() => {
|
|
|
24
24
|
|
|
25
25
|
beforeEach(async () => {
|
|
26
26
|
jest.clearAllMocks();
|
|
27
|
-
await MockExtension.withConfiguredAccount();
|
|
28
27
|
});
|
|
29
28
|
|
|
30
29
|
describe("AuthenticationStatusService::isAuthenticated", () => {
|
|
@@ -35,24 +34,28 @@ describe("AuthenticationStatusService::isAuthenticated", () => {
|
|
|
35
34
|
it("should return true if the user is fully authenticated", async () => {
|
|
36
35
|
expect.assertions(1);
|
|
37
36
|
mockIsAuthenticated(() => mockApiResponse({}));
|
|
38
|
-
|
|
37
|
+
const authenticationStatusService = new AuthenticationStatusService(defaultApiClientOptions());
|
|
38
|
+
await expect(authenticationStatusService.isAuthenticated()).resolves.toStrictEqual(true);
|
|
39
39
|
});
|
|
40
40
|
|
|
41
41
|
it("should return false if the user is not signed in and doesn't required MFA", async () => {
|
|
42
42
|
expect.assertions(1);
|
|
43
43
|
mockIsAuthenticated(() => mockApiResponseError(403, "User is not signed in"));
|
|
44
|
-
|
|
44
|
+
const authenticationStatusService = new AuthenticationStatusService(defaultApiClientOptions());
|
|
45
|
+
await expect(authenticationStatusService.isAuthenticated()).resolves.toStrictEqual(false);
|
|
45
46
|
});
|
|
46
47
|
|
|
47
48
|
it("should throw an Error if the endpoint is not found", async () => {
|
|
48
49
|
expect.assertions(1);
|
|
49
50
|
mockIsAuthenticated(() => mockApiResponseError(404, "Endpoint is not found"));
|
|
50
|
-
|
|
51
|
+
const authenticationStatusService = new AuthenticationStatusService(defaultApiClientOptions());
|
|
52
|
+
await expect(authenticationStatusService.isAuthenticated()).rejects.toThrow(NotFoundError);
|
|
51
53
|
});
|
|
52
54
|
|
|
53
55
|
it("should throw an MfaAuthenticationRequiredError if the user miss the Mfa authentication", async () => {
|
|
54
56
|
expect.assertions(1);
|
|
55
57
|
mockIsAuthenticated(() => mockApiRedirectResponse("/mfa/verify/error.json"));
|
|
56
|
-
|
|
58
|
+
const authenticationStatusService = new AuthenticationStatusService(defaultApiClientOptions());
|
|
59
|
+
await expect(authenticationStatusService.isAuthenticated()).rejects.toThrow(MfaAuthenticationRequiredError);
|
|
57
60
|
});
|
|
58
61
|
});
|
|
@@ -17,9 +17,9 @@ import GenerateGpgKeyPairOptionsEntity from "../../model/entity/gpgkey/generate/
|
|
|
17
17
|
import DecryptPrivateKeyService from "../../service/crypto/decryptPrivateKeyService";
|
|
18
18
|
import { OpenpgpAssertion } from "../../utils/openpgp/openpgpAssertions";
|
|
19
19
|
import { defaultDto } from "../../model/entity/gpgkey/generate/generateGpgKeyPairOptionsEntity.test.data";
|
|
20
|
-
import {
|
|
21
|
-
import
|
|
22
|
-
import
|
|
20
|
+
import { customEmailValidationProSiteSettings } from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity.test.data";
|
|
21
|
+
import SiteSettingsEntity from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity";
|
|
22
|
+
import SiteSettingsRuntimeCache from "../siteSettings/siteSettingsRuntimeCache";
|
|
23
23
|
|
|
24
24
|
describe("GenerateGpgKeyPair service", () => {
|
|
25
25
|
it(
|
|
@@ -124,8 +124,8 @@ describe("GenerateGpgKeyPair service", () => {
|
|
|
124
124
|
it(
|
|
125
125
|
"should generate a key pair with a non standard email if the application settings customize the email validation.",
|
|
126
126
|
async () => {
|
|
127
|
-
const organizationSettings =
|
|
128
|
-
|
|
127
|
+
const organizationSettings = customEmailValidationProSiteSettings();
|
|
128
|
+
SiteSettingsRuntimeCache.set(new SiteSettingsEntity(organizationSettings));
|
|
129
129
|
|
|
130
130
|
const generateGpgKeyPairOptionsDto = defaultDto({ email: "admin@passbolt.c" });
|
|
131
131
|
const generateGpgKeyPairOptionsEntity = new GenerateGpgKeyPairOptionsEntity(generateGpgKeyPairOptionsDto);
|
|
@@ -11,28 +11,29 @@
|
|
|
11
11
|
* @link https://www.passbolt.com Passbolt(tm)
|
|
12
12
|
* @since 3.6.3
|
|
13
13
|
*/
|
|
14
|
-
import
|
|
14
|
+
import GetOrFindSiteSettingsService from "../siteSettings/getOrFindSiteSettingsService";
|
|
15
15
|
|
|
16
16
|
class GetGpgKeyCreationDateService {
|
|
17
17
|
/**
|
|
18
18
|
* Returns a date that could be used to generate a gpg key
|
|
19
19
|
* while being compatible with both the client and the server.
|
|
20
20
|
*
|
|
21
|
+
* @param {AccountEntity} account The account.
|
|
21
22
|
* @param {ApiClientOptions} apiClientOptions The api client options.
|
|
22
23
|
* @return {Promise<integer>}
|
|
23
24
|
*/
|
|
24
|
-
static async getDate(apiClientOptions) {
|
|
25
|
-
const
|
|
25
|
+
static async getDate(account, apiClientOptions) {
|
|
26
|
+
const getOrFindSiteSettingsService = new GetOrFindSiteSettingsService(account, apiClientOptions);
|
|
26
27
|
|
|
27
|
-
let
|
|
28
|
+
let siteSettings;
|
|
28
29
|
try {
|
|
29
|
-
|
|
30
|
+
siteSettings = await getOrFindSiteSettingsService.getOrFind(false);
|
|
30
31
|
} catch (e) {
|
|
31
32
|
console.error(e);
|
|
32
33
|
return new Date().getTime();
|
|
33
34
|
}
|
|
34
35
|
|
|
35
|
-
return
|
|
36
|
+
return siteSettings.isServerInPast() ? siteSettings.serverTime : new Date().getTime();
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
|
|
@@ -12,16 +12,19 @@
|
|
|
12
12
|
* @since 3.6.0
|
|
13
13
|
*/
|
|
14
14
|
import GetGpgKeyCreationDateService from "./getGpgKeyCreationDateService";
|
|
15
|
-
import {
|
|
15
|
+
import { anonymousSiteSettings } from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity.test.data";
|
|
16
16
|
import { mockApiResponse } from "../../../../../test/mocks/mockApiResponse";
|
|
17
17
|
import MockExtension from "../../../../../test/mocks/mockExtension";
|
|
18
18
|
import { enableFetchMocks } from "jest-fetch-mock";
|
|
19
19
|
import { defaultApiClientOptions } from "passbolt-styleguide/src/shared/lib/apiClient/apiClientOptions.test.data";
|
|
20
|
+
import AccountEntity from "../../model/entity/account/accountEntity";
|
|
21
|
+
import { defaultAccountDto } from "../../model/entity/account/accountEntity.test.data";
|
|
20
22
|
|
|
21
|
-
let currentTime;
|
|
23
|
+
let currentTime, account;
|
|
22
24
|
beforeEach(() => {
|
|
23
25
|
enableFetchMocks();
|
|
24
26
|
MockExtension.withMissingPrivateKeyAccount();
|
|
27
|
+
account = new AccountEntity(defaultAccountDto());
|
|
25
28
|
|
|
26
29
|
jest.useFakeTimers();
|
|
27
30
|
currentTime = new Date();
|
|
@@ -34,9 +37,9 @@ describe("GetGpgCompatibleDate service", () => {
|
|
|
34
37
|
const serverTimestamp = currentTime.getTime() - 3600000; //current time minus one hour
|
|
35
38
|
const serverTime = new Date(serverTimestamp);
|
|
36
39
|
|
|
37
|
-
fetch.doMock(() => mockApiResponse(
|
|
40
|
+
fetch.doMock(() => mockApiResponse(anonymousSiteSettings(), { servertime: serverTime.getTime() / 1000 }));
|
|
38
41
|
|
|
39
|
-
const gpgDate = await GetGpgKeyCreationDateService.getDate(defaultApiClientOptions());
|
|
42
|
+
const gpgDate = await GetGpgKeyCreationDateService.getDate(account, defaultApiClientOptions());
|
|
40
43
|
expect(gpgDate).toEqual(serverTime.getTime());
|
|
41
44
|
});
|
|
42
45
|
|
|
@@ -44,9 +47,9 @@ describe("GetGpgCompatibleDate service", () => {
|
|
|
44
47
|
const serverTimestamp = currentTime.getTime() + 3600000; //current time plus one hour
|
|
45
48
|
const serverTime = new Date(serverTimestamp);
|
|
46
49
|
|
|
47
|
-
fetch.doMock(() => mockApiResponse(
|
|
50
|
+
fetch.doMock(() => mockApiResponse(anonymousSiteSettings(), { servertime: serverTime.getTime() / 1000 }));
|
|
48
51
|
|
|
49
|
-
const gpgDate = await GetGpgKeyCreationDateService.getDate(defaultApiClientOptions());
|
|
52
|
+
const gpgDate = await GetGpgKeyCreationDateService.getDate(account, defaultApiClientOptions());
|
|
50
53
|
expect(gpgDate).toEqual(currentTime.getTime());
|
|
51
54
|
});
|
|
52
55
|
|
|
@@ -55,7 +58,7 @@ describe("GetGpgCompatibleDate service", () => {
|
|
|
55
58
|
throw new Error("Something wrong happened");
|
|
56
59
|
});
|
|
57
60
|
|
|
58
|
-
const gpgDate = await GetGpgKeyCreationDateService.getDate(defaultApiClientOptions());
|
|
61
|
+
const gpgDate = await GetGpgKeyCreationDateService.getDate(account, defaultApiClientOptions());
|
|
59
62
|
expect(gpgDate).toEqual(currentTime.getTime());
|
|
60
63
|
});
|
|
61
64
|
});
|