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.
- package/CHANGELOG.md +58 -1
- package/README.md +2 -2
- package/RELEASE_NOTES.md +8 -30
- package/crowdin.yml +1 -0
- package/package.json +4 -3
- package/src/all/_locales/cs/messages.json +10 -0
- package/src/all/background_page/controller/InformMenuController/InformMenuController.js +3 -3
- package/src/all/background_page/controller/auth/redirectPostLoginController.js +57 -0
- package/src/all/background_page/controller/auth/redirectPostLoginController.test.js +82 -0
- package/src/all/background_page/controller/auth/redirectToAdminWorkspaceController.js +50 -0
- package/src/all/background_page/controller/auth/redirectToAdminWorkspaceController.test.js +45 -0
- package/src/all/background_page/controller/comment/createCommentController.js +3 -3
- package/src/all/background_page/controller/comment/createCommentController.test.js +5 -5
- package/src/all/background_page/controller/comment/deleteCommentController.js +3 -3
- package/src/all/background_page/controller/comment/deleteCommentController.test.js +3 -3
- package/src/all/background_page/controller/comment/getCommentsByRessourceIdController.js +3 -3
- package/src/all/background_page/controller/comment/getCommentsByRessourceidController.test.js +2 -2
- package/src/all/background_page/controller/import/importResourcesFileController.test.js +23 -23
- package/src/all/background_page/controller/metadata/enableEncryptedMetadataForExistingInstanceController.js +54 -0
- package/src/all/background_page/controller/metadata/enableEncryptedMetadataForExistingInstanceController.test.js +54 -0
- package/src/all/background_page/controller/metadata/enableMetadataSetupSettingsController.js +54 -0
- package/src/all/background_page/controller/metadata/enableMetadataSetupSettingsController.test.js +64 -0
- package/src/all/background_page/controller/metadata/findAllNonDeletedMetadataKeysController.js +2 -3
- package/src/all/background_page/controller/metadata/findMetadataGettingStartedSettingsController.js +50 -0
- package/src/all/background_page/controller/metadata/findMetadataGettingStartedSettingsController.test.js +33 -0
- package/src/all/background_page/controller/metadata/findMetadataSetupSettingsController.js +50 -0
- package/src/all/background_page/controller/metadata/findMetadataSetupSettingsController.test.js +42 -0
- package/src/all/background_page/controller/metadata/keepCleartextMetadataForExistingInstanceController.js +51 -0
- package/src/all/background_page/controller/metadata/keepCleartextMetadataForExistingInstanceController.test.js +47 -0
- package/src/all/background_page/controller/permission/FindAcoPermissionsForDisplayController.js +1 -0
- package/src/all/background_page/controller/quickaccess/consumeInProgressCreationResourceController.js +53 -0
- package/src/all/background_page/controller/quickaccess/consumeInProgressCreationResourceController.test.js +40 -0
- package/src/all/background_page/controller/quickaccess/prepareResourceController.js +64 -0
- package/src/all/background_page/controller/quickaccess/prepareResourceController.test.js +73 -0
- package/src/all/background_page/controller/resource/resourceDeleteController.js +67 -0
- package/src/all/background_page/controller/resource/resourceDeleteController.test.js +114 -0
- package/src/all/background_page/controller/resourceLocalStorage/resourceUpdateLocalStorageController.js +1 -1
- package/src/all/background_page/controller/resourceLocalStorage/resourceUpdateLocalStorageController.test.js +5 -1
- package/src/all/background_page/controller/setup/signInSetupController.js +0 -10
- package/src/all/background_page/controller/setup/signInSetupController.test.js +11 -12
- package/src/all/background_page/controller/sso/saveSsoSettingsAsDraftController.test.data.js +1 -0
- package/src/all/background_page/controller/webIntegration/webIntegrationController.js +1 -1
- package/src/all/background_page/event/appEvents.js +47 -0
- package/src/all/background_page/event/authEvents.js +4 -8
- package/src/all/background_page/event/informMenuEvents.js +31 -0
- package/src/all/background_page/event/quickAccessEvents.js +18 -23
- package/src/all/background_page/event/recoverEvents.js +12 -0
- package/src/all/background_page/event/resourceEvents.js +4 -11
- package/src/all/background_page/event/setupEvents.js +55 -0
- package/src/all/background_page/model/comment/{commentModel.js → commentService.js} +6 -2
- package/src/all/background_page/model/comment/commentService.test.js +98 -0
- package/src/all/background_page/model/entity/actionLog/actionLogsCollection.js +3 -3
- package/src/all/background_page/model/entity/actionLog/permissionsUpdatedActionLogEntity.js +4 -0
- package/src/all/background_page/model/entity/import/importResourcesFileEntity.test.data.js +3 -3
- package/src/all/background_page/model/entity/organizationSettings/organizationSettingsEntity.test.data.js +4 -0
- package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionEntity.test.data.js +23 -0
- package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionEntity.test.js +18 -33
- package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionsCollection.js +71 -2
- package/src/all/background_page/model/entity/permission/actionLog/updatedPermissionsCollection.test.js +204 -0
- package/src/all/background_page/model/entity/permission/permissionsCollection.js +78 -0
- package/src/all/background_page/model/entity/permission/permissionsCollection.test.js +139 -7
- package/src/all/background_page/model/entity/plaintext/plaintextEntity.js +9 -0
- package/src/all/background_page/model/entity/resource/external/externalResourceEntity.js +65 -8
- package/src/all/background_page/model/entity/resource/external/externalResourceEntity.test.data.js +5 -4
- package/src/all/background_page/model/entity/resource/external/externalResourceEntity.test.js +72 -16
- package/src/all/background_page/model/entity/resource/external/externalResourcesCollection.test.js +2 -1
- package/src/all/background_page/model/entity/totp/externalTotpEntity.js +2 -2
- package/src/all/background_page/model/entity/totp/totpEntity.test.js +1 -1
- package/src/all/background_page/model/export/resources/csvRowComposer/csv1PasswordRowComposer.test.js +2 -2
- package/src/all/background_page/model/export/resources/csvRowComposer/csv1passwordRowComposer.js +5 -1
- package/src/all/background_page/model/export/resources/csvRowComposer/csvBitWardenRowComposer.js +9 -1
- package/src/all/background_page/model/export/resources/csvRowComposer/csvBitWardenRowComposer.test.js +6 -4
- package/src/all/background_page/model/export/resources/csvRowComposer/csvChromiumRowComposer.js +5 -1
- package/src/all/background_page/model/export/resources/csvRowComposer/csvChromiumRowComposer.test.js +3 -2
- package/src/all/background_page/model/export/resources/csvRowComposer/csvDashlaneRowComposer.js +5 -1
- package/src/all/background_page/model/export/resources/csvRowComposer/csvDashlaneRowComposer.test.js +2 -3
- package/src/all/background_page/model/export/resources/csvRowComposer/csvKdbxRowComposer.js +3 -1
- package/src/all/background_page/model/export/resources/csvRowComposer/csvKdbxRowComposer.test.js +6 -4
- package/src/all/background_page/model/export/resources/csvRowComposer/csvLastPassRowComposer.js +5 -1
- package/src/all/background_page/model/export/resources/csvRowComposer/csvLastPassRowComposer.test.js +2 -3
- package/src/all/background_page/model/export/resources/csvRowComposer/csvLogMeOnceRowComposer.js +5 -1
- package/src/all/background_page/model/export/resources/csvRowComposer/csvLogMeOnceRowComposer.test.js +2 -3
- package/src/all/background_page/model/export/resources/csvRowComposer/csvMozillaPlatformRowComposer.js +6 -2
- package/src/all/background_page/model/export/resources/csvRowComposer/csvMozillaPlatformRowComposer.test.js +2 -2
- package/src/all/background_page/model/export/resources/csvRowComposer/csvNordpassRowComposer.js +5 -1
- package/src/all/background_page/model/export/resources/csvRowComposer/csvNordpassRowComposer.test.js +2 -2
- package/src/all/background_page/model/export/resources/csvRowComposer/csvSafariRowComposer.js +5 -1
- package/src/all/background_page/model/export/resources/csvRowComposer/csvSafariRowComposer.test.js +2 -2
- package/src/all/background_page/model/export/resources/resourcesKdbxExporter.js +44 -2
- package/src/all/background_page/model/export/resources/resourcesKdbxExporter.test.js +24 -3
- package/src/all/background_page/model/import/resources/csvRowParser/abstractCsvRowParser.js +1 -1
- package/src/all/background_page/model/import/resources/csvRowParser/csv1PasswordRowParser.js +5 -3
- package/src/all/background_page/model/import/resources/csvRowParser/csv1PasswordRowParser.test.js +3 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvBitWardenRowParser.js +22 -3
- package/src/all/background_page/model/import/resources/csvRowParser/csvBitWardenRowParser.test.js +92 -4
- package/src/all/background_page/model/import/resources/csvRowParser/csvChromiumRowParser.js +4 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvChromiumRowParser.test.js +2 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvDashlaneRowParser.js +4 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvDashlaneRowParser.test.js +3 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvKdbxRowParser.js +5 -3
- package/src/all/background_page/model/import/resources/csvRowParser/csvKdbxRowParser.test.js +4 -4
- package/src/all/background_page/model/import/resources/csvRowParser/csvLastPassRowParser.js +4 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvLastPassRowParser.test.js +2 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvLogMeOnceRowParser.js +5 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvLogMeOnceRowParser.test.js +2 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvMozillaPlatformRowParser.js +5 -3
- package/src/all/background_page/model/import/resources/csvRowParser/csvMozillaPlatformRowParser.test.js +2 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvNordpassRowParser.js +4 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvNordpassRowParser.test.js +2 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvSafariRowParser.js +4 -2
- package/src/all/background_page/model/import/resources/csvRowParser/csvSafariRowParser.test.js +2 -2
- package/src/all/background_page/model/import/resources/kdbx/kdbx-custom-fields-with-uris.kdbx +0 -0
- package/src/all/background_page/model/import/resources/kdbx/kdbx-multiple-uris-with-33-entries.kdbx +0 -0
- package/src/all/background_page/model/import/resources/kdbx/kdbx-multiple-uris.kdbx +0 -0
- package/src/all/background_page/model/import/resources/kdbx/kdbx-with-protected-custom-fields.kdbx +0 -0
- package/src/all/background_page/model/import/resources/resourcesCsvImportParser.test.js +1 -1
- package/src/all/background_page/model/import/resources/resourcesKdbxImportParser.js +124 -41
- package/src/all/background_page/model/import/resources/resourcesKdbxImportParser.test.js +133 -1
- package/src/all/background_page/model/import/resourcesImportParser.test.js +0 -1
- package/src/all/background_page/model/resource/resourceModel.js +0 -68
- package/src/all/background_page/service/api/comment/commentApiService.test.js +1 -1
- package/src/all/background_page/service/api/metadata/metadataSetupSettingsApiService.js +40 -0
- package/src/all/background_page/service/api/metadata/metadataSetupSettingsApiService.test.js +54 -0
- package/src/all/background_page/service/api/setup/setupService.js +2 -2
- package/src/all/background_page/service/api/setup/setupService.test.js +132 -0
- package/src/all/background_page/service/local_storage/resourceLocalStorage.js +25 -1
- package/src/all/background_page/service/local_storage/resourceLocalStorage.test.js +54 -0
- package/src/all/background_page/service/metadata/configureMetadataSettingsService.js +100 -0
- package/src/all/background_page/service/metadata/configureMetadataSettingsService.test.js +265 -0
- package/src/all/background_page/service/metadata/createMetadataKeyService.js +1 -1
- package/src/all/background_page/service/metadata/decryptMetadataPrivateKeysService.js +3 -19
- package/src/all/background_page/service/metadata/decryptMetadataService.js +5 -3
- package/src/all/background_page/service/metadata/decryptMetadataService.test.js +31 -24
- package/src/all/background_page/service/metadata/encryptMetadataService.js +2 -18
- package/src/all/background_page/service/metadata/findAndUpdateMetadataKeysSessionStorageService.js +5 -2
- package/src/all/background_page/service/metadata/findAndUpdateMetadataKeysSessionStorageService.test.js +4 -6
- package/src/all/background_page/service/metadata/findMetadataKeysService.js +8 -12
- package/src/all/background_page/service/metadata/findMetadataKeysService.test.js +21 -47
- package/src/all/background_page/service/metadata/findMetadataSetupSettingsService.js +45 -0
- package/src/all/background_page/service/metadata/findMetadataSetupSettingsService.test.js +68 -0
- package/src/all/background_page/service/metadata/generateMetadataKeyService.js +1 -1
- package/src/all/background_page/service/metadata/verifyOrTrustMetadataKeyService.test.js +16 -0
- package/src/all/background_page/service/passphrase/getPassphraseService.js +13 -0
- package/src/all/background_page/service/permission/findPermissionsService.js +3 -1
- package/src/all/background_page/service/resource/delete/deleteResourceService.js +60 -0
- package/src/all/background_page/service/resource/delete/deleteResourceService.test.js +75 -0
- package/src/all/background_page/service/resource/export/exportResourcesService.js +22 -0
- package/src/all/background_page/service/resource/export/exportResourcesService.test.js +48 -1
- package/src/all/background_page/service/resource/import/ImportResourcesService.js +34 -3
- package/src/all/background_page/service/resource/import/ImportResourcesService.test.js +55 -13
- package/src/all/background_page/service/sessionKey/decryptSessionKeysBundlesService.js +2 -18
- package/src/all/background_page/service/sessionKey/encryptSessionKeysBundlesService.js +1 -17
- package/src/all/locales/cs-CZ/common.json +130 -0
- package/src/all/locales/de-DE/common.json +11 -5
- package/src/all/locales/en-UK/common.json +6 -0
- package/src/all/locales/es-ES/common.json +6 -0
- package/src/all/locales/fr-FR/common.json +6 -0
- package/src/all/locales/it-IT/common.json +6 -0
- package/src/all/locales/ja-JP/common.json +6 -0
- package/src/all/locales/ko-KR/common.json +6 -0
- package/src/all/locales/lt-LT/common.json +6 -0
- package/src/all/locales/nl-NL/common.json +6 -0
- package/src/all/locales/pl-PL/common.json +6 -0
- package/src/all/locales/pt-BR/common.json +6 -0
- package/src/all/locales/ro-RO/common.json +6 -0
- package/src/all/locales/ru-RU/common.json +6 -0
- package/src/all/locales/sl-SI/common.json +6 -0
- package/src/all/locales/sv-SE/common.json +6 -0
- package/src/all/locales/uk-UA/common.json +6 -0
- package/src/chrome/manifest.json +1 -1
- package/src/chrome-mv3/manifest.json +1 -1
- package/src/firefox/manifest.json +1 -1
- 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.
|
|
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
|
-
|
|
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
|
-
|
|
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\":\"
|
|
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
|
-
|
|
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
|
-
|
|
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\":\"
|
|
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
|
-
|
|
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(
|
|
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(
|
|
395
|
-
expect(importResourcesService.progressService.finishStep).toHaveBeenCalledTimes(
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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.": "
|
|
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.": "
|
|
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.": "
|
|
108
|
-
"The verificationResult signature should be a valid verified Promise<openpgp.Signature>.": "
|
|
109
|
-
"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",
|