diff --git a/src/importers/rememBearCsvImporter.ts b/src/importers/rememBearCsvImporter.ts new file mode 100644 index 0000000000..9cf559e8d2 --- /dev/null +++ b/src/importers/rememBearCsvImporter.ts @@ -0,0 +1,73 @@ +import { BaseImporter } from './baseImporter'; +import { Importer } from './importer'; + +import { CipherType } from '../enums/cipherType'; + +import { ImportResult } from '../models/domain/importResult'; + +import { CardView } from '../models/view/cardView'; + +export class RememBearCsvImporter 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 (value.trash === 'true') { + return; + } + const cipher = this.initLoginCipher(); + cipher.name = this.getValueOrDefault(value.name); + cipher.notes = this.getValueOrDefault(value.notes); + if (value.type === 'LoginItem') { + cipher.login.uris = this.makeUriArray(value.website); + cipher.login.password = this.getValueOrDefault(value.password); + cipher.login.username = this.getValueOrDefault(value.username); + } else if (value.type === 'CreditCardItem') { + cipher.type = CipherType.Card; + cipher.card = new CardView(); + cipher.card.cardholderName = this.getValueOrDefault(value.cardholder); + cipher.card.number = this.getValueOrDefault(value.number); + cipher.card.brand = this.getCardBrand(cipher.card.number); + cipher.card.code = this.getValueOrDefault(value.verification); + + try { + const expMonth = this.getValueOrDefault(value.expiryMonth); + if (expMonth != null) { + const expMonthNumber = parseInt(expMonth, null); + if (expMonthNumber != null && expMonthNumber >= 1 && expMonthNumber <= 12) { + cipher.card.expMonth = expMonthNumber.toString(); + } + } + } catch { } + try { + const expYear = this.getValueOrDefault(value.expiryYear); + if (expYear != null) { + const expYearNumber = parseInt(expYear, null); + if (expYearNumber != null) { + cipher.card.expYear = expYearNumber.toString(); + } + } + } catch { } + + const pin = this.getValueOrDefault(value.pin); + if (pin != null) { + this.processKvp(cipher, 'PIN', pin); + } + const zip = this.getValueOrDefault(value.zipCode); + if (zip != null) { + this.processKvp(cipher, 'Zip Code', zip); + } + } + this.cleanupCipher(cipher); + result.ciphers.push(cipher); + }); + + result.success = true; + return result; + } +} diff --git a/src/services/import.service.ts b/src/services/import.service.ts index 6f39bf52c6..7c66014e32 100644 --- a/src/services/import.service.ts +++ b/src/services/import.service.ts @@ -55,6 +55,7 @@ import { PasswordAgentCsvImporter } from '../importers/passwordAgentCsvImporter' import { PasswordBossJsonImporter } from '../importers/passwordBossJsonImporter'; import { PasswordDragonXmlImporter } from '../importers/passwordDragonXmlImporter'; import { PasswordSafeXmlImporter } from '../importers/passwordSafeXmlImporter'; +import { RememBearCsvImporter } from '../importers/rememBearCsvImporter'; import { RoboFormCsvImporter } from '../importers/roboformCsvImporter'; import { SafeInCloudXmlImporter } from '../importers/safeInCloudXmlImporter'; import { SaferPassCsvImporter } from '../importers/saferpassCsvImport'; @@ -111,6 +112,7 @@ export class ImportService implements ImportServiceAbstraction { { id: 'avastcsv', name: 'Avast Passwords (csv)' }, { id: 'fsecurefsk', name: 'F-Secure KEY (fsk)' }, { id: 'kasperskytxt', name: 'Kaspersky Password Manager (txt)' }, + { id: 'remembearcsv', name: 'RememBear (csv)' }, ]; constructor(private cipherService: CipherService, private folderService: FolderService, @@ -239,6 +241,8 @@ export class ImportService implements ImportServiceAbstraction { return new FSecureFskImporter(); case 'kasperskytxt': return new KasperskyTxtImporter(); + case 'remembearcsv': + return new RememBearCsvImporter(); default: return null; }