From 8149d7877d97c9c8a945ae934ab9c6a1fe74fd63 Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Thu, 19 Jul 2018 15:12:58 -0400 Subject: [PATCH] zoho csv importer --- src/importers/baseImporter.ts | 8 +++- src/importers/zohoVaultCsvImporter.ts | 66 +++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/importers/zohoVaultCsvImporter.ts diff --git a/src/importers/baseImporter.ts b/src/importers/baseImporter.ts index 291d558c5e..d7ee9d5f72 100644 --- a/src/importers/baseImporter.ts +++ b/src/importers/baseImporter.ts @@ -105,6 +105,9 @@ export abstract class BaseImporter { if (typeof uri === 'string') { const loginUri = new LoginUriView(); loginUri.uri = this.fixUri(uri); + if (this.isNullOrWhitespace(loginUri.uri)) { + return null; + } loginUri.match = null; return [loginUri]; } @@ -114,10 +117,13 @@ export abstract class BaseImporter { uri.forEach((u) => { const loginUri = new LoginUriView(); loginUri.uri = this.fixUri(u); + if (this.isNullOrWhitespace(loginUri.uri)) { + return; + } loginUri.match = null; returnArr.push(loginUri); }); - return returnArr; + return returnArr.length === 0 ? null : returnArr; } return null; diff --git a/src/importers/zohoVaultCsvImporter.ts b/src/importers/zohoVaultCsvImporter.ts new file mode 100644 index 0000000000..f2cc12d1c1 --- /dev/null +++ b/src/importers/zohoVaultCsvImporter.ts @@ -0,0 +1,66 @@ +import { BaseImporter } from './baseImporter'; +import { Importer } from './importer'; + +import { ImportResult } from '../models/domain/importResult'; +import { CipherView } from '../models/view'; + +export class ZohoVaultCsvImporter extends BaseImporter implements Importer { + parse(data: string): ImportResult { + const result = new ImportResult(); + const results = this.parseCsv(data, true); + if (results == null) { + result.success = false; + return result; + } + + results.forEach((value) => { + if (this.isNullOrWhitespace(value['Secret Name'])) { + return; + } + this.processFolder(result, this.getValueOrDefault(value.ChamberName)); + const cipher = this.initLoginCipher(); + cipher.favorite = this.getValueOrDefault(value.Favorite, '0') === '1'; + cipher.notes = this.getValueOrDefault(value.Notes); + cipher.name = this.getValueOrDefault(value['Secret Name'], '--'); + cipher.login.uris = this.makeUriArray(value['Secret URL']); + this.parseData(cipher, value.SecretData); + this.parseData(cipher, value.CustomData); + this.convertToNoteIfNeeded(cipher); + this.cleanupCipher(cipher); + result.ciphers.push(cipher); + }); + + if (this.organization) { + this.moveFoldersToCollections(result); + } + + result.success = true; + return result; + } + + private parseData(cipher: CipherView, data: string) { + if (this.isNullOrWhitespace(data)) { + return; + } + const dataLines = this.splitNewLine(data); + dataLines.forEach((line) => { + const delimPosition = line.indexOf(':'); + if (delimPosition < 0) { + return; + } + const field = line.substring(0, delimPosition); + const value = line.length > delimPosition ? line.substring(delimPosition + 1) : null; + if (this.isNullOrWhitespace(field) || this.isNullOrWhitespace(value) || field === 'SecretType') { + return; + } + const fieldLower = field.toLowerCase(); + if (cipher.login.username == null && this.usernameFieldNames.indexOf(fieldLower) > -1) { + cipher.login.username = value; + } else if (cipher.login.password == null && this.passwordFieldNames.indexOf(fieldLower) > -1) { + cipher.login.password = value; + } else { + this.processKvp(cipher, field, value); + } + }); + } +}