From dcbd09e736b516b359369f9d9fe5b0f5a6c2a928 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Fri, 4 Dec 2020 21:05:11 -0500 Subject: [PATCH] encrypted import for bitwarden json (#220) --- .../importers/keepass2XmlImporter.spec.ts | 2 +- .../importers/lastpassCsvImporter.spec.ts | 2 +- .../importers/onepassword1PifImporter.spec.ts | 10 +- .../importers/onepasswordCsvImporter.spec.ts | 8 +- src/abstractions/import.service.ts | 2 +- src/importers/ascendoCsvImporter.ts | 6 +- src/importers/avastCsvImporter.ts | 6 +- src/importers/avastJsonImporter.ts | 6 +- src/importers/aviraCsvImporter.ts | 6 +- src/importers/baseImporter.ts | 6 +- src/importers/bitwardenCsvImporter.ts | 6 +- src/importers/bitwardenJsonImporter.ts | 108 ++++++++++++++---- src/importers/blackBerryCsvImporter.ts | 6 +- src/importers/blurCsvImporter.ts | 6 +- src/importers/buttercupCsvImporter.ts | 6 +- src/importers/chromeCsvImporter.ts | 6 +- src/importers/clipperzHtmlImporter.ts | 8 +- src/importers/codebookCsvImporter.ts | 6 +- src/importers/dashlaneJsonImporter.ts | 6 +- src/importers/encryptrCsvImporter.ts | 6 +- src/importers/enpassCsvImporter.ts | 6 +- src/importers/enpassJsonImporter.ts | 6 +- src/importers/firefoxCsvImporter.ts | 6 +- src/importers/fsecureFskImporter.ts | 6 +- src/importers/gnomeJsonImporter.ts | 6 +- src/importers/importer.ts | 5 +- src/importers/kasperskyTxtImporter.ts | 4 +- src/importers/keepass2XmlImporter.ts | 8 +- src/importers/keepassxCsvImporter.ts | 6 +- src/importers/keeperCsvImporter.ts | 6 +- src/importers/lastpassCsvImporter.ts | 6 +- src/importers/logMeOnceCsvImporter.ts | 6 +- src/importers/meldiumCsvImporter.ts | 6 +- src/importers/msecureCsvImporter.ts | 6 +- src/importers/mykiCsvImporter.ts | 6 +- src/importers/onepassword1PifImporter.ts | 4 +- src/importers/onepasswordWinCsvImporter.ts | 6 +- src/importers/padlockCsvImporter.ts | 6 +- src/importers/passkeepCsvImporter.ts | 6 +- src/importers/passmanJsonImporter.ts | 6 +- src/importers/passpackCsvImporter.ts | 6 +- src/importers/passwordAgentCsvImporter.ts | 6 +- src/importers/passwordBossJsonImporter.ts | 6 +- src/importers/passwordDragonXmlImporter.ts | 6 +- src/importers/passwordSafeXmlImporter.ts | 8 +- src/importers/passwordWalletTxtImporter.ts | 6 +- src/importers/rememBearCsvImporter.ts | 6 +- src/importers/roboformCsvImporter.ts | 6 +- src/importers/safeInCloudXmlImporter.ts | 8 +- src/importers/saferpassCsvImport.ts | 6 +- src/importers/secureSafeCsvImporter.ts | 6 +- src/importers/splashIdCsvImporter.ts | 6 +- src/importers/stickyPasswordXmlImporter.ts | 6 +- src/importers/truekeyCsvImporter.ts | 6 +- src/importers/upmCsvImporter.ts | 6 +- src/importers/yotiCsvImporter.ts | 6 +- src/importers/zohoVaultCsvImporter.ts | 6 +- src/models/export/card.ts | 11 ++ src/models/export/cipher.ts | 33 ++++++ src/models/export/collection.ts | 10 ++ src/models/export/field.ts | 8 ++ src/models/export/folder.ts | 6 + src/models/export/identity.ts | 23 ++++ src/models/export/login.ts | 11 ++ src/models/export/loginUri.ts | 7 ++ src/models/export/secureNote.ts | 5 + src/services/export.service.ts | 4 + src/services/import.service.ts | 4 +- 68 files changed, 375 insertions(+), 188 deletions(-) diff --git a/spec/common/importers/keepass2XmlImporter.spec.ts b/spec/common/importers/keepass2XmlImporter.spec.ts index 757b53e69c..a744e322e3 100644 --- a/spec/common/importers/keepass2XmlImporter.spec.ts +++ b/spec/common/importers/keepass2XmlImporter.spec.ts @@ -192,7 +192,7 @@ line2 describe('KeePass2 Xml Importer', () => { it('should parse XML data', async () => { const importer = new Importer(); - const result = importer.parse(TestData); + const result = await importer.parse(TestData); expect(result != null).toBe(true); }); }); diff --git a/spec/common/importers/lastpassCsvImporter.spec.ts b/spec/common/importers/lastpassCsvImporter.spec.ts index 6254a816fe..df1dea0fb8 100644 --- a/spec/common/importers/lastpassCsvImporter.spec.ts +++ b/spec/common/importers/lastpassCsvImporter.spec.ts @@ -163,7 +163,7 @@ describe('Lastpass CSV Importer', () => { CipherData.forEach((data) => { it(data.title, async () => { const importer = new Importer(); - const result = importer.parse(data.csv); + const result = await importer.parse(data.csv); expect(result != null).toBe(true); expect(result.ciphers.length).toBeGreaterThan(0); diff --git a/spec/common/importers/onepassword1PifImporter.spec.ts b/spec/common/importers/onepassword1PifImporter.spec.ts index 276f36397a..98158fdc6d 100644 --- a/spec/common/importers/onepassword1PifImporter.spec.ts +++ b/spec/common/importers/onepassword1PifImporter.spec.ts @@ -434,7 +434,7 @@ const IdentityTestData = JSON.stringify({ describe('1Password 1Pif Importer', () => { it('should parse data', async () => { const importer = new Importer(); - const result = importer.parse(TestData); + const result = await importer.parse(TestData); expect(result != null).toBe(true); const cipher = result.ciphers.shift(); @@ -447,7 +447,7 @@ describe('1Password 1Pif Importer', () => { it('should create concealed field as "hidden" type', async () => { const importer = new Importer(); - const result = importer.parse(TestData); + const result = await importer.parse(TestData); expect(result != null).toBe(true); const ciphers = result.ciphers; @@ -465,7 +465,7 @@ describe('1Password 1Pif Importer', () => { it('should create identity records', async () => { const importer = new Importer(); - const result = importer.parse(IdentityTestData); + const result = await importer.parse(IdentityTestData); expect(result != null).toBe(true); const cipher = result.ciphers.shift(); expect(cipher.name).toEqual('Test Identity'); @@ -488,7 +488,7 @@ describe('1Password 1Pif Importer', () => { it('should create password history', async () => { const importer = new Importer(); - const result = importer.parse(TestData); + const result = await importer.parse(TestData); const cipher = result.ciphers.shift(); expect(cipher.passwordHistory.length).toEqual(1); @@ -499,7 +499,7 @@ describe('1Password 1Pif Importer', () => { it('should create password history from windows opvault 1pif format', async () => { const importer = new Importer(); - const result = importer.parse(WindowsOpVaultTestData); + const result = await importer.parse(WindowsOpVaultTestData); const cipher = result.ciphers.shift(); expect(cipher.passwordHistory.length).toEqual(5); diff --git a/spec/common/importers/onepasswordCsvImporter.spec.ts b/spec/common/importers/onepasswordCsvImporter.spec.ts index 299b4901ed..8ca37cef59 100644 --- a/spec/common/importers/onepasswordCsvImporter.spec.ts +++ b/spec/common/importers/onepasswordCsvImporter.spec.ts @@ -6,9 +6,9 @@ import { data as creditCardData } from './testData/onePasswordCsv/creditCard.csv import { data as identityData } from './testData/onePasswordCsv/identity.csv' describe('1Password CSV Importer', () => { - it('should parse identity imports', () => { + it('should parse identity imports', async () => { const importer = new Importer(); - const result = importer.parse(identityData); + const result = await importer.parse(identityData); expect(result).not.toBeNull(); expect(result.success).toBe(true); @@ -29,9 +29,9 @@ describe('1Password CSV Importer', () => { expect(cipher.notes).toContain('address\ncity state zip\nUnited States'); }); - it('should parse credit card imports', () => { + it('should parse credit card imports', async () => { const importer = new Importer(); - const result = importer.parse(creditCardData); + const result = await importer.parse(creditCardData); expect(result).not.toBeNull(); expect(result.success).toBe(true); diff --git a/src/abstractions/import.service.ts b/src/abstractions/import.service.ts index c471ea6ef3..8115c2c0b1 100644 --- a/src/abstractions/import.service.ts +++ b/src/abstractions/import.service.ts @@ -9,5 +9,5 @@ export abstract class ImportService { regularImportOptions: ImportOption[]; getImportOptions: () => ImportOption[]; import: (importer: Importer, fileContents: string, organizationId?: string) => Promise; - getImporter: (format: string, organization?: boolean) => Importer; + getImporter: (format: string, organizationId: string) => Importer; } diff --git a/src/importers/ascendoCsvImporter.ts b/src/importers/ascendoCsvImporter.ts index 52b9f0808b..f729c0f6d9 100644 --- a/src/importers/ascendoCsvImporter.ts +++ b/src/importers/ascendoCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class AscendoCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, false); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -50,6 +50,6 @@ export class AscendoCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/avastCsvImporter.ts b/src/importers/avastCsvImporter.ts index a1eb16574f..8e12a05f9c 100644 --- a/src/importers/avastCsvImporter.ts +++ b/src/importers/avastCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class AvastCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -23,6 +23,6 @@ export class AvastCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/avastJsonImporter.ts b/src/importers/avastJsonImporter.ts index b4981983a6..9f8d775295 100644 --- a/src/importers/avastJsonImporter.ts +++ b/src/importers/avastJsonImporter.ts @@ -7,12 +7,12 @@ import { CipherType } from '../enums/cipherType'; import { SecureNoteType } from '../enums/secureNoteType'; export class AvastJsonImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = JSON.parse(data); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } if (results.logins != null) { @@ -64,6 +64,6 @@ export class AvastJsonImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/aviraCsvImporter.ts b/src/importers/aviraCsvImporter.ts index 41774ba75c..2586aa63be 100644 --- a/src/importers/aviraCsvImporter.ts +++ b/src/importers/aviraCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class AviraCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -31,6 +31,6 @@ export class AviraCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/baseImporter.ts b/src/importers/baseImporter.ts index 2999227d3c..ab02785bd6 100644 --- a/src/importers/baseImporter.ts +++ b/src/importers/baseImporter.ts @@ -18,7 +18,7 @@ import { FieldType } from '../enums/fieldType'; import { SecureNoteType } from '../enums/secureNoteType'; export abstract class BaseImporter { - organization = false; + organizationId: string = null; protected newLineRegex = /(?:\r\n|\r|\n)/; @@ -70,6 +70,10 @@ export abstract class BaseImporter { skipEmptyLines: false, } + protected organization() { + return this.organizationId != null; + } + protected parseXml(data: string): Document { const parser = new DOMParser(); const doc = parser.parseFromString(data, 'application/xml'); diff --git a/src/importers/bitwardenCsvImporter.ts b/src/importers/bitwardenCsvImporter.ts index 3da6c338b6..ab2bc0d83d 100644 --- a/src/importers/bitwardenCsvImporter.ts +++ b/src/importers/bitwardenCsvImporter.ts @@ -15,12 +15,12 @@ import { FieldType } from '../enums/fieldType'; import { SecureNoteType } from '../enums/secureNoteType'; export class BitwardenCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -105,6 +105,6 @@ export class BitwardenCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/bitwardenJsonImporter.ts b/src/importers/bitwardenJsonImporter.ts index 1e94ad94db..25f72abe3b 100644 --- a/src/importers/bitwardenJsonImporter.ts +++ b/src/importers/bitwardenJsonImporter.ts @@ -8,37 +8,106 @@ import { CollectionWithId } from '../models/export/collectionWithId'; import { FolderWithId } from '../models/export/folderWithId'; export class BitwardenJsonImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { - const result = new ImportResult(); - const results = JSON.parse(data); - if (results == null || results.items == null || results.items.length === 0) { - result.success = false; - return result; + private results: any; + private result: ImportResult; + + async parse(data: string): Promise { + this.result = new ImportResult(); + this.results = JSON.parse(data); + if (this.results == null || this.results.items == null || this.results.items.length === 0) { + this.result.success = false; + return this.result; } + if (this.results.encrypted) { + await this.parseEncrypted(); + } else { + this.parseDecrypted(); + } + + this.result.success = true; + return this.result; + } + + private async parseEncrypted() { const groupingsMap = new Map(); - if (this.organization && results.collections != null) { - results.collections.forEach((c: CollectionWithId) => { + + if (this.organization && this.results.collections != null) { + for (const c of this.results.collections as CollectionWithId[]) { + const collection = CollectionWithId.toDomain(c); + if (collection != null) { + collection.id = null; + collection.organizationId = this.organizationId; + const view = await collection.decrypt(); + groupingsMap.set(c.id, this.result.collections.length); + this.result.collections.push(view); + } + } + } else if (!this.organization && this.results.folders != null) { + for (const f of this.results.folders as FolderWithId[]) { + const folder = FolderWithId.toDomain(f); + if (folder != null) { + folder.id = null; + const view = await folder.decrypt(); + groupingsMap.set(f.id, this.result.folders.length); + this.result.folders.push(view); + } + } + } + + for (const c of this.results.items as CipherWithIds[]) { + const cipher = CipherWithIds.toDomain(c); + // reset ids incase they were set for some reason + cipher.id = null; + cipher.folderId = null; + cipher.organizationId = this.organizationId; + cipher.collectionIds = null; + + // make sure password history is limited + if (cipher.passwordHistory != null && cipher.passwordHistory.length > 5) { + cipher.passwordHistory = cipher.passwordHistory.slice(0, 5); + } + + if (!this.organization && c.folderId != null && groupingsMap.has(c.folderId)) { + this.result.folderRelationships.push([this.result.ciphers.length, groupingsMap.get(c.folderId)]); + } else if (this.organization && c.collectionIds != null) { + c.collectionIds.forEach((cId) => { + if (groupingsMap.has(cId)) { + this.result.collectionRelationships.push([this.result.ciphers.length, groupingsMap.get(cId)]); + } + }); + } + + const view = await cipher.decrypt(); + this.cleanupCipher(view); + this.result.ciphers.push(view); + } + } + + private parseDecrypted() { + const groupingsMap = new Map(); + if (this.organization && this.results.collections != null) { + this.results.collections.forEach((c: CollectionWithId) => { const collection = CollectionWithId.toView(c); if (collection != null) { collection.id = null; collection.organizationId = null; - groupingsMap.set(c.id, result.collections.length); - result.collections.push(collection); + groupingsMap.set(c.id, this.result.collections.length); + this.result.collections.push(collection); } }); - } else if (!this.organization && results.folders != null) { - results.folders.forEach((f: FolderWithId) => { + } else if (!this.organization && this.results.folders != null) { + this.results.folders.forEach((f: FolderWithId) => { const folder = FolderWithId.toView(f); if (folder != null) { folder.id = null; - groupingsMap.set(f.id, result.folders.length); - result.folders.push(folder); + groupingsMap.set(f.id, this.result.folders.length); + this.result.folders.push(folder); } }); } - results.items.forEach((c: CipherWithIds) => { + this.results.items.forEach((c: CipherWithIds) => { const cipher = CipherWithIds.toView(c); // reset ids incase they were set for some reason cipher.id = null; @@ -52,20 +121,17 @@ export class BitwardenJsonImporter extends BaseImporter implements Importer { } if (!this.organization && c.folderId != null && groupingsMap.has(c.folderId)) { - result.folderRelationships.push([result.ciphers.length, groupingsMap.get(c.folderId)]); + this.result.folderRelationships.push([this.result.ciphers.length, groupingsMap.get(c.folderId)]); } else if (this.organization && c.collectionIds != null) { c.collectionIds.forEach((cId) => { if (groupingsMap.has(cId)) { - result.collectionRelationships.push([result.ciphers.length, groupingsMap.get(cId)]); + this.result.collectionRelationships.push([this.result.ciphers.length, groupingsMap.get(cId)]); } }); } this.cleanupCipher(cipher); - result.ciphers.push(cipher); + this.result.ciphers.push(cipher); }); - - result.success = true; - return result; } } diff --git a/src/importers/blackBerryCsvImporter.ts b/src/importers/blackBerryCsvImporter.ts index 286603f04b..5d26bcc9a6 100644 --- a/src/importers/blackBerryCsvImporter.ts +++ b/src/importers/blackBerryCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class BlackBerryCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -31,6 +31,6 @@ export class BlackBerryCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/blurCsvImporter.ts b/src/importers/blurCsvImporter.ts index 9fd484a51f..6a6001b4f7 100644 --- a/src/importers/blurCsvImporter.ts +++ b/src/importers/blurCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class BlurCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -34,6 +34,6 @@ export class BlurCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/buttercupCsvImporter.ts b/src/importers/buttercupCsvImporter.ts index 9173dc6569..344f7c0895 100644 --- a/src/importers/buttercupCsvImporter.ts +++ b/src/importers/buttercupCsvImporter.ts @@ -8,12 +8,12 @@ const OfficialProps = [ ]; export class ButtercupCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -46,6 +46,6 @@ export class ButtercupCsvImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/chromeCsvImporter.ts b/src/importers/chromeCsvImporter.ts index 5ca97dd20a..8f4a77822b 100644 --- a/src/importers/chromeCsvImporter.ts +++ b/src/importers/chromeCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class ChromeCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -23,6 +23,6 @@ export class ChromeCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/clipperzHtmlImporter.ts b/src/importers/clipperzHtmlImporter.ts index 0443114811..a772ae0084 100644 --- a/src/importers/clipperzHtmlImporter.ts +++ b/src/importers/clipperzHtmlImporter.ts @@ -4,19 +4,19 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class ClipperzHtmlImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const doc = this.parseXml(data); if (doc == null) { result.success = false; - return result; + return Promise.resolve(result); } const textarea = doc.querySelector('textarea'); if (textarea == null || this.isNullOrWhitespace(textarea.textContent)) { result.errorMessage = 'Missing textarea.'; result.success = false; - return result; + return Promise.resolve(result); } const entries = JSON.parse(textarea.textContent); @@ -74,6 +74,6 @@ export class ClipperzHtmlImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/codebookCsvImporter.ts b/src/importers/codebookCsvImporter.ts index 7ee56c205b..96e56ef481 100644 --- a/src/importers/codebookCsvImporter.ts +++ b/src/importers/codebookCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class CodebookCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -42,6 +42,6 @@ export class CodebookCsvImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/dashlaneJsonImporter.ts b/src/importers/dashlaneJsonImporter.ts index fdf2ebf0fc..dd8d7bb6a6 100644 --- a/src/importers/dashlaneJsonImporter.ts +++ b/src/importers/dashlaneJsonImporter.ts @@ -17,12 +17,12 @@ const HandledResults = new Set(['ADDRESS', 'AUTHENTIFIANT', 'BANKSTATEMENT', 'ID export class DashlaneJsonImporter extends BaseImporter implements Importer { private result: ImportResult; - parse(data: string): ImportResult { + parse(data: string): Promise { this.result = new ImportResult(); const results = JSON.parse(data); if (results == null || results.length === 0) { this.result.success = false; - return this.result; + return Promise.resolve(this.result); } if (results.ADDRESS != null) { @@ -51,7 +51,7 @@ export class DashlaneJsonImporter extends BaseImporter implements Importer { } this.result.success = true; - return this.result; + return Promise.resolve(this.result); } private processAuth(results: any[]) { diff --git a/src/importers/encryptrCsvImporter.ts b/src/importers/encryptrCsvImporter.ts index a1e57899e5..3deb155541 100644 --- a/src/importers/encryptrCsvImporter.ts +++ b/src/importers/encryptrCsvImporter.ts @@ -8,12 +8,12 @@ import { CardView } from '../models/view/cardView'; import { CipherType } from '../enums/cipherType'; export class EncryptrCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -57,6 +57,6 @@ export class EncryptrCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/enpassCsvImporter.ts b/src/importers/enpassCsvImporter.ts index 02fa9ab3ca..8543ae2f6e 100644 --- a/src/importers/enpassCsvImporter.ts +++ b/src/importers/enpassCsvImporter.ts @@ -10,12 +10,12 @@ import { CardView } from '../models/view/cardView'; import { SecureNoteView } from '../models/view/secureNoteView'; export class EnpassCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, false); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } let firstRow = true; @@ -99,7 +99,7 @@ export class EnpassCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } private containsField(fields: any[], name: string) { diff --git a/src/importers/enpassJsonImporter.ts b/src/importers/enpassJsonImporter.ts index ca43577239..1b325224bb 100644 --- a/src/importers/enpassJsonImporter.ts +++ b/src/importers/enpassJsonImporter.ts @@ -11,12 +11,12 @@ import { CipherType } from '../enums/cipherType'; import { FieldType } from '../enums/fieldType'; export class EnpassJsonImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = JSON.parse(data); if (results == null || results.items == null || results.items.length === 0) { result.success = false; - return result; + return Promise.resolve(result); } const foldersMap = new Map(); @@ -59,7 +59,7 @@ export class EnpassJsonImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } private processLogin(cipher: CipherView, fields: any[]) { diff --git a/src/importers/firefoxCsvImporter.ts b/src/importers/firefoxCsvImporter.ts index a7d6a5b356..87dd13c35a 100644 --- a/src/importers/firefoxCsvImporter.ts +++ b/src/importers/firefoxCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class FirefoxCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -24,6 +24,6 @@ export class FirefoxCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/fsecureFskImporter.ts b/src/importers/fsecureFskImporter.ts index 81ca6d5f30..1aac8932f0 100644 --- a/src/importers/fsecureFskImporter.ts +++ b/src/importers/fsecureFskImporter.ts @@ -8,12 +8,12 @@ import { CardView } from '../models/view/cardView'; import { CipherType } from '../enums/cipherType'; export class FSecureFskImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = JSON.parse(data); if (results == null || results.data == null) { result.success = false; - return result; + return Promise.resolve(result); } for (const key in results.data) { @@ -55,6 +55,6 @@ export class FSecureFskImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/gnomeJsonImporter.ts b/src/importers/gnomeJsonImporter.ts index be62e8cfbe..23ebfc832b 100644 --- a/src/importers/gnomeJsonImporter.ts +++ b/src/importers/gnomeJsonImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class GnomeJsonImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = JSON.parse(data); if (results == null || Object.keys(results).length === 0) { result.success = false; - return result; + return Promise.resolve(result); } for (const keyRing in results) { @@ -55,6 +55,6 @@ export class GnomeJsonImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/importer.ts b/src/importers/importer.ts index fdd5c0c45d..487dc18468 100644 --- a/src/importers/importer.ts +++ b/src/importers/importer.ts @@ -1,7 +1,6 @@ import { ImportResult } from '../models/domain/importResult'; export interface Importer { - organization: boolean; - - parse(data: string): ImportResult; + organizationId: string; + parse(data: string): Promise; } diff --git a/src/importers/kasperskyTxtImporter.ts b/src/importers/kasperskyTxtImporter.ts index 9c318df611..d01f4ba296 100644 --- a/src/importers/kasperskyTxtImporter.ts +++ b/src/importers/kasperskyTxtImporter.ts @@ -9,7 +9,7 @@ const WebsitesHeader = 'Websites\n\n'; const Delimiter = '\n---\n'; export class KasperskyTxtImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); let notesData: string; @@ -72,7 +72,7 @@ export class KasperskyTxtImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } private parseDataCategory(data: string): Map[] { diff --git a/src/importers/keepass2XmlImporter.ts b/src/importers/keepass2XmlImporter.ts index a485d2265e..604a6f7d26 100644 --- a/src/importers/keepass2XmlImporter.ts +++ b/src/importers/keepass2XmlImporter.ts @@ -10,18 +10,18 @@ import { FolderView } from '../models/view/folderView'; export class KeePass2XmlImporter extends BaseImporter implements Importer { result = new ImportResult(); - parse(data: string): ImportResult { + parse(data: string): Promise { const doc = this.parseXml(data); if (doc == null) { this.result.success = false; - return this.result; + return Promise.resolve(this.result); } const rootGroup = doc.querySelector('KeePassFile > Root > Group'); if (rootGroup == null) { this.result.errorMessage = 'Missing `KeePassFile > Root > Group` node.'; this.result.success = false; - return this.result; + return Promise.resolve(this.result); } this.traverse(rootGroup, true, ''); @@ -31,7 +31,7 @@ export class KeePass2XmlImporter extends BaseImporter implements Importer { } this.result.success = true; - return this.result; + return Promise.resolve(this.result); } traverse(node: Element, isRootNode: boolean, groupPrefixName: string) { diff --git a/src/importers/keepassxCsvImporter.ts b/src/importers/keepassxCsvImporter.ts index 0d07fcc998..69a3d2144e 100644 --- a/src/importers/keepassxCsvImporter.ts +++ b/src/importers/keepassxCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class KeePassXCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -37,6 +37,6 @@ export class KeePassXCsvImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/keeperCsvImporter.ts b/src/importers/keeperCsvImporter.ts index 27a520e52f..68bfd79dbc 100644 --- a/src/importers/keeperCsvImporter.ts +++ b/src/importers/keeperCsvImporter.ts @@ -6,12 +6,12 @@ import { ImportResult } from '../models/domain/importResult'; import { FolderView } from '../models/view/folderView'; export class KeeperCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, false); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -43,6 +43,6 @@ export class KeeperCsvImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/lastpassCsvImporter.ts b/src/importers/lastpassCsvImporter.ts index fdb0da2991..63c76bffce 100644 --- a/src/importers/lastpassCsvImporter.ts +++ b/src/importers/lastpassCsvImporter.ts @@ -14,12 +14,12 @@ import { CipherType } from '../enums/cipherType'; import { SecureNoteType } from '../enums/secureNoteType'; export class LastPassCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value, index) => { @@ -84,7 +84,7 @@ export class LastPassCsvImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } private buildBaseCipher(value: any) { diff --git a/src/importers/logMeOnceCsvImporter.ts b/src/importers/logMeOnceCsvImporter.ts index d7ff04e8a0..8e3542bae5 100644 --- a/src/importers/logMeOnceCsvImporter.ts +++ b/src/importers/logMeOnceCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class LogMeOnceCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, false); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -26,6 +26,6 @@ export class LogMeOnceCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/meldiumCsvImporter.ts b/src/importers/meldiumCsvImporter.ts index f73de0124a..98117758b9 100644 --- a/src/importers/meldiumCsvImporter.ts +++ b/src/importers/meldiumCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class MeldiumCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -24,6 +24,6 @@ export class MeldiumCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/msecureCsvImporter.ts b/src/importers/msecureCsvImporter.ts index d7c14e69cc..e37a76c53e 100644 --- a/src/importers/msecureCsvImporter.ts +++ b/src/importers/msecureCsvImporter.ts @@ -9,12 +9,12 @@ import { SecureNoteType } from '../enums/secureNoteType'; import { SecureNoteView } from '../models/view/secureNoteView'; export class MSecureCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, false); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -57,6 +57,6 @@ export class MSecureCsvImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/mykiCsvImporter.ts b/src/importers/mykiCsvImporter.ts index 47988cc797..365cb2cfef 100644 --- a/src/importers/mykiCsvImporter.ts +++ b/src/importers/mykiCsvImporter.ts @@ -11,12 +11,12 @@ import { SecureNoteView } from '../models/view/secureNoteView'; import { ImportResult } from '../models/domain/importResult'; export class MykiCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -71,6 +71,6 @@ export class MykiCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/onepassword1PifImporter.ts b/src/importers/onepassword1PifImporter.ts index d2aaa5c3db..821b69d45e 100644 --- a/src/importers/onepassword1PifImporter.ts +++ b/src/importers/onepassword1PifImporter.ts @@ -16,7 +16,7 @@ import { SecureNoteType } from '../enums/secureNoteType'; export class OnePassword1PifImporter extends BaseImporter implements Importer { result = new ImportResult(); - parse(data: string): ImportResult { + parse(data: string): Promise { data.split(this.newLineRegex).forEach((line) => { if (this.isNullOrWhitespace(line) || line[0] !== '{') { return; @@ -39,7 +39,7 @@ export class OnePassword1PifImporter extends BaseImporter implements Importer { }); this.result.success = true; - return this.result; + return Promise.resolve(this.result); } private processWinOpVaultItem(item: any, cipher: CipherView) { diff --git a/src/importers/onepasswordWinCsvImporter.ts b/src/importers/onepasswordWinCsvImporter.ts index 110268da92..6e0192e697 100644 --- a/src/importers/onepasswordWinCsvImporter.ts +++ b/src/importers/onepasswordWinCsvImporter.ts @@ -9,7 +9,7 @@ import { CardView, IdentityView } from '../models/view'; const IgnoredProperties = ['ainfo', 'autosubmit', 'notesplain', 'ps', 'scope', 'tags', 'title', 'uuid', 'notes']; export class OnePasswordWinCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true, { quoteChar: '"', @@ -17,7 +17,7 @@ export class OnePasswordWinCsvImporter extends BaseImporter implements Importer }); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -155,7 +155,7 @@ export class OnePasswordWinCsvImporter extends BaseImporter implements Importer }); result.success = true; - return result; + return Promise.resolve(result); } private getProp(obj: any, name: string): any { diff --git a/src/importers/padlockCsvImporter.ts b/src/importers/padlockCsvImporter.ts index b85e4113bc..8ec5e8228d 100644 --- a/src/importers/padlockCsvImporter.ts +++ b/src/importers/padlockCsvImporter.ts @@ -7,12 +7,12 @@ import { CollectionView } from '../models/view/collectionView'; import { FolderView } from '../models/view/folderView'; export class PadlockCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, false); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } let headers: string[] = null; @@ -82,6 +82,6 @@ export class PadlockCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/passkeepCsvImporter.ts b/src/importers/passkeepCsvImporter.ts index b51ffdaec5..e1c2873c02 100644 --- a/src/importers/passkeepCsvImporter.ts +++ b/src/importers/passkeepCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class PassKeepCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -30,7 +30,7 @@ export class PassKeepCsvImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } private getValue(key: string, value: any) { diff --git a/src/importers/passmanJsonImporter.ts b/src/importers/passmanJsonImporter.ts index 8e2346f0b8..c00eeb1a7f 100644 --- a/src/importers/passmanJsonImporter.ts +++ b/src/importers/passmanJsonImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class PassmanJsonImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = JSON.parse(data); if (results == null || results.length === 0) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((credential: any) => { @@ -56,6 +56,6 @@ export class PassmanJsonImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/passpackCsvImporter.ts b/src/importers/passpackCsvImporter.ts index 9b26d45c2b..3fcdf4120e 100644 --- a/src/importers/passpackCsvImporter.ts +++ b/src/importers/passpackCsvImporter.ts @@ -6,12 +6,12 @@ import { ImportResult } from '../models/domain/importResult'; import { CollectionView } from '../models/view/collectionView'; export class PasspackCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -88,6 +88,6 @@ export class PasspackCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/passwordAgentCsvImporter.ts b/src/importers/passwordAgentCsvImporter.ts index e1d1018368..d14e8036cc 100644 --- a/src/importers/passwordAgentCsvImporter.ts +++ b/src/importers/passwordAgentCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class PasswordAgentCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, false); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } let newVersion = true; @@ -47,6 +47,6 @@ export class PasswordAgentCsvImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/passwordBossJsonImporter.ts b/src/importers/passwordBossJsonImporter.ts index 65c0875570..3edb18edec 100644 --- a/src/importers/passwordBossJsonImporter.ts +++ b/src/importers/passwordBossJsonImporter.ts @@ -9,12 +9,12 @@ import { FolderView } from '../models/view/folderView'; import { CipherType } from '../enums/cipherType'; export class PasswordBossJsonImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = JSON.parse(data); if (results == null || results.items == null) { result.success = false; - return result; + return Promise.resolve(result); } const foldersMap = new Map(); @@ -116,6 +116,6 @@ export class PasswordBossJsonImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/passwordDragonXmlImporter.ts b/src/importers/passwordDragonXmlImporter.ts index 5fc52b524e..9195fca5ba 100644 --- a/src/importers/passwordDragonXmlImporter.ts +++ b/src/importers/passwordDragonXmlImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class PasswordDragonXmlImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const doc = this.parseXml(data); if (doc == null) { result.success = false; - return result; + return Promise.resolve(result); } const records = doc.querySelectorAll('PasswordManager > record'); @@ -52,6 +52,6 @@ export class PasswordDragonXmlImporter extends BaseImporter implements Importer } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/passwordSafeXmlImporter.ts b/src/importers/passwordSafeXmlImporter.ts index e4bbedb836..e105e186e8 100644 --- a/src/importers/passwordSafeXmlImporter.ts +++ b/src/importers/passwordSafeXmlImporter.ts @@ -4,19 +4,19 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class PasswordSafeXmlImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const doc = this.parseXml(data); if (doc == null) { result.success = false; - return result; + return Promise.resolve(result); } const passwordSafe = doc.querySelector('passwordsafe'); if (passwordSafe == null) { result.errorMessage = 'Missing `passwordsafe` node.'; result.success = false; - return result; + return Promise.resolve(result); } const notesDelimiter = passwordSafe.getAttribute('delimiter'); @@ -57,6 +57,6 @@ export class PasswordSafeXmlImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/passwordWalletTxtImporter.ts b/src/importers/passwordWalletTxtImporter.ts index c98459f354..561085aa04 100644 --- a/src/importers/passwordWalletTxtImporter.ts +++ b/src/importers/passwordWalletTxtImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class PasswordWalletTxtImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, false); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -42,6 +42,6 @@ export class PasswordWalletTxtImporter extends BaseImporter implements Importer } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/rememBearCsvImporter.ts b/src/importers/rememBearCsvImporter.ts index 9cf559e8d2..bc9aaeb945 100644 --- a/src/importers/rememBearCsvImporter.ts +++ b/src/importers/rememBearCsvImporter.ts @@ -8,12 +8,12 @@ import { ImportResult } from '../models/domain/importResult'; import { CardView } from '../models/view/cardView'; export class RememBearCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -68,6 +68,6 @@ export class RememBearCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/roboformCsvImporter.ts b/src/importers/roboformCsvImporter.ts index 09a97997b3..99c763665c 100644 --- a/src/importers/roboformCsvImporter.ts +++ b/src/importers/roboformCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class RoboFormCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } let i = 1; @@ -58,6 +58,6 @@ export class RoboFormCsvImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/safeInCloudXmlImporter.ts b/src/importers/safeInCloudXmlImporter.ts index 7027ec1bff..ea22fe2aa4 100644 --- a/src/importers/safeInCloudXmlImporter.ts +++ b/src/importers/safeInCloudXmlImporter.ts @@ -10,19 +10,19 @@ import { CipherType } from '../enums/cipherType'; import { SecureNoteType } from '../enums/secureNoteType'; export class SafeInCloudXmlImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const doc = this.parseXml(data); if (doc == null) { result.success = false; - return result; + return Promise.resolve(result); } const db = doc.querySelector('database'); if (db == null) { result.errorMessage = 'Missing `database` node.'; result.success = false; - return result; + return Promise.resolve(result); } const foldersMap = new Map(); @@ -96,6 +96,6 @@ export class SafeInCloudXmlImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/saferpassCsvImport.ts b/src/importers/saferpassCsvImport.ts index e36c3da498..3fdad40b8a 100644 --- a/src/importers/saferpassCsvImport.ts +++ b/src/importers/saferpassCsvImport.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class SaferPassCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -24,6 +24,6 @@ export class SaferPassCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/secureSafeCsvImporter.ts b/src/importers/secureSafeCsvImporter.ts index a0cabb5e21..068c70098e 100644 --- a/src/importers/secureSafeCsvImporter.ts +++ b/src/importers/secureSafeCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class SecureSafeCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -24,6 +24,6 @@ export class SecureSafeCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/splashIdCsvImporter.ts b/src/importers/splashIdCsvImporter.ts index 39dd76aea4..9210824c0a 100644 --- a/src/importers/splashIdCsvImporter.ts +++ b/src/importers/splashIdCsvImporter.ts @@ -5,12 +5,12 @@ import { ImportResult } from '../models/domain/importResult'; import { CipherView } from '../models/view/cipherView'; export class SplashIdCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, false); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -42,7 +42,7 @@ export class SplashIdCsvImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } private parseFieldsToNotes(cipher: CipherView, startIndex: number, value: any) { diff --git a/src/importers/stickyPasswordXmlImporter.ts b/src/importers/stickyPasswordXmlImporter.ts index 6bb1dc88ee..3955099255 100644 --- a/src/importers/stickyPasswordXmlImporter.ts +++ b/src/importers/stickyPasswordXmlImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class StickyPasswordXmlImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const doc = this.parseXml(data); if (doc == null) { result.success = false; - return result; + return Promise.resolve(result); } const loginNodes = doc.querySelectorAll('root > Database > Logins > Login'); @@ -62,7 +62,7 @@ export class StickyPasswordXmlImporter extends BaseImporter implements Importer } result.success = true; - return result; + return Promise.resolve(result); } buildGroupText(doc: Document, groupId: string, groupText: string): string { diff --git a/src/importers/truekeyCsvImporter.ts b/src/importers/truekeyCsvImporter.ts index e8d30a88a2..a7d8f8f9c9 100644 --- a/src/importers/truekeyCsvImporter.ts +++ b/src/importers/truekeyCsvImporter.ts @@ -14,12 +14,12 @@ const PropertiesToIgnore = ['kind', 'autologin', 'favorite', 'hexcolor', 'protec ]; export class TrueKeyCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -69,6 +69,6 @@ export class TrueKeyCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/upmCsvImporter.ts b/src/importers/upmCsvImporter.ts index 8b5002cad7..40cb814b79 100644 --- a/src/importers/upmCsvImporter.ts +++ b/src/importers/upmCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class UpmCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, false); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -27,6 +27,6 @@ export class UpmCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/yotiCsvImporter.ts b/src/importers/yotiCsvImporter.ts index 2651e6fa70..abfe0d6c63 100644 --- a/src/importers/yotiCsvImporter.ts +++ b/src/importers/yotiCsvImporter.ts @@ -4,12 +4,12 @@ import { Importer } from './importer'; import { ImportResult } from '../models/domain/importResult'; export class YotiCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -23,6 +23,6 @@ export class YotiCsvImporter extends BaseImporter implements Importer { }); result.success = true; - return result; + return Promise.resolve(result); } } diff --git a/src/importers/zohoVaultCsvImporter.ts b/src/importers/zohoVaultCsvImporter.ts index cf2403e552..4b91e4f5a7 100644 --- a/src/importers/zohoVaultCsvImporter.ts +++ b/src/importers/zohoVaultCsvImporter.ts @@ -5,12 +5,12 @@ import { ImportResult } from '../models/domain/importResult'; import { CipherView } from '../models/view'; export class ZohoVaultCsvImporter extends BaseImporter implements Importer { - parse(data: string): ImportResult { + parse(data: string): Promise { const result = new ImportResult(); const results = this.parseCsv(data, true); if (results == null) { result.success = false; - return result; + return Promise.resolve(result); } results.forEach((value) => { @@ -37,7 +37,7 @@ export class ZohoVaultCsvImporter extends BaseImporter implements Importer { } result.success = true; - return result; + return Promise.resolve(result); } private parseData(cipher: CipherView, data: string) { diff --git a/src/models/export/card.ts b/src/models/export/card.ts index 380f112612..168b3b3ab3 100644 --- a/src/models/export/card.ts +++ b/src/models/export/card.ts @@ -1,6 +1,7 @@ import { CardView } from '../view/cardView'; import { Card as CardDomain } from '../domain/card'; +import { CipherString } from '../domain/cipherString'; export class Card { static template(): Card { @@ -24,6 +25,16 @@ export class Card { return view; } + static toDomain(req: Card, domain = new CardDomain()) { + domain.cardholderName = req.cardholderName != null ? new CipherString(req.cardholderName) : null; + domain.brand = req.brand != null ? new CipherString(req.brand) : null; + domain.number = req.number != null ? new CipherString(req.number) : null; + domain.expMonth = req.expMonth != null ? new CipherString(req.expMonth) : null; + domain.expYear = req.expYear != null ? new CipherString(req.expYear) : null; + domain.code = req.code != null ? new CipherString(req.code) : null; + return domain; + } + cardholderName: string; brand: string; number: string; diff --git a/src/models/export/cipher.ts b/src/models/export/cipher.ts index 5fb2462f25..d88db8f7a4 100644 --- a/src/models/export/cipher.ts +++ b/src/models/export/cipher.ts @@ -3,6 +3,7 @@ import { CipherType } from '../../enums/cipherType'; import { CipherView } from '../view/cipherView'; import { Cipher as CipherDomain } from '../domain/cipher'; +import { CipherString } from '../domain/cipherString'; import { Card } from './card'; import { Field } from './field'; @@ -59,6 +60,38 @@ export class Cipher { return view; } + static toDomain(req: Cipher, domain = new CipherDomain()) { + domain.type = req.type; + domain.folderId = req.folderId; + if (domain.organizationId == null) { + domain.organizationId = req.organizationId; + } + domain.name = req.name != null ? new CipherString(req.name) : null; + domain.notes = req.notes != null ? new CipherString(req.notes) : null; + domain.favorite = req.favorite; + + if (req.fields != null) { + domain.fields = req.fields.map((f) => Field.toDomain(f)); + } + + switch (req.type) { + case CipherType.Login: + domain.login = Login.toDomain(req.login); + break; + case CipherType.SecureNote: + domain.secureNote = SecureNote.toDomain(req.secureNote); + break; + case CipherType.Card: + domain.card = Card.toDomain(req.card); + break; + case CipherType.Identity: + domain.identity = Identity.toDomain(req.identity); + break; + } + + return domain; + } + type: CipherType; folderId: string; organizationId: string; diff --git a/src/models/export/collection.ts b/src/models/export/collection.ts index 03b2a42599..f0efd41fd9 100644 --- a/src/models/export/collection.ts +++ b/src/models/export/collection.ts @@ -1,5 +1,6 @@ import { CollectionView } from '../view/collectionView'; +import { CipherString } from '../domain/cipherString'; import { Collection as CollectionDomain } from '../domain/collection'; export class Collection { @@ -20,6 +21,15 @@ export class Collection { return view; } + static toDomain(req: Collection, domain = new CollectionDomain()) { + domain.name = req.name != null ? new CipherString(req.name) : null; + domain.externalId = req.externalId; + if (domain.organizationId == null) { + domain.organizationId = req.organizationId; + } + return domain; + } + organizationId: string; name: string; externalId: string; diff --git a/src/models/export/field.ts b/src/models/export/field.ts index 3029b2338e..da451e4c68 100644 --- a/src/models/export/field.ts +++ b/src/models/export/field.ts @@ -2,6 +2,7 @@ import { FieldType } from '../../enums/fieldType'; import { FieldView } from '../view/fieldView'; +import { CipherString } from '../domain/cipherString'; import { Field as FieldDomain } from '../domain/field'; export class Field { @@ -20,6 +21,13 @@ export class Field { return view; } + static toDomain(req: Field, domain = new FieldDomain()) { + domain.type = req.type; + domain.value = req.value != null ? new CipherString(req.value) : null; + domain.name = req.name != null ? new CipherString(req.name) : null; + return domain; + } + name: string; value: string; type: FieldType; diff --git a/src/models/export/folder.ts b/src/models/export/folder.ts index b8d6f43977..cc6299300f 100644 --- a/src/models/export/folder.ts +++ b/src/models/export/folder.ts @@ -1,5 +1,6 @@ import { FolderView } from '../view/folderView'; +import { CipherString } from '../domain/cipherString'; import { Folder as FolderDomain } from '../domain/folder'; export class Folder { @@ -14,6 +15,11 @@ export class Folder { return view; } + static toDomain(req: Folder, domain = new FolderDomain()) { + domain.name = req.name != null ? new CipherString(req.name) : null; + return domain; + } + name: string; // Use build method instead of ctor so that we can control order of JSON stringify for pretty print diff --git a/src/models/export/identity.ts b/src/models/export/identity.ts index 20546ac7f0..6bae582cda 100644 --- a/src/models/export/identity.ts +++ b/src/models/export/identity.ts @@ -1,5 +1,6 @@ import { IdentityView } from '../view/identityView'; +import { CipherString } from '../domain/cipherString'; import { Identity as IdentityDomain } from '../domain/identity'; export class Identity { @@ -48,6 +49,28 @@ export class Identity { return view; } + static toDomain(req: Identity, domain = new IdentityDomain()) { + domain.title = req.title != null ? new CipherString(req.title) : null; + domain.firstName = req.firstName != null ? new CipherString(req.firstName) : null; + domain.middleName = req.middleName != null ? new CipherString(req.middleName) : null; + domain.lastName = req.lastName != null ? new CipherString(req.lastName) : null; + domain.address1 = req.address1 != null ? new CipherString(req.address1) : null; + domain.address2 = req.address2 != null ? new CipherString(req.address2) : null; + domain.address3 = req.address3 != null ? new CipherString(req.address3) : null; + domain.city = req.city != null ? new CipherString(req.city) : null; + domain.state = req.state != null ? new CipherString(req.state) : null; + domain.postalCode = req.postalCode != null ? new CipherString(req.postalCode) : null; + domain.country = req.country != null ? new CipherString(req.country) : null; + domain.company = req.company != null ? new CipherString(req.company) : null; + domain.email = req.email != null ? new CipherString(req.email) : null; + domain.phone = req.phone != null ? new CipherString(req.phone) : null; + domain.ssn = req.ssn != null ? new CipherString(req.ssn) : null; + domain.username = req.username != null ? new CipherString(req.username) : null; + domain.passportNumber = req.passportNumber != null ? new CipherString(req.passportNumber) : null; + domain.licenseNumber = req.licenseNumber != null ? new CipherString(req.licenseNumber) : null; + return domain; + } + title: string; firstName: string; middleName: string; diff --git a/src/models/export/login.ts b/src/models/export/login.ts index d8ad6918ab..4bf487b6f1 100644 --- a/src/models/export/login.ts +++ b/src/models/export/login.ts @@ -2,6 +2,7 @@ import { LoginUri } from './loginUri'; import { LoginView } from '../view/loginView'; +import { CipherString } from '../domain/cipherString'; import { Login as LoginDomain } from '../domain/login'; export class Login { @@ -24,6 +25,16 @@ export class Login { return view; } + static toDomain(req: Login, domain = new LoginDomain()) { + if (req.uris != null) { + domain.uris = req.uris.map((u) => LoginUri.toDomain(u)); + } + domain.username = req.username != null ? new CipherString(req.username) : null; + domain.password = req.password != null ? new CipherString(req.password) : null; + domain.totp = req.totp != null ? new CipherString(req.totp) : null; + return domain; + } + uris: LoginUri[]; username: string; password: string; diff --git a/src/models/export/loginUri.ts b/src/models/export/loginUri.ts index 3b416d9fdd..c567b670a3 100644 --- a/src/models/export/loginUri.ts +++ b/src/models/export/loginUri.ts @@ -2,6 +2,7 @@ import { UriMatchType } from '../../enums/uriMatchType'; import { LoginUriView } from '../view/loginUriView'; +import { CipherString } from '../domain/cipherString'; import { LoginUri as LoginUriDomain } from '../domain/loginUri'; export class LoginUri { @@ -18,6 +19,12 @@ export class LoginUri { return view; } + static toDomain(req: LoginUri, domain = new LoginUriDomain()) { + domain.uri = req.uri != null ? new CipherString(req.uri) : null; + domain.match = req.match; + return domain; + } + uri: string; match: UriMatchType = null; diff --git a/src/models/export/secureNote.ts b/src/models/export/secureNote.ts index 31a80c04df..078f40331e 100644 --- a/src/models/export/secureNote.ts +++ b/src/models/export/secureNote.ts @@ -16,6 +16,11 @@ export class SecureNote { return view; } + static toDomain(req: SecureNote, view = new SecureNoteDomain()) { + view.type = req.type; + return view; + } + type: SecureNoteType; constructor(o?: SecureNoteView | SecureNoteDomain) { diff --git a/src/services/export.service.ts b/src/services/export.service.ts index 03c499d9b1..e0c4188e87 100644 --- a/src/services/export.service.ts +++ b/src/services/export.service.ts @@ -98,6 +98,7 @@ export class ExportService implements ExportServiceAbstraction { return papa.unparse(exportCiphers); } else { const jsonDoc: any = { + encrypted: false, folders: [], items: [], }; @@ -130,6 +131,7 @@ export class ExportService implements ExportServiceAbstraction { const ciphers = await this.cipherService.getAll(); const jsonDoc: any = { + encrypted: true, folders: [], items: [], }; @@ -215,6 +217,7 @@ export class ExportService implements ExportServiceAbstraction { return papa.unparse(exportCiphers); } else { const jsonDoc: any = { + encrypted: false, collections: [], items: [], }; @@ -264,6 +267,7 @@ export class ExportService implements ExportServiceAbstraction { await Promise.all(promises); const jsonDoc: any = { + encrypted: true, collections: [], items: [], }; diff --git a/src/services/import.service.ts b/src/services/import.service.ts index a74fc2c62d..3b2d4ed444 100644 --- a/src/services/import.service.ts +++ b/src/services/import.service.ts @@ -165,12 +165,12 @@ export class ImportService implements ImportServiceAbstraction { } } - getImporter(format: string, organization = false): Importer { + getImporter(format: string, organizationId: string = null): Importer { const importer = this.getImporterInstance(format); if (importer == null) { return null; } - importer.organization = organization; + importer.organizationId = organizationId; return importer; }