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
@@ -79,7 +79,7 @@ class ImportResourcesService {
79
79
  const resourceToImportDto = importResourcesFile.importResources.toResourceCollectionImportDto();
80
80
  const resourcesCollection = new ResourcesCollection(resourceToImportDto);
81
81
  const clearTextMetadataResourcesCollection = new ResourcesCollection(resourceToImportDto);
82
- await this.encryptMetadataService.encryptAllFromForeignModels(resourcesCollection, passphrase);
82
+ await this.encryptMetadata(resourcesCollection, passphrase);
83
83
  await this.bulkImportResources(importResourcesFile, resourcesCollection, clearTextMetadataResourcesCollection);
84
84
  importResourcesFile.mustTag && await this.bulkTagResources(importResourcesFile);
85
85
  await this.progressService.finishStep(null, true);
@@ -101,10 +101,24 @@ class ImportResourcesService {
101
101
  const progressGoal = 1 // Initialization
102
102
  + (importResourcesFile.mustImportFolders ? importResourcesFile.importFolders.items.length : 0) // #folders create API calls
103
103
  + importResourcesFile.importResources.items.length * 2 // #resource to encrypt + #resource create API calls
104
+ + 1 // #resource metadata encryption
104
105
  + (importResourcesFile.mustTag ? importResourcesFile.importResources.items.length : 0); // #resources tag API calls
105
106
  this.progressService.updateGoals(progressGoal);
106
107
  }
107
108
 
109
+
110
+ /**
111
+ * Encrypts the metadata of resources in a collection using the provided passphrase.
112
+ *
113
+ * @param {ResourcesCollection} resourcesCollection - The collection of resources to be encrypted.
114
+ * @param {string} passphrase - The passphrase used for encryption.
115
+ * @returns {Promise<void>} A promise that resolves when the encryption process is complete.
116
+ */
117
+ async encryptMetadata(resourcesCollection, passphrase) {
118
+ await this.progressService.finishStep(i18n.t('Encrypting {{total}} metadata', {total: resourcesCollection.items.length}));
119
+ await this.encryptMetadataService.encryptAllFromForeignModels(resourcesCollection, passphrase);
120
+ }
121
+
108
122
  /**
109
123
  * Encrypt the secrets
110
124
  * @param {ImportResourcesFileEntity} importResourcesFile The import object
@@ -115,14 +129,14 @@ class ImportResourcesService {
115
129
  */
116
130
  async encryptSecrets(importResourcesFile, userId, privateKey) {
117
131
  let i = 0;
132
+ const userPublicArmoredKey = this.keyring.findPublic(userId).armoredKey;
133
+ const userPublicKey = await OpenpgpAssertion.readKeyOrFail(userPublicArmoredKey);
118
134
  for (const importResourcesEntity of importResourcesFile.importResources) {
119
135
  i++;
120
136
  await this.progressService.finishStep(i18n.t('Encrypting {{counter}}/{{total}}', {counter: i, total: importResourcesFile.importResources.items.length}));
121
137
  // @todo The secret DTO could be carried by the external resource entity. It can be done when we arrange the external resource entity schema validation.
122
138
  const secretDto = this.buildSecretDto(importResourcesEntity);
123
139
  const serializedPlaintextDto = await this.resourceModel.serializePlaintextDto(importResourcesEntity.resourceTypeId, secretDto);
124
- const userPublicArmoredKey = this.keyring.findPublic(userId).armoredKey;
125
- const userPublicKey = await OpenpgpAssertion.readKeyOrFail(userPublicArmoredKey);
126
140
  const data = await EncryptMessageService.encrypt(serializedPlaintextDto, userPublicKey, [privateKey]);
127
141
  const secret = new SecretEntity({data: data});
128
142
  importResourcesEntity.secrets = new ResourceSecretsCollection([secret]);
@@ -147,11 +161,28 @@ class ImportResourcesService {
147
161
  importResourcesFile.secretClear = "";
148
162
  importResourcesFile.description = "";
149
163
  importResourcesFile.totp = null;
164
+ if (importResourcesFile.customFields) {
165
+ dto.custom_fields = this.buildCustomFieldSecretDto(importResourcesFile);
166
+ }
150
167
  return dto;
151
168
  }
152
169
  return importResourcesFile.secretClear;
153
170
  }
154
171
 
172
+ /**
173
+ * Build the custom field secret DTO.
174
+ * @param {ExternalResourceEntity} importResourcesFile The resource to import
175
+ * @returns {Object}
176
+ * @private
177
+ */
178
+ buildCustomFieldSecretDto(importResourcesFile) {
179
+ const customFieldsDto = [];
180
+ importResourcesFile.customFields?.items?.forEach(customField => {
181
+ customFieldsDto.push(customField.toSecretDto());
182
+ });
183
+ return customFieldsDto;
184
+ }
185
+
155
186
  /**
156
187
  * Import the folders.
157
188
  * @param {ImportResourcesFileEntity} importResourcesFile The import object
@@ -56,6 +56,8 @@ import each from "jest-each";
56
56
  import GetOrFindMetadataSettingsService from "../../metadata/getOrFindMetadataSettingsService";
57
57
  import ResourcesCollection from "../../../model/entity/resource/resourcesCollection";
58
58
  import DecryptMetadataService from "../../metadata/decryptMetadataService";
59
+ import CustomFieldsCollection from "passbolt-styleguide/src/shared/models/entity/customField/customFieldsCollection";
60
+ import {defaultCustomFieldsCollection} from "passbolt-styleguide/src/shared/models/entity/customField/customFieldsCollection.test.data";
59
61
 
60
62
  jest.mock("../../../service/progress/progressService");
61
63
 
@@ -84,7 +86,6 @@ describe("ImportResourcesService", () => {
84
86
  return DecryptMessageService.decrypt(secretMessage, decryptedPrivateKey, [signingKey]);
85
87
  };
86
88
 
87
-
88
89
  beforeEach(async() => {
89
90
  worker = {
90
91
  port: {
@@ -154,7 +155,7 @@ describe("ImportResourcesService", () => {
154
155
  name: 'Password 1',
155
156
  resource_type_id: expectedResourceType.id,
156
157
  folder_parent_path: "import-ref",
157
- uri: "https://url1.com",
158
+ uris: ["https://url1.com"],
158
159
  username: "Username 1",
159
160
  }));
160
161
 
@@ -163,7 +164,7 @@ describe("ImportResourcesService", () => {
163
164
  name: 'Password 2',
164
165
  resource_type_id: expectedResourceType.id,
165
166
  folder_parent_path: "import-ref",
166
- uri: "https://url1.com",
167
+ uris: ["https://url1.com"],
167
168
  username: "Username 2",
168
169
  folder_parent_path_expected: "/Folder",
169
170
  }));
@@ -191,7 +192,7 @@ describe("ImportResourcesService", () => {
191
192
 
192
193
  const secret1 = await decryptSecret(importResourceFileCSV.importResources.items[0].secrets.items[0].data, pgpKeys.ada.private, pgpKeys.ada.passphrase);
193
194
 
194
- expect(secret1).toEqual("{\"password\":\"Secret 1\",\"description\":\"Description 1\",\"totp\":{\"secret_key\":\"THISISASECRET\",\"period\":30,\"digits\":6,\"algorithm\":\"SHA1\"}}");
195
+ expect(secret1).toEqual("{\"password\":\"Password 1\",\"description\":\"Description 1\",\"totp\":{\"secret_key\":\"THISISASECRET\",\"period\":30,\"digits\":6,\"algorithm\":\"SHA1\"}}");
195
196
 
196
197
  //Remove encrypted secrets checked previously
197
198
  delete importedResources[0]._secrets;
@@ -201,7 +202,7 @@ describe("ImportResourcesService", () => {
201
202
  name: 'Password 1',
202
203
  resource_type_id: expectedResourceType.id,
203
204
  folder_parent_path: "import-ref",
204
- uri: "https://url1.com",
205
+ uris: ["https://url1.com"],
205
206
  username: "Username 1",
206
207
  folder_parent_path_expected: "/Folder 1",
207
208
  }));
@@ -237,7 +238,7 @@ describe("ImportResourcesService", () => {
237
238
  name: 'Password 1',
238
239
  resource_type_id: expectedResourceType.id,
239
240
  folder_parent_path: "import-ref",
240
- uri: "https://url1.com",
241
+ uris: ["https://url1.com"],
241
242
  username: "Username 1",
242
243
  folder_parent_path_expected: "",
243
244
  }));
@@ -263,7 +264,7 @@ describe("ImportResourcesService", () => {
263
264
 
264
265
  const secret1 = await decryptSecret(importResourceFileCSV.importResources.items[0].secrets.items[0].data, pgpKeys.ada.private, pgpKeys.ada.passphrase);
265
266
 
266
- expect(secret1).toEqual("{\"password\":\"Secret 1\",\"description\":\"Description 1\",\"totp\":{\"secret_key\":\"THISISASECRET\",\"period\":30,\"digits\":6,\"algorithm\":\"SHA1\"}}");
267
+ expect(secret1).toEqual("{\"password\":\"Password 1\",\"description\":\"Description 1\",\"totp\":{\"secret_key\":\"THISISASECRET\",\"period\":30,\"digits\":6,\"algorithm\":\"SHA1\"}}");
267
268
 
268
269
  //Remove encrypted secrets checked previously
269
270
  delete importedResources[0]._secrets;
@@ -273,7 +274,7 @@ describe("ImportResourcesService", () => {
273
274
  name: 'Password 1',
274
275
  resource_type_id: expectedResourceType.id,
275
276
  folder_parent_path: "import-ref/Folder 1",
276
- uri: "https://url1.com",
277
+ uris: ["https://url1.com"],
277
278
  username: "Username 1",
278
279
  folder_parent_path_expected: "",
279
280
  }));
@@ -382,7 +383,7 @@ describe("ImportResourcesService", () => {
382
383
  });
383
384
 
384
385
  it("Should inform the user about the progress", async() => {
385
- expect.assertions(8);
386
+ expect.assertions(9);
386
387
 
387
388
  jest.spyOn(importResourcesService.progressService, "updateGoals");
388
389
  jest.spyOn(importResourcesService.progressService, "finishStep");
@@ -391,10 +392,11 @@ describe("ImportResourcesService", () => {
391
392
  await importResourcesService.importFile(importResourceFileCSV, passphrase);
392
393
 
393
394
  expect(importResourcesService.progressService.updateGoals).toHaveBeenCalledTimes(1);
394
- expect(importResourcesService.progressService.updateGoals).toHaveBeenCalledWith(5);
395
- expect(importResourcesService.progressService.finishStep).toHaveBeenCalledTimes(5);
395
+ expect(importResourcesService.progressService.updateGoals).toHaveBeenCalledWith(6);
396
+ expect(importResourcesService.progressService.finishStep).toHaveBeenCalledTimes(6);
396
397
  expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith("Encrypting 1/2");
397
398
  expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith("Encrypting 2/2");
399
+ expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith("Encrypting 2 metadata");
398
400
  expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith("Importing passwords 1/2");
399
401
  expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith("Importing passwords 2/2");
400
402
  expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith(null, true);
@@ -434,7 +436,7 @@ describe("ImportResourcesService", () => {
434
436
  });
435
437
 
436
438
  it("Should inform the user about the progress - <folder>", async() => {
437
- expect.assertions(8);
439
+ expect.assertions(9);
438
440
 
439
441
  jest.spyOn(importResourcesService.progressService, "updateGoals");
440
442
 
@@ -447,9 +449,10 @@ describe("ImportResourcesService", () => {
447
449
  await importResourcesService.parseFile(importResourceFileCSV);
448
450
  await importResourcesService.importFile(importResourceFileCSV, passphrase);
449
451
 
450
- expect(importResourcesService.progressService.finishStep).toHaveBeenCalledTimes(7);
452
+ expect(importResourcesService.progressService.finishStep).toHaveBeenCalledTimes(8);
451
453
  expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith("Encrypting 1/2");
452
454
  expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith("Encrypting 2/2");
455
+ expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith("Encrypting 2 metadata");
453
456
  expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith("Importing passwords 1/2");
454
457
  expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith("Importing passwords 2/2");
455
458
  expect(importResourcesService.progressService.finishStep).toHaveBeenCalledWith("Importing folders 1/2");
@@ -538,4 +541,43 @@ describe("ImportResourcesService", () => {
538
541
  expect(result.importFolders.items[0].name).toEqual("import-ref");
539
542
  });
540
543
  });
544
+
545
+ describe("::buildCustomFieldSecretDto", () => {
546
+ it("Should build the custom field secret DTO", () => {
547
+ expect.assertions(1);
548
+
549
+ const customFieldsDto = defaultCustomFieldsCollection();
550
+ const importResourcesFile = {
551
+ customFields: new CustomFieldsCollection(customFieldsDto)
552
+ };
553
+ const result = importResourcesService.buildCustomFieldSecretDto(importResourcesFile);
554
+
555
+ expect(result).toEqual([
556
+ {id: customFieldsDto[0].id, type: "text", secret_value: customFieldsDto[0].secret_value},
557
+ {id: customFieldsDto[1].id, type: "text", secret_value: customFieldsDto[1].secret_value}
558
+ ]);
559
+ });
560
+
561
+ it("Should return an empty array if no custom fields", () => {
562
+ expect.assertions(1);
563
+
564
+ const importResourcesFile = {
565
+ customFields: null
566
+ };
567
+ const result = importResourcesService.buildCustomFieldSecretDto(importResourcesFile);
568
+
569
+ expect(result).toEqual([]);
570
+ });
571
+
572
+ it("Should handle empty custom fields collection", () => {
573
+ expect.assertions(1);
574
+
575
+ const importResourcesFile = {
576
+ customFields: new CustomFieldsCollection([])
577
+ };
578
+ const result = importResourcesService.buildCustomFieldSecretDto(importResourcesFile);
579
+
580
+ expect(result).toEqual([]);
581
+ });
582
+ });
541
583
  });
@@ -13,7 +13,6 @@
13
13
  */
14
14
  import {OpenpgpAssertion} from "../../utils/openpgp/openpgpAssertions";
15
15
  import PassphraseStorageService from '../session_storage/passphraseStorageService';
16
- import UserPassphraseRequiredError from "passbolt-styleguide/src/shared/error/userPassphraseRequiredError";
17
16
  import SessionKeysBundleEntity from "passbolt-styleguide/src/shared/models/entity/sessionKey/sessionKeysBundleEntity";
18
17
  import SessionKeysBundleDataEntity from "passbolt-styleguide/src/shared/models/entity/sessionKey/sessionKeysBundleDataEntity";
19
18
  import SessionKeysBundlesCollection from "passbolt-styleguide/src/shared/models/entity/sessionKey/sessionKeysBundlesCollection";
@@ -49,7 +48,7 @@ class DecryptSessionKeysBundlesService {
49
48
  }
50
49
  const message = await OpenpgpAssertion.readMessageOrFail(sessionKeysBundleEntity.data);
51
50
 
52
- passphrase = passphrase || await this.getPassphraseFromLocalStorageOrFail();
51
+ passphrase = passphrase || await PassphraseStorageService.getOrFail();
53
52
 
54
53
  const userDecryptedPrivateArmoredKey = await DecryptPrivateKeyService.decryptArmoredKey(this.account.userPrivateArmoredKey, passphrase);
55
54
  const decryptedMessage = await DecryptMessageService.decrypt(message, userDecryptedPrivateArmoredKey);
@@ -73,7 +72,7 @@ class DecryptSessionKeysBundlesService {
73
72
  async decryptAll(sessionKeysBundlesCollection, passphrase = null) {
74
73
  assertType(sessionKeysBundlesCollection, SessionKeysBundlesCollection, "The given collection is not of the type SessionKeysBundlesCollection");
75
74
 
76
- passphrase = passphrase || await this.getPassphraseFromLocalStorageOrFail();
75
+ passphrase = passphrase || await PassphraseStorageService.getOrFail();
77
76
 
78
77
  const items = sessionKeysBundlesCollection.items;
79
78
  for (let i = 0; i < items.length; i++) {
@@ -81,21 +80,6 @@ class DecryptSessionKeysBundlesService {
81
80
  await this.decryptOne(sessionKeysBundleEntity, passphrase);
82
81
  }
83
82
  }
84
-
85
- /**
86
- * Retrieve the user passphrase from the local storage or fail.
87
- *
88
- * @returns {Promise<string>}
89
- * @throws {UserPassphraseRequiredError} if the `passphrase` is not set and cannot be retrieved.
90
- * @private
91
- */
92
- async getPassphraseFromLocalStorageOrFail() {
93
- const passphrase = await PassphraseStorageService.get();
94
- if (!passphrase) {
95
- throw new UserPassphraseRequiredError();
96
- }
97
- return passphrase;
98
- }
99
83
  }
100
84
 
101
85
  export default DecryptSessionKeysBundlesService;
@@ -12,7 +12,6 @@
12
12
  * @since 4.10.1
13
13
  */
14
14
  import PassphraseStorageService from '../session_storage/passphraseStorageService';
15
- import UserPassphraseRequiredError from "passbolt-styleguide/src/shared/error/userPassphraseRequiredError";
16
15
  import SessionKeysBundleEntity from "passbolt-styleguide/src/shared/models/entity/sessionKey/sessionKeysBundleEntity";
17
16
  import {assertString, assertType} from '../../utils/assertions';
18
17
  import DecryptPrivateKeyService from '../crypto/decryptPrivateKeyService';
@@ -45,28 +44,13 @@ class EncryptSessionKeysBundlesService {
45
44
  throw new TypeError("The session key bundle should be decrypted.");
46
45
  }
47
46
 
48
- passphrase = passphrase || await this.getPassphraseFromSessionStorageOrFail();
47
+ passphrase = passphrase || await PassphraseStorageService.getOrFail();
49
48
 
50
49
  const userDecryptedPrivateKey = await DecryptPrivateKeyService.decryptArmoredKey(this.account.userPrivateArmoredKey, passphrase);
51
50
  const userPublicKey = await OpenpgpAssertion.readKeyOrFail(this.account.userPublicArmoredKey);
52
51
  const message = JSON.stringify(sessionKeysBundle.data.toDto());
53
52
  sessionKeysBundle.data = await EncryptMessageService.encrypt(message, userPublicKey, [userDecryptedPrivateKey]);
54
53
  }
55
-
56
- /**
57
- * Retrieve the user passphrase from the session storage or fail.
58
- *
59
- * @returns {Promise<string>}
60
- * @throws {UserPassphraseRequiredError} if the `passphrase` is not set and cannot be retrieved.
61
- * @private
62
- */
63
- async getPassphraseFromSessionStorageOrFail() {
64
- const passphrase = await PassphraseStorageService.get();
65
- if (!passphrase) {
66
- throw new UserPassphraseRequiredError();
67
- }
68
- return passphrase;
69
- }
70
54
  }
71
55
 
72
56
  export default EncryptSessionKeysBundlesService;
@@ -0,0 +1,130 @@
1
+ {
2
+ "Adding tag...": "Přidávám tag...",
3
+ "An ECC key should be based on a supported curve.": "Klíč ECC by měl být založen na podporované křivce.",
4
+ "An internal error occurred. The server response could not be parsed. Please contact your administrator.": "Došlo k interní chybě. Odpověď serveru nelze zpracovat. Prosím obraťte se na správce systému.",
5
+ "An RSA key should have a length of {{size}} bits minimum.": "RSA klíč by měl mít délku nejméně {{size}} bitů.",
6
+ "Autofill failed. Could not find the active tab.": "Automatické vyplňování se nezdařilo. Nelze najít aktivní kartu.",
7
+ "Calculate permissions": "Vypočítat oprávnění",
8
+ "Calculating changes for {{name}}": "Vypočítávání změn pro {{name}}",
9
+ "Calculating folders permissions changes": "Výpočet změn oprávnění složek",
10
+ "Calculating resources permissions changes": "Výpočet změn oprávnění zdrojů",
11
+ "Calculating secrets": "Výpočet tajných klíčů",
12
+ "Calculating secrets {{counter}}/{{total}}": "Výpočet tajných klíčů {{counter}}/{{total}}",
13
+ "Confirming share operation": "Potvrzení operace sdílení",
14
+ "Could not verify the server key.": "Nepodařilo se ověřit klíč serveru.",
15
+ "Creating folder...": "Vytváření složky...",
16
+ "Creating password": "Vytváření hesla",
17
+ "Decrypting ...": "Dešifrování...",
18
+ "Decrypting {{counter}}/{{total}}": "Dešifrování {{counter}}/{{total}}",
19
+ "Decrypting secrets": "Dešifrování tajných klíčů",
20
+ "Decrypting secrets {{counter}}/{{total}}": "Dešifrování tajných klíčů {{counter}}/{{total}}",
21
+ "Delete {{count}} resource(s)_one": "Delete one resource",
22
+ "Delete {{count}} resource(s)_other": "Delete {{count}} resources",
23
+ "Delete Resources": "Delete Resources",
24
+ "Deleting Resource(s)": "Deleting Resource(s)",
25
+ "Deleting resource(s) {{counter}}/{{total}}": "Deleting resource(s) {{counter}}/{{total}}",
26
+ "Done": "Hotovo",
27
+ "Done!": "Hotovo!",
28
+ "Encrypting {{counter}}/{{total}}": "Šifrování {{counter}}/{{total}}",
29
+ "Encrypting {{total}} metadata": "Encrypting {{total}} metadata",
30
+ "Encrypting Metadata": "Šifrování metadat",
31
+ "Encrypting secret": "Šifrování tajemství",
32
+ "Encrypting Secret": "Šifrování tajného klíče",
33
+ "Encrypting secrets": "Šifrování tajných klíčů",
34
+ "Expiry date will be updated on {{count}} resource._one": "Datum vypršení platnosti bude aktualizováno u {{count}} zdroje.",
35
+ "Expiry date will be updated on {{count}} resource._other": "Datum vypršení platnosti bude aktualizováno na {{count}} zdrojích.",
36
+ "Exporting ...": "Exportování ...",
37
+ "Fetching parent permissions": "Načítání nadřazených oprávnění",
38
+ "Folder {{name}} can not be moved.": "Složku {{name}} nelze přesunout.",
39
+ "Folder {{name}} is already in folder {{destination}}.": "Složka {{name}} je již ve složce {{destination}}.",
40
+ "Folder {{name}} is already in the root folder.": "Složka {{name}} je již v kořenovém adresáři.",
41
+ "Generate file": "Vygenerovat soubor",
42
+ "Importing ...": "Importování...",
43
+ "Importing folders {{importedCount}}/{{total}}": "Importování složek {{importedCount}}/{{total}}",
44
+ "Importing passwords {{importedCount}}/{{total}}": "Importování hesel {{importedCount}}/{{total}}",
45
+ "Inactive worker on the page.": "Neaktivní worker na stránce.",
46
+ "Initialize": "Inicializovat",
47
+ "Initializing": "Inicializace",
48
+ "Initializing ...": "Inicializace ...",
49
+ "Mark as expired ...": "Označit jako neplatný ...",
50
+ "MFA authentication is required.": "Je vyžadováno ověření pomocí MFA.",
51
+ "Migrating metadata": "Migrace metadat",
52
+ "Migrating resources metadata page {{number}}/{{totalPagesCount}}": "Migrace metadat stránek zdrojů {{number}}/{{totalPagesCount}}",
53
+ "Moving {{count}} resources_one": "Přesouvání jednoho záznamu",
54
+ "Moving {{count}} resources_other": "Přesouvání {{count}} záznamů",
55
+ "Moving {{name}}": "Přesouvání {{name}}",
56
+ "Moving folder": "Přesouvání složky",
57
+ "Moving resources": "Přesunování zdrojů",
58
+ "Preparing...": "Probíhá příprava...",
59
+ "Private key not found.": "Soukromý klíč nebyl nalezen.",
60
+ "Public key can't be found.": "Veřejný klíč nebyl nalezen.",
61
+ "Rekeying users' key": "Překlíčování uživatelova klíče",
62
+ "Retrieving all resources parent folders permissions": "Získávání všech oprávnění nadřazených složek zdrojů",
63
+ "Retrieving destination folder permissions": "Získávání oprávnění cílové složky",
64
+ "Retrieving folders permissions": "Získávání oprávnění složek",
65
+ "Retrieving resource types": "Získávání typů zdrojů",
66
+ "Retrieving resources permissions": "Získávání oprávnění zdrojů",
67
+ "Retrieving secrets": "Získávání tajných klíčů",
68
+ "Saving permissions...": "Ukládání oprávnění...",
69
+ "Saving resource": "Ukládání záznamu",
70
+ "Server internal error. Check with your administrator.": "Interní chyba serveru. Kontaktujte správce systému.",
71
+ "Share {{count}} resource_one": "Sdílení jednoho zdroje",
72
+ "Share {{count}} resource_other": "Sdílet {{count}} zdrojů",
73
+ "Sharing folder {{name}}": "Sdílení složky {{name}}",
74
+ "Sharing folders": "Sdílení složek",
75
+ "Sharing folders {{counter}}/{{total}}": "Sdílení složek {{counter}}/{{total}}",
76
+ "Sharing resources": "Sdílení zdrojů",
77
+ "Sharing resources {{counter}}/{{total}}": "Sdílení zdrojů {{counter}}/{{total}}",
78
+ "Start sharing": "Začít sdílet",
79
+ "Synchronizing keyring": "Synchronizace klíčenky",
80
+ "Synchronizing keys": "Synchronizace klíčů",
81
+ "Tagging passwords {{taggedCount}}/{{total}}": "Označování hesel {{taggedCount}}/{{total}}",
82
+ "The encryption key used to share metadata between users could not be verified and is considered untrusted.": "Šifrovací klíč použitý k sdílení metadat mezi uživateli nemohl být ověřen a je považován za nespolehlivý.",
83
+ "The external service is unavailable": "Externí služba není k dispozici",
84
+ "The external service raised an error": "Externí služba způsobila chybu",
85
+ "The folder cannot be moved inside itself.": "Složku nelze přesunout do sebe sama.",
86
+ "The key should be a valid openpgp armored key string.": "Klíč by měl být platný řetězec klíče openpgp.",
87
+ "The key should be a valid openpgp key.": "Klíč by měl být platný openpgp klíč.",
88
+ "The key should be a valid openpgp private key.": "Klíč by měl být platný openpgp soukromý klíč.",
89
+ "The key should be a valid openpgp public key.": "Klíč by měl být platný openpgp veřejný klíč.",
90
+ "The keys should be an array of valid decrypted openpgp private keys.": "Klíče by měly být pole platných dešifrovaných openpgp soukromých klíčů.",
91
+ "The keys should be an array of valid encrypted openpgp private keys.": "Klíče by měly být pole platných šifrovaných openpgp soukromých klíčů.",
92
+ "The keys should be an array of valid openpgp armored key strings.": "Klíče by měly být pole platných openpgp textových řetězců.",
93
+ "The keys should be an array of valid openpgp private keys.": "Klíče by měly být pole platných openpgp soukromých klíčů.",
94
+ "The keys should be an array of valid openpgp public keys.": "Klíče by měly být pole platných openpgp veřejných klíčů.",
95
+ "The keys should be an array.": "Klíče by měly být pole.",
96
+ "The message should be a valid openpgp clear text message.": "Zpráva by měla být platná, v clear textu a ve formátu OpenPGP.",
97
+ "The message should be a valid openpgp message.": "Zpráva by měla být platná openpgp zpráva.",
98
+ "The message should be decrypted.": "Zpráva by měla být dešifrována.",
99
+ "The message should be of type string.": "Zpráva by měla být typu textový řetězec.",
100
+ "The message should contain at least one session key.": "Zpráva by měla obsahovat alespoň jeden klíč relace.",
101
+ "The operation has been aborted to maintain security integrity.": "Operace byla přerušena k udržení integritu bezpečnosti.",
102
+ "The private key should be a valid openpgp key.": "Soukromý klíč by měl být platný openpgp klíč.",
103
+ "The private key should be decrypted.": "Soukromý klíč by měl být dešifrovaný.",
104
+ "The private key should be encrypted.": "Soukromý klíč by měl být zašifrovaný.",
105
+ "The private key should not be expired.": "Soukromý klíč by neměl mít vypršenou platnost.",
106
+ "The private key should not be revoked.": "Soukromý klíč by neměl být revokovaný.",
107
+ "The private key should not have an expiry date.": "Soukromý klíč by neměl mít datum vypršení platnosti.",
108
+ "The private key should use a supported algorithm: RSA, ECDSA OR EDDSA.": "Soukromý klíč by měl používat podporovaný algoritmus: RSA, ECDSA NEBO EDDSA.",
109
+ "The server key cannot be parsed.": "Serverový klíč nelze rozparsovat.",
110
+ "The server key has changed.": "Klíč serveru byl změněn.",
111
+ "The server key is expired.": "Platnost klíče serveru vypršela.",
112
+ "The service is unavailable": "Tato služba není dostupná",
113
+ "The verificationResult keyID should be a valid keyID Object.": "VerificationResult keyID by měl být platným objektem keyID.",
114
+ "The verificationResult signature should be a valid verified Promise<openpgp.Signature>.": "VerificationResult signature by měl být platnou ověřenou Promise<openpgp.Signature>.",
115
+ "The verificationResult verified should be a valid verified Promise<boolean>.": "VerificationResult verified by měl být platnou ověřenou Promise<boolean>.",
116
+ "This is not a valid passphrase": "Toto není platné heslo",
117
+ "This key does not match any account.": "Tento klíč se neshoduje s žádným účtem.",
118
+ "This key is already used by another user.": "Tento klíč již používá jiný uživatel.",
119
+ "Unable to retrieve the active tab info.": "Nepodařilo se načíst informace o aktivní kartě.",
120
+ "Updating folders local storage": "Aktualizace místního úložiště složek",
121
+ "Updating group": "Aktualizování skupiny",
122
+ "Updating group ...": "Aktualizování skupiny ...",
123
+ "Updating password": "Aktualizování hesla",
124
+ "Updating resource": "Aktualizuji zdroj",
125
+ "Updating resources local storage": "Aktualizace místního úložiště zdrojů",
126
+ "Updating resources metadata": "Aktualizace metadat zdrojů",
127
+ "Updating resources metadata {{counter}}/{{total}}": "Aktualizace metadat zdrojů {{counter}}/{{total}}",
128
+ "Updating users' key...": "Aktualizuji klíč uživatele...",
129
+ "You have already started the process on another tab.": "Tento proces jste již zahájili na jiné kartě."
130
+ }
@@ -18,9 +18,15 @@
18
18
  "Decrypting {{counter}}/{{total}}": "Entschlüsselung {{counter}}/{{total}}",
19
19
  "Decrypting secrets": "Geheimnisse werden entschlüsselt",
20
20
  "Decrypting secrets {{counter}}/{{total}}": "Geheimnisse werden entschlüsselt {{counter}}/{{total}}",
21
+ "Delete {{count}} resource(s)_one": "Delete one resource",
22
+ "Delete {{count}} resource(s)_other": "Delete {{count}} resources",
23
+ "Delete Resources": "Delete Resources",
24
+ "Deleting Resource(s)": "Deleting Resource(s)",
25
+ "Deleting resource(s) {{counter}}/{{total}}": "Deleting resource(s) {{counter}}/{{total}}",
21
26
  "Done": "Fertig",
22
27
  "Done!": "Fertig!",
23
28
  "Encrypting {{counter}}/{{total}}": "Verschlüsselung {{counter}}/{{total}}",
29
+ "Encrypting {{total}} metadata": "Encrypting {{total}} metadata",
24
30
  "Encrypting Metadata": "Metadaten werden verschlüsselt",
25
31
  "Encrypting secret": "Geheimnis wird verschlüsselt",
26
32
  "Encrypting Secret": "Geheimnis wird verschlüsselt",
@@ -73,7 +79,7 @@
73
79
  "Synchronizing keyring": "Schlüsselring wird synchronisiert",
74
80
  "Synchronizing keys": "Schlüssel werden synchronisiert",
75
81
  "Tagging passwords {{taggedCount}}/{{total}}": "Passwörter {{taggedCount}}/{{total}} werden markiert",
76
- "The encryption key used to share metadata between users could not be verified and is considered untrusted.": "The encryption key used to share metadata between users could not be verified and is considered untrusted.",
82
+ "The encryption key used to share metadata between users could not be verified and is considered untrusted.": "Der für den Austausch von Metadaten zwischen Benutzern verwendete Verschlüsselungsschlüssel konnte nicht überprüft werden und gilt als nicht vertrauenswürdig.",
77
83
  "The external service is unavailable": "Der externe Dienst ist nicht verfügbar",
78
84
  "The external service raised an error": "Der externe Dienst hat einen Fehler ausgelöst",
79
85
  "The folder cannot be moved inside itself.": "Der Ordner kann nicht in sich selbst verschoben werden.",
@@ -92,7 +98,7 @@
92
98
  "The message should be decrypted.": "Die Nachricht sollte entschlüsselt werden.",
93
99
  "The message should be of type string.": "Die Nachricht sollte vom Typ String sein.",
94
100
  "The message should contain at least one session key.": "Die Nachricht sollte mindestens einen Sitzungsschlüssel enthalten.",
95
- "The operation has been aborted to maintain security integrity.": "The operation has been aborted to maintain security integrity.",
101
+ "The operation has been aborted to maintain security integrity.": "Der Vorgang wurde abgebrochen, um die Sicherheitsintegrität zu wahren.",
96
102
  "The private key should be a valid openpgp key.": "Der private Schlüssel sollte ein gültiger OpenPGP Schlüssel sein.",
97
103
  "The private key should be decrypted.": "Der private Schlüssel sollte entschlüsselt werden.",
98
104
  "The private key should be encrypted.": "Der private Schlüssel sollte verschlüsselt werden.",
@@ -104,9 +110,9 @@
104
110
  "The server key has changed.": "Der Server-Schlüssel wurde geändert.",
105
111
  "The server key is expired.": "Der Server-Schlüssel ist abgelaufen.",
106
112
  "The service is unavailable": "Der Dienst ist nicht verfügbar",
107
- "The verificationResult keyID should be a valid keyID Object.": "The verificationResult keyID should be a valid keyID Object.",
108
- "The verificationResult signature should be a valid verified Promise<openpgp.Signature>.": "The verificationResult signature should be a valid verified Promise<openpgp.Signature>.",
109
- "The verificationResult verified should be a valid verified Promise<boolean>.": "The verificationResult verified should be a valid verified Promise<boolean>.",
113
+ "The verificationResult keyID should be a valid keyID Object.": "Die keyID des verificationResult sollte ein gültiges keyID-Objekt sein.",
114
+ "The verificationResult signature should be a valid verified Promise<openpgp.Signature>.": "Die verificationResult-Signatur sollte ein gültiges verifiziertes Promise<openpgp.Signature> sein.",
115
+ "The verificationResult verified should be a valid verified Promise<boolean>.": "Das verifizierte Ergebnis von verificationResult sollte ein gültiges verifiziertes Promise<boolean> sein.",
110
116
  "This is not a valid passphrase": "Dies ist kein gültiges Kennwort",
111
117
  "This key does not match any account.": "Dieser Schlüssel stimmt mit keinem Konto überein.",
112
118
  "This key is already used by another user.": "Dieser Schlüssel wird bereits von einem anderen Benutzer verwendet.",
@@ -18,9 +18,15 @@
18
18
  "Decrypting {{counter}}/{{total}}": "Decrypting {{counter}}/{{total}}",
19
19
  "Decrypting secrets": "Decrypting secrets",
20
20
  "Decrypting secrets {{counter}}/{{total}}": "Decrypting secrets {{counter}}/{{total}}",
21
+ "Delete {{count}} resource(s)_one": "Delete one resource",
22
+ "Delete {{count}} resource(s)_other": "Delete {{count}} resources",
23
+ "Delete Resources": "Delete Resources",
24
+ "Deleting Resource(s)": "Deleting Resource(s)",
25
+ "Deleting resource(s) {{counter}}/{{total}}": "Deleting resource(s) {{counter}}/{{total}}",
21
26
  "Done": "Done",
22
27
  "Done!": "Done!",
23
28
  "Encrypting {{counter}}/{{total}}": "Encrypting {{counter}}/{{total}}",
29
+ "Encrypting {{total}} metadata": "Encrypting {{total}} metadata",
24
30
  "Encrypting Metadata": "Encrypting Metadata",
25
31
  "Encrypting secret": "Encrypting secret",
26
32
  "Encrypting Secret": "Encrypting Secret",
@@ -18,9 +18,15 @@
18
18
  "Decrypting {{counter}}/{{total}}": "Desencriptando {{counter}}/{{total}}",
19
19
  "Decrypting secrets": "Descifrando secretos",
20
20
  "Decrypting secrets {{counter}}/{{total}}": "Descifrando secretos {{counter}}/{{total}}",
21
+ "Delete {{count}} resource(s)_one": "Eliminar un recurso",
22
+ "Delete {{count}} resource(s)_other": "Delete {{count}} resources",
23
+ "Delete Resources": "Delete Resources",
24
+ "Deleting Resource(s)": "Deleting Resource(s)",
25
+ "Deleting resource(s) {{counter}}/{{total}}": "Deleting resource(s) {{counter}}/{{total}}",
21
26
  "Done": "Hecho",
22
27
  "Done!": "Hecho!",
23
28
  "Encrypting {{counter}}/{{total}}": "Cifrando {{counter}}/{{total}}",
29
+ "Encrypting {{total}} metadata": "Encrypting {{total}} metadata",
24
30
  "Encrypting Metadata": "Cifrando metadatos",
25
31
  "Encrypting secret": "Cifrando secreto",
26
32
  "Encrypting Secret": "Cifrando secreto",
@@ -18,9 +18,15 @@
18
18
  "Decrypting {{counter}}/{{total}}": "Déchiffrement {{counter}}/{{total}}",
19
19
  "Decrypting secrets": "Déchiffrement des secrets",
20
20
  "Decrypting secrets {{counter}}/{{total}}": "Déchiffrement des secrets {{counter}}/{{total}}",
21
+ "Delete {{count}} resource(s)_one": "Delete one resource",
22
+ "Delete {{count}} resource(s)_other": "Delete {{count}} resources",
23
+ "Delete Resources": "Delete Resources",
24
+ "Deleting Resource(s)": "Deleting Resource(s)",
25
+ "Deleting resource(s) {{counter}}/{{total}}": "Deleting resource(s) {{counter}}/{{total}}",
21
26
  "Done": "Terminé",
22
27
  "Done!": "Terminé!",
23
28
  "Encrypting {{counter}}/{{total}}": "Chiffrement {{counter}}/{{total}}",
29
+ "Encrypting {{total}} metadata": "Encrypting {{total}} metadata",
24
30
  "Encrypting Metadata": "Chiffrement des métadonnées",
25
31
  "Encrypting secret": "Chiffrement du secret",
26
32
  "Encrypting Secret": "Chiffrement du secret",
@@ -18,9 +18,15 @@
18
18
  "Decrypting {{counter}}/{{total}}": "Decriptazione {{counter}}/{{total}}",
19
19
  "Decrypting secrets": "Decriptazione dei segreti",
20
20
  "Decrypting secrets {{counter}}/{{total}}": "Decriptazione dei segreti {{counter}}/{{total}}",
21
+ "Delete {{count}} resource(s)_one": "Delete one resource",
22
+ "Delete {{count}} resource(s)_other": "Delete {{count}} resources",
23
+ "Delete Resources": "Delete Resources",
24
+ "Deleting Resource(s)": "Deleting Resource(s)",
25
+ "Deleting resource(s) {{counter}}/{{total}}": "Deleting resource(s) {{counter}}/{{total}}",
21
26
  "Done": "Completato",
22
27
  "Done!": "Completato!",
23
28
  "Encrypting {{counter}}/{{total}}": "Criptazione {{counter}}/{{total}}",
29
+ "Encrypting {{total}} metadata": "Encrypting {{total}} metadata",
24
30
  "Encrypting Metadata": "Criptazione dei metadati",
25
31
  "Encrypting secret": "Criptazione del segreto",
26
32
  "Encrypting Secret": "Criptazione del segreto",
@@ -18,9 +18,15 @@
18
18
  "Decrypting {{counter}}/{{total}}": "{{counter}}/{{total}} を復号中",
19
19
  "Decrypting secrets": "シークレットを復号化中",
20
20
  "Decrypting secrets {{counter}}/{{total}}": "シークレットを復号化中 {{counter}}/{{total}}",
21
+ "Delete {{count}} resource(s)_one": "Delete one resource",
22
+ "Delete {{count}} resource(s)_other": "Delete {{count}} resources",
23
+ "Delete Resources": "Delete Resources",
24
+ "Deleting Resource(s)": "Deleting Resource(s)",
25
+ "Deleting resource(s) {{counter}}/{{total}}": "Deleting resource(s) {{counter}}/{{total}}",
21
26
  "Done": "完了",
22
27
  "Done!": "完了!",
23
28
  "Encrypting {{counter}}/{{total}}": "{{counter}}/{{total}} を暗号化中",
29
+ "Encrypting {{total}} metadata": "Encrypting {{total}} metadata",
24
30
  "Encrypting Metadata": "メタデータを暗号化中",
25
31
  "Encrypting secret": "秘密の暗号化",
26
32
  "Encrypting Secret": "シークレットを暗号化中",
@@ -18,9 +18,15 @@
18
18
  "Decrypting {{counter}}/{{total}}": "복호화 중 {{counter}}/{{total}}",
19
19
  "Decrypting secrets": "비밀을 복호화 중",
20
20
  "Decrypting secrets {{counter}}/{{total}}": "{{counter}}/{{total}} 비밀을 복호화 중",
21
+ "Delete {{count}} resource(s)_one": "Delete one resource",
22
+ "Delete {{count}} resource(s)_other": "Delete {{count}} resources",
23
+ "Delete Resources": "Delete Resources",
24
+ "Deleting Resource(s)": "Deleting Resource(s)",
25
+ "Deleting resource(s) {{counter}}/{{total}}": "Deleting resource(s) {{counter}}/{{total}}",
21
26
  "Done": "완료",
22
27
  "Done!": "완료!",
23
28
  "Encrypting {{counter}}/{{total}}": "암호화 중 {{counter}}/{{total}}",
29
+ "Encrypting {{total}} metadata": "Encrypting {{total}} metadata",
24
30
  "Encrypting Metadata": "메타데이터 암호화",
25
31
  "Encrypting secret": "비밀 암호화 중",
26
32
  "Encrypting Secret": "비밀 암호화 중",
@@ -18,9 +18,15 @@
18
18
  "Decrypting {{counter}}/{{total}}": "Iššifruoti {{counter}}/{{total}}",
19
19
  "Decrypting secrets": "Iššifruojamos paslaptys",
20
20
  "Decrypting secrets {{counter}}/{{total}}": "Iššifruojamos paslaptys {{counter}}/{{total}}",
21
+ "Delete {{count}} resource(s)_one": "Delete one resource",
22
+ "Delete {{count}} resource(s)_other": "Delete {{count}} resources",
23
+ "Delete Resources": "Delete Resources",
24
+ "Deleting Resource(s)": "Deleting Resource(s)",
25
+ "Deleting resource(s) {{counter}}/{{total}}": "Deleting resource(s) {{counter}}/{{total}}",
21
26
  "Done": "Atlikta",
22
27
  "Done!": "Atlikta!",
23
28
  "Encrypting {{counter}}/{{total}}": "Užšifruoti {{counter}}/{{total}}",
29
+ "Encrypting {{total}} metadata": "Encrypting {{total}} metadata",
24
30
  "Encrypting Metadata": "Šifruojami metaduomenys",
25
31
  "Encrypting secret": "Užšifruoti paslaptį",
26
32
  "Encrypting Secret": "Šifruojama paslaptis",