From 257de6517c91c397725a329e382dc1231ed74343 Mon Sep 17 00:00:00 2001 From: pan93412 Date: Tue, 26 Oct 2021 15:00:03 +0800 Subject: [PATCH] feat: add an importer for Safari (CSV) (#512) * feat(importers/safariCsvImporter): add the importer for Safari (CSV) * Revert changes to package-lock.json Co-authored-by: Thomas Rittson --- common/src/importers/safariCsvImporter.ts | 29 +++++++++++++++++++++++ common/src/services/import.service.ts | 4 ++++ 2 files changed, 33 insertions(+) create mode 100644 common/src/importers/safariCsvImporter.ts diff --git a/common/src/importers/safariCsvImporter.ts b/common/src/importers/safariCsvImporter.ts new file mode 100644 index 00000000..64a30b3a --- /dev/null +++ b/common/src/importers/safariCsvImporter.ts @@ -0,0 +1,29 @@ +import { BaseImporter } from './baseImporter'; +import { Importer } from './importer'; + +import { ImportResult } from '../models/domain/importResult'; + +export class SafariCsvImporter extends BaseImporter implements Importer { + parse(data: string): Promise { + const result = new ImportResult(); + const results = this.parseCsv(data, true); + if (results == null) { + result.success = false; + return Promise.resolve(result); + } + + results.forEach(value => { + const cipher = this.initLoginCipher(); + cipher.name = this.getValueOrDefault(value.Title, '--'); + cipher.login.username = this.getValueOrDefault(value.Username); + cipher.login.password = this.getValueOrDefault(value.Password); + cipher.login.uris = this.makeUriArray(value.Url); + cipher.login.totp = this.getValueOrDefault(value.OTPAuth); + this.cleanupCipher(cipher); + result.ciphers.push(cipher); + }); + + result.success = true; + return Promise.resolve(result); + } +} diff --git a/common/src/services/import.service.ts b/common/src/services/import.service.ts index a3fd9700..3e797031 100644 --- a/common/src/services/import.service.ts +++ b/common/src/services/import.service.ts @@ -70,6 +70,7 @@ import { PasswordSafeXmlImporter } from '../importers/passwordSafeXmlImporter'; import { PasswordWalletTxtImporter } from '../importers/passwordWalletTxtImporter'; import { RememBearCsvImporter } from '../importers/rememBearCsvImporter'; import { RoboFormCsvImporter } from '../importers/roboformCsvImporter'; +import { SafariCsvImporter } from '../importers/safariCsvImporter'; import { SafeInCloudXmlImporter } from '../importers/safeInCloudXmlImporter'; import { SaferPassCsvImporter } from '../importers/saferpassCsvImport'; import { SecureSafeCsvImporter } from '../importers/secureSafeCsvImporter'; @@ -87,6 +88,7 @@ export class ImportService implements ImportServiceAbstraction { { id: 'lastpasscsv', name: 'LastPass (csv)' }, { id: 'chromecsv', name: 'Chrome (csv)' }, { id: 'firefoxcsv', name: 'Firefox (csv)' }, + { id: 'safaricsv', name: 'Safari (csv)' }, { id: 'keepass2xml', name: 'KeePass 2 (xml)' }, { id: '1password1pif', name: '1Password (1pif)' }, { id: 'dashlanejson', name: 'Dashlane (json)' }, @@ -226,6 +228,8 @@ export class ImportService implements ImportServiceAbstraction { return new UpmCsvImporter(); case 'saferpasscsv': return new SaferPassCsvImporter(); + case 'safaricsv': + return new SafariCsvImporter(); case 'meldiumcsv': return new MeldiumCsvImporter(); case '1password1pif':