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