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
@@ -4,7 +4,6 @@
4
4
  "An internal error occurred. The server response could not be parsed. Please contact your administrator.": "Ocorreu um erro interno. A resposta do servidor não pôde ser analisada. Por favor, contate o administrador.",
5
5
  "An RSA key should have a length of {{size}} bits minimum.": "Uma chave RSA deve ter o mínimo de {{size}} bits de comprimento.",
6
6
  "Autofill failed. Could not find the active tab.": "Falha no preenchimento automático. Não foi possível encontrar a aba ativa.",
7
- "Calculate permissions": "Calcular permissões",
8
7
  "Calculating changes for {{name}}": "Calculando alterações para {{name}}",
9
8
  "Calculating folders permissions changes": "Calculando modificações das permissões das pastas",
10
9
  "Calculating resources permissions changes": "Calculando modificações das permissões dos recursos",
@@ -14,7 +13,7 @@
14
13
  "Could not verify the server key.": "Não foi possível verificar a chave do servidor.",
15
14
  "Creating folder...": "Criando pasta...",
16
15
  "Creating metadata key": "Criando chave de metadados",
17
- "Creating resource": "Creating resource",
16
+ "Creating resource": "Criando recurso",
18
17
  "Decrypting ...": "Descriptografando...",
19
18
  "Decrypting {{counter}}/{{total}}": "Descriptografando {{counter}}/{{total}}",
20
19
  "Decrypting secrets": "Descriptografando segredos",
@@ -85,9 +84,7 @@
85
84
  "Sharing folders {{counter}}/{{total}}": "Compartilhando pastas {{counter}}/{{total}}",
86
85
  "Sharing resources": "Compartilhando recursos",
87
86
  "Sharing resources {{counter}}/{{total}}": "Compartilhando recursos {{counter}}/{{total}}",
88
- "Start sharing": "Iniciar compartilhamento",
89
87
  "Synchronizing keyring": "Sincronizando chaves",
90
- "Synchronizing keys": "Sincronizando chaves",
91
88
  "Tagging passwords {{taggedCount}}/{{total}}": "Etiquetando senhas {{taggedCount}}/{{total}}",
92
89
  "The encryption key used to share metadata between users could not be verified and is considered untrusted.": "A chave de criptografia usada para compartilhar metadados entre usuários não pôde ser verificada e é considerada não confiável.",
93
90
  "The external service is unavailable": "O serviço externo está indisponível",
@@ -4,7 +4,6 @@
4
4
  "An internal error occurred. The server response could not be parsed. Please contact your administrator.": "A apărut o eroare internă. Răspunsul serverului nu a putut fi analizat. Vă rugăm să contactați administratorul.",
5
5
  "An RSA key should have a length of {{size}} bits minimum.": "O cheie RSA ar trebui să aibă o lungime minimă de {{size}} biți.",
6
6
  "Autofill failed. Could not find the active tab.": "Autocompletare eșuată. Nu s-a putut găsi un tab activ.",
7
- "Calculate permissions": "Calculează permisiunile",
8
7
  "Calculating changes for {{name}}": "Se calculează modificările pentru {{name}}",
9
8
  "Calculating folders permissions changes": "Se calculează modificările permisiunilor folderelor",
10
9
  "Calculating resources permissions changes": "Se calculează modificările permisiunilor resurselor",
@@ -14,7 +13,7 @@
14
13
  "Could not verify the server key.": "Nu s-a putut verifica cheia serverului.",
15
14
  "Creating folder...": "Se creează folderul...",
16
15
  "Creating metadata key": "Se creează cheia de metadate",
17
- "Creating resource": "Creating resource",
16
+ "Creating resource": "Se creează resursa",
18
17
  "Decrypting ...": "Se decriptează...",
19
18
  "Decrypting {{counter}}/{{total}}": "Decriptare {{counter}}/{{total}}",
20
19
  "Decrypting secrets": "Se decriptează secretele",
@@ -85,9 +84,7 @@
85
84
  "Sharing folders {{counter}}/{{total}}": "Partajarea folderelor {{counter}}/{{total}}",
86
85
  "Sharing resources": "Partajarea resurselor",
87
86
  "Sharing resources {{counter}}/{{total}}": "Partajarea resurselor {{counter}}/{{total}}",
