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
|
@@ -30,6 +30,9 @@ import GroupUserEntity from "passbolt-styleguide/src/shared/models/entity/groupU
|
|
|
30
30
|
import { plaintextSecretPasswordAndDescriptionDto } from "passbolt-styleguide/src/shared/models/entity/plaintextSecret/plaintextSecretEntity.test.data";
|
|
31
31
|
import GroupLocalStorage from "../local_storage/groupLocalStorage";
|
|
32
32
|
import { defaultProgressService } from "../progress/progressService.test.data";
|
|
33
|
+
import { RequestAddUsersToGroupOffscreenService } from "../../../../chrome-mv3/serviceWorker/service/addUsersToGroup/requestAddUsersToGroupOffscreenService";
|
|
34
|
+
import GroupUpdateSecretsCollection from "../../model/entity/secret/groupUpdate/groupUpdateSecretsCollection";
|
|
35
|
+
import SecretEntity from "passbolt-styleguide/src/shared/models/entity/secret/secretEntity";
|
|
33
36
|
|
|
34
37
|
beforeEach(() => {
|
|
35
38
|
jest.resetAllMocks();
|
|
@@ -261,6 +264,8 @@ describe("GroupUpdateService", () => {
|
|
|
261
264
|
it("should update the group and encrypt secrets for the new users", async () => {
|
|
262
265
|
expect.assertions(30);
|
|
263
266
|
|
|
267
|
+
chrome.runtime.getManifest.mockImplementation(() => ({ manifest_version: 2 }));
|
|
268
|
+
|
|
264
269
|
const apiClientOptions = defaultApiClientOptions();
|
|
265
270
|
const account = new AccountEntity(defaultAccountDto());
|
|
266
271
|
const progressService = defaultProgressService({ goals: 10 });
|
|
@@ -369,6 +374,137 @@ describe("GroupUpdateService", () => {
|
|
|
369
374
|
expect(progressService.updateStepMessage).toHaveBeenCalledWith("Updating group member 1/1");
|
|
370
375
|
});
|
|
371
376
|
|
|
377
|
+
it("should update the group and encrypt secrets for the new users with offscreen", async () => {
|
|
378
|
+
expect.assertions(28);
|
|
379
|
+
|
|
380
|
+
chrome.runtime.getManifest.mockImplementation(() => ({ manifest_version: 3 }));
|
|
381
|
+
|
|
382
|
+
const apiClientOptions = defaultApiClientOptions();
|
|
383
|
+
const account = new AccountEntity(defaultAccountDto());
|
|
384
|
+
const progressService = defaultProgressService({ goals: 10 });
|
|
385
|
+
|
|
386
|
+
const existingEntityDto = defaultGroupDto({}, { withGroupsUsers: 1 });
|
|
387
|
+
const updateGroupEntity = new GroupEntity({ ...existingEntityDto });
|
|
388
|
+
|
|
389
|
+
const newUser = new GroupUserEntity(createGroupUser({ group_id: existingEntityDto.id }));
|
|
390
|
+
updateGroupEntity._groups_users._items = [...updateGroupEntity._groups_users.items, newUser];
|
|
391
|
+
|
|
392
|
+
const mixGroupUpdateDto = {
|
|
393
|
+
...existingEntityDto,
|
|
394
|
+
groups_users: [
|
|
395
|
+
{
|
|
396
|
+
user_id: newUser._props.user_id,
|
|
397
|
+
is_admin: newUser._props.is_admin,
|
|
398
|
+
},
|
|
399
|
+
],
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
const secrets = defaultResourcesSecretsDtos(1);
|
|
403
|
+
|
|
404
|
+
const adaPublicKey = await OpenpgpAssertion.readKeyOrFail(pgpKeys.ada.public);
|
|
405
|
+
const originalDecryptedSecret = plaintextSecretPasswordAndDescriptionDto();
|
|
406
|
+
secrets[0].data = await EncryptMessageService.encrypt(JSON.stringify(originalDecryptedSecret), adaPublicKey);
|
|
407
|
+
const needed_secrets = [
|
|
408
|
+
{
|
|
409
|
+
user_id: newUser._props.user_id,
|
|
410
|
+
resource_id: secrets[0].resource_id,
|
|
411
|
+
},
|
|
412
|
+
];
|
|
413
|
+
const bettyPublicKey = await OpenpgpAssertion.readKeyOrFail(pgpKeys.betty.public);
|
|
414
|
+
const secretsBettyEncrypted = await EncryptMessageService.encrypt(
|
|
415
|
+
JSON.stringify(originalDecryptedSecret),
|
|
416
|
+
bettyPublicKey,
|
|
417
|
+
);
|
|
418
|
+
const secretBettyEntity = new SecretEntity({
|
|
419
|
+
user_id: newUser._props.user_id,
|
|
420
|
+
resource_id: secrets[0].resource_id,
|
|
421
|
+
data: secretsBettyEncrypted,
|
|
422
|
+
});
|
|
423
|
+
const groupUpdateDryRunResultDto = { needed_secrets, secrets };
|
|
424
|
+
const groupUpdateDryRunResultEntity = new GroupUpdateDryRunResultEntity(groupUpdateDryRunResultDto);
|
|
425
|
+
const diffGroupUpdateEntity = new GroupUpdateEntity(mixGroupUpdateDto);
|
|
426
|
+
|
|
427
|
+
const service = new GroupUpdateService(apiClientOptions, account, progressService);
|
|
428
|
+
|
|
429
|
+
const spyOnGroupModelGetById = jest.spyOn(service.groupModel, "getById");
|
|
430
|
+
const spyOnGroupModelDryRun = jest.spyOn(service.groupModel, "updateDryRun");
|
|
431
|
+
const spyOnGroupApiServiceUpdate = jest.spyOn(service.groupApiService, "update");
|
|
432
|
+
const spyOnKeyringSync = jest.spyOn(Keyring.prototype, "sync");
|
|
433
|
+
const spyOnKeyringFindPublic = jest.spyOn(Keyring.prototype, "findPublic");
|
|
434
|
+
const spyOnOffscreen = jest.spyOn(RequestAddUsersToGroupOffscreenService, "decryptAndEncryptSecrets");
|
|
435
|
+
jest.spyOn(GroupLocalStorage.prototype, "updateGroup").mockImplementation(() => {});
|
|
436
|
+
|
|
437
|
+
spyOnGroupModelGetById.mockImplementation(async () => new GroupEntity(existingEntityDto));
|
|
438
|
+
spyOnKeyringSync.mockImplementation(async () => {});
|
|
439
|
+
spyOnKeyringFindPublic.mockImplementation(() => ({ armoredKey: pgpKeys.betty.public }));
|
|
440
|
+
spyOnOffscreen.mockImplementationOnce(() => new GroupUpdateSecretsCollection([secretBettyEntity]));
|
|
441
|
+
|
|
442
|
+
spyOnGroupApiServiceUpdate.mockImplementation(async (groupUpdateId, groupUpdateDto) => {
|
|
443
|
+
if (!groupUpdateDto.groups_users) {
|
|
444
|
+
//it's the first step and a group name update only operation
|
|
445
|
+
expect(groupUpdateDto.id).toStrictEqual(diffGroupUpdateEntity.id);
|
|
446
|
+
expect(groupUpdateDto.name).toStrictEqual(diffGroupUpdateEntity.name);
|
|
447
|
+
return groupUpdateDto; // ignoring first step
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
expect(groupUpdateId).toStrictEqual(diffGroupUpdateEntity.id);
|
|
451
|
+
expect(groupUpdateDto.id).toStrictEqual(diffGroupUpdateEntity.id);
|
|
452
|
+
expect(groupUpdateDto.name).toStrictEqual(diffGroupUpdateEntity.name);
|
|
453
|
+
expect(groupUpdateDto.groups_users).toStrictEqual(diffGroupUpdateEntity.groupsUsers.toDto());
|
|
454
|
+
expect(groupUpdateDto.secrets).toHaveLength(1);
|
|
455
|
+
|
|
456
|
+
const secret = groupUpdateDto.secrets[0];
|
|
457
|
+
expect(secret.resource_id).toStrictEqual(secrets[0].resource_id);
|
|
458
|
+
expect(secret.user_id).toStrictEqual(newUser._props.user_id);
|
|
459
|
+
|
|
460
|
+
const decryptedData = await DecryptMessageService.decrypt(
|
|
461
|
+
await OpenpgpAssertion.readMessageOrFail(secret.data),
|
|
462
|
+
await OpenpgpAssertion.readKeyOrFail(pgpKeys.betty.private_decrypted),
|
|
463
|
+
);
|
|
464
|
+
expect(JSON.parse(decryptedData)).toStrictEqual(originalDecryptedSecret);
|
|
465
|
+
|
|
466
|
+
return groupUpdateDto;
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
spyOnGroupModelDryRun.mockImplementation(async (groupUpdateEntity) => {
|
|
470
|
+
expect(groupUpdateEntity).toStrictEqual(diffGroupUpdateEntity);
|
|
471
|
+
return groupUpdateDryRunResultEntity;
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
await service.exec(updateGroupEntity, "ada@passbolt.com");
|
|
475
|
+
|
|
476
|
+
expect(spyOnKeyringSync).toHaveBeenCalledTimes(1);
|
|
477
|
+
expect(spyOnKeyringFindPublic).toHaveBeenCalledWith(newUser._props.user_id);
|
|
478
|
+
|
|
479
|
+
expect(spyOnGroupModelGetById).toHaveBeenCalledTimes(1);
|
|
480
|
+
expect(spyOnGroupModelGetById).toHaveBeenCalledWith(updateGroupEntity.id);
|
|
481
|
+
|
|
482
|
+
expect(spyOnGroupModelDryRun).toHaveBeenCalledTimes(1);
|
|
483
|
+
|
|
484
|
+
expect(spyOnGroupApiServiceUpdate).toHaveBeenCalledTimes(2);
|
|
485
|
+
|
|
486
|
+
expect(spyOnOffscreen).toHaveBeenCalledTimes(1);
|
|
487
|
+
expect(spyOnOffscreen).toHaveBeenCalledWith(
|
|
488
|
+
account,
|
|
489
|
+
"ada@passbolt.com",
|
|
490
|
+
groupUpdateDryRunResultEntity,
|
|
491
|
+
{ [newUser._props.user_id]: pgpKeys.betty.public },
|
|
492
|
+
progressService,
|
|
493
|
+
);
|
|
494
|
+
|
|
495
|
+
//Exepctation for the progressSerivce when there is no crypto involved
|
|
496
|
+
expect(progressService.start).toHaveBeenCalledTimes(1);
|
|
497
|
+
expect(progressService.start).toHaveBeenCalledWith(6, "Initialize");
|
|
498
|
+
expect(progressService.updateGoals).not.toHaveBeenCalled();
|
|
499
|
+
|
|
500
|
+
expect(progressService.finishStep).toHaveBeenCalledTimes(5);
|
|
501
|
+
expect(progressService.finishStep).toHaveBeenCalledWith("Group update feasibility check", true);
|
|
502
|
+
expect(progressService.finishStep).toHaveBeenCalledWith("Encrypt required secrets for new users", true);
|
|
503
|
+
expect(progressService.finishStep).toHaveBeenCalledWith("Synchronizing keyring", true);
|
|
504
|
+
expect(progressService.finishStep).toHaveBeenCalledWith("Updating group", true);
|
|
505
|
+
expect(progressService.finishStep).toHaveBeenCalledWith("Done", true);
|
|
506
|
+
});
|
|
507
|
+
|
|
372
508
|
it("should throw an error if the given dto is not valid as a GroupEntity", async () => {
|
|
373
509
|
expect.assertions(1);
|
|
374
510
|
|
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
import ResourceLocalStorage from "../local_storage/resourceLocalStorage";
|
|
15
15
|
import ResourceTypeLocalStorage from "../local_storage/resourceTypeLocalStorage";
|
|
16
16
|
import FolderLocalStorage from "../local_storage/folderLocalStorage";
|
|
17
|
-
import AuthStatusLocalStorage from "../local_storage/authStatusLocalStorage";
|
|
18
17
|
import UserLocalStorage from "../local_storage/userLocalStorage";
|
|
19
18
|
import GroupLocalStorage from "../local_storage/groupLocalStorage";
|
|
20
19
|
import RolesLocalStorage from "../local_storage/rolesLocalStorage";
|
|
@@ -24,7 +23,6 @@ import PassphraseStorageService from "../session_storage/passphraseStorageServic
|
|
|
24
23
|
import SsoKitTemporaryStorageService from "../session_storage/ssoKitTemporaryStorageService";
|
|
25
24
|
import GetLegacyAccountService from "../account/getLegacyAccountService";
|
|
26
25
|
import RbacsLocalStorage from "../local_storage/rbacLocalStorage";
|
|
27
|
-
import UserMeSessionStorageService from "../sessionStorage/userMeSessionStorageService";
|
|
28
26
|
import User from "../../model/user";
|
|
29
27
|
import PasswordPoliciesLocalStorage from "../local_storage/passwordPoliciesLocalStorage";
|
|
30
28
|
import PasswordExpirySettingsLocalStorage from "../local_storage/passwordExpirySettingsLocalStorage";
|
|
@@ -33,6 +31,9 @@ import MetadataKeysSettingsLocalStorage from "../local_storage/metadataKeysSetti
|
|
|
33
31
|
import MetadataTypesSettingsLocalStorage from "../local_storage/metadataTypesSettingsLocalStorage";
|
|
34
32
|
import MetadataKeysSessionStorage from "../session_storage/metadataKeysSessionStorage";
|
|
35
33
|
import SessionKeysBundlesSessionStorageService from "../sessionStorage/sessionKeysBundlesSessionStorageService";
|
|
34
|
+
import ActiveSessionLocalStorage from "../local_storage/activeSessionLocalStorage";
|
|
35
|
+
import UserMeLocalStorage from "../local_storage/userMeLocalStorage";
|
|
36
|
+
import SiteSettingsLocalStorage from "../local_storage/siteSettingsLocalStorage";
|
|
36
37
|
|
|
37
38
|
/**
|
|
38
39
|
* Flush storage data when:
|
|
@@ -45,9 +46,7 @@ class LocalStorageService {
|
|
|
45
46
|
*/
|
|
46
47
|
static async flush() {
|
|
47
48
|
ResourceLocalStorage.flush();
|
|
48
|
-
ResourceTypeLocalStorage.flush();
|
|
49
49
|
FolderLocalStorage.flush();
|
|
50
|
-
AuthStatusLocalStorage.flush();
|
|
51
50
|
UserLocalStorage.flush();
|
|
52
51
|
RolesLocalStorage.flush();
|
|
53
52
|
PasswordGeneratorLocalStorage.flush();
|
|
@@ -64,8 +63,10 @@ class LocalStorageService {
|
|
|
64
63
|
return;
|
|
65
64
|
}
|
|
66
65
|
|
|
67
|
-
const account =
|
|
66
|
+
const account = GetLegacyAccountService.get();
|
|
67
|
+
new ActiveSessionLocalStorage(account).flush();
|
|
68
68
|
new RbacsLocalStorage(account).flush();
|
|
69
|
+
new ResourceTypeLocalStorage(account).flush();
|
|
69
70
|
new PasswordPoliciesLocalStorage(account).flush();
|
|
70
71
|
new PasswordExpirySettingsLocalStorage(account).flush();
|
|
71
72
|
new MetadataKeysSettingsLocalStorage(account).flush();
|
|
@@ -73,7 +74,8 @@ class LocalStorageService {
|
|
|
73
74
|
new MetadataKeysSessionStorage(account).flush();
|
|
74
75
|
new SessionKeysBundlesSessionStorageService(account).flush();
|
|
75
76
|
new GroupLocalStorage(account).flush();
|
|
76
|
-
|
|
77
|
+
new UserMeLocalStorage(account).flush();
|
|
78
|
+
new SiteSettingsLocalStorage(account).flush();
|
|
77
79
|
}
|
|
78
80
|
}
|
|
79
81
|
|
|
@@ -14,10 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
import LocalStorageService from "./localStorageService";
|
|
16
16
|
import GetLegacyAccountService from "../account/getLegacyAccountService";
|
|
17
|
-
import UserMeSessionStorageService from "../sessionStorage/userMeSessionStorageService";
|
|
18
17
|
import { defaultAccountDto } from "../../model/entity/account/accountEntity.test.data";
|
|
19
18
|
import AccountEntity from "../../model/entity/account/accountEntity";
|
|
20
|
-
import { RBACS_LOCAL_STORAGE_KEY } from "../local_storage/rbacLocalStorage";
|
|
19
|
+
import RbacLocalStorage, { RBACS_LOCAL_STORAGE_KEY } from "../local_storage/rbacLocalStorage";
|
|
21
20
|
import MockExtension from "../../../../../test/mocks/mockExtension";
|
|
22
21
|
import PostponeUserSettingInvitationService from "../invitation/postponeUserSettingInvitationService";
|
|
23
22
|
import { PASSWORD_POLICIES_LOCAL_STORAGE_KEY } from "../local_storage/passwordPoliciesLocalStorage";
|
|
@@ -33,6 +32,12 @@ import SessionKeysBundlesSessionStorageService, {
|
|
|
33
32
|
} from "../sessionStorage/sessionKeysBundlesSessionStorageService";
|
|
34
33
|
import { METADATA_KEYS_SETTINGS_LOCAL_STORAGE_KEY } from "../local_storage/metadataKeysSettingsLocalStorage";
|
|
35
34
|
import GroupLocalStorage, { GROUP_LOCAL_STORAGE_KEY } from "../local_storage/groupLocalStorage";
|
|
35
|
+
import UserMeLocalStorage, { USER_ME_STORAGE_KEY_PREFIX } from "../local_storage/userMeLocalStorage";
|
|
36
|
+
import ResourceTypeLocalStorage, { RESOURCE_TYPES_LOCAL_STORAGE_KEY } from "../local_storage/resourceTypeLocalStorage";
|
|
37
|
+
import ActiveSessionLocalStorage, {
|
|
38
|
+
ACTIVE_SESSION_LOCAL_STORAGE_KEY,
|
|
39
|
+
} from "../local_storage/activeSessionLocalStorage";
|
|
40
|
+
import SiteSettingsLocalStorage, { SITE_SETTINGS } from "../local_storage/siteSettingsLocalStorage";
|
|
36
41
|
|
|
37
42
|
beforeEach(() => {
|
|
38
43
|
jest.clearAllMocks();
|
|
@@ -41,28 +46,30 @@ beforeEach(() => {
|
|
|
41
46
|
describe("LocalStorageService", () => {
|
|
42
47
|
describe("LocalStorageService::flush", () => {
|
|
43
48
|
it("Should flush all storage (with no account set)", async () => {
|
|
44
|
-
expect.assertions(
|
|
49
|
+
expect.assertions(23);
|
|
45
50
|
// spy on
|
|
46
51
|
jest.spyOn(browser.storage.local, "remove");
|
|
47
52
|
jest.spyOn(browser.storage.session, "remove");
|
|
48
53
|
jest.spyOn(browser.alarms, "clear");
|
|
49
54
|
jest.spyOn(GetLegacyAccountService, "get");
|
|
50
|
-
jest.spyOn(
|
|
55
|
+
jest.spyOn(UserMeLocalStorage.prototype, "flush");
|
|
51
56
|
jest.spyOn(PostponeUserSettingInvitationService, "reset");
|
|
52
57
|
jest.spyOn(MetadataTypesSettingsLocalStorage.prototype, "flush");
|
|
53
58
|
jest.spyOn(MetadataKeysSessionStorage.prototype, "flush");
|
|
54
59
|
jest.spyOn(SessionKeysBundlesSessionStorageService.prototype, "flush");
|
|
55
60
|
jest.spyOn(GroupLocalStorage.prototype, "flush");
|
|
61
|
+
jest.spyOn(ResourceTypeLocalStorage.prototype, "flush");
|
|
62
|
+
jest.spyOn(RbacLocalStorage.prototype, "flush");
|
|
63
|
+
jest.spyOn(ActiveSessionLocalStorage.prototype, "flush");
|
|
64
|
+
jest.spyOn(SiteSettingsLocalStorage.prototype, "flush");
|
|
56
65
|
// process
|
|
57
66
|
await LocalStorageService.flush();
|
|
58
67
|
// expectations
|
|
59
|
-
expect(browser.storage.local.remove).toHaveBeenCalledTimes(
|
|
68
|
+
expect(browser.storage.local.remove).toHaveBeenCalledTimes(5);
|
|
60
69
|
expect(browser.storage.session.remove).toHaveBeenCalledTimes(2);
|
|
61
70
|
expect(browser.alarms.clear).toHaveBeenCalledTimes(2);
|
|
62
71
|
expect(browser.storage.local.remove).toHaveBeenCalledWith("resources");
|
|
63
|
-
expect(browser.storage.local.remove).toHaveBeenCalledWith("resourceTypes");
|
|
64
72
|
expect(browser.storage.local.remove).toHaveBeenCalledWith("folders");
|
|
65
|
-
expect(browser.storage.local.remove).toHaveBeenCalledWith("auth_status");
|
|
66
73
|
expect(browser.storage.local.remove).toHaveBeenCalledWith("users");
|
|
67
74
|
expect(browser.storage.local.remove).toHaveBeenCalledWith("roles");
|
|
68
75
|
expect(browser.storage.local.remove).toHaveBeenCalledWith("passwordGenerator");
|
|
@@ -72,15 +79,19 @@ describe("LocalStorageService", () => {
|
|
|
72
79
|
expect(browser.alarms.clear).toHaveBeenCalledWith("SessionKeepAlive");
|
|
73
80
|
expect(browser.storage.session.remove).toHaveBeenCalledWith("temp_server_part_sso_kit");
|
|
74
81
|
expect(GetLegacyAccountService.get).not.toHaveBeenCalled();
|
|
75
|
-
expect(
|
|
82
|
+
expect(UserMeLocalStorage.prototype.flush).not.toHaveBeenCalled();
|
|
76
83
|
expect(MetadataTypesSettingsLocalStorage.prototype.flush).not.toHaveBeenCalled();
|
|
77
84
|
expect(MetadataKeysSessionStorage.prototype.flush).not.toHaveBeenCalled();
|
|
78
85
|
expect(SessionKeysBundlesSessionStorageService.prototype.flush).not.toHaveBeenCalled();
|
|
79
86
|
expect(GroupLocalStorage.prototype.flush).not.toHaveBeenCalled();
|
|
87
|
+
expect(ResourceTypeLocalStorage.prototype.flush).not.toHaveBeenCalled();
|
|
88
|
+
expect(RbacLocalStorage.prototype.flush).not.toHaveBeenCalled();
|
|
89
|
+
expect(ActiveSessionLocalStorage.prototype.flush).not.toHaveBeenCalled();
|
|
90
|
+
expect(SiteSettingsLocalStorage.prototype.flush).not.toHaveBeenCalled();
|
|
80
91
|
});
|
|
81
92
|
|
|
82
93
|
it("Should flush all storage (with an account set)", async () => {
|
|
83
|
-
expect.assertions(
|
|
94
|
+
expect.assertions(30);
|
|
84
95
|
// mock data
|
|
85
96
|
MockExtension.withConfiguredAccount();
|
|
86
97
|
const account = new AccountEntity(defaultAccountDto());
|
|
@@ -90,17 +101,16 @@ describe("LocalStorageService", () => {
|
|
|
90
101
|
jest.spyOn(browser.alarms, "clear");
|
|
91
102
|
jest.spyOn(PostponeUserSettingInvitationService, "reset");
|
|
92
103
|
jest.spyOn(GetLegacyAccountService, "get").mockImplementation(() => account);
|
|
93
|
-
jest.spyOn(UserMeSessionStorageService, "remove");
|
|
94
104
|
// process
|
|
95
105
|
await LocalStorageService.flush();
|
|
106
|
+
// Need to wait metadata and data to be removed
|
|
107
|
+
await Promise.resolve();
|
|
96
108
|
// expectations
|
|
97
|
-
expect(browser.storage.local.remove).toHaveBeenCalledTimes(
|
|
98
|
-
expect(browser.storage.session.remove).toHaveBeenCalledTimes(
|
|
109
|
+
expect(browser.storage.local.remove).toHaveBeenCalledTimes(19);
|
|
110
|
+
expect(browser.storage.session.remove).toHaveBeenCalledTimes(4);
|
|
99
111
|
expect(browser.alarms.clear).toHaveBeenCalledTimes(2);
|
|
100
112
|
expect(browser.storage.local.remove).toHaveBeenCalledWith("resources");
|
|
101
|
-
expect(browser.storage.local.remove).toHaveBeenCalledWith("resourceTypes");
|
|
102
113
|
expect(browser.storage.local.remove).toHaveBeenCalledWith("folders");
|
|
103
|
-
expect(browser.storage.local.remove).toHaveBeenCalledWith("auth_status");
|
|
104
114
|
expect(browser.storage.local.remove).toHaveBeenCalledWith("users");
|
|
105
115
|
expect(browser.storage.local.remove).toHaveBeenCalledWith("groups");
|
|
106
116
|
expect(browser.storage.local.remove).toHaveBeenCalledWith("roles");
|
|
@@ -111,6 +121,7 @@ describe("LocalStorageService", () => {
|
|
|
111
121
|
expect(browser.alarms.clear).toHaveBeenCalledWith("SessionKeepAlive");
|
|
112
122
|
expect(browser.storage.session.remove).toHaveBeenCalledWith("temp_server_part_sso_kit");
|
|
113
123
|
expect(GetLegacyAccountService.get).toHaveBeenCalled();
|
|
124
|
+
expect(browser.storage.local.remove).toHaveBeenCalledWith(`${RBACS_LOCAL_STORAGE_KEY}-metadata-${account.id}`);
|
|
114
125
|
expect(browser.storage.local.remove).toHaveBeenCalledWith(`${RBACS_LOCAL_STORAGE_KEY}-${account.id}`);
|
|
115
126
|
expect(browser.storage.local.remove).toHaveBeenCalledWith(`${PASSWORD_POLICIES_LOCAL_STORAGE_KEY}-${account.id}`);
|
|
116
127
|
expect(browser.storage.local.remove).toHaveBeenCalledWith(
|
|
@@ -126,8 +137,15 @@ describe("LocalStorageService", () => {
|
|
|
126
137
|
expect(browser.storage.session.remove).toHaveBeenCalledWith(
|
|
127
138
|
`${SESSION_KEYS_BUNDLES_SESSION_STORAGE_KEY}-${account.id}`,
|
|
128
139
|
);
|
|
129
|
-
expect(
|
|
140
|
+
expect(browser.storage.local.remove).toHaveBeenCalledWith(`${USER_ME_STORAGE_KEY_PREFIX}-metadata-${account.id}`);
|
|
141
|
+
expect(browser.storage.local.remove).toHaveBeenCalledWith(`${USER_ME_STORAGE_KEY_PREFIX}-${account.id}`);
|
|
130
142
|
expect(browser.storage.local.remove).toHaveBeenCalledWith(`${GROUP_LOCAL_STORAGE_KEY}`);
|
|
143
|
+
expect(browser.storage.local.remove).toHaveBeenCalledWith(
|
|
144
|
+
`${RESOURCE_TYPES_LOCAL_STORAGE_KEY}-metadata-${account.id}`,
|
|
145
|
+
);
|
|
146
|
+
expect(browser.storage.local.remove).toHaveBeenCalledWith(`${RESOURCE_TYPES_LOCAL_STORAGE_KEY}-${account.id}`);
|
|
147
|
+
expect(browser.storage.local.remove).toHaveBeenCalledWith(`${ACTIVE_SESSION_LOCAL_STORAGE_KEY}-${account.id}`);
|
|
148
|
+
expect(browser.storage.local.remove).toHaveBeenCalledWith(`${SITE_SETTINGS}-${account.id}`);
|
|
131
149
|
/**
|
|
132
150
|
* TODO: Re-enable this test assertion once local storage flush operations are properly awaited.
|
|
133
151
|
* Currently disabled because the storage flush for the second key may not complete
|
|
@@ -0,0 +1,193 @@
|
|
|
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 Log from "../../model/log";
|
|
15
|
+
import { assertType } from "../../utils/assertions";
|
|
16
|
+
import LocalStorageMetadataEntity from "../../model/entity/localStorage/localStorageMetadataEntity";
|
|
17
|
+
import AbstractAccountEntity from "../../model/entity/account/abstractAccountEntity";
|
|
18
|
+
|
|
19
|
+
class AbstractLocalStorage {
|
|
20
|
+
/**
|
|
21
|
+
* Runtime cached data.
|
|
22
|
+
* @type {Object} Key: account_id, value: cached data as dto.
|
|
23
|
+
* @private
|
|
24
|
+
*/
|
|
25
|
+
static _runtimeCachedData = {};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Runtime cached metadata.
|
|
29
|
+
* @type {Object} Key: account_id, value: cached metadata as dto.
|
|
30
|
+
* @private
|
|
31
|
+
*/
|
|
32
|
+
static _runtimeCachedMetadata = {};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Constructor
|
|
36
|
+
* @param account the user account
|
|
37
|
+
*/
|
|
38
|
+
constructor(account) {
|
|
39
|
+
if (!account || !(account instanceof AbstractAccountEntity)) {
|
|
40
|
+
throw new TypeError("Parameter `account` should be of type AbstractAccountEntity.");
|
|
41
|
+
}
|
|
42
|
+
this.account = account;
|
|
43
|
+
this.storageMetadataKey = this.getMetadataStorageKey(account);
|
|
44
|
+
this.storageDataKey = this.getDataStorageKey(account);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Get the metadata data storage key.
|
|
49
|
+
* @param {AbstractAccountEntity} account The account to get the key for.
|
|
50
|
+
* @returns {string}
|
|
51
|
+
* @throws {Error} If it cannot retrieve account id.
|
|
52
|
+
*/
|
|
53
|
+
getMetadataStorageKey(account) {
|
|
54
|
+
return `${this.key}-metadata-${account.id}`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Get the data storage key.
|
|
59
|
+
* @param {AbstractAccountEntity} account The account to get the key for.
|
|
60
|
+
* @returns {string}
|
|
61
|
+
* @throws {Error} If it cannot retrieve account id.
|
|
62
|
+
*/
|
|
63
|
+
getDataStorageKey(account) {
|
|
64
|
+
return `${this.key}-${account.id}`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Flush the active session from local storage and runtime cached data.
|
|
69
|
+
* @return {Promise<void>}
|
|
70
|
+
*/
|
|
71
|
+
async flush() {
|
|
72
|
+
await browser.storage.local.remove(this.storageMetadataKey);
|
|
73
|
+
await browser.storage.local.remove(this.storageDataKey);
|
|
74
|
+
delete AbstractLocalStorage._runtimeCachedData[this.storageDataKey];
|
|
75
|
+
delete AbstractLocalStorage._runtimeCachedMetadata[this.storageMetadataKey];
|
|
76
|
+
Log.write({ level: "debug", message: `${this.key} metadata flushed for (${this.account.id})` });
|
|
77
|
+
Log.write({ level: "debug", message: `${this.key} flushed for (${this.account.id})` });
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Get the metadata from the local storage.
|
|
82
|
+
* @return {Promise<object|undefined>}
|
|
83
|
+
*/
|
|
84
|
+
async getMetadata() {
|
|
85
|
+
if (!AbstractLocalStorage._runtimeCachedMetadata[this.storageMetadataKey]) {
|
|
86
|
+
const data = await browser.storage.local.get([this.storageMetadataKey]);
|
|
87
|
+
if (!data[this.storageMetadataKey]) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
AbstractLocalStorage._runtimeCachedMetadata[this.storageMetadataKey] = data[this.storageMetadataKey];
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return AbstractLocalStorage._runtimeCachedMetadata[this.storageMetadataKey];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Get the data from the local storage.
|
|
98
|
+
* @return {Promise<object|Array|undefined>}
|
|
99
|
+
*/
|
|
100
|
+
async getData() {
|
|
101
|
+
if (!AbstractLocalStorage._runtimeCachedData[this.storageDataKey]) {
|
|
102
|
+
const data = await browser.storage.local.get([this.storageDataKey]);
|
|
103
|
+
if (!data[this.storageDataKey]) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
AbstractLocalStorage._runtimeCachedData[this.storageDataKey] = data[this.storageDataKey];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return AbstractLocalStorage._runtimeCachedData[this.storageDataKey];
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Set the data in the local storage and update the metadata.
|
|
114
|
+
* @param {EntityV2|EntityV2Collection} data The data to insert in the local storage.
|
|
115
|
+
* @return {Promise<void>}
|
|
116
|
+
* @throws {TypeError} If parameter settings is not of type entityClass.
|
|
117
|
+
*/
|
|
118
|
+
async setData(data) {
|
|
119
|
+
assertType(data, this.entityClass, `Parameter "data" should be of type ${this.entityClass.constructor.name}`);
|
|
120
|
+
await navigator.locks.request(this.storageDataKey, async () => {
|
|
121
|
+
const dataDto = data.toDto(this.constructor.DEFAULT_CONTAIN);
|
|
122
|
+
await this._setBrowserStorage({ [this.storageDataKey]: dataDto });
|
|
123
|
+
AbstractLocalStorage._runtimeCachedData[this.storageDataKey] = dataDto;
|
|
124
|
+
});
|
|
125
|
+
const date = new Date().toISOString();
|
|
126
|
+
const metadata = new LocalStorageMetadataEntity({ last_updated: date });
|
|
127
|
+
await this.setMetadata(metadata);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Set the data in the local storage and update the metadata.
|
|
132
|
+
* @param {LocalStorageMetadataEntity} metadata The data to insert in the local storage.
|
|
133
|
+
* @return {Promise<void>}
|
|
134
|
+
* @throws {TypeError} If parameter settings is not of type entityClass.
|
|
135
|
+
*/
|
|
136
|
+
async setMetadata(metadata) {
|
|
137
|
+
assertType(
|
|
138
|
+
metadata,
|
|
139
|
+
LocalStorageMetadataEntity,
|
|
140
|
+
"Parameter 'metadata' should be of type LocalStorageMetadataEntity",
|
|
141
|
+
);
|
|
142
|
+
await navigator.locks.request(this.storageMetadataKey, async () => {
|
|
143
|
+
const metadataDto = metadata.toDto(this.constructor.DEFAULT_CONTAIN);
|
|
144
|
+
await this._setBrowserStorage({ [this.storageMetadataKey]: metadataDto });
|
|
145
|
+
AbstractLocalStorage._runtimeCachedMetadata[this.storageMetadataKey] = metadataDto;
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Set the browser storage.
|
|
151
|
+
* @param {object} data The data to store in the local storage.
|
|
152
|
+
* @returns {Promise<void>}
|
|
153
|
+
* @private
|
|
154
|
+
*/
|
|
155
|
+
async _setBrowserStorage(data) {
|
|
156
|
+
await browser.storage.local.set(data);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Get the key name
|
|
161
|
+
* @returns {string}
|
|
162
|
+
*/
|
|
163
|
+
get key() {
|
|
164
|
+
Log.write({
|
|
165
|
+
level: "debug",
|
|
166
|
+
message: "The local storage should implement key. Default throw an error.",
|
|
167
|
+
});
|
|
168
|
+
throw new Error("The local storage should implement key.");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Get the entity class
|
|
173
|
+
* @returns {Class}
|
|
174
|
+
*/
|
|
175
|
+
get entityClass() {
|
|
176
|
+
Log.write({
|
|
177
|
+
level: "debug",
|
|
178
|
+
message: "The local storage should implement entityClass. Default throw an error.",
|
|
179
|
+
});
|
|
180
|
+
throw new Error("The local storage should implement entityClass.");
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Get the contain options
|
|
185
|
+
* @return {{}}
|
|
186
|
+
* @constructor
|
|
187
|
+
*/
|
|
188
|
+
static get DEFAULT_CONTAIN() {
|
|
189
|
+
return {};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export default AbstractLocalStorage;
|
|
@@ -0,0 +1,45 @@
|
|
|
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 AbstractLocalStorage from "./abstractLocalStorage";
|
|
15
|
+
import EntityV2 from "passbolt-styleguide/src/shared/models/entity/abstract/entityV2";
|
|
16
|
+
|
|
17
|
+
export class TestLocalStorage extends AbstractLocalStorage {
|
|
18
|
+
get key() {
|
|
19
|
+
return "test_local_storage";
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
get entityClass() {
|
|
23
|
+
return TestEntityLocalStorage;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class TestEntityLocalStorage extends EntityV2 {
|
|
28
|
+
static getSchema() {
|
|
29
|
+
return {
|
|
30
|
+
type: "object",
|
|
31
|
+
required: ["name"],
|
|
32
|
+
properties: {
|
|
33
|
+
id: {
|
|
34
|
+
type: "string",
|
|
35
|
+
format: "uuid",
|
|
36
|
+
nullable: true,
|
|
37
|
+
},
|
|
38
|
+
name: {
|
|
39
|
+
type: "string",
|
|
40
|
+
nullable: true,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|