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
@@ -19,7 +19,7 @@ import { QuickAccessEvents } from "../event/quickAccessEvents";
19
19
  import { GroupEvents } from "../event/groupEvents";
20
20
  import { ResourceEvents } from "../event/resourceEvents";
21
21
  import { SecretEvents } from "../event/secretEvents";
22
- import { OrganizationSettingsEvents } from "../event/organizationSettingsEvents";
22
+ import { SiteSettingsEvents } from "../event/siteSettingsEvents";
23
23
  import { TabEvents } from "../event/tabEvents";
24
24
  import { LocaleEvents } from "../event/localeEvents";
25
25
  import { PownedPasswordEvents } from "../event/pownedPasswordEvents";
@@ -38,7 +38,7 @@ jest.spyOn(QuickAccessEvents, "listen").mockImplementation(jest.fn());
38
38
  jest.spyOn(GroupEvents, "listen").mockImplementation(jest.fn());
39
39
  jest.spyOn(ResourceEvents, "listen").mockImplementation(jest.fn());
40
40
  jest.spyOn(SecretEvents, "listen").mockImplementation(jest.fn());
41
- jest.spyOn(OrganizationSettingsEvents, "listen").mockImplementation(jest.fn());
41
+ jest.spyOn(SiteSettingsEvents, "listen").mockImplementation(jest.fn());
42
42
  jest.spyOn(TabEvents, "listen").mockImplementation(jest.fn());
43
43
  jest.spyOn(LocaleEvents, "listen").mockImplementation(jest.fn());
44
44
  jest.spyOn(PownedPasswordEvents, "listen").mockImplementation(jest.fn());