88
- "Start sharing": "Începe partajarea",
89
87
  "Synchronizing keyring": "Sincronizare keyring",
90
- "Synchronizing keys": "Sincronizare chei",
91
88
  "Tagging passwords {{taggedCount}}/{{total}}": "Etichetare parole {{taggedCount}}/{{total}}",
92
89
  "The encryption key used to share metadata between users could not be verified and is considered untrusted.": "Cheia de criptare utilizată pentru a partaja metadatele între utilizatori nu a putut fi verificată și este considerată de neîncredere.",
93
90
  "The external service is unavailable": "Serviciul extern nu este disponibil",
@@ -4,7 +4,6 @@
4
4
  "An internal error occurred. The server response could not be parsed. Please contact your administrator.": "Произошла внутренняя ошибка. Ответ сервера не может быть обработан. Пожалуйста, свяжитесь с вашим администратором.",
5
5
  "An RSA key should have a length of {{size}} bits minimum.": "RSA ключ должен иметь длину не менее {{size}} бит.",
6
6
  "Autofill failed. Could not find the active tab.": "Ошибка автозаполнения. Не удалось найти активную вкладку.",
7
- "Calculate permissions": "Вычислить права доступа",
8
7
  "Calculating changes for {{name}}": "Вычисление изменений для {{name}}",
9
8
  "Calculating folders permissions changes": "Вычисление изменений разрешений папок",
10
9
  "Calculating resources permissions changes": "Вычисление изменений разрешений ресурсов",
@@ -14,7 +13,7 @@
14
13
  "Could not verify the server key.": "Не удалось проверить ключ сервера.",
15
14
  "Creating folder...": "Создание папки...",
16
15
  "Creating metadata key": "Создание ключа метаданных",
17
- "Creating resource": "Creating resource",
16
+ "Creating resource": "Создание ресурса",
18
17
  "Decrypting ...": "Расшифровка ...",
19
18
  "Decrypting {{counter}}/{{total}}": "Расшифровка {{counter}}/{{total}}",
20
19
  "Decrypting secrets": "Расшифровка паролей",
@@ -85,9 +84,7 @@
85
84
  "Sharing folders {{counter}}/{{total}}": "Общий доступ к папкам {{counter}}/{{total}}",
86
85
  "Sharing resources": "Общий доступ к ресурсам",
87
86
  "Sharing resources {{counter}}/{{total}}": "Общий доступ к ресурсам {{counter}}/{{total}}",
88
- "Start sharing": "Начать делиться",
89
87
  "Synchronizing keyring": "Синхронизация связки ключей",
90
- "Synchronizing keys": "Синхронизация ключей",
91
88
  "Tagging passwords {{taggedCount}}/{{total}}": "Пометка паролей {{taggedCount}}/{{total}}",
92
89
  "The encryption key used to share metadata between users could not be verified and is considered untrusted.": "Ключ шифрования, используемый для обмена метаданными между пользователями, не удалось проверить, он считается ненадёжным.",
93
90
  "The external service is unavailable": "Внешний сервис недоступен",
@@ -4,7 +4,6 @@
4
4
  "An internal error occurred. The server response could not be parsed. Please contact your administrator.": "Prišlo je do notranje napake. Odgovora strežnika ni bilo mogoče obdelati. Obrnite se na svojega skrbnika.",
5
5
  "An RSA key should have a length of {{size}} bits minimum.": "Ključ RSA mora imeti najmanj {{size}} bitov dolžine.",
6
6
  "Autofill failed. Could not find the active tab.": "Samodejno izpolnjevanje ni uspelo. Aktivnega zavihka ni bilo mogoče najti.",
7
- "Calculate permissions": "Izračunaj dovoljenja",
8
7
  "Calculating changes for {{name}}": "Izračunavam spremembe za {{name}}",
9
8
  "Calculating folders permissions changes": "Izračunavam spremembe dovoljenj za mape",
10
9
  "Calculating resources permissions changes": "Izračunavam spremembe dovoljenj za vire",
@@ -14,7 +13,7 @@
14
13
  "Could not verify the server key.": "Ključa strežnika ni bilo mogoče preveriti.",
15
14
  "Creating folder...": "Ustvarjanje mape...",
16
15
  "Creating metadata key": "Ustvarjanje ključa metapodatkov",
