passbolt-browser-extension 5.3.2 → 5.4.1

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 (173) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/README.md +2 -2
  3. package/RELEASE_NOTES.md +8 -30
  4. package/crowdin.yml +1 -0
  5. package/package.json +4 -3
  6. package/src/all/_locales/cs/messages.json +10 -0
  7. package/src/all/background_page/controller/InformMenuController/InformMenuController.js +3 -3
  8. package/src/all/background_page/controller/auth/redirectPostLoginController.js +57 -0
  9. package/src/all/background_page/controller/auth/redirectPostLoginController.test.js +82 -0
  10. package/src/all/background_page/controller/auth/redirectToAdminWorkspaceController.js +50 -0
  11. package/src/all/background_page/controller/auth/redirectToAdminWorkspaceController.test.js +45 -0
  12. package/src/all/background_page/controller/comment/createCommentController.js +3 -3
  13. package/src/all/background_page/controller/comment/createCommentController.test.js +5 -5
  14. package/src/all/background_page/controller/comment/deleteCommentController.js +3 -3
  15. package/src/all/background_page/controller/comment/deleteCommentController.test.js +3 -3
  16. package/src/all/background_page/controller/comment/getCommentsByRessourceIdController.js +3 -3
  17. package/src/all/background_page/controller/comment/getCommentsByRessourceidController.test.js +2 -2
  18. package/src/all/background_page/controller/import/importResourcesFileController.test.js +23 -23
  19. package/src/all/background_page/controller/metadata/enableEncryptedMetadataForExistingInstanceController.js +54 -0
  20. package/src/all/background_page/controller/metadata/enableEncryptedMetadataForExistingInstanceController.test.js +54 -0
  21. package/src/all/background_page/controller/metadata/enableMetadataSetupSettingsController.js +54 -0
  22. package/src/all/background_page/controller/metadata/enableMetadataSetupSettingsController.test.js +64 -0
  23. package/src/all/background_page/controller/metadata/findAllNonDeletedMetadataKeysController.js +2 -3
  24. package/src/all/background_page/controller/metadata/findMetadataGettingStartedSettingsController.js +50 -0
  25. package/src/all/background_page/controller/metadata/findMetadataGettingStartedSettingsController.test.js +33 -0
  26. package/src/all/background_page/controller/metadata/findMetadataSetupSettingsController.js +50 -0
  27. package/src/all/background_page/controller/metadata/findMetadataSetupSettingsController.test.js +42 -0
  28. package/src/all/background_page/controller/metadata/keepCleartextMetadataForExistingInstanceController.js +51 -0
  29. package/src/all/background_page/controller/metadata/keepCleartextMetadataForExistingInstanceController.test.js +47 -0
  30. package/src/all/background_page/controller/permission/FindAcoPermissionsForDisplayController.js +1 -0
  31. package/src/all/background_page/controller/quickaccess/consumeInProgressCreationResourceController.js +53 -0
  32. package/src/all/background_page/controller/quickaccess/consumeInProgressCreationResourceController.test.js +40 -0
  33. package/src/all/background_page/controller/quickaccess/prepareResourceController.js +64 -0
  34. package/src/all/background_page/controller/quickaccess/prepareResourceController.test.js +73 -0
  35. package/src/all/background_page/controller/resource/resourceDeleteController.js +67 -0
  36. package/src/all/background_page/controller/resource/resourceDeleteController.test.js +114 -0
  37. package/src/all/background_page/controller/resourceLocalStorage/resourceUpdateLocalStorageController.js +1 -1
  38. package/src/all/background_page/controller/resourceLocalStorage/resourceUpdateLocalStorageController.test.js +5 -1
  39. package/src/all/background_page/controller/setup/signInSetupController.js +0 -10
  40. package/src/all/background_page/controller/setup/signInSetupController.test.js +11 -12
  41. package/src/all/background_page/controller/sso/saveSsoSettingsAsDraftController.test.data.js +1 -0
  42. package/src/all/background_page/controller/webIntegration/webIntegrationController.js +1 -1
  43. package/src/all/background_page/event/appEvents.js +47 -0
  44. package/src/all/background_page/event/authEvents.js +4 -8
  45. package/src/all/background_page/event/informMenuEvents.js +31 -0
  46. package/src/all/background_page/event/quickAccessEvents.js +18 -23
  47. package/src/all/background_page/event/recoverEvents.js +12 -0
  48. package/src/all/background_page/event/resourceEvents.js +4 -11
  49. package/src/all/background_page/event/setupEvents.js +55 -0
  50. package/src/all/background_page/model/comment/{commentModel.js → commentService.js} +6 -2
  51. package/src/all/background_page/model/comment/commentService.test.js +98 -0
  52. package/src/all/background_page/model/entity/actionLog/actionLogsCollection.js +3 -3
  53. package/src/all/background_page/model/entity/actionLog/permissionsUpdatedActionLogEntity.js +4 -0
  54. package/src/all/background_page/model/entity/import/importResourcesFileEntity.test.data.js +3 -3
  55. package/src/all/background_page/model/entity/organizationSettings/organizationSettingsEntity.test.data.js +4 -0
  56. package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionEntity.test.data.js +23 -0
  57. package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionEntity.test.js +18 -33
  58. package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionsCollection.js +71 -2
  59. package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionsCollection.test.js +204 -0
  60. package/src/all/background_page/model/entity/permission/permissionsCollection.js +78 -0
  61. package/src/all/background_page/model/entity/permission/permissionsCollection.test.js +139 -7
  62. package/src/all/background_page/model/entity/plaintext/plaintextEntity.js +9 -0
  63. package/src/all/background_page/model/entity/resource/external/externalResourceEntity.js +65 -8
  64. package/src/all/background_page/model/entity/resource/external/externalResourceEntity.test.data.js +5 -4
  65. package/src/all/background_page/model/entity/resource/external/externalResourceEntity.test.js +72 -16
  66. package/src/all/background_page/model/entity/resource/external/externalResourcesCollection.test.js +2 -1
  67. package/src/all/background_page/model/entity/totp/externalTotpEntity.js +2 -2
  68. package/src/all/background_page/model/entity/totp/totpEntity.test.js +1 -1
  69. package/src/all/background_page/model/export/resources/csvRowComposer/csv1PasswordRowComposer.test.js +2 -2
  70. package/src/all/background_page/model/export/resources/csvRowComposer/csv1passwordRowComposer.js +5 -1
  71. package/src/all/background_page/model/export/resources/csvRowComposer/csvBitWardenRowComposer.js +9 -1
  72. package/src/all/background_page/model/export/resources/csvRowComposer/csvBitWardenRowComposer.test.js +6 -4
  73. package/src/all/background_page/model/export/resources/csvRowComposer/csvChromiumRowComposer.js +5 -1
  74. package/src/all/background_page/model/export/resources/csvRowComposer/csvChromiumRowComposer.test.js +3 -2
  75. package/src/all/background_page/model/export/resources/csvRowComposer/csvDashlaneRowComposer.js +5 -1
  76. package/src/all/background_page/model/export/resources/csvRowComposer/csvDashlaneRowComposer.test.js +2 -3
  77. package/src/all/background_page/model/export/resources/csvRowComposer/csvKdbxRowComposer.js +3 -1
  78. package/src/all/background_page/model/export/resources/csvRowComposer/csvKdbxRowComposer.test.js +6 -4
  79. package/src/all/background_page/model/export/resources/csvRowComposer/csvLastPassRowComposer.js +5 -1
  80. package/src/all/background_page/model/export/resources/csvRowComposer/csvLastPassRowComposer.test.js +2 -3
  81. package/src/all/background_page/model/export/resources/csvRowComposer/csvLogMeOnceRowComposer.js +5 -1
  82. package/src/all/background_page/model/export/resources/csvRowComposer/csvLogMeOnceRowComposer.test.js +2 -3
  83. package/src/all/background_page/model/export/resources/csvRowComposer/csvMozillaPlatformRowComposer.js +6 -2
  84. package/src/all/background_page/model/export/resources/csvRowComposer/csvMozillaPlatformRowComposer.test.js +2 -2
  85. package/src/all/background_page/model/export/resources/csvRowComposer/csvNordpassRowComposer.js +5 -1
  86. package/src/all/background_page/model/export/resources/csvRowComposer/csvNordpassRowComposer.test.js +2 -2
  87. package/src/all/background_page/model/export/resources/csvRowComposer/csvSafariRowComposer.js +5 -1
  88. package/src/all/background_page/model/export/resources/csvRowComposer/csvSafariRowComposer.test.js +2 -2
  89. package/src/all/background_page/model/export/resources/resourcesKdbxExporter.js +44 -2
  90. package/src/all/background_page/model/export/resources/resourcesKdbxExporter.test.js +24 -3
  91. package/src/all/background_page/model/import/resources/csvRowParser/abstractCsvRowParser.js +1 -1
  92. package/src/all/background_page/model/import/resources/csvRowParser/csv1PasswordRowParser.js +5 -3
  93. package/src/all/background_page/model/import/resources/csvRowParser/csv1PasswordRowParser.test.js +3 -2
  94. package/src/all/background_page/model/import/resources/csvRowParser/csvBitWardenRowParser.js +22 -3
  95. package/src/all/background_page/model/import/resources/csvRowParser/csvBitWardenRowParser.test.js +92 -4
  96. package/src/all/background_page/model/import/resources/csvRowParser/csvChromiumRowParser.js +4 -2
  97. package/src/all/background_page/model/import/resources/csvRowParser/csvChromiumRowParser.test.js +2 -2
  98. package/src/all/background_page/model/import/resources/csvRowParser/csvDashlaneRowParser.js +4 -2
  99. package/src/all/background_page/model/import/resources/csvRowParser/csvDashlaneRowParser.test.js +3 -2
  100. package/src/all/background_page/model/import/resources/csvRowParser/csvKdbxRowParser.js +5 -3
  101. package/src/all/background_page/model/import/resources/csvRowParser/csvKdbxRowParser.test.js +4 -4
  102. package/src/all/background_page/model/import/resources/csvRowParser/csvLastPassRowParser.js +4 -2
  103. package/src/all/background_page/model/import/resources/csvRowParser/csvLastPassRowParser.test.js +2 -2
  104. package/src/all/background_page/model/import/resources/csvRowParser/csvLogMeOnceRowParser.js +5 -2
  105. package/src/all/background_page/model/import/resources/csvRowParser/csvLogMeOnceRowParser.test.js +2 -2
  106. package/src/all/background_page/model/import/resources/csvRowParser/csvMozillaPlatformRowParser.js +5 -3
  107. package/src/all/background_page/model/import/resources/csvRowParser/csvMozillaPlatformRowParser.test.js +2 -2
  108. package/src/all/background_page/model/import/resources/csvRowParser/csvNordpassRowParser.js +4 -2
  109. package/src/all/background_page/model/import/resources/csvRowParser/csvNordpassRowParser.test.js +2 -2
  110. package/src/all/background_page/model/import/resources/csvRowParser/csvSafariRowParser.js +4 -2
  111. package/src/all/background_page/model/import/resources/csvRowParser/csvSafariRowParser.test.js +2 -2
  112. package/src/all/background_page/model/import/resources/kdbx/kdbx-custom-fields-with-uris.kdbx +0 -0
  113. package/src/all/background_page/model/import/resources/kdbx/kdbx-multiple-uris-with-33-entries.kdbx +0 -0
  114. package/src/all/background_page/model/import/resources/kdbx/kdbx-multiple-uris.kdbx +0 -0
  115. package/src/all/background_page/model/import/resources/kdbx/kdbx-with-protected-custom-fields.kdbx +0 -0
  116. package/src/all/background_page/model/import/resources/resourcesCsvImportParser.test.js +1 -1
  117. package/src/all/background_page/model/import/resources/resourcesKdbxImportParser.js +124 -41
  118. package/src/all/background_page/model/import/resources/resourcesKdbxImportParser.test.js +133 -1
  119. package/src/all/background_page/model/import/resourcesImportParser.test.js +0 -1
  120. package/src/all/background_page/model/resource/resourceModel.js +0 -68
  121. package/src/all/background_page/service/api/comment/commentApiService.test.js +1 -1
  122. package/src/all/background_page/service/api/metadata/metadataSetupSettingsApiService.js +40 -0
  123. package/src/all/background_page/service/api/metadata/metadataSetupSettingsApiService.test.js +54 -0
  124. package/src/all/background_page/service/api/setup/setupService.js +2 -2
  125. package/src/all/background_page/service/api/setup/setupService.test.js +132 -0
  126. package/src/all/background_page/service/local_storage/resourceLocalStorage.js +25 -1
  127. package/src/all/background_page/service/local_storage/resourceLocalStorage.test.js +54 -0
  128. package/src/all/background_page/service/metadata/configureMetadataSettingsService.js +100 -0
  129. package/src/all/background_page/service/metadata/configureMetadataSettingsService.test.js +265 -0
  130. package/src/all/background_page/service/metadata/createMetadataKeyService.js +1 -1
  131. package/src/all/background_page/service/metadata/decryptMetadataPrivateKeysService.js +3 -19
  132. package/src/all/background_page/service/metadata/decryptMetadataService.js +5 -3
  133. package/src/all/background_page/service/metadata/decryptMetadataService.test.js +31 -24
  134. package/src/all/background_page/service/metadata/encryptMetadataService.js +2 -18
  135. package/src/all/background_page/service/metadata/findAndUpdateMetadataKeysSessionStorageService.js +5 -2
  136. package/src/all/background_page/service/metadata/findAndUpdateMetadataKeysSessionStorageService.test.js +4 -6
  137. package/src/all/background_page/service/metadata/findMetadataKeysService.js +8 -12
  138. package/src/all/background_page/service/metadata/findMetadataKeysService.test.js +21 -47
  139. package/src/all/background_page/service/metadata/findMetadataSetupSettingsService.js +45 -0
  140. package/src/all/background_page/service/metadata/findMetadataSetupSettingsService.test.js +68 -0
  141. package/src/all/background_page/service/metadata/generateMetadataKeyService.js +1 -1
  142. package/src/all/background_page/service/metadata/verifyOrTrustMetadataKeyService.test.js +16 -0
  143. package/src/all/background_page/service/passphrase/getPassphraseService.js +13 -0
  144. package/src/all/background_page/service/permission/findPermissionsService.js +3 -1
  145. package/src/all/background_page/service/resource/delete/deleteResourceService.js +60 -0
  146. package/src/all/background_page/service/resource/delete/deleteResourceService.test.js +75 -0
  147. package/src/all/background_page/service/resource/export/exportResourcesService.js +22 -0
  148. package/src/all/background_page/service/resource/export/exportResourcesService.test.js +48 -1
  149. package/src/all/background_page/service/resource/import/ImportResourcesService.js +34 -3
  150. package/src/all/background_page/service/resource/import/ImportResourcesService.test.js +55 -13
  151. package/src/all/background_page/service/sessionKey/decryptSessionKeysBundlesService.js +2 -18
  152. package/src/all/background_page/service/sessionKey/encryptSessionKeysBundlesService.js +1 -17
  153. package/src/all/locales/cs-CZ/common.json +130 -0
  154. package/src/all/locales/de-DE/common.json +11 -5
  155. package/src/all/locales/en-UK/common.json +6 -0
  156. package/src/all/locales/es-ES/common.json +6 -0
  157. package/src/all/locales/fr-FR/common.json +6 -0
  158. package/src/all/locales/it-IT/common.json +6 -0
  159. package/src/all/locales/ja-JP/common.json +6 -0
  160. package/src/all/locales/ko-KR/common.json +6 -0
  161. package/src/all/locales/lt-LT/common.json +6 -0
  162. package/src/all/locales/nl-NL/common.json +6 -0
  163. package/src/all/locales/pl-PL/common.json +6 -0
  164. package/src/all/locales/pt-BR/common.json +6 -0
  165. package/src/all/locales/ro-RO/common.json +6 -0
  166. package/src/all/locales/ru-RU/common.json +6 -0
  167. package/src/all/locales/sl-SI/common.json +6 -0
  168. package/src/all/locales/sv-SE/common.json +6 -0
  169. package/src/all/locales/uk-UA/common.json +6 -0
  170. package/src/chrome/manifest.json +1 -1
  171. package/src/chrome-mv3/manifest.json +1 -1
  172. package/src/firefox/manifest.json +1 -1
  173. package/src/safari/manifest.json +1 -1