@@ -78,7 +78,7 @@ describe("QuickAccess", () => {
78
78
  expect(GroupEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
79
79
  expect(ResourceEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
80
80
  expect(SecretEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
81
- expect(OrganizationSettingsEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
81
+ expect(SiteSettingsEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
82
82
  expect(TabEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
83
83
  expect(LocaleEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
84
84
  expect(PownedPasswordEvents.listen).toHaveBeenCalledWith(expectedArgument, apiClientOptions, mockedAccount);
@@ -93,7 +93,7 @@ describe("QuickAccess", () => {
93
93
  GroupEvents,
94
94
  ResourceEvents,
95
95
  SecretEvents,
96
- OrganizationSettingsEvents,
96
+ SiteSettingsEvents,
97
97
  TabEvents,
98
98
  LocaleEvents,
99
99
  PownedPasswordEvents,
@@ -17,7 +17,7 @@ import { RecoverEvents } from "../event/recoverEvents";
17
17
  import BuildAccountRecoverService from "../service/recover/buildAccountRecoverService";
18
18
  import BuildApiClientOptionsService from "../service/account/buildApiClientOptionsService";
19
19
  import { PownedPasswordEvents } from "../event/pownedPasswordEvents";
20
- import OrganizationSettingsModel from "../model/organizationSettings/organizationSettingsModel";
20
+ import GetOrFindSiteSettingsService from "../service/siteSettings/getOrFindSiteSettingsService";
21
21
 
22
22
  class Recover extends Pagemod {
23
23
  /**
@@ -45,7 +45,7 @@ class Recover extends Pagemod {
45
45
  const tab = port._port.sender.tab;
46
46
  const account = BuildAccountRecoverService.buildFromRecoverUrl(tab.url);
47
47
  const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
48
- await new OrganizationSettingsModel(apiClientOptions).getOrFind(true);
48
+ await new GetOrFindSiteSettingsService(account, apiClientOptions).getOrFind(true);
49
49
  for (const event of this.events) {
50
50
  event.listen({ port, tab }, apiClientOptions, account);
51
51
  }
@@ -18,6 +18,9 @@ import { ConfigEvents } from "../event/configEvents";
18
18
  import BuildApiClientOptionsService from "../service/account/buildApiClientOptionsService";
19
19
  import { PownedPasswordEvents } from "../event/pownedPasswordEvents";
20
20
  import { enableFetchMocks } from "jest-fetch-mock";
21
+ import { anonymousSiteSettings } from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity.test.data";
22
+ import SiteSettingsEntity from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity";
23
+ import GetOrFindSiteSettingsService from "../service/siteSettings/getOrFindSiteSettingsService";
21
24
 
22
25
  jest.spyOn(BuildAccountRecoverService, "buildFromRecoverUrl");
23
26
  jest.spyOn(BuildApiClientOptionsService, "buildFromAccount");
@@ -30,6 +33,9 @@ describe("Recover", () => {
30
33
  jest.resetModules();
31
34
  jest.clearAllMocks();
32
35
  enableFetchMocks();
36
+ jest
37
+ .spyOn(GetOrFindSiteSettingsService.prototype, "getOrFind")
38
+ .mockImplementation(() => new SiteSettingsEntity(anonymousSiteSettings()));
33
39
  });
34
40
 
35
41
  describe("Recover::attachEvents", () => {
@@ -17,7 +17,7 @@ import BuildApiClientOptionsService from "../service/account/buildApiClientOptio
17
17
  import { SetupEvents } from "../event/setupEvents";
18
18
  import BuildAccountSetupService from "../service/setup/buildAccountSetupService";
19
19
  import { PownedPasswordEvents } from "../event/pownedPasswordEvents";
20
- import OrganizationSettingsModel from "../model/organizationSettings/organizationSettingsModel";
20
+ import GetOrFindSiteSettingsService from "../service/siteSettings/getOrFindSiteSettingsService";
21
21
 
22
22
  class Setup extends Pagemod {
23
23
  /**
@@ -43,7 +43,7 @@ class Setup extends Pagemod {
43
43
  const tab = port._port.sender.tab;
44
44
  const account = BuildAccountSetupService.buildFromSetupUrl(tab.url);
45
45
  const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
46
- await new OrganizationSettingsModel(apiClientOptions).getOrFind(true);
46
+ await new GetOrFindSiteSettingsService(account, apiClientOptions).getOrFind(true);
47
47
  for (const event of this.events) {
48
48
  event.listen({ port, tab }, apiClientOptions, account);
49
49
  }
@@ -18,6 +18,9 @@ import BuildApiClientOptionsService from "../service/account/buildApiClientOptio
18
18
  import BuildAccountSetupService from "../service/setup/buildAccountSetupService";
19
19
  import { PownedPasswordEvents } from "../event/pownedPasswordEvents";
20
20
  import { enableFetchMocks } from "jest-fetch-mock";
21
+ import { anonymousSiteSettings } from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity.test.data";
22
+ import SiteSettingsEntity from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity";
23
+ import GetOrFindSiteSettingsService from "../service/siteSettings/getOrFindSiteSettingsService";
21
24
 
22
25
  jest.spyOn(BuildAccountSetupService, "buildFromSetupUrl");
23
26
  jest.spyOn(BuildApiClientOptionsService, "buildFromAccount");
@@ -30,6 +33,9 @@ describe("Setup", () => {
30
33
  jest.resetModules();
31
34
  jest.clearAllMocks();
32
35
  enableFetchMocks();
36
+ jest
37
+ .spyOn(GetOrFindSiteSettingsService.prototype, "getOrFind")
38
+ .mockImplementation(() => new SiteSettingsEntity(anonymousSiteSettings()));
33
39
  });
34
40
 
35
41
  describe("Setup::attachEvents", () => {
@@ -14,10 +14,11 @@
14
14
  import Pagemod from "./pagemod";
15
15
  import { ConfigEvents } from "../event/configEvents";
16
16
  import { WebIntegrationEvents } from "../event/webIntegrationEvents";
17
- import { OrganizationSettingsEvents } from "../event/organizationSettingsEvents";
17
+ import { SiteSettingsEvents } from "../event/siteSettingsEvents";
18
18
  import { PortEvents } from "../event/portEvents";
19
19
  import ParseWebIntegrationUrlService from "../service/webIntegration/parseWebIntegrationUrlService";
20
20
  import GetActiveAccountService from "../service/account/getActiveAccountService";
21
+ import BuildApiClientOptionsService from "../service/account/buildApiClientOptionsService";
21
22
 
22
23
  class WebIntegration extends Pagemod {
23
24
  /**
@@ -49,7 +50,25 @@ class WebIntegration extends Pagemod {
49
50
  * @inheritDoc
50
51
  */
51
52
  get events() {
52
- return [ConfigEvents, WebIntegrationEvents, OrganizationSettingsEvents, PortEvents];
53
+ return [ConfigEvents, WebIntegrationEvents, SiteSettingsEvents, PortEvents];
54
+ }
55
+
56
+ /**
57
+ * @inheritDoc
58
+ */
59
+ async attachEvents(port) {
60
+ try {
61
+ const tab = port._port.sender.tab;
62
+ const account = await GetActiveAccountService.get();
63
+ const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
64
+ const name = this.appName;
65
+ for (const event of this.events) {
66
+ event.listen({ port, tab, name }, apiClientOptions, account);
67
+ }
68
+ } catch (error) {
69
+ // Unexpected error.
70
+ console.error(error);
71
+ }
53
72
  }
54
73
 
55
74
  /**
@@ -19,9 +19,12 @@ import WorkerEntity from "../model/entity/worker/workerEntity";
19
19
  import ScriptExecution from "../sdk/scriptExecution";
20
20
  import Pagemod from "./pagemod";
21
21
  import { ConfigEvents } from "../event/configEvents";
22
- import { OrganizationSettingsEvents } from "../event/organizationSettingsEvents";
22
+ import { SiteSettingsEvents } from "../event/siteSettingsEvents";
23
23
  import { WebIntegrationEvents } from "../event/webIntegrationEvents";
24
24
  import { PortEvents } from "../event/portEvents";
25
+ import GetActiveAccountService from "../service/account/getActiveAccountService";
26
+ import BuildApiClientOptionsService from "../service/account/buildApiClientOptionsService";
27
+ import { v4 as uuid } from "uuid";
25
28
 
26
29
  const spyAddWorker = jest.spyOn(WorkersSessionStorage, "addWorker");
27
30
  jest.spyOn(ScriptExecution.prototype, "injectPortname").mockImplementation(jest.fn());
@@ -29,7 +32,7 @@ jest.spyOn(ScriptExecution.prototype, "injectCss").mockImplementation(jest.fn())
29
32
  jest.spyOn(ScriptExecution.prototype, "injectJs").mockImplementation(jest.fn());
30
33
  jest.spyOn(ConfigEvents, "listen").mockImplementation(jest.fn());
31
34
  jest.spyOn(WebIntegrationEvents, "listen").mockImplementation(jest.fn());
32
- jest.spyOn(OrganizationSettingsEvents, "listen").mockImplementation(jest.fn());
35
+ jest.spyOn(SiteSettingsEvents, "listen").mockImplementation(jest.fn());
33
36
  jest.spyOn(PortEvents, "listen").mockImplementation(jest.fn());
34
37
 
35
38
  describe("WebIntegration", () => {
@@ -54,12 +57,7 @@ describe("WebIntegration", () => {
54
57
  "contentScripts/js/dist/browser-integration/vendors.js",
55
58
  "contentScripts/js/dist/browser-integration/browser-integration.js",
56
59
  ]);
57
- expect(WebIntegration.events).toStrictEqual([
58
- ConfigEvents,
59
- WebIntegrationEvents,
60
- OrganizationSettingsEvents,
61
- PortEvents,
62
- ]);
60
+ expect(WebIntegration.events).toStrictEqual([ConfigEvents, WebIntegrationEvents, SiteSettingsEvents, PortEvents]);
63
61
  expect(WebIntegration.mustReloadOnExtensionUpdate).toBeFalsy();
64
62
  expect(WebIntegration.appName).toBe("WebIntegration");
65
63
  });
@@ -114,29 +112,22 @@ describe("WebIntegration", () => {
114
112
  },
115
113
  },
116
114
  };
115
+ // mock functions
116
+ const mockedAccount = { user_id: uuid(), domain: "https://test.passbolt.local" };
117
+ const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(mockedAccount);
118
+ jest.spyOn(GetActiveAccountService, "get").mockImplementation(() => mockedAccount);
117
119
  // process
118
120
  await WebIntegration.attachEvents(port);
119
121
  // expectations
120
- expect(ConfigEvents.listen).toHaveBeenCalledWith({
121
- port: port,
122
- tab: port._port.sender.tab,
123
- name: WebIntegration.appName,
124
- });
125
- expect(WebIntegrationEvents.listen).toHaveBeenCalledWith({
126
- port: port,
127
- tab: port._port.sender.tab,
128
- name: WebIntegration.appName,
129
- });
130
- expect(OrganizationSettingsEvents.listen).toHaveBeenCalledWith({
131
- port: port,
132
- tab: port._port.sender.tab,
133
- name: WebIntegration.appName,
134
- });
135
- expect(PortEvents.listen).toHaveBeenCalledWith({
122
+ const expectedWorker = {
136
123
  port: port,
137
124
  tab: port._port.sender.tab,
138
125
  name: WebIntegration.appName,
139
- });
126
+ };
127
+ expect(ConfigEvents.listen).toHaveBeenCalledWith(expectedWorker, apiClientOptions, mockedAccount);
128
+ expect(WebIntegrationEvents.listen).toHaveBeenCalledWith(expectedWorker, apiClientOptions, mockedAccount);
129
+ expect(SiteSettingsEvents.listen).toHaveBeenCalledWith(expectedWorker, apiClientOptions, mockedAccount);
130
+ expect(PortEvents.listen).toHaveBeenCalledWith(expectedWorker, apiClientOptions, mockedAccount);
140
131
  });
141
132
  });
142
133
  });
@@ -20,11 +20,10 @@ const ACTIVE_ACCOUNT_KEY = "active-account";
20
20
  class GetActiveAccountService {
21
21
  /**
22
22
  * Get the active account associated with this extension.
23
- * @param {Object} options The option to add more data in the account
24
23
  * @return {Promise<AccountEntity>}
25
24
  * @throw {Error} if no account yet associated with this extension.
26
25
  */
27
- get(options = {}) {
26
+ get() {
28
27
  return navigator.locks.request(ACTIVE_ACCOUNT_KEY, async () => {
29
28
  // Check if the storage have some data
30
29
  if (Object.keys(storage._data).length === 0) {
@@ -33,7 +32,7 @@ class GetActiveAccountService {
33
32
  // Initialization of the config to get the user information
34
33
  Config.init();
35
34
  }
36
- return await GetLegacyAccountService.get(options);
35
+ return GetLegacyAccountService.get();
37
36
  });
38
37
  }
39
38
  }
@@ -16,31 +16,20 @@ import Keyring from "../../model/keyring";
16
16
  import { Uuid } from "../../utils/uuid";
17
17
  import AccountEntity from "../../model/entity/account/accountEntity";
18
18
  import User from "../../model/user";
19
- import BuildApiClientOptionsService from "./buildApiClientOptionsService";
20
- import UserModel from "../../model/user/userModel";
21
19
 
22
20
  class GetLegacyAccountService {
23
21
  /**
24
22
  * Get the account associated with this extension.
25
- * @param {Object} option The option to add more data in the account
26
- * @return {Promise<AccountEntity>}
23
+ * @return {AccountEntity}
27
24
  * @throw {Error} if no account yet associated with this extension.
28
25
  */
29
- static async get(option = {}) {
26
+ static get() {
30
27
  const keyring = new Keyring();
31
28
  const user = User.getInstance().get();
32
29
  const serverPublicKeyInfo = keyring.findPublic(Uuid.get(user.settings.domain));
33
30
  const userPublicKeyInfo = keyring.findPublic(user.id);
34
31
  const userPrivateKeyInfo = keyring.findPrivate();
35
32
 
36
- // Add in the account the role name if the option object have role (only for authenticated user)
37
- let userEntity;
38
- if (option?.role) {
39
- // Load the application settings, necessary to validate the account username.
40
- const apiClientOptions = BuildApiClientOptionsService.buildFromDomain(user.settings.domain);
41
- userEntity = await new UserModel(apiClientOptions).findOne(user.id, { role: true });
42
- }
43
-
44
33
  const accountDto = {
45
34
  domain: user.settings.domain,
46
35
  user_id: user.id,
@@ -52,7 +41,7 @@ class GetLegacyAccountService {
52
41
  user_public_armored_key: userPublicKeyInfo.armoredKey,
53
42
  user_private_armored_key: userPrivateKeyInfo.armoredKey,
54
43
  security_token: user.settings.securityToken,
55
- role_name: userEntity?.role?.name || null,
44
+ role_name: null, // This property should be updated later as the user should be authenticated to get his role
56
45
  };
57
46
 
58
47
  /*
@@ -11,7 +11,7 @@
11
11
  * @link https://www.passbolt.com Passbolt(tm)
12
12
  * @since 3.9.0
13
13
  */
14
- import OrganizationSettingsModel from "../../model/organizationSettings/organizationSettingsModel";
14
+ import GetOrFindSiteSettingsService from "../siteSettings/getOrFindSiteSettingsService";
15
15
  import SsoSettingsModel from "../../model/sso/ssoSettingsModel";
16
16
  import SsoDataStorage from "../indexedDB_storage/ssoDataStorage";
17
17
  import GenerateSsoKitService from "../sso/generateSsoKitService";
@@ -19,8 +19,12 @@ import SsoKitServerPartModel from "../../model/sso/ssoKitServerPartModel";
19
19
  import EntityValidationError from "passbolt-styleguide/src/shared/models/entity/abstract/entityValidationError";
20
20
 
21
21
  class UpdateSsoCredentialsService {
22
- constructor(apiClientOption) {
23
- this.organisationSettingsModel = new OrganizationSettingsModel(apiClientOption);
22
+ /**
23
+ * @param {ApiClientOptions} apiClientOption the api client options
24
+ * @param {AccountEntity} account the user account
25
+ */
26
+ constructor(apiClientOption, account) {
27
+ this.getOrFindSiteSettingsService = new GetOrFindSiteSettingsService(account, apiClientOption);
24
28
  this.ssoSettingsModel = new SsoSettingsModel(apiClientOption);
25
29
  this.ssoKitServerPartModel = new SsoKitServerPartModel(apiClientOption);
26
30
  }
@@ -44,8 +48,8 @@ class UpdateSsoCredentialsService {
44
48
  */
45
49
  async updateSsoKitIfNeeded(passphrase) {
46
50
  const localSsoKit = await SsoDataStorage.get();
47
- const organizationSettings = await this.organisationSettingsModel.getOrFind();
48
- if (!organizationSettings.isPluginEnabled("sso")) {
51
+ const siteSettings = await this.getOrFindSiteSettingsService.getOrFind(false);
52
+ if (!siteSettings.isPluginEnabled("sso")) {
49
53
  /*
50
54
  * If the plugin is disabled there is no reason to keep an SSO kit
51
55
  * Plus, if we have an SSO kit locally, the login page will continue display the SSO login
@@ -66,21 +66,23 @@ class GroupApiService extends AbstractService {
66
66
  * @returns {Array<string>} list of supported option
67
67
  */
68
68
  static getSupportedFiltersOptions() {
69
- return ["has-users", "has-managers", "has-id"];
69
+ return ["has-users", "has-managers"];
70
70
  }
71
71
 
72
72
  /**
73
73
  * Get a group for a given id
74
74
  *
75
75
  * @param {string} id group uuid
76
+ * @param {Object} [contains] optional example: { ["groups_users.user.profile"]: true }
76
77
  * @throws {Error} if API call fails, service unreachable, etc.
77
78
  * @throws {TypeError} if group id is not a valid uuid
78
- * @returns {Object} groupDto
79
+ * @returns {Promise<PassboltResponseEntity>} groupDto
79
80
  */
80
- async get(id) {
81
+ async get(id, contains) {
81
82
  this.assertValidId(id);
82
- const response = await this.apiClient.get(id);
83
- return response.body;
83
+ const options = contains ? this.formatContainOptions(contains, GroupApiService.getSupportedContainOptions()) : null;
84
+ const response = await this.apiClient.get(id, options);
85
+ return new PassboltResponseEntity(response);
84
86
  }
85
87
 
86
88
  /**
@@ -93,23 +95,14 @@ class GroupApiService extends AbstractService {
93
95
  * @public
94
96
  */
95
97
  async findAll(contains, filters) {
96
- const hasIdFilter = filters?.["has-id"];
97
98
  const legacyContain = GroupApiService.remapLegacyContain(contains); // crassette
98
99
  contains = legacyContain
99
100
  ? this.formatContainOptions(legacyContain, GroupApiService.getSupportedContainOptions())
100
101
  : null;
101
102
  filters = filters ? this.formatFilterOptions(filters, GroupApiService.getSupportedFiltersOptions()) : null;
102
103
  const options = { ...contains, ...filters };
103
- const rawResponse = await this.apiClient.findAll(options);
104
- /*
105
- * Ensure backward compatibility with servers that do not yet support the has-id filter:
106
- * post-filter the results in memory so the caller always receives only the requested groups.
107
- */
108
- if (hasIdFilter && rawResponse.body) {
109
- const idsMap = new Set(Array.isArray(hasIdFilter) ? hasIdFilter : [hasIdFilter]);
110
- rawResponse.body = rawResponse.body.filter((group) => idsMap.has(group.id));
111
- }
112
- return new PassboltResponseEntity(rawResponse);
104
+ const response = await this.apiClient.findAll(options);
105
+ return new PassboltResponseEntity(response);
113
106
  }
114
107
 
115
108
  /**
@@ -12,7 +12,8 @@
12
12
  * @since 2.13.0
13
13
  */
14
14
  import { enableFetchMocks } from "jest-fetch-mock";
15
- import { mockApiResponse } from "../../../../../../test/mocks/mockApiResponse";
15
+ import { v4 as uuidv4 } from "uuid";
16
+ import { mockApiResponse, mockApiResponseError } from "../../../../../../test/mocks/mockApiResponse";
16
17
  import GroupApiService from "./groupApiService";
17
18
  import { defaultApiClientOptions } from "passbolt-styleguide/src/shared/lib/apiClient/apiClientOptions.test.data";
18
19
  import { defaultGroupDto } from "passbolt-styleguide/src/shared/models/entity/group/groupEntity.test.data";
@@ -25,7 +26,7 @@ beforeEach(() => {
25
26
 
26
27
  describe("GroupApiService", () => {
27
28
  describe("::findAll", () => {
28
- it("should return a PassboltResponseEntity containing all groups when no has-id filter is given", async () => {
29
+ it("should return a PassboltResponseEntity containing all groups", async () => {
29
30
  expect.assertions(3);
30
31
  const groupsDto = [defaultGroupDto(), defaultGroupDto()];
31
32
  fetch.doMockOnceIf(/groups\.json/, () => mockApiResponse(groupsDto));
@@ -37,48 +38,80 @@ describe("GroupApiService", () => {
37
38
  expect(response.body).toHaveLength(2);
38
39
  expect(response.body).toStrictEqual(groupsDto);
39
40
  });
41
+ });
40
42
 
41
- it("should post-filter results to only return groups matching the has-id filter", async () => {
43
+ describe("::get", () => {
44
+ it("should return a PassboltResponseEntity containing the group for the given id", async () => {
42
45
  expect.assertions(3);
43
- const group1 = defaultGroupDto();
44
- const group2 = defaultGroupDto();
45
- const group3 = defaultGroupDto();
46
- fetch.doMockOnceIf(/groups\.json/, () => mockApiResponse([group1, group2, group3]));
46
+ const groupDto = defaultGroupDto();
47
+ let request;
48
+ fetch.doMockOnceIf(new RegExp(`/groups/${groupDto.id}.json`), (req) => {
49
+ request = req;
50
+ return mockApiResponse(groupDto);
51
+ });
47
52
 
48
53
  const service = new GroupApiService(defaultApiClientOptions());
49
- const response = await service.findAll(null, { "has-id": [group1.id, group3.id] });
54
+ const response = await service.get(groupDto.id);
50
55
 
51
56
  expect(response).toBeInstanceOf(PassboltResponseEntity);
52
- expect(response.body).toHaveLength(2);
53
- expect(response.body).toStrictEqual([group1, group3]);
57
+ expect(response.body).toStrictEqual(groupDto);
58
+ // No contain params should be sent when no contains is given.
59
+ const containParams = [...new URL(request.url).searchParams.keys()].filter((key) => key.startsWith("contain"));
60
+ expect(containParams).toStrictEqual([]);
54
61
  });
55
62
 
56
- it("should support a single string value for the has-id filter", async () => {
63
+ it("should request the given contain options", async () => {
57
64
  expect.assertions(3);
58
- const group1 = defaultGroupDto();
59
- const group2 = defaultGroupDto();
60
- fetch.doMockOnceIf(/groups\.json/, () => mockApiResponse([group1, group2]));
65
+ const groupDto = defaultGroupDto();
66
+ const contains = { groups_users: true, my_group_user: true, modifier: false };
67
+ let request;
68
+ fetch.doMockOnceIf(new RegExp(`/groups/${groupDto.id}.json`), (req) => {
69
+ request = req;
70
+ return mockApiResponse(groupDto);
71
+ });
61
72
 
62
73
  const service = new GroupApiService(defaultApiClientOptions());
63
- const response = await service.findAll(null, { "has-id": group2.id });
74
+ await service.get(groupDto.id, contains);
64
75
 
65
- expect(response).toBeInstanceOf(PassboltResponseEntity);
66
- expect(response.body).toHaveLength(1);
67
- expect(response.body).toStrictEqual([group2]);
76
+ const url = new URL(request.url);
77
+ expect(url.searchParams.get("contain[groups_users]")).toStrictEqual("1");
78
+ expect(url.searchParams.get("contain[my_group_user]")).toStrictEqual("1");
79
+ expect(url.searchParams.get("contain[modifier]")).toStrictEqual("0");
68
80
  });
69
81
 
70
- it("should return an empty body when no groups match the has-id filter", async () => {
82
+ it("should ignore unsupported contain options", async () => {
71
83
  expect.assertions(2);
72
- const group1 = defaultGroupDto();
73
- const group2 = defaultGroupDto();
74
- fetch.doMockOnceIf(/groups\.json/, () => mockApiResponse([group1, group2]));
84
+ const groupDto = defaultGroupDto();
85
+ const contains = { groups_users: true, unsupported_option: true };
86
+ let request;
87
+ fetch.doMockOnceIf(new RegExp(`/groups/${groupDto.id}.json`), (req) => {
88
+ request = req;
89
+ return mockApiResponse(groupDto);
90
+ });
75
91
 
76
- const unrelatedId = defaultGroupDto().id;
77
92
  const service = new GroupApiService(defaultApiClientOptions());
78
- const response = await service.findAll(null, { "has-id": [unrelatedId] });
93
+ await service.get(groupDto.id, contains);
79
94
 
80
- expect(response).toBeInstanceOf(PassboltResponseEntity);
81
- expect(response.body).toHaveLength(0);
95
+ const url = new URL(request.url);
96
+ expect(url.searchParams.get("contain[groups_users]")).toStrictEqual("1");
97
+ expect(url.searchParams.has("contain[unsupported_option]")).toStrictEqual(false);
98
+ });
99
+
100
+ it("should throw an error if the API returns a 404", async () => {
101
+ expect.assertions(1);
102
+ const groupId = uuidv4();
103
+ fetch.doMockOnceIf(new RegExp(`/groups/${groupId}.json`), () => mockApiResponseError(404, "Group not found"));
104
+
105
+ const service = new GroupApiService(defaultApiClientOptions());
106
+
107
+ await expect(service.get(groupId)).rejects.toThrow("Group not found");
108
+ });
109
+
110
+ it("should throw a TypeError if the id is not a valid uuid", async () => {
111
+ expect.assertions(1);
112
+ const service = new GroupApiService(defaultApiClientOptions());
113
+
114
+ await expect(service.get("not-a-uuid")).rejects.toThrow(TypeError);
82
115
  });
83
116
  });
84
117
  });
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 6.0.0
13
+ */
14
+ import AbstractService from "../abstract/abstractService";
15
+
16
+ const SITE_SETTINGS_SERVICE_RESOURCE_NAME = "settings";
17
+
18
+ class SiteSettingsApiService extends AbstractService {
19
+ /**
20
+ * @param {ApiClientOptions} apiClientOptions
21
+ */
22
+ constructor(apiClientOptions) {
23
+ super(apiClientOptions, SiteSettingsApiService.RESOURCE_NAME);
24
+ }
25
+
26
+ static get RESOURCE_NAME() {
27
+ return SITE_SETTINGS_SERVICE_RESOURCE_NAME;
28
+ }
29
+
30
+ /**
31
+ * Fetch the site settings.
32
+ * Merges the response server-time header into the dto as `serverTimeDiff` (ms).
33
+ * @returns {Promise<object>} The site settings dto.
34
+ */
35
+ async findSiteSettings() {
36
+ const response = await this.apiClient.findAll();
37
+ const dto = JSON.parse(JSON.stringify(response.body));
38
+ dto.serverTimeDiff = null;
39
+ if (response.header?.servertime) {
40
+ dto.serverTimeDiff = response.header.servertime * 1000 - new Date().getTime();
41
+ }
42
+ return dto;
43
+ }
44
+ }
45
+
46
+ export default SiteSettingsApiService;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 6.0.0
13
+ */
14
+ import { enableFetchMocks } from "jest-fetch-mock";
15
+ import { mockApiResponse, mockApiResponseError } from "passbolt-styleguide/test/mocks/mockApiResponse";
16
+ import { defaultApiClientOptions } from "passbolt-styleguide/src/shared/lib/apiClient/apiClientOptions.test.data";
17
+ import PassboltApiFetchError from "passbolt-styleguide/src/shared/lib/Error/PassboltApiFetchError";
18
+ import { defaultProSiteSettings } from "passbolt-styleguide/src/shared/models/entity/siteSettings/siteSettingsEntity.test.data";
19
+ import SiteSettingsApiService from "./siteSettingsApiService";
20
+
21
+ beforeEach(() => {
22
+ enableFetchMocks();
23
+ fetch.resetMocks();
24
+ jest.clearAllMocks();
25
+ });
26
+
27
+ describe("SiteSettingsApiService", () => {
28
+ describe("::findSiteSettings", () => {
29
+ it("issues a GET /settings.json request and returns the body", async () => {
30
+ expect.assertions(3);
31
+ const expectedDto = defaultProSiteSettings();
32
+ fetch.doMockOnceIf(/settings\.json/, () => mockApiResponse(expectedDto));
33
+
34
+ const service = new SiteSettingsApiService(defaultApiClientOptions());
35
+ const result = await service.findSiteSettings();
36
+
37
+ expect(result.app).toEqual(expectedDto.app);
38
+ expect(result.passbolt).toEqual(expectedDto.passbolt);
39
+ expect(result.serverTimeDiff).toBeNull();
40
+ });
41
+
42
+ it("merges the servertime header into serverTimeDiff (ms)", async () => {
43
+ expect.assertions(1);
44
+ const expectedDto = defaultProSiteSettings();
45
+ const nowSec = Math.floor(Date.now() / 1000);
46
+ const serverAheadSec = nowSec + 60;
47
+ fetch.doMockOnceIf(/settings\.json/, () => mockApiResponse(expectedDto, { servertime: serverAheadSec }));
48
+
49
+ const service = new SiteSettingsApiService(defaultApiClientOptions());
50
+ const result = await service.findSiteSettings();
51
+
52
+ // serverTimeDiff should be positive (server ahead). Allow ~5s of fuzz for test runtime.
53
+ expect(result.serverTimeDiff).toBeGreaterThan(55_000);
54
+ });
55
+
56
+ it("throws PassboltApiFetchError on API error", async () => {
57
+ expect.assertions(1);
58
+ fetch.doMockOnceIf(/settings\.json/, () => mockApiResponseError(500, "boom"));
59
+ const service = new SiteSettingsApiService(defaultApiClientOptions());
60
+ await expect(() => service.findSiteSettings()).rejects.toThrow(PassboltApiFetchError);
61
+ });
62
+ });
63
+ });