17
- "Creating resource": "Creating resource",
16
+ "Creating resource": "Ustvarjanje vira",
18
17
  "Decrypting ...": "Dešifriranje ...",
19
18
  "Decrypting {{counter}}/{{total}}": "Dešifriranje {{counter}}/{{total}}",
20
19
  "Decrypting secrets": "Dešifriranje gesel",
@@ -85,9 +84,7 @@
85
84
  "Sharing folders {{counter}}/{{total}}": "Deljenje map {{counter}}/{{total}}",
86
85
  "Sharing resources": "Deljenje virov",
87
86
  "Sharing resources {{counter}}/{{total}}": "Deljenje virov {{counter}}/{{total}}",
88
- "Start sharing": "Začni z deljenjem",
89
87
  "Synchronizing keyring": "Sinhronizacija zbirke ključev",
90
- "Synchronizing keys": "Synchroniziranje ključev",
91
88
  "Tagging passwords {{taggedCount}}/{{total}}": "Označevanje gesel {{taggedCount}}/{{total}}",
92
89
  "The encryption key used to share metadata between users could not be verified and is considered untrusted.": "Šifrirnega ključa za izmenjavo metapodatkov med uporabniki ni bilo mogoče preveriti in velja za nezaupanja vrednega.",
93
90
  "The external service is unavailable": "Zunanja storitev ni na voljo",
@@ -4,7 +4,6 @@
4
4
  "An internal error occurred. The server response could not be parsed. Please contact your administrator.": "Ett internt fel uppstod. Serversvaret kunde inte tolkas. Kontakta administratören.",
5
5
  "An RSA key should have a length of {{size}} bits minimum.": "En RSA-nyckel bör ha en längd på minst {{size}} bitar.",
6
6
  "Autofill failed. Could not find the active tab.": "Autofyll misslyckades. Det gick inte att hitta den aktiva fliken.",
7
- "Calculate permissions": "Beräkna behörigheter",
8
7
  "Calculating changes for {{name}}": "Beräknar ändringar för {{name}}",
9
8
  "Calculating folders permissions changes": "Beräknar mappbehörighetsändringar",
10
9
  "Calculating resources permissions changes": "Beräknar resursbehörighetsändringar",
@@ -14,7 +13,7 @@
14
13
  "Could not verify the server key.": "Kunde inte verifiera servernyckeln.",
15
14
  "Creating folder...": "Skapar mapp...",
16
15
  "Creating metadata key": "Skapar metadata-nyckel",
17
- "Creating resource": "Creating resource",
16
+ "Creating resource": "Skapar resurs",
18
17
  "Decrypting ...": "Dekrypterar ...",
19
18
  "Decrypting {{counter}}/{{total}}": "Dekrypterar {{counter}}/{{total}}",
20
19
  "Decrypting secrets": "Dekrypterar hemligheter",
@@ -85,9 +84,7 @@
85
84
  "Sharing folders {{counter}}/{{total}}": "Delar mappar {{counter}}/{{total}}",
86
85
  "Sharing resources": "Delar resurser",
87
86
  "Sharing resources {{counter}}/{{total}}": "Delar resurser {{counter}}/{{total}}",
88
- "Start sharing": "Börja dela",
89
87
  "Synchronizing keyring": "Synkroniserar nyckelring",
90
- "Synchronizing keys": "Synkroniserar nycklar",
91
88
  "Tagging passwords {{taggedCount}}/{{total}}": "Taggar lösenord {{taggedCount}}/{{total}}",
92
89
  "The encryption key used to share metadata between users could not be verified and is considered untrusted.": "Krypteringsnyckeln som används för att dela metadata mellan användare kunde inte verifieras och betraktas som opålitlig.",
93
90
  "The external service is unavailable": "Den externa tjänsten är inte tillgänglig",
@@ -4,7 +4,6 @@
4
4
  "An internal error occurred. The server response could not be parsed. Please contact your administrator.": "Виникла внутрішня помилка. Не вдалося обробити відповідь сервера. Будь ласка, зверніться до адміністратора.",
5
5
  "An RSA key should have a length of {{size}} bits minimum.": "Ключ RSA повинен мати мінімальну довжину {{size}} біт.",
6
6
  "Autofill failed. Could not find the active tab.": "Помилка автозаповнення. Не вдалося знайти активну вкладку.",