@@ -219,7 +219,7 @@ describe("ImportResourcesFileController", () => {
219
219
  id: importedResources[0].id,
220
220
  name: 'Password 1',
221
221
  username: 'username1',
222
- uri: 'https://url1.com',
222
+ uris: ['https://url1.com'],
223
223
  resource_type_id: expectedResourceType.id,
224
224
  folder_parent_path: importedResources[0].folderParentPath,
225
225
  folder_parent_path_expected: "/Root/Folder 1/Folder 2",
@@ -229,7 +229,7 @@ describe("ImportResourcesFileController", () => {
229
229
  id: importedResources[1].id,
230
230
  name: 'Password 2',
231
231
  username: 'username2',
232
- uri: 'https://url2.com',
232
+ uris: ['https://url2.com'],
233
233
  resource_type_id: expectedResourceType.id,
234
234
  folder_parent_path: importedResources[1].folderParentPath,
235
235
  folder_parent_path_expected: "/Root/Folder 1",
@@ -239,7 +239,7 @@ describe("ImportResourcesFileController", () => {
239
239
  id: importedResources[2].id,
240
240
  name: 'Password 4',
241
241
  username: 'username4',
242
- uri: 'https://url4.com',
242
+ uris: ['https://url4.com'],
243
243
  resource_type_id: expectedResourceType.id,
244
244
  folder_parent_path: importedResources[2].folderParentPath,
245
245
  folder_parent_path_expected: "/Root/Folder 2/Folder 1",
@@ -249,7 +249,7 @@ describe("ImportResourcesFileController", () => {
249
249
  id: importedResources[3].id,
250
250
  name: 'Password 3',
251
251
  username: 'username3',
252
- uri: 'https://url3.com',
252
+ uris: ['https://url3.com'],
253
253
  resource_type_id: expectedResourceType.id,
254
254
  folder_parent_path: importedResources[3].folderParentPath,
255
255
  folder_parent_path_expected: "/Root/Folder 3/Folder 4",
@@ -292,7 +292,7 @@ describe("ImportResourcesFileController", () => {
292
292
  id: importedResources[0].id,
293
293
  name: 'Password 1',
294
294
  username: 'username1',
295
- uri: 'https://url1.com',
295
+ uris: ['https://url1.com'],
296
296
  resource_type_id: expectedResourceType.id,
297
297
  folder_parent_path: importedResources[0].folderParentPath,
298
298
  folder_parent_path_expected: "/Root",
@@ -329,7 +329,7 @@ describe("ImportResourcesFileController", () => {
329
329
  id: importedResources[0].id,
330
330
  name: 'Password 1',
331
331
  username: 'username1',
332
- uri: 'https://url1.com',
332
+ uris: ['https://url1.com'],
333
333
  resource_type_id: expectedResourceType.id,
334
334
  folder_parent_path: importedResources[0].folderParentPath,
335
335
  folder_parent_path_expected: "/Root",
@@ -393,7 +393,7 @@ describe("ImportResourcesFileController", () => {
393
393
  id: importedResources[0].id,
394
394
  name: 'Password 1',
395
395
  username: 'Username 1',
396
- uri: 'https://url1.com',
396
+ uris: ['https://url1.com'],
397
397
  resource_type_id: expectedResourceType.id,
398
398
  folder_parent_path: importedResources[0].folderParentPath,
399
399
  folder_parent_path_expected: ""
@@ -464,7 +464,7 @@ describe("ImportResourcesFileController", () => {
464
464
  id: importedResources[0].id,
465
465
  name: 'Password 1',
466
466
  username: 'Username 1',
467
- uri: 'https://url1.com',
467
+ uris: ['https://url1.com'],
468
468
  resource_type_id: expectedResourceType.id,
469
469
  folder_parent_path: importedResources[0].folderParentPath,
470
470
  }));
@@ -487,18 +487,6 @@ describe("ImportResourcesFileController", () => {
487
487
  metadataTypesSettings: defaultMetadataTypesSettingsV50FreshDto(),
488
488
  resourceType: RESOURCE_TYPE_V5_DEFAULT_SLUG
489
489
  },
490
- {
491
- scenario: "bitwarden",
492
- file: bitwardenCsvFile,
493
- metadataTypesSettings: defaultMetadataTypesSettingsV4Dto(),
494
- resourceType: RESOURCE_TYPE_PASSWORD_AND_DESCRIPTION_SLUG
495
- },
496
- {
497
- scenario: "bitwarden",
498
- file: bitwardenCsvFile,
499
- metadataTypesSettings: defaultMetadataTypesSettingsV50FreshDto(),
500
- resourceType: RESOURCE_TYPE_V5_DEFAULT_SLUG
501
- },
502
490
  {
503
491
  scenario: "lastpass", file: lastpassCsvFile,
504
492
  metadataTypesSettings: defaultMetadataTypesSettingsV4Dto(),
@@ -545,7 +533,7 @@ describe("ImportResourcesFileController", () => {
545
533
  id: importedResources[0].id,
546
534
  name: 'Password 1',
547
535
  username: 'Username 1',
548
- uri: 'https://url1.com',
536
+ uris: ['https://url1.com'],
549
537
  resource_type_id: expectedResourceType.id,
550
538
  folder_parent_path: importedResources[0].folderParentPath,
551
539
  folder_parent_path_expected: "/Folder 1"
@@ -571,6 +559,18 @@ describe("ImportResourcesFileController", () => {
571
559
  metadataTypesSettings: defaultMetadataTypesSettingsV50FreshDto(),
572
560
  resourceType: RESOURCE_TYPE_V5_DEFAULT_TOTP_SLUG
573
561
  },
562
+ {
563
+ scenario: "bitwarden",
564
+ file: bitwardenCsvFile,
565
+ metadataTypesSettings: defaultMetadataTypesSettingsV4Dto(),
566
+ resourceType: RESOURCE_TYPE_PASSWORD_DESCRIPTION_TOTP_SLUG
567
+ },
568
+ {
569
+ scenario: "bitwarden",
570
+ file: bitwardenCsvFile,
571
+ metadataTypesSettings: defaultMetadataTypesSettingsV50FreshDto(),
572
+ resourceType: RESOURCE_TYPE_V5_DEFAULT_TOTP_SLUG
573
+ },
574
574
  ]).describe("Should parse keypass with description, folder and totp", test => {
575
575
  beforeEach(() => {
576
576
  jest.spyOn(GetOrFindMetadataSettingsService.prototype, "getOrFindTypesSettings")
@@ -588,13 +588,13 @@ describe("ImportResourcesFileController", () => {
588
588
  const expectedResourceType = collection.find(resourceType => resourceType.slug === test.resourceType);
589
589
  const secret1 = await decryptSecret(result.importResources.items[0].secrets.items[0].data, pgpKeys.ada.private, pgpKeys.ada.passphrase);
590
590
 
591
- expect(secret1).toEqual("{\"password\":\"Secret 1\",\"description\":\"Description 1\",\"totp\":{\"secret_key\":\"THISISASECRET\",\"period\":30,\"digits\":6,\"algorithm\":\"SHA1\"}}");
591
+ expect(secret1).toEqual("{\"password\":\"Password 1\",\"description\":\"Description 1\",\"totp\":{\"secret_key\":\"THISISASECRET\",\"period\":30,\"digits\":6,\"algorithm\":\"SHA1\"}}");
592
592
 
593
593
  const externalEntity1 = new ExternalResourceEntity(defaultExternalResourceImportMinimalDto({
594
594
  id: importedResources[0].id,
595
595
  name: 'Password 1',
596
596
  username: 'Username 1',
597
- uri: 'https://url1.com',
597
+ uris: ['https://url1.com'],
598
598
  resource_type_id: expectedResourceType.id,
599
599
  folder_parent_path: importedResources[0].folderParentPath,
600
600
  folder_parent_path_expected: "/Folder 1"
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 5.4.0
13
+ */
14
+ import ConfigureMetadataSettingsService from "../../service/metadata/configureMetadataSettingsService";
15
+ import GetPassphraseService from "../../service/passphrase/getPassphraseService";
16
+
17
+ export default class EnableEncryptedMetadataForExistingInstanceController {
18
+ /**
19
+ * @constructor
20
+ * @param {Worker} worker
21
+ * @param {string} requestId
22
+ * @param {ApiClientOptions} apiClientOptions the api client options
23
+ * @param {AccountEntity} account the account associated to the worker
24
+ */
25
+ constructor(worker, requestId, apiClientOptions, account) {
26
+ this.worker = worker;
27
+ this.requestId = requestId;
28
+ this.configureMetadataSettingsService = new ConfigureMetadataSettingsService(account, apiClientOptions);
29
+ this.getPassphraseService = new GetPassphraseService(account);
30
+ }
31
+
32
+ /**
33
+ * Controller executor.
34
+ * @returns {Promise<void>}
35
+ */
36
+ async _exec() {
37
+ try {
38
+ const result = await this.exec();
39
+ this.worker.port.emit(this.requestId, 'SUCCESS', result);
40
+ } catch (error) {
41
+ console.error(error);
42
+ this.worker.port.emit(this.requestId, 'ERROR', error);
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Run the process to enable metadata encryption
48
+ * @returns {Promise<void>}
49
+ */
50
+ async exec() {
51
+ const passphrase = await this.getPassphraseService.getPassphrase(this.worker);
52
+ return await this.configureMetadataSettingsService.enableEncryptedMetadataForExistingInstance(passphrase);
53
+ }
54
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 5.4.0
13
+ */
14
+ import AccountEntity from "../../model/entity/account/accountEntity";
15
+ import {defaultAccountDto} from "../../model/entity/account/accountEntity.test.data";
16
+ import BuildApiClientOptionsService from "../../service/account/buildApiClientOptionsService";
17
+ import PassphraseStorageService from "../../service/session_storage/passphraseStorageService";
18
+ import EnableEncryptedMetadataForExistingInstanceController from "./enableEncryptedMetadataForExistingInstanceController";
19
+
20
+ describe("EnableEncryptedMetadataForExistingInstanceController", () => {
21
+ describe("::exec", () => {
22
+ it("should call for the orchestrator to enable metadata", async() => {
23
+ expect.assertions(3);
24
+
25
+ const passphrase = "ada@passbolt.com";
26
+ await PassphraseStorageService.set(passphrase);
27
+
28
+ const account = new AccountEntity(defaultAccountDto());
29
+ const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
30
+ const controller = new EnableEncryptedMetadataForExistingInstanceController(null, null, apiClientOptions, account);
31
+ jest.spyOn(controller.getPassphraseService, "getPassphrase");
32
+ jest.spyOn(controller.configureMetadataSettingsService, "enableEncryptedMetadataForExistingInstance").mockImplementation(() => {});
33
+
34
+ await controller.exec();
35
+
36
+ expect(controller.getPassphraseService.getPassphrase).toHaveBeenCalledTimes(1);
37
+ expect(controller.configureMetadataSettingsService.enableEncryptedMetadataForExistingInstance).toHaveBeenCalledTimes(1);
38
+ expect(controller.configureMetadataSettingsService.enableEncryptedMetadataForExistingInstance).toHaveBeenCalledWith(passphrase);
39
+ });
40
+
41
+ it("should not intercept unexpected error if something goes wrong when enabling the metadata encryption", async() => {
42
+ expect.assertions(1);
43
+
44
+ const passphrase = "ada@passbolt.com";
45
+ await PassphraseStorageService.set(passphrase);
46
+ const account = new AccountEntity(defaultAccountDto());
47
+ const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
48
+ const controller = new EnableEncryptedMetadataForExistingInstanceController(null, null, apiClientOptions, account);
49
+ jest.spyOn(controller.configureMetadataSettingsService, "enableEncryptedMetadataForExistingInstance").mockImplementation(() => { throw new Error("Something went wrong!"); });
50
+
51
+ await expect(() => controller.exec()).rejects.toThrowError("Something went wrong!");
52
+ });
53
+ });
54
+ });
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 5.4.0
13
+ */
14
+ import ConfigureMetadataSettingsService from "../../service/metadata/configureMetadataSettingsService";
15
+ import GetPassphraseService from "../../service/passphrase/getPassphraseService";
16
+
17
+ export default class EnableMetadataSetupSettingsController {
18
+ /**
19
+ * @constructor
20
+ * @param {Worker} worker
21
+ * @param {string} requestId
22
+ * @param {ApiClientOptions} apiClientOptions the api client options
23
+ * @param {AccountEntity} account the account associated to the worker
24
+ */
25
+ constructor(worker, requestId, apiClientOptions, account) {
26
+ this.worker = worker;
27
+ this.requestId = requestId;
28
+ this.configureMetadataSettingsService = new ConfigureMetadataSettingsService(account, apiClientOptions);
29
+ this.getPassphraseService = new GetPassphraseService(account);
30
+ }
31
+
32
+ /**
33
+ * Controller executor.
34
+ * @returns {Promise<void>}
35
+ */
36
+ async _exec() {
37
+ try {
38
+ const result = await this.exec();
39
+ this.worker.port.emit(this.requestId, 'SUCCESS', result);
40
+ } catch (error) {
41
+ console.error(error);
42
+ this.worker.port.emit(this.requestId, 'ERROR', error);
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Run the process to enable metadata encryption
48
+ * @returns {Promise<void>}
49
+ */
50
+ async exec() {
51
+ const passphrase = await this.getPassphraseService.getFromStorageOrFail();
52
+ return await this.configureMetadataSettingsService.enableEncryptedMetadataForNewInstance(passphrase);
53
+ }
54
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 5.4.0
13
+ */
14
+ import AccountEntity from "../../model/entity/account/accountEntity";
15
+ import {defaultAccountDto} from "../../model/entity/account/accountEntity.test.data";
16
+ import BuildApiClientOptionsService from "../../service/account/buildApiClientOptionsService";
17
+ import PassphraseStorageService from "../../service/session_storage/passphraseStorageService";
18
+ import EnableMetadataSetupSettingsController from "./enableMetadataSetupSettingsController";
19
+
20
+ describe("EnableMetadataSetupSettingsController", () => {
21
+ describe("::exec", () => {
22
+ it("should call for the orchestrator to enable metadata", async() => {
23
+ expect.assertions(3);
24
+
25
+ const passphrase = "ada@passbolt.com";
26
+ await PassphraseStorageService.set(passphrase);
27
+
28
+ const account = new AccountEntity(defaultAccountDto());
29
+ const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
30
+ const controller = new EnableMetadataSetupSettingsController(null, null, apiClientOptions, account);
31
+ jest.spyOn(controller.getPassphraseService, "getFromStorageOrFail");
32
+ jest.spyOn(controller.configureMetadataSettingsService, "enableEncryptedMetadataForNewInstance").mockImplementation(() => {});
33
+
34
+ await controller.exec();
35
+
36
+ expect(controller.getPassphraseService.getFromStorageOrFail).toHaveBeenCalledTimes(1);
37
+ expect(controller.configureMetadataSettingsService.enableEncryptedMetadataForNewInstance).toHaveBeenCalledTimes(1);
38
+ expect(controller.configureMetadataSettingsService.enableEncryptedMetadataForNewInstance).toHaveBeenCalledWith(passphrase);
39
+ });
40
+
41
+ it("should throw an error if the passphrase is not available in the session storage", async() => {
42
+ expect.assertions(1);
43
+
44
+ const account = new AccountEntity(defaultAccountDto());
45
+ const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
46
+ const controller = new EnableMetadataSetupSettingsController(null, null, apiClientOptions, account);
47
+
48
+ await expect(() => controller.exec()).rejects.toThrowError("No passphrase found in the session storage.");
49
+ });
50
+
51
+ it("should not intercept unexpected error if something goes wrong when enabling the metadata encryption", async() => {
52
+ expect.assertions(1);
53
+
54
+ const passphrase = "ada@passbolt.com";
55
+ await PassphraseStorageService.set(passphrase);
56
+ const account = new AccountEntity(defaultAccountDto());
57
+ const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
58
+ const controller = new EnableMetadataSetupSettingsController(null, null, apiClientOptions, account);
59
+ jest.spyOn(controller.configureMetadataSettingsService, "enableEncryptedMetadataForNewInstance").mockImplementation(() => { throw new Error("Something went wrong!"); });
60
+
61
+ await expect(() => controller.exec()).rejects.toThrowError("Something went wrong!");
62
+ });
63
+ });
64
+ });
@@ -20,12 +20,11 @@ class FindAllNonDeletedMetadataKeysController {
20
20
  * @param {Worker} worker
21
21
  * @param {string} requestId
22
22
  * @param {ApiClientOptions} apiClientOptions the api client options
23
- * @param {AccountEntity} account the user account
24
23
  */
25
- constructor(worker, requestId, apiClientOptions, account) {
24
+ constructor(worker, requestId, apiClientOptions) {
26
25
  this.worker = worker;
27
26
  this.requestId = requestId;
28
- this.findMetadataKeysService = new FindMetadataKeysService(apiClientOptions, account);
27
+ this.findMetadataKeysService = new FindMetadataKeysService(apiClientOptions);
29
28
  }
30
29
 
31
30
  /**
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 5.4.0
13
+ */
14
+ import FindMetadataGettingStartedSettingsService from "passbolt-styleguide/src/shared/services/metadata/findMetadataGettingStartedSettingsService";
15
+
16
+ export default class FindMetadataGettingStartedSettingsController {
17
+ /**
18
+ * @constructor
19
+ * @param {Worker} worker
20
+ * @param {string} requestId
21
+ * @param {ApiClientOptions} apiClientOptions the api client options
22
+ */
23
+ constructor(worker, requestId, apiClientOptions) {
24
+ this.worker = worker;
25
+ this.requestId = requestId;
26
+ this.findMetadataGettingStartedSettingsService = new FindMetadataGettingStartedSettingsService(apiClientOptions);
27
+ }
28
+
29
+ /**
30
+ * Controller executor.
31
+ * @returns {Promise<void>}
32
+ */
33
+ async _exec() {
34
+ try {
35
+ const result = await this.exec();
36
+ this.worker.port.emit(this.requestId, 'SUCCESS', result);
37
+ } catch (error) {
38
+ console.error(error);
39
+ this.worker.port.emit(this.requestId, 'ERROR', error);
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Find the metadata getting started settings.
45
+ * @returns {Promise<MetadataGettingStartedSettingsEntity>}
46
+ */
47
+ async exec() {
48
+ return await this.findMetadataGettingStartedSettingsService.findGettingStartedSettings();
49
+ }
50
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 5.4.0
13
+ */
14
+ import FindMetadataGettingStartedSettingsController from "./findMetadataGettingStartedSettingsController";
15
+ import {defaultApiClientOptions} from "passbolt-styleguide/src/shared/lib/apiClient/apiClientOptions.test.data";
16
+ import MetadataGettingStartedSettingsEntity from "passbolt-styleguide/src/shared/models/entity/metadata/metadataGettingStartedSettingsEntity";
17
+ import {enableMetadataGettingStartedSettingsDto} from "passbolt-styleguide/src/shared/models/entity/metadata/metadataGettingStartedSettingsEntity.test.data";
18
+
19
+ describe("FindMetadataGettingStartedSettingsController", () => {
20
+ describe("::exec", () => {
21
+ it("find metadata keys settings and update session storage.", async() => {
22
+ expect.assertions(1);
23
+
24
+ const expectedResult = new MetadataGettingStartedSettingsEntity(enableMetadataGettingStartedSettingsDto());
25
+ const controller = new FindMetadataGettingStartedSettingsController(null, null, defaultApiClientOptions());
26
+ jest.spyOn(controller.findMetadataGettingStartedSettingsService, "findGettingStartedSettings").mockImplementation(() => expectedResult);
27
+
28
+ const result = await controller.exec();
29
+
30
+ expect(result).toStrictEqual(expectedResult);
31
+ });
32
+ });
33
+ });
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 5.4.0
13
+ */
14
+ import FindMetadataSetupSettingsService from "../../service/metadata/findMetadataSetupSettingsService";
15
+
16
+ export default class FindMetadataSetupSettingsController {
17
+ /**
18
+ * @constructor
19
+ * @param {Worker} worker
20
+ * @param {string} requestId
21
+ * @param {ApiClientOptions} apiClientOptions the api client options
22
+ */
23
+ constructor(worker, requestId, apiClientOptions) {
24
+ this.worker = worker;
25
+ this.requestId = requestId;
26
+ this.findMetadataSetupSettingsService = new FindMetadataSetupSettingsService(apiClientOptions);
27
+ }
28
+
29
+ /**
30
+ * Controller executor.
31
+ * @returns {Promise<void>}
32
+ */
33
+ async _exec() {
34
+ try {
35
+ const result = await this.exec();
36
+ this.worker.port.emit(this.requestId, 'SUCCESS', result);
37
+ } catch (error) {
38
+ console.error(error);
39
+ this.worker.port.emit(this.requestId, 'ERROR', error);
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Find the metadata keys settings entity and update the session storage.
45
+ * @returns {Promise<MetadataSetupSettingsEntity>}
46
+ */
47
+ async exec() {
48
+ return await this.findMetadataSetupSettingsService.findSetupSettings();
49
+ }
50
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 5.4.0
13
+ */
14
+ import FindMetadataSetupSettingsController from "./findMetadataSetupSettingsController";
15
+ import {defaultApiClientOptions} from "passbolt-styleguide/src/shared/lib/apiClient/apiClientOptions.test.data";
16
+ import MetadataSetupSettingsEntity from "passbolt-styleguide/src/shared/models/entity/metadata/metadataSetupSettingsEntity";
17
+ import {enableMetadataSetupSettingsDto} from "passbolt-styleguide/src/shared/models/entity/metadata/metadataSetupSettingsEntity.test.data";
18
+
19
+ describe("FindMetadataSetupSettingsController", () => {
20
+ describe("::exec", () => {
21
+ it("find metadata keys settings and update session storage.", async() => {
22
+ expect.assertions(1);
23
+
24
+ const expectedResult = new MetadataSetupSettingsEntity(enableMetadataSetupSettingsDto());
25
+ const controller = new FindMetadataSetupSettingsController(null, null, defaultApiClientOptions());
26
+ jest.spyOn(controller.findMetadataSetupSettingsService, "findSetupSettings").mockImplementation(() => expectedResult);
27
+
28
+ const result = await controller.exec();
29
+
30
+ expect(result).toStrictEqual(expectedResult);
31
+ });
32
+
33
+ it("should not intercept unexpected error.", async() => {
34
+ expect.assertions(1);
35
+
36
+ const controller = new FindMetadataSetupSettingsController(null, null, defaultApiClientOptions());
37
+ jest.spyOn(controller.findMetadataSetupSettingsService, "findSetupSettings").mockImplementation(() => { throw new Error("Something went wrong!"); });
38
+
39
+ await expect(() => controller.exec()).rejects.toThrowError();
40
+ });
41
+ });
42
+ });
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 5.4.0
13
+ */
14
+ import ConfigureMetadataSettingsService from "../../service/metadata/configureMetadataSettingsService";
15
+
16
+ export default class KeepCleartextMetadataForExistingInstanceController {
17
+ /**
18
+ * @constructor
19
+ * @param {Worker} worker
20
+ * @param {string} requestId
21
+ * @param {ApiClientOptions} apiClientOptions the api client options
22
+ * @param {AccountEntity} account the account associated to the worker
23
+ */
24
+ constructor(worker, requestId, apiClientOptions, account) {
25
+ this.worker = worker;
26
+ this.requestId = requestId;
27
+ this.configureMetadataSettingsService = new ConfigureMetadataSettingsService(account, apiClientOptions);
28
+ }
29
+
30
+ /**
31
+ * Controller executor.
32
+ * @returns {Promise<void>}
33
+ */
34
+ async _exec() {
35
+ try {
36
+ const result = await this.exec();
37
+ this.worker.port.emit(this.requestId, 'SUCCESS', result);
38
+ } catch (error) {
39
+ console.error(error);
40
+ this.worker.port.emit(this.requestId, 'ERROR', error);
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Run the process to keep legacy metadata in cleartext
46
+ * @returns {Promise<void>}
47
+ */
48
+ async exec() {
49
+ return await this.configureMetadataSettingsService.keepCleartextMetadataForExistingInstance();
50
+ }
51
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 5.4.0
13
+ */
14
+ import AccountEntity from "../../model/entity/account/accountEntity";
15
+ import {defaultAccountDto} from "../../model/entity/account/accountEntity.test.data";
16
+ import BuildApiClientOptionsService from "../../service/account/buildApiClientOptionsService";
17
+ import KeepCleartextMetadataForExistingInstanceController from "./keepCleartextMetadataForExistingInstanceController";
18
+
19
+ describe("KeepCleartextMetadataForExistingInstanceController", () => {
20
+ describe("::exec", () => {
21
+ it("should call for the orchestrator not to enable metadata encryption", async() => {
22
+ expect.assertions(2);
23
+
24
+ const account = new AccountEntity(defaultAccountDto());
25
+ const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
26
+ const controller = new KeepCleartextMetadataForExistingInstanceController(null, null, apiClientOptions, account);
27
+
28
+ jest.spyOn(controller.configureMetadataSettingsService, "keepCleartextMetadataForExistingInstance").mockImplementation(() => {});
29
+
30
+ await controller.exec();
31
+
32
+ expect(controller.configureMetadataSettingsService.keepCleartextMetadataForExistingInstance).toHaveBeenCalledTimes(1);
33
+ expect(controller.configureMetadataSettingsService.keepCleartextMetadataForExistingInstance).toHaveBeenCalledWith();
34
+ });
35
+
36
+ it("should not intercept unexpected error if something goes wrong when enabling the metadata encryption", async() => {
37
+ expect.assertions(1);
38
+
39
+ const account = new AccountEntity(defaultAccountDto());
40
+ const apiClientOptions = BuildApiClientOptionsService.buildFromAccount(account);
41
+ const controller = new KeepCleartextMetadataForExistingInstanceController(null, null, apiClientOptions, account);
42
+ jest.spyOn(controller.configureMetadataSettingsService, "keepCleartextMetadataForExistingInstance").mockImplementation(() => { throw new Error("Something went wrong!"); });
43
+
44
+ await expect(() => controller.exec()).rejects.toThrowError("Something went wrong!");
45
+ });
46
+ });
47
+ });