From 7fc0ab97f340ada87dddd28b11802eb45efd35d9 Mon Sep 17 00:00:00 2001 From: David Frankel <42774874+frankeld@users.noreply.github.com> Date: Thu, 24 Mar 2022 15:33:28 -0600 Subject: [PATCH] [bug] Fix Safari CSV importer for URL and Notes (#730) --- common/src/importers/safariCsvImporter.ts | 3 +- .../importers/safariCsvImporter.spec.ts | 74 +++++++++++++++++++ .../safariCsv/oldSimplePasswordData.csv.ts | 2 + .../safariCsv/simplePasswordData.csv.ts | 3 + 4 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 spec/common/importers/safariCsvImporter.spec.ts create mode 100644 spec/common/importers/testData/safariCsv/oldSimplePasswordData.csv.ts create mode 100644 spec/common/importers/testData/safariCsv/simplePasswordData.csv.ts diff --git a/common/src/importers/safariCsvImporter.ts b/common/src/importers/safariCsvImporter.ts index 156c276756..786b282783 100644 --- a/common/src/importers/safariCsvImporter.ts +++ b/common/src/importers/safariCsvImporter.ts @@ -17,8 +17,9 @@ export class SafariCsvImporter extends BaseImporter implements Importer { 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.uris = this.makeUriArray(value.Url ?? value.URL); cipher.login.totp = this.getValueOrDefault(value.OTPAuth); + cipher.notes = this.getValueOrDefault(value.Notes); this.cleanupCipher(cipher); result.ciphers.push(cipher); }); diff --git a/spec/common/importers/safariCsvImporter.spec.ts b/spec/common/importers/safariCsvImporter.spec.ts new file mode 100644 index 0000000000..5fcd33ae0e --- /dev/null +++ b/spec/common/importers/safariCsvImporter.spec.ts @@ -0,0 +1,74 @@ +import { SafariCsvImporter as Importer } from "jslib-common/importers/SafariCsvImporter"; +import { CipherView } from "jslib-common/models/view/cipherView"; +import { LoginUriView } from "jslib-common/models/view/loginUriView"; +import { LoginView } from "jslib-common/models/view/loginView"; + +import { data as oldSimplePasswordData } from "./testData/safariCsv/oldSimplePasswordData.csv"; +import { data as simplePasswordData } from "./testData/safariCsv/simplePasswordData.csv"; + +const CipherData = [ + { + title: "should parse URLs in new CSV format", + csv: simplePasswordData, + expected: Object.assign(new CipherView(), { + id: null, + organizationId: null, + folderId: null, + name: "example.com (example_user)", + login: Object.assign(new LoginView(), { + username: "example_user", + password: "example_p@ssword", + uris: [ + Object.assign(new LoginUriView(), { + uri: "https://example.com", + }), + ], + totp: "otpauth://totp/test?secret=examplesecret", + }), + notes: "Example note\nMore notes on new line", + type: 1, + }), + }, + { + title: "should parse URLs in old CSV format", + csv: oldSimplePasswordData, + expected: Object.assign(new CipherView(), { + id: null, + organizationId: null, + folderId: null, + name: "example.com (example_user)", + login: Object.assign(new LoginView(), { + username: "example_user", + password: "example_p@ssword", + uris: [ + Object.assign(new LoginUriView(), { + uri: "https://example.com", + }), + ], + }), + type: 1, + }), + }, +]; + +describe("Safari CSV Importer", () => { + CipherData.forEach((data) => { + it(data.title, async () => { + const importer = new Importer(); + const result = await importer.parse(data.csv); + expect(result != null).toBe(true); + expect(result.ciphers.length).toBeGreaterThan(0); + + const cipher = result.ciphers.shift(); + let property: keyof typeof data.expected; + for (property in data.expected) { + // eslint-disable-next-line + if (data.expected.hasOwnProperty(property)) { + // eslint-disable-next-line + expect(cipher.hasOwnProperty(property)).toBe(true); + expect(cipher[property]).toEqual(data.expected[property]); + } + } + }); + }); +}); diff --git a/spec/common/importers/testData/safariCsv/oldSimplePasswordData.csv.ts b/spec/common/importers/testData/safariCsv/oldSimplePasswordData.csv.ts new file mode 100644 index 0000000000..f4dce0e7ef --- /dev/null +++ b/spec/common/importers/testData/safariCsv/oldSimplePasswordData.csv.ts @@ -0,0 +1,2 @@ +export const data = `Title,Url,Username,Password +example.com (example_user),https://example.com,example_user,example_p@ssword`; diff --git a/spec/common/importers/testData/safariCsv/simplePasswordData.csv.ts b/spec/common/importers/testData/safariCsv/simplePasswordData.csv.ts new file mode 100644 index 0000000000..52c7de8ea3 --- /dev/null +++ b/spec/common/importers/testData/safariCsv/simplePasswordData.csv.ts @@ -0,0 +1,3 @@ +export const data = `Title,URL,Username,Password,Notes,OTPAuth +example.com (example_user),https://example.com,example_user,example_p@ssword,"Example note +More notes on new line",otpauth://totp/test?secret=examplesecret`;