7
- "Calculate permissions": "Розрахунок прав доступу",
8
7
  "Calculating changes for {{name}}": "Обчислення змін для {{name}}",
9
8
  "Calculating folders permissions changes": "Обчислення змін прав доступу до тек",
10
9
  "Calculating resources permissions changes": "Обчислення змін дозволів ресурсів",
@@ -14,7 +13,7 @@
14
13
  "Could not verify the server key.": "Не вдалося перевірити ключ сервера.",
15
14
  "Creating folder...": "Створення теки…",
16
15
  "Creating metadata key": "Створення ключа метаданих",
17
- "Creating resource": "Creating resource",
16
+ "Creating resource": "Створення ресурсу",
18
17
  "Decrypting ...": "Розшифрування…",
19
18
  "Decrypting {{counter}}/{{total}}": "Розшифрування {{counter}}/{{total}}",
20
19
  "Decrypting secrets": "Розшифрування секретів",
@@ -85,9 +84,7 @@
85
84
  "Sharing folders {{counter}}/{{total}}": "Надання спільного доступу до тек {{counter}}/{{total}}",
86
85
  "Sharing resources": "Надання спільного доступу до ресурсів",
87
86
  "Sharing resources {{counter}}/{{total}}": "Надання спільного доступу до ресурсів {{counter}}/{{total}}",
88
- "Start sharing": "Надати спільний доступ",
89
87
  "Synchronizing keyring": "Синхронізація зв'язки ключів",
90
- "Synchronizing keys": "Синхронізація ключів",
91
88
  "Tagging passwords {{taggedCount}}/{{total}}": "Тегування паролів {{taggedCount}}/{{total}}",
92
89
  "The encryption key used to share metadata between users could not be verified and is considered untrusted.": "Ключ шифрування, який використовується для обміну метаданими між користувачами не може бути підтверджений і вважається ненадійним.",
93
90
  "The external service is unavailable": "Зовнішня служба недоступна",
@@ -17,6 +17,13 @@ import ExtQuickAccess from "passbolt-styleguide/src/react-quickaccess/ExtQuickAc
17
17
  import Port from "../lib/port";
18
18
 
19
19
  async function main() {
20
+ // The QuickAccess is only ever rendered as a top-level extension surface (toolbar popup or detached window).
21
+ // If it is running inside a frame, a remote page has embedded it; refuse to initialise to prevent
22
+ // clickjacking / UI redress of the QuickAccess UI.
23
+ if (window.top !== window.self) {
24
+ return;
25
+ }
26
+
20
27
  const query = new URLSearchParams(window.location.search);
21
28
  const portname = query.get("passbolt");
22
29
  const port = new Port(portname);
@@ -2,7 +2,7 @@
2
2
  "manifest_version": 2,
3
3
  "name": "__MSG_appName__",
4
4
  "short_name": "passbolt",
5
- "version": "5.13.0",
5
+ "version": "5.14.2",
6
6
  "description": "__MSG_appDescription__",
7
7
  "default_locale": "en",
8
8
  "externally_connectable": {},
@@ -2,7 +2,7 @@
2
2
  "manifest_version": 3,
3
3
  "name": "__MSG_appName__",
4
4
  "short_name": "passbolt",
5
- "version": "5.13.0",
5
+ "version": "5.14.2",
6
6
  "description": "__MSG_appDescription__",
7
7
  "default_locale": "en",
8
8
  "minimum_chrome_version": "116",
@@ -0,0 +1,132 @@
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 5.13.0
13
+ */
14
+ import GroupUpdateSecretsCollection from "../../../../all/background_page/model/entity/secret/groupUpdate/groupUpdateSecretsCollection";
15
+ import NeededSecretsCollection from "../../../../all/background_page/model/entity/secret/needed/neededSecretsCollection";
16
+ import DecryptPrivateKeyService from "../../../../all/background_page/service/crypto/decryptPrivateKeyService";
17
+ import GroupUpdateSecretsCryptoService from "../../../../all/background_page/service/group/groupUpdateSecretsCryptoService";
18
+
19
+ export const SEND_MESSAGE_TARGET_ADD_USERS_TO_GROUP_OFFSCREEN = "add-user-to-group-offscreen";
20
+ export const SEND_MESSAGE_TARGET_ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_HANDLER =
21
+ "service-worker-add-user-to-group-offscreen-response-handler";
22
+ export const SEND_MESSAGE_TARGET_OFFSCREEN_PROGRESS_SERVICE_HANDLER =
23
+ "service-worker-offscreen-progress-service-handler";
24
+ export const ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_SUCCESS = "success";
25
+ export const ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_ERROR = "error";
26
+ export const ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_PROGRESS = "progress";
27
+
28
+ const PROGRESS_INTERVAL_MS = 80; // send progress message every 80ms
29
+
30
+ export default class AddUsersToGroupOffscreenService {
31
+ /**
32
+ * Handle decryption and encryption of add user to group.
33
+ * @param {{requestId: string, addUsersToGroupContent: object}} message arguments to pass to decrypt and encrypt secrets for users.
34
+ * @returns {Promise<object>}
35
+ */
36
+ static async handleRequest({ requestId, addUsersToGroupContent }) {
37
+ try {
38
+ const groupUpdateSecrets = await AddUsersToGroupOffscreenService._handleDecryptAndEncryptRequest(
39
+ requestId,
40
+ addUsersToGroupContent,
41
+ );
42
+ return await AddUsersToGroupOffscreenService.handleSuccessResponse(groupUpdateSecrets);
43
+ } catch (error) {
44
+ return AddUsersToGroupOffscreenService.handleErrorResponse(error);
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Handles decrypt and encrypt secrets
50
+ * @param {string} requestId The offscreen request id, used to route progress messages.
51
+ * @param {object} addUsersToGroupContent
52
+ * @returns {Promise<GroupUpdateSecretsCollection>}
53
+ * @private
54
+ */
55
+ static async _handleDecryptAndEncryptRequest(requestId, addUsersToGroupContent) {
56
+ const privateKey = await DecryptPrivateKeyService.decryptArmoredKey(
57
+ addUsersToGroupContent.privateKey.armoredKey,
58
+ addUsersToGroupContent.privateKey.passphrase,
59
+ );
60
+ const secrets = new GroupUpdateSecretsCollection(addUsersToGroupContent.secrets, { validate: false });
61
+ const neededSecrets = new NeededSecretsCollection(addUsersToGroupContent.neededSecrets, { validate: false });
62
+
63
+ /*
64
+ * Throttle progress messages to the service worker. Sending a message also keeps the app progress
65
+ * dialog refreshed while the offscreen processes the cryptographic operations.
66
+ */
67
+ let lastYield = Date.now();
68
+ const onProgress = async (message) => {
69
+ if (Date.now() - lastYield >= PROGRESS_INTERVAL_MS) {
70
+ await AddUsersToGroupOffscreenService.handleProgressResponse(requestId, { message });
71
+ lastYield = Date.now();
72
+ }
73
+ };
74
+
75
+ const decryptedSecrets = await GroupUpdateSecretsCryptoService.decryptSecrets(privateKey, secrets, onProgress);
76
+ return await GroupUpdateSecretsCryptoService.encryptSecrets(
77
+ privateKey,
78
+ addUsersToGroupContent.usersPublicKeys,
79
+ neededSecrets,
80
+ decryptedSecrets,
81
+ onProgress,
82
+ );
83
+ }
84
+
85
+ /**
86
+ * Build the success response sent back to the service worker.
87
+ * @param {GroupUpdateSecretsCollection} groupUpdateSecrets The groupUpdateSecrets
88
+ * @returns {Promise<object>}
89
+ * @private
90
+ */
91
+ static async handleSuccessResponse(groupUpdateSecrets) {
92
+ return {
93
+ data: groupUpdateSecrets.toDto(),
94
+ type: ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_SUCCESS,
95
+ target: SEND_MESSAGE_TARGET_ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_HANDLER,
96
+ };
97
+ }
98
+
99
+ /**
100
+ * Build the error response sent back to the service worker.
101
+ * @param {Error} error The error
102
+ * @returns {object}
103
+ * @private
104
+ */
105
+ static handleErrorResponse(error) {
106
+ console.error(error);
107
+ return {
108
+ data: {
109
+ name: error?.name,
110
+ message: error?.message || "AddUsersToGroupOffscreenService: an unexpected error occurred",
111
+ },
112
+ type: ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_ERROR,
113
+ target: SEND_MESSAGE_TARGET_ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_HANDLER,
114
+ };
115
+ }
116
+
117
+ /**
118
+ * Send a progress message to the service worker so it can update the app progress dialog.
119
+ * @param {string} requestId The offscreen request id, used to route the progress to the right progress service.
120
+ * @param {{message: string}} progress
121
+ * @returns {Promise<void>}
122
+ * @private
123
+ */
124
+ static async handleProgressResponse(requestId, progress) {
125
+ await chrome.runtime.sendMessage({
126
+ id: requestId,
127
+ data: progress,
128
+ type: ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_PROGRESS,
129
+ target: SEND_MESSAGE_TARGET_OFFSCREEN_PROGRESS_SERVICE_HANDLER,
130
+ });
131
+ }
132
+ }
@@ -0,0 +1,125 @@
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 5.13.0
13
+ */
14
+ import AddUsersToGroupOffscreenService, {
15
+ ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_ERROR,
16
+ ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_PROGRESS,
17
+ ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_SUCCESS,
18
+ SEND_MESSAGE_TARGET_ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_HANDLER,
19
+ SEND_MESSAGE_TARGET_OFFSCREEN_PROGRESS_SERVICE_HANDLER,
20
+ } from "./addUsersToGroupOffscreenService";
21
+ import { defaultGroupDto } from "passbolt-styleguide/src/shared/models/entity/group/groupEntity.test.data";
22
+ import GroupEntity from "passbolt-styleguide/src/shared/models/entity/group/groupEntity";
23
+ import GroupUserEntity from "passbolt-styleguide/src/shared/models/entity/groupUser/groupUserEntity";
24
+ import { createGroupUser } from "passbolt-styleguide/src/shared/models/entity/groupUser/groupUserEntity.test.data";
25
+ import { defaultResourcesSecretsDtos } from "../../../../all/background_page/model/entity/secret/groupUpdate/groupUpdateSecretsCollection.test.data";
26
+ import { OpenpgpAssertion } from "../../../../all/background_page/utils/openpgp/openpgpAssertions";
27
+ import { plaintextSecretPasswordAndDescriptionDto } from "passbolt-styleguide/src/shared/models/entity/plaintextSecret/plaintextSecretEntity.test.data";
28
+ import EncryptMessageService from "../../../../all/background_page/service/crypto/encryptMessageService";
29
+ import AccountEntity from "../../../../all/background_page/model/entity/account/accountEntity";
30
+ import { defaultAccountDto } from "../../../../all/background_page/model/entity/account/accountEntity.test.data";
31
+ import GroupUpdateDryRunResultEntity from "../../../../all/background_page/model/entity/group/update/groupUpdateDryRunResultEntity";
32
+ import { pgpKeys } from "passbolt-styleguide/test/fixture/pgpKeys/keys";
33
+ import DecryptMessageService from "../../../../all/background_page/service/crypto/decryptMessageService";
34
+
35
+ describe("AddUsersToGroupOffscreenService", () => {
36
+ describe("::handleRequest", () => {
37
+ it("should decrypt and encrypt secrets for the requester", async () => {
38
+ expect.assertions(2);
39
+
40
+ const account = new AccountEntity(defaultAccountDto());
41
+
42
+ const existingEntityDto = defaultGroupDto({}, { withGroupsUsers: 1 });
43
+ const updateGroupEntity = new GroupEntity({ ...existingEntityDto });
44
+
45
+ const newUser = new GroupUserEntity(createGroupUser({ group_id: existingEntityDto.id }));
46
+ updateGroupEntity._groups_users._items = [...updateGroupEntity._groups_users.items, newUser];
47
+
48
+ const secrets = defaultResourcesSecretsDtos(1);
49
+
50
+ const adaPublicKey = await OpenpgpAssertion.readKeyOrFail(pgpKeys.ada.public);
51
+ const originalDecryptedSecret = plaintextSecretPasswordAndDescriptionDto();
52
+ secrets[0].data = await EncryptMessageService.encrypt(JSON.stringify(originalDecryptedSecret), adaPublicKey);
53
+ const needed_secrets = [
54
+ {
55
+ user_id: newUser._props.user_id,
56
+ resource_id: secrets[0].resource_id,
57
+ },
58
+ ];
59
+ const groupUpdateDryRunResultDto = { needed_secrets, secrets };
60
+ const groupUpdateDryRunEntity = new GroupUpdateDryRunResultEntity(groupUpdateDryRunResultDto);
61
+
62
+ const result = await AddUsersToGroupOffscreenService.handleRequest({
63
+ requestId: "11111111-1111-4111-8111-111111111111",
64
+ addUsersToGroupContent: {
65
+ privateKey: {
66
+ armoredKey: account.userPrivateArmoredKey,
67
+ passphrase: "ada@passbolt.com",
68
+ },
69
+ secrets: groupUpdateDryRunEntity.secrets.toDto(),
70
+ neededSecrets: groupUpdateDryRunEntity.neededSecrets.toDto(),
71
+ usersPublicKeys: { [newUser._props.user_id]: pgpKeys.betty.public },
72
+ },
73
+ });
74
+
75
+ const expectedResult = {
76
+ type: ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_SUCCESS,
77
+ target: SEND_MESSAGE_TARGET_ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_HANDLER,
78
+ data: expect.any(Object),
79
+ };
80
+
81
+ const decryptedData = await DecryptMessageService.decrypt(
82
+ await OpenpgpAssertion.readMessageOrFail(result.data[0].data),
83
+ await OpenpgpAssertion.readKeyOrFail(pgpKeys.betty.private_decrypted),
84
+ );
85
+
86
+ expect(JSON.parse(decryptedData)).toStrictEqual(originalDecryptedSecret);
87
+ expect(result).toStrictEqual(expectedResult);
88
+ });
89
+
90
+ it("should send error if any unexpected error happen", async () => {
91
+ expect.assertions(1);
92
+
93
+ const result = await AddUsersToGroupOffscreenService.handleRequest({
94
+ requestId: "11111111-1111-4111-8111-111111111111",
95
+ addUsersToGroupContent: {},
96
+ });
97
+
98
+ const expectedResult = {
99
+ type: ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_ERROR,
100
+ target: SEND_MESSAGE_TARGET_ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_HANDLER,
101
+ data: expect.any(Object),
102
+ };
103
+
104
+ expect(result).toStrictEqual(expectedResult);
105
+ });
106
+ });
107
+
108
+ describe("::handleProgressResponse", () => {
109
+ it("should send a progress message tagged with the request id", async () => {
110
+ expect.assertions(1);
111
+
112
+ const requestId = "11111111-1111-4111-8111-111111111111";
113
+ jest.spyOn(chrome.runtime, "sendMessage").mockImplementation(() => {});
114
+
115
+ await AddUsersToGroupOffscreenService.handleProgressResponse(requestId, { message: "Encrypting 1/2" });
116
+
117
+ expect(chrome.runtime.sendMessage).toHaveBeenCalledWith({
118
+ id: requestId,
119
+ data: { message: "Encrypting 1/2" },
120
+ type: ADD_USERS_TO_GROUP_OFFSCREEN_RESPONSE_TYPE_PROGRESS,
121
+ target: SEND_MESSAGE_TARGET_OFFSCREEN_PROGRESS_SERVICE_HANDLER,
122
+ });
123
+ });
124
+ });
125
+ });
@@ -17,6 +17,9 @@ import WriteClipobardOffscreenService, {
17
17
  SEND_MESSAGE_TARGET_CLIPBOARD_WRITE_OFFSCREEN,
18
18
  } from "../clipboard/writeClipobardOffscreenService";
19
19
  import { assertUuid } from "../../../../all/background_page/utils/assertions";
20
+ import AddUsersToGroupOffscreenService, {
21
+ SEND_MESSAGE_TARGET_ADD_USERS_TO_GROUP_OFFSCREEN,
22
+ } from "../group/addUsersToGroupOffscreenService";
20
23
 
21
24
  export const SEND_MESSAGE_TARGET_OFFSCREEN_ERROR_RESPONSE_HANDLER = "service-worker-offscreen-error-response-handler";
22
25
 
@@ -32,6 +35,7 @@ export default class HandleOffscreenRequestService {
32
35
  const REQUEST_HANDLE_MAP = {
33
36
  [SEND_MESSAGE_TARGET_FETCH_OFFSCREEN]: FetchOffscreenService.handleFetchRequest,
34
37
  [SEND_MESSAGE_TARGET_CLIPBOARD_WRITE_OFFSCREEN]: WriteClipobardOffscreenService.handleClipboardRequest,
38
+ [SEND_MESSAGE_TARGET_ADD_USERS_TO_GROUP_OFFSCREEN]: AddUsersToGroupOffscreenService.handleRequest,
35
39
  };
36
40
 
37
41
  const requestHandler = REQUEST_HANDLE_MAP[message.target];
@@ -0,0 +1,83 @@
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 5.13.0
13
+ */
14
+ import CreateOffscreenDocumentService from "../offscreen/createOffscreenDocumentService";
15
+ import HandleOffscreenResponseService from "../offscreen/handleOffscreenResponseService";
16
+ import { SEND_MESSAGE_TARGET_ADD_USERS_TO_GROUP_OFFSCREEN } from "../../../offscreens/service/group/addUsersToGroupOffscreenService";
17
+ import ResponseAddUsersToGroupOffscreenService from "./responseAddUsersToGroupOffscreenService";
18
+ import { assertPassphrase, assertType } from "../../../../all/background_page/utils/assertions";
19
+ import AccountEntity from "../../../../all/background_page/model/entity/account/accountEntity";
20
+ import GroupUpdateDryRunResultEntity from "../../../../all/background_page/model/entity/group/update/groupUpdateDryRunResultEntity";
21
+ import ProgressService from "../../../../all/background_page/service/progress/progressService";
22
+
23
+ export class RequestAddUsersToGroupOffscreenService {
24
+ /**
25
+ * Run the decryption and encryption of the secrets through offscreen.
26
+ * @param {AccountEntity} account
27
+ * @param {string} passphrase
28
+ * @param {GroupUpdateDryRunResultEntity} groupUpdateDryRunResultEntity
29
+ * @param {object} usersPublicKeys
30
+ * @param {ProgressService} progressService the progress service
31
+ * @returns {Promise<object[]>} The encrypted group update secrets as DTOs.
32
+ */
33
+ static async decryptAndEncryptSecrets(
34
+ account,
35
+ passphrase,
36
+ groupUpdateDryRunResultEntity,
37
+ usersPublicKeys,
38
+ progressService,
39
+ ) {
40
+ assertType(account, AccountEntity);
41
+ assertPassphrase(passphrase);
42
+ assertType(groupUpdateDryRunResultEntity, GroupUpdateDryRunResultEntity);
43
+ assertType(progressService, ProgressService);
44
+ await CreateOffscreenDocumentService.createIfNotExistOffscreenDocument();
45
+
46
+ const requestId = crypto.randomUUID();
47
+ const offscreenAddUsersToGroupData = {
48
+ requestId: requestId,
49
+ addUsersToGroupContent: {
50
+ privateKey: {
51
+ armoredKey: account.userPrivateArmoredKey,
52
+ passphrase: passphrase,
53
+ },
54
+ secrets: groupUpdateDryRunResultEntity.secrets.toDto(),
55
+ neededSecrets: groupUpdateDryRunResultEntity.neededSecrets.toDto(),
56
+ usersPublicKeys: usersPublicKeys,
57
+ },
58
+ };
59
+ // Register the progress service for this request so progress messages can be routed back to the app
60
+ ResponseAddUsersToGroupOffscreenService.setProgressService(requestId, progressService);
61
+ return new Promise((resolve, reject) => {
62
+ // Stack the response listener callbacks.
63
+ HandleOffscreenResponseService.setResponseCallback(requestId, { resolve, reject });
64
+ return RequestAddUsersToGroupOffscreenService.sendOffscreenMessage(requestId, offscreenAddUsersToGroupData).catch(
65
+ reject,
66
+ );
67
+ });
68
+ }
69
+
70
+ /**
71
+ * Send message to the offscreen document for add users to group decryption and encryption operations.
72
+ * @param {string} id The id.
73
+ * @param {object} data The data to handle.
74
+ * @returns {Promise<*>}
75
+ */
76
+ static async sendOffscreenMessage(id, data) {
77
+ return chrome.runtime.sendMessage({
78
+ id: id,
79
+ data: data,
80
+ target: SEND_MESSAGE_TARGET_ADD_USERS_TO_GROUP_OFFSCREEN,
81
+ });
82
+ }
83
+ }