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.
Files changed (282) hide show
  1. package/.devcontainer/Dockerfile +33 -3
  2. package/.devcontainer/devcontainer-lock.json +9 -0
  3. package/.devcontainer/post-start.sh +1 -2
  4. package/.github/workflows/codeql-analysis.yml +2 -1
  5. package/.github/workflows/release_candidate.yaml +3 -1
  6. package/.gitlab-ci.yml +1 -0
  7. package/CHANGELOG.md +202 -70
  8. package/CODEOWNERS +2 -0
  9. package/RELEASE_NOTES.md +4 -2
  10. package/package.json +9 -7
  11. package/renovate.json +6 -0
  12. package/src/all/background_page/controller/InformMenuController/InformMenuController.js +2 -5
  13. package/src/all/background_page/controller/InformMenuController/InformMenuController.test.js +31 -1
  14. package/src/all/background_page/controller/account/getAndInitializeAccountLocaleController.js +1 -1
  15. package/src/all/background_page/controller/account/getAndInitializeAccountLocaleController.test.js +6 -14
  16. package/src/all/background_page/controller/account/updatePrivateKeyController.js +7 -5
  17. package/src/all/background_page/controller/account/updatePrivateKeyController.test.js +18 -13
  18. package/src/all/background_page/controller/accountRecovery/accountRecoveryGenerateOrganizationKeyController.js +4 -2
  19. package/src/all/background_page/controller/accountRecovery/accountRecoveryGenerateOrganizationKeyController.test.js +25 -2
  20. package/src/all/background_page/controller/accountRecovery/accountRecoveryLoginController.js +1 -1
  21. package/src/all/background_page/controller/accountRecovery/accountRecoveryLoginController.test.js +10 -5
  22. package/src/all/background_page/controller/accountRecovery/recoverAccountController.js +6 -2
  23. package/src/all/background_page/controller/accountRecovery/recoverAccountController.test.js +11 -4
  24. package/src/all/background_page/controller/auth/authCheckStatus.test.data.js +6 -6
  25. package/src/all/background_page/controller/auth/authCheckStatusController.js +11 -3
  26. package/src/all/background_page/controller/auth/authCheckStatusController.test.js +74 -44
  27. package/src/all/background_page/controller/auth/authIsMfaRequiredController.js +11 -3
  28. package/src/all/background_page/controller/auth/authIsMfaRequiredController.test.js +18 -9
  29. package/src/all/background_page/controller/auth/authLoginController.js +1 -1
  30. package/src/all/background_page/controller/auth/authLoginController.test.js +10 -5
  31. package/src/all/background_page/controller/autofill/AutofillController.js +3 -3
  32. package/src/all/background_page/controller/autofill/AutofillController.test.js +20 -12
  33. package/src/all/background_page/controller/export/exportResourcesFileController.js +6 -3
  34. package/src/all/background_page/controller/export/exportResourcesFileController.test.js +34 -4
  35. package/src/all/background_page/controller/extension/onExtensionInstalledController.js +8 -2
  36. package/src/all/background_page/controller/extension/onExtensionInstalledController.test.js +5 -1
  37. package/src/all/background_page/controller/group/{getOrFindGroupsController.js → findGroupsByIdsForShareController.js} +9 -10
  38. package/src/all/background_page/controller/group/{getOrFindGroupsController.test.js → findGroupsByIdsForShareController.test.js} +8 -8
  39. package/src/all/background_page/controller/group/groupUpdateController.test.js +1 -0
  40. package/src/all/background_page/controller/import/importResourcesFileController.test.js +8 -1
  41. package/src/all/background_page/controller/informCallToActionController/informCallToActionController.js +2 -2
  42. package/src/all/background_page/controller/informCallToActionController/informCallToActionController.test.js +7 -4
  43. package/src/all/background_page/controller/locale/getLocaleController.js +3 -2
  44. package/src/all/background_page/controller/metadata/findMetadataTypesSettingsController.test.js +9 -15
  45. package/src/all/background_page/controller/metadata/getMetadataTypesSettingsController.test.js +9 -15
  46. package/src/all/background_page/controller/metadata/getOrFindMetadataKeysSettingsController.test.js +12 -22
  47. package/src/all/background_page/controller/metadata/shareMetadataKeyPrivateController.test.js +14 -2
  48. package/src/all/background_page/controller/move/moveFolderController.test.js +8 -0
  49. package/src/all/background_page/controller/move/moveResourcesController.test.js +8 -0
  50. package/src/all/background_page/controller/passwordExpiry/getOrFindPasswordExpirySettingsController.test.js +13 -8
  51. package/src/all/background_page/controller/passwordExpiry/savePasswordExpirySettingsController.js +4 -4
  52. package/src/all/background_page/controller/passwordExpiry/savePasswordExpirySettingsController.test.js +8 -10
  53. package/src/all/background_page/controller/permission/findPermissionsByIdsForShareController.js +62 -0
  54. package/src/all/background_page/controller/permission/findPermissionsByIdsForShareController.test.js +71 -0
  55. package/src/all/background_page/controller/recover/generateRecoverAccountRecoveryRequestKeyController.js +1 -1
  56. package/src/all/background_page/controller/resource/resourceCreateController.js +11 -4
  57. package/src/all/background_page/controller/resource/resourceCreateController.test.js +12 -1
  58. package/src/all/background_page/controller/resource/resourceUpdateController.js +11 -4
  59. package/src/all/background_page/controller/resource/resourceUpdateController.test.js +35 -2
  60. package/src/all/background_page/controller/resourceType/getResourceTypesController.js +5 -4
  61. package/src/all/background_page/controller/resourceType/getResourceTypesController.test.js +5 -2
  62. package/src/all/background_page/controller/resourceType/updateAllResourceTypesDeletedStatusController.js +3 -2
  63. package/src/all/background_page/controller/resourceType/updateAllResourceTypesDeletedStatusController.test.js +16 -3
  64. package/src/all/background_page/controller/secret/findSecretByResourceIdController.js +3 -3
  65. package/src/all/background_page/controller/secret/findSecretByResourceIdController.test.js +24 -0
  66. package/src/all/background_page/controller/secretRevision/findResourceSecretRevisionsForDisplayController.js +2 -1
  67. package/src/all/background_page/controller/setup/generateSetupKeyPairController.js +6 -3
  68. package/src/all/background_page/controller/setup/generateSetupKeyPairController.test.js +11 -1
  69. package/src/all/background_page/controller/setup/getAndInitSetupLocaleController.js +1 -1
  70. package/src/all/background_page/controller/setup/getAndInitSetupLocaleController.test.js +14 -18
  71. package/src/all/background_page/controller/setup/setSetupLocaleController.js +1 -1
  72. package/src/all/background_page/controller/setup/setSetupLocaleController.test.js +6 -10
  73. package/src/all/background_page/controller/setup/signInSetupController.js +6 -2
  74. package/src/all/background_page/controller/setup/signInSetupController.test.js +10 -5
  75. package/src/all/background_page/controller/share/shareOneFolderController.test.js +8 -0
  76. package/src/all/background_page/controller/share/shareResourcesController.test.js +9 -1
  77. package/src/all/background_page/controller/siteSettings/getOrFindSiteSettingsController.js +59 -0
  78. package/src/all/background_page/controller/siteSettings/getOrFindSiteSettingsController.test.js +150 -0
  79. package/src/all/background_page/controller/{group/getOrFindGroupsUsersController.js → user/getOrFindAllUsersController.js} +12 -17
  80. package/src/all/background_page/controller/user/getOrFindAllUsersController.test.js +55 -0
  81. package/src/all/background_page/controller/user/getOrFindLoggedInUserController.js +3 -3
  82. package/src/all/background_page/controller/user/getOrFindLoggedInUserController.test.js +19 -15
  83. package/src/all/background_page/controller/user/updateUserLocalStorageController.test.js +8 -5
  84. package/src/all/background_page/event/accountRecoveryEvents.js +4 -4
  85. package/src/all/background_page/event/appEvents.js +7 -2
  86. package/src/all/background_page/event/authEvents.js +2 -2
  87. package/src/all/background_page/event/groupEvents.js +4 -17
  88. package/src/all/background_page/event/informCallToActionEvents.js +1 -1
  89. package/src/all/background_page/event/informMenuEvents.js +1 -1
  90. package/src/all/background_page/event/localeEvents.js +4 -3
  91. package/src/all/background_page/event/permissionEvents.js +13 -0
  92. package/src/all/background_page/event/recoverEvents.js +4 -4
  93. package/src/all/background_page/event/resourceEvents.js +6 -15
  94. package/src/all/background_page/event/resourceTypeEvents.js +4 -3
  95. package/src/all/background_page/event/setupEvents.js +4 -4
  96. package/src/all/background_page/event/siteSettingsEvents.js +29 -0
  97. package/src/all/background_page/event/userEvents.js +4 -8
  98. package/src/all/background_page/index.js +0 -37
  99. package/src/all/background_page/model/entity/account/abstractAccountEntity.js +2 -2
  100. package/src/all/background_page/model/entity/account/accountAccountRecoveryEntity.js +7 -17
  101. package/src/all/background_page/model/entity/account/accountEntity.js +7 -14
  102. package/src/all/background_page/model/entity/account/accountKitEntity.js +1 -2
  103. package/src/all/background_page/model/entity/account/accountRecoverEntity.js +4 -14
  104. package/src/all/background_page/model/entity/account/accountSetupEntity.js +4 -14
  105. package/src/all/background_page/model/entity/account/accountTemporaryEntity.js +2 -5
  106. package/src/all/background_page/model/entity/gpgkey/generate/generateGpgKeyPairOptionsEntity.test.js +5 -5
  107. package/src/all/background_page/model/entity/localStorage/localStorageMetadataEntity.js +49 -0
  108. package/src/all/background_page/model/entity/localStorage/localStorageMetadataEntity.test.data.js +23 -0
  109. package/src/all/background_page/model/entity/localStorage/localStorageMetadataEntity.test.js +51 -0
  110. package/src/all/background_page/model/entity/{organizationSettings/organizationSettingsEntity.js → siteSettings/siteSettingsEntity.js} +17 -24
  111. package/src/all/background_page/model/entity/{organizationSettings/organizationSettingsEntity.test.data.js → siteSettings/siteSettingsEntity.test.data.js} +9 -9
  112. package/src/all/background_page/model/entity/{organizationSettings/organizationSettingsEntity.test.js → siteSettings/siteSettingsEntity.test.js} +30 -39
  113. package/src/all/background_page/model/entity/user/userEntity.test.js +6 -6
  114. package/src/all/background_page/model/export/resources/resourcesKdbxExporter.js +40 -3
  115. package/src/all/background_page/model/export/resources/resourcesKdbxExporter.test.js +122 -0
  116. package/src/all/background_page/model/import/resources/resourcesKdbxImportParser.js +1 -1
  117. package/src/all/background_page/model/locale/localeModel.js +13 -8
  118. package/src/all/background_page/model/passwordExpiry/passwordExpirySettingsModel.js +6 -6
  119. package/src/all/background_page/model/passwordExpiry/passwordExpirySettingsModel.test.js +3 -2
  120. package/src/all/background_page/model/resource/resourceModel.js +4 -4
  121. package/src/all/background_page/model/user/userModel.js +7 -28
  122. package/src/all/background_page/model/user/userModel.test.js +51 -99
  123. package/src/all/background_page/pagemod/appBootstrapPagemod.js +4 -1
  124. package/src/all/background_page/pagemod/appBootstrapPagemod.test.js +5 -2
  125. package/src/all/background_page/pagemod/appPagemod.js +32 -6
  126. package/src/all/background_page/pagemod/appPagemod.test.js +22 -10
  127. package/src/all/background_page/pagemod/authPagemod.js +2 -10
  128. package/src/all/background_page/pagemod/authPagemod.test.js +4 -4
  129. package/src/all/background_page/pagemod/pagemodManager.test.js +5 -2
  130. package/src/all/background_page/pagemod/quickAccessPagemod.js +2 -2
  131. package/src/all/background_page/pagemod/quickAccessPagemod.test.js +4 -4
  132. package/src/all/background_page/pagemod/recoverPagemod.js +2 -2
  133. package/src/all/background_page/pagemod/recoverPagemod.test.js +6 -0
  134. package/src/all/background_page/pagemod/setupPagemod.js +2 -2
  135. package/src/all/background_page/pagemod/setupPagemod.test.js +6 -0
  136. package/src/all/background_page/pagemod/webIntegrationPagemod.js +21 -2
  137. package/src/all/background_page/pagemod/webIntegrationPagemod.test.js +16 -25
  138. package/src/all/background_page/service/account/getActiveAccountService.js +2 -3
  139. package/src/all/background_page/service/account/getLegacyAccountService.js +3 -14
  140. package/src/all/background_page/service/account/updateSsoCredentialsService.js +9 -5
  141. package/src/all/background_page/service/api/group/groupApiService.js +9 -16
  142. package/src/all/background_page/service/api/group/groupApiService.test.js +59 -26
  143. package/src/all/background_page/service/api/siteSettings/siteSettingsApiService.js +46 -0
  144. package/src/all/background_page/service/api/siteSettings/siteSettingsApiService.test.js +63 -0
  145. package/src/all/background_page/service/auth/checkAuthStatusService.js +27 -14
  146. package/src/all/background_page/service/auth/checkAuthStatusService.test.js +80 -62
  147. package/src/all/background_page/service/auth/postLoginService.js +3 -3
  148. package/src/all/background_page/service/auth/postLoginService.test.js +4 -4
  149. package/src/all/background_page/service/auth/startLoopAuthSessionCheckService.js +5 -1
  150. package/src/all/background_page/service/auth/startLoopAuthSessionCheckService.test.js +14 -8
  151. package/src/all/background_page/service/authenticationStatusService.js +13 -18
  152. package/src/all/background_page/service/authenticationStatusService.test.js +9 -6
  153. package/src/all/background_page/service/crypto/generateGpgKeyPairService.test.js +5 -5
  154. package/src/all/background_page/service/crypto/getGpgKeyCreationDateService.js +7 -6
  155. package/src/all/background_page/service/crypto/getGpgKeyCreationDateService.test.js +10 -7
  156. package/src/all/background_page/service/extension/onExtensionUpdateAvailableService.js +7 -2
  157. package/src/all/background_page/service/extension/onExtensionUpdateAvailableService.test.js +5 -5
  158. package/src/all/background_page/service/group/findGroupsService.js +42 -1
  159. package/src/all/background_page/service/group/findGroupsService.test.js +82 -0
  160. package/src/all/background_page/service/group/groupUpdateSecretsCryptoService.js +82 -0
  161. package/src/all/background_page/service/group/groupUpdateSecretsCryptoService.test.js +102 -0
  162. package/src/all/background_page/service/group/groupUpdateService.js +49 -78
  163. package/src/all/background_page/service/group/groupUpdateService.test.js +136 -0
  164. package/src/all/background_page/service/localStorage/localStorageService.js +8 -6
  165. package/src/all/background_page/service/localStorage/localStorageService.test.js +33 -15
  166. package/src/all/background_page/service/local_storage/abstractLocalStorage.js +193 -0
  167. package/src/all/background_page/service/local_storage/abstractLocalStorage.test.data.js +45 -0
  168. package/src/all/background_page/service/local_storage/abstractLocalStorage.test.js +271 -0
  169. package/src/all/background_page/service/local_storage/activeSessionLocalStorage.js +105 -0
  170. package/src/all/background_page/service/local_storage/activeSessionLocalStorage.test.js +153 -0
  171. package/src/all/background_page/service/local_storage/rbacLocalStorage.js +10 -82
  172. package/src/all/background_page/service/local_storage/rbacLocalStorage.test.js +8 -8
  173. package/src/all/background_page/service/local_storage/resourceTypeLocalStorage.js +10 -43
  174. package/src/all/background_page/service/local_storage/resourceTypeLocalStorage.test.js +68 -0
  175. package/src/all/background_page/service/local_storage/siteSettingsLocalStorage.js +104 -0
  176. package/src/all/background_page/service/local_storage/siteSettingsLocalStorage.test.js +114 -0
  177. package/src/all/background_page/service/local_storage/userMeLocalStorage.js +50 -0
  178. package/src/all/background_page/service/{sessionStorage/userMeSessionStorageService.test.js → local_storage/userMeLocalStorage.test.js} +55 -36
  179. package/src/all/background_page/service/metadata/encryptMetadataService.js +3 -3
  180. package/src/all/background_page/service/metadata/encryptMetadataService.test.js +11 -11
  181. package/src/all/background_page/service/metadata/findAndUpdateMetadataSettingsLocalStorageService.js +4 -4
  182. package/src/all/background_page/service/metadata/findAndUpdateMetadataSettingsLocalStorageService.test.js +18 -16
  183. package/src/all/background_page/service/metadata/getOrFindMetadataSettingsService.test.js +6 -8
  184. package/src/all/background_page/service/metadata/rotateMetadata/rotateResourcesMetadataKeyService.test.js +4 -4
  185. package/src/all/background_page/service/metadata/shareMetadataKeyPrivateService.js +3 -3
  186. package/src/all/background_page/service/metadata/shareMetadataKeyPrivateService.test.js +1 -1
  187. package/src/all/background_page/service/metadata/verifyOrTrustMetadataKeyService.js +4 -4
  188. package/src/all/background_page/service/metadata/verifyOrTrustMetadataKeyService.test.js +9 -7
  189. package/src/all/background_page/service/migrateMetadata/migrateMetadataResourcesService.js +4 -4
  190. package/src/all/background_page/service/migrateMetadata/migrateMetadataResourcesService.test.js +6 -6
  191. package/src/all/background_page/service/rbac/findAndUpdateRbacsLocalStorageService.js +2 -2
  192. package/src/all/background_page/service/rbac/getOrFindRbacService.js +1 -1
  193. package/src/all/background_page/service/resource/create/resourceCreateService.js +41 -51
  194. package/src/all/background_page/service/resource/create/resourceCreateService.test.js +100 -98
  195. package/src/all/background_page/service/resource/export/exportResourcesService.js +7 -7
  196. package/src/all/background_page/service/resource/findAndUpdateResourcesLocalStorageService.js +4 -4
  197. package/src/all/background_page/service/resource/findResourcesService.js +13 -16
  198. package/src/all/background_page/service/resource/findResourcesService.test.js +12 -11
  199. package/src/all/background_page/service/resource/getOrFindResourcesService.js +3 -3
  200. package/src/all/background_page/service/resource/import/ImportResourcesService.js +9 -9
  201. package/src/all/background_page/service/resource/import/ImportResourcesService.test.js +30 -15
  202. package/src/all/background_page/service/resource/update/resourceUpdateService.js +38 -19
  203. package/src/all/background_page/service/resource/update/resourceUpdateService.test.js +64 -31
  204. package/src/all/background_page/service/resourceType/getOrFindResourceTypesService.js +49 -0
  205. package/src/all/background_page/service/resourceType/getOrFindResourceTypesService.test.js +61 -0
  206. package/src/all/background_page/service/resourceType/getSecretSchemaResourceTypeService.js +44 -0
  207. package/src/all/background_page/service/resourceType/updateResourceTypesService.js +6 -4
  208. package/src/all/background_page/service/resourceType/updateResourceTypesService.test.js +19 -14
  209. package/src/all/background_page/service/secretRevisions/findAndDecryptSecretRevisionsService.js +5 -4
  210. package/src/all/background_page/service/secretRevisions/findAndDecryptSecretRevisionsService.test.js +16 -9
  211. package/src/all/background_page/service/share/shareResourceService.js +4 -4
  212. package/src/all/background_page/service/share/shareResourceService.test.js +6 -6
  213. package/src/all/background_page/service/siteSettings/findAndUpdateSiteSettingsLocalStorageService.js +77 -0
  214. package/src/all/background_page/service/siteSettings/findAndUpdateSiteSettingsLocalStorageService.test.js +130 -0
  215. package/src/all/background_page/service/siteSettings/findSiteSettingsService.js +47 -0
  216. package/src/all/background_page/service/siteSettings/findSiteSettingsService.test.js +68 -0
  217. package/src/all/background_page/service/siteSettings/getOrFindSiteSettingsService.js +84 -0
  218. package/src/all/background_page/service/siteSettings/getOrFindSiteSettingsService.test.js +175 -0
  219. package/src/all/background_page/service/siteSettings/siteSettingsRuntimeCache.js +70 -0
  220. package/src/all/background_page/service/sso/generateSsoKitService.test.js +2 -2
  221. package/src/all/background_page/service/toolbar/toolbarService.js +6 -4
  222. package/src/all/background_page/service/toolbar/toolbarService.test.js +14 -13
  223. package/src/all/background_page/service/user/findAndUpdateUsersLocalStorageService.js +4 -4
  224. package/src/all/background_page/service/user/findAndUpdateUsersLocalStorageService.test.js +3 -3
  225. package/src/all/background_page/service/user/getOrFindMeService.js +64 -0
  226. package/src/all/background_page/service/user/getOrFindMeService.test.js +65 -0
  227. package/src/all/background_page/service/userKeyPolicies/findUserKeyPoliciesSettingsService.js +5 -4
  228. package/src/all/background_page/service/userKeyPolicies/findUserKeyPoliciesSettingsService.test.js +12 -11
  229. package/src/all/background_page/service/validator/appEmailValidatorService.js +11 -6
  230. package/src/all/background_page/service/validator/appEmailValidatorService.test.js +11 -11
  231. package/src/all/common/polyfill/browserPolyfill.js +8 -8
  232. package/src/all/locales/cs-CZ/common.json +1 -4
  233. package/src/all/locales/de-DE/common.json +1 -4
  234. package/src/all/locales/en-UK/common.json +0 -3
  235. package/src/all/locales/es-ES/common.json +1 -4
  236. package/src/all/locales/fr-FR/common.json +1 -4
  237. package/src/all/locales/it-IT/common.json +1 -4
  238. package/src/all/locales/ja-JP/common.json +1 -4
  239. package/src/all/locales/ko-KR/common.json +0 -3
  240. package/src/all/locales/lt-LT/common.json +1 -4
  241. package/src/all/locales/nl-NL/common.json +1 -4
  242. package/src/all/locales/pl-PL/common.json +1 -4
  243. package/src/all/locales/pt-BR/common.json +1 -4
  244. package/src/all/locales/ro-RO/common.json +1 -4
  245. package/src/all/locales/ru-RU/common.json +1 -4
  246. package/src/all/locales/sl-SI/common.json +1 -4
  247. package/src/all/locales/sv-SE/common.json +1 -4
  248. package/src/all/locales/uk-UA/common.json +1 -4
  249. package/src/all/webAccessibleResources/js/app/QuickAccess.js +7 -0
  250. package/src/chrome/manifest.json +1 -1
  251. package/src/chrome-mv3/manifest.json +1 -1
  252. package/src/chrome-mv3/offscreens/service/group/addUsersToGroupOffscreenService.js +132 -0
  253. package/src/chrome-mv3/offscreens/service/group/addUsersToGroupOffscreenService.test.js +125 -0
  254. package/src/chrome-mv3/offscreens/service/offscreen/handleOffscreenRequestService.js +4 -0
  255. package/src/chrome-mv3/serviceWorker/service/addUsersToGroup/requestAddUsersToGroupOffscreenService.js +83 -0
  256. package/src/chrome-mv3/serviceWorker/service/addUsersToGroup/requestAddUsersToGroupOffscreenService.test.js +116 -0
  257. package/src/chrome-mv3/serviceWorker/service/addUsersToGroup/responseAddUsersToGroupOffscreenService.js +99 -0
  258. package/src/chrome-mv3/serviceWorker/service/addUsersToGroup/responseAddUsersToGroupOffscreenService.test.data.js +45 -0
  259. package/src/chrome-mv3/serviceWorker/service/addUsersToGroup/responseAddUsersToGroupOffscreenService.test.js +87 -0
  260. package/src/chrome-mv3/serviceWorker/service/network/requestFetchOffscreenService.js +0 -1
  261. package/src/chrome-mv3/serviceWorker/service/offscreen/handleOffscreenResponseService.js +15 -0
  262. package/src/firefox/manifest.json +1 -1
  263. package/src/safari/background_page/index.js +0 -37
  264. package/src/safari/common/polyfill/safariBrowserPolyfill.js +10 -10
  265. package/src/safari/manifest.json +1 -1
  266. package/test/jest.setup.js +4 -2
  267. package/src/all/background_page/controller/group/getOrFindGroupsUsersController.test.js +0 -69
  268. package/src/all/background_page/controller/organizationSettings/getOrganizationSettingsController.js +0 -55
  269. package/src/all/background_page/controller/organizationSettings/getOrganizationSettingsController.test.js +0 -45
  270. package/src/all/background_page/controller/resource/findAllByIdsForDisplayPermissionsController.js +0 -76
  271. package/src/all/background_page/controller/resource/findAllByIdsForDisplayPermissionsController.test.js +0 -102
  272. package/src/all/background_page/event/organizationSettingsEvents.js +0 -37
  273. package/src/all/background_page/model/organizationSettings/organizationSettingsModel.js +0 -93
  274. package/src/all/background_page/model/resourceType/resourceTypeModel.js +0 -72
  275. package/src/all/background_page/model/resourceType/resourceTypeModel.test.js +0 -101
  276. package/src/all/background_page/service/api/organizationSettings/organizationSettingsService.js +0 -58
  277. package/src/all/background_page/service/group/getOrFindGroupsService.js +0 -65
  278. package/src/all/background_page/service/group/getOrFindGroupsService.test.js +0 -168
  279. package/src/all/background_page/service/group/getOrFindGroupsUsersService.js +0 -51
  280. package/src/all/background_page/service/group/getOrFindGroupsUsersService.test.js +0 -94
  281. package/src/all/background_page/service/local_storage/authStatusLocalStorage.js +0 -70
  282. 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 = await GetLegacyAccountService.get();
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
- UserMeSessionStorageService.remove(account);
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(21);
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(UserMeSessionStorageService, "remove");
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(7);
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(UserMeSessionStorageService.remove).not.toHaveBeenCalled();
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(26);
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(13);
98
- expect(browser.storage.session.remove).toHaveBeenCalledTimes(5);
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(UserMeSessionStorageService.remove).toHaveBeenCalledWith(account);
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
+ }