1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-17 16:53:34 +00:00

[PM-17628] Move all files from libs/importer/spec into libs/importer/src (#13202)

* Move all files from libs/importer/spec into libs/importer/src

* Ignore ts-strict on spec-data

---------

Co-authored-by: Daniel James Smith <djsmith85@users.noreply.github.com>
This commit is contained in:
Daniel James Smith
2025-02-07 20:13:41 +01:00
committed by GitHub
parent 1bf917c08a
commit d7baa6078d
124 changed files with 173 additions and 183 deletions

View File

@@ -0,0 +1,124 @@
import { CipherType } from "@bitwarden/common/vault/enums";
import { CardView } from "@bitwarden/common/vault/models/view/card.view";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { BaseImporter } from "./base-importer";
class FakeBaseImporter extends BaseImporter {
initLoginCipher(): CipherView {
return super.initLoginCipher();
}
setCardExpiration(cipher: CipherView, expiration: string): boolean {
return super.setCardExpiration(cipher, expiration);
}
parseXml(data: string): Document {
return super.parseXml(data);
}
}
describe("BaseImporter class", () => {
const importer = new FakeBaseImporter();
let cipher: CipherView;
describe("setCardExpiration method", () => {
beforeEach(() => {
cipher = importer.initLoginCipher();
cipher.card = new CardView();
cipher.type = CipherType.Card;
});
it.each([
["01/2025", "1", "2025"],
["5/21", "5", "2021"],
["10/2100", "10", "2100"],
])(
"sets ciper card expYear & expMonth and returns true",
(expiration, expectedMonth, expectedYear) => {
const result = importer.setCardExpiration(cipher, expiration);
expect(cipher.card.expMonth).toBe(expectedMonth);
expect(cipher.card.expYear).toBe(expectedYear);
expect(result).toBe(true);
},
);
it.each([
["01/2032", "1"],
["09/2032", "9"],
["10/2032", "10"],
])("removes leading zero from month", (expiration, expectedMonth) => {
const result = importer.setCardExpiration(cipher, expiration);
expect(cipher.card.expMonth).toBe(expectedMonth);
expect(cipher.card.expYear).toBe("2032");
expect(result).toBe(true);
});
it.each([
["12/00", "2000"],
["12/99", "2099"],
["12/32", "2032"],
["12/2042", "2042"],
])("prefixes '20' to year if only two digits long", (expiration, expectedYear) => {
const result = importer.setCardExpiration(cipher, expiration);
expect(cipher.card.expYear).toHaveLength(4);
expect(cipher.card.expYear).toBe(expectedYear);
expect(result).toBe(true);
});
it.each([["01 / 2025"], ["01 / 2025"], [" 01/2025 "], [" 01/2025 "]])(
"removes any whitespace in expiration string",
(expiration) => {
const result = importer.setCardExpiration(cipher, expiration);
expect(cipher.card.expMonth).toBe("1");
expect(cipher.card.expYear).toBe("2025");
expect(result).toBe(true);
},
);
it.each([[""], [" "], [null]])(
"returns false if expiration is null or empty ",
(expiration) => {
const result = importer.setCardExpiration(cipher, expiration);
expect(result).toBe(false);
},
);
it.each([["0123"], ["01/03/23"]])(
"returns false if invalid card expiration string",
(expiration) => {
const result = importer.setCardExpiration(cipher, expiration);
expect(result).toBe(false);
},
);
it.each([["5/"], ["03/231"], ["12/1"], ["2/20221"]])(
"returns false if year is not 2 or 4 digits long",
(expiration) => {
const result = importer.setCardExpiration(cipher, expiration);
expect(result).toBe(false);
},
);
it.each([["/2023"], ["003/2023"], ["111/32"]])(
"returns false if month is not 1 or 2 digits long",
(expiration) => {
const result = importer.setCardExpiration(cipher, expiration);
expect(result).toBe(false);
},
);
it("parse XML should reject xml with external entities", async () => {
const xml = `<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE replace [
<!ELEMENT replace ANY>
<!ENTITY xxe "External entity">
]>
<passwordsafe delimiter=";">
<entry><title>PoC XXE</title><username>&xxe;</username></entry>
</passwordsafe>`;
const result = importer.parseXml(xml);
expect(result).toBe(null);
});
});
});

View File

@@ -0,0 +1,140 @@
import { mock, MockProxy } from "jest-mock-extended";
import { PinServiceAbstraction } from "@bitwarden/auth/common";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { EncryptService } from "@bitwarden/common/key-management/crypto/abstractions/encrypt.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { KdfType, KeyService } from "@bitwarden/key-management";
import { emptyAccountEncrypted } from "../spec-data/bitwarden-json/account-encrypted.json";
import { emptyUnencryptedExport } from "../spec-data/bitwarden-json/unencrypted.json";
import { BitwardenJsonImporter } from "./bitwarden-json-importer";
import { BitwardenPasswordProtectedImporter } from "./bitwarden-password-protected-importer";
describe("BitwardenPasswordProtectedImporter", () => {
let importer: BitwardenPasswordProtectedImporter;
let keyService: MockProxy<KeyService>;
let encryptService: MockProxy<EncryptService>;
let i18nService: MockProxy<I18nService>;
let cipherService: MockProxy<CipherService>;
let pinService: MockProxy<PinServiceAbstraction>;
let accountService: MockProxy<AccountService>;
const password = Utils.newGuid();
const promptForPassword_callback = async () => {
return password;
};
beforeEach(() => {
keyService = mock<KeyService>();
encryptService = mock<EncryptService>();
i18nService = mock<I18nService>();
cipherService = mock<CipherService>();
pinService = mock<PinServiceAbstraction>();
accountService = mock<AccountService>();
importer = new BitwardenPasswordProtectedImporter(
keyService,
encryptService,
i18nService,
cipherService,
pinService,
accountService,
promptForPassword_callback,
);
});
describe("Unencrypted", () => {
beforeAll(() => {
jest.spyOn(BitwardenJsonImporter.prototype, "parse");
});
it("Should call BitwardenJsonImporter", async () => {
expect((await importer.parse(emptyUnencryptedExport)).success).toEqual(true);
expect(BitwardenJsonImporter.prototype.parse).toHaveBeenCalledWith(emptyUnencryptedExport);
});
});
describe("Account encrypted", () => {
beforeAll(() => {
jest.spyOn(BitwardenJsonImporter.prototype, "parse");
});
it("Should call BitwardenJsonImporter", async () => {
expect((await importer.parse(emptyAccountEncrypted)).success).toEqual(true);
expect(BitwardenJsonImporter.prototype.parse).toHaveBeenCalledWith(emptyAccountEncrypted);
});
});
describe("Password protected", () => {
let jDoc: {
encrypted?: boolean;
passwordProtected?: boolean;
salt?: string;
kdfIterations?: any;
kdfType?: any;
encKeyValidation_DO_NOT_EDIT?: string;
data?: string;
};
beforeEach(() => {
jDoc = {
encrypted: true,
passwordProtected: true,
salt: "c2FsdA==",
kdfIterations: 100000,
kdfType: KdfType.PBKDF2_SHA256,
encKeyValidation_DO_NOT_EDIT: Utils.newGuid(),
data: Utils.newGuid(),
};
});
it("succeeds with default jdoc", async () => {
encryptService.decryptToUtf8.mockReturnValue(Promise.resolve(emptyUnencryptedExport));
expect((await importer.parse(JSON.stringify(jDoc))).success).toEqual(true);
});
it("fails if salt === null", async () => {
jDoc.salt = null;
expect((await importer.parse(JSON.stringify(jDoc))).success).toEqual(false);
});
it("fails if kdfIterations === null", async () => {
jDoc.kdfIterations = null;
expect((await importer.parse(JSON.stringify(jDoc))).success).toEqual(false);
});
it("fails if kdfIterations is not a number", async () => {
jDoc.kdfIterations = "not a number";
expect((await importer.parse(JSON.stringify(jDoc))).success).toEqual(false);
});
it("fails if kdfType === null", async () => {
jDoc.kdfType = null;
expect((await importer.parse(JSON.stringify(jDoc))).success).toEqual(false);
});
it("fails if kdfType is not a string", async () => {
jDoc.kdfType = "not a valid kdf type";
expect((await importer.parse(JSON.stringify(jDoc))).success).toEqual(false);
});
it("fails if kdfType is not a known kdfType", async () => {
jDoc.kdfType = -1;
expect((await importer.parse(JSON.stringify(jDoc))).success).toEqual(false);
});
it("fails if encKeyValidation_DO_NOT_EDIT === null", async () => {
jDoc.encKeyValidation_DO_NOT_EDIT = null;
expect((await importer.parse(JSON.stringify(jDoc))).success).toEqual(false);
});
it("fails if data === null", async () => {
jDoc.data = null;
expect((await importer.parse(JSON.stringify(jDoc))).success).toEqual(false);
});
});
});

View File

@@ -0,0 +1,72 @@
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view";
import { LoginView } from "@bitwarden/common/vault/models/view/login.view";
import { ChromeCsvImporter } from "./chrome-csv-importer";
import { data as androidData } from "./spec-data/chrome-csv/android-data.csv";
import { data as simplePasswordData } from "./spec-data/chrome-csv/simple-password-data.csv";
const CipherData = [
{
title: "should parse app name",
csv: androidData,
expected: Object.assign(new CipherView(), {
id: null,
organizationId: null,
folderId: null,
name: "com.xyz.example.app.android",
login: Object.assign(new LoginView(), {
username: "username@example.com",
password: "Qh6W4Wz55YGFNU",
uris: [
Object.assign(new LoginUriView(), {
uri: "android://N2H9MndUUUt3JuQSWAKexOU9oJLJeHR4nyUGac5E1TXKppkY7xtdRl6l8vKo1hQWCqAEy4gsNLUBIbVxpdmhOP==@com.xyz.example.app.android/",
}),
],
}),
notes: null,
type: 1,
}),
},
{
title: "should parse password",
csv: simplePasswordData,
expected: Object.assign(new CipherView(), {
id: null,
organizationId: null,
folderId: null,
name: "www.example.com",
login: Object.assign(new LoginView(), {
username: "username@example.com",
password: "wpC9qFvsbWQK5Z",
uris: [
Object.assign(new LoginUriView(), {
uri: "https://www.example.com/",
}),
],
}),
notes: null,
type: 1,
}),
},
];
describe("Chrome CSV Importer", () => {
CipherData.forEach((data) => {
it(data.title, async () => {
const importer = new ChromeCsvImporter();
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) {
if (Object.prototype.hasOwnProperty.call(data.expected, property)) {
expect(Object.prototype.hasOwnProperty.call(cipher, property)).toBe(true);
expect(cipher[property]).toEqual(data.expected[property]);
}
}
});
});
});

View File

@@ -0,0 +1,376 @@
import { CipherType } from "@bitwarden/common/vault/enums";
import { DashlaneCsvImporter } from "..";
import { credentialsData_otpUrl } from "../spec-data/dashlane-csv/credentials-otpurl.csv";
import { credentialsData } from "../spec-data/dashlane-csv/credentials.csv";
import { identityData } from "../spec-data/dashlane-csv/id.csv";
import { multiplePersonalInfoData } from "../spec-data/dashlane-csv/multiple-personal-info.csv";
import { paymentsData } from "../spec-data/dashlane-csv/payments.csv";
import { personalInfoData } from "../spec-data/dashlane-csv/personal-info.csv";
import { secureNoteData } from "../spec-data/dashlane-csv/securenotes.csv";
describe("Dashlane CSV Importer", () => {
let importer: DashlaneCsvImporter;
beforeEach(() => {
importer = new DashlaneCsvImporter();
});
it("should parse login records", async () => {
const result = await importer.parse(credentialsData);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("example.com");
expect(cipher.login.username).toEqual("jdoe");
expect(cipher.login.password).toEqual("somePassword");
expect(cipher.login.totp).toEqual("someTOTPSeed");
expect(cipher.login.uris.length).toEqual(1);
const uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("https://www.example.com");
expect(cipher.notes).toEqual("some note for example.com");
});
it("should parse login with totp when given otpUrl instead of otpSecret", async () => {
const result = await importer.parse(credentialsData_otpUrl);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.login.totp).toEqual("anotherTOTPSeed");
});
it("should parse an item and create a folder", async () => {
const result = await importer.parse(credentialsData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.folders.length).toBe(1);
expect(result.folders[0].name).toBe("Entertainment");
expect(result.folderRelationships[0]).toEqual([0, 0]);
});
it("should parse payment records", async () => {
const result = await importer.parse(paymentsData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(2);
// Account
const cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.Card);
expect(cipher.name).toBe("John's savings account");
expect(cipher.card.brand).toBeNull();
expect(cipher.card.cardholderName).toBe("John Doe");
expect(cipher.card.number).toBe("accountNumber");
expect(cipher.card.code).toBeNull();
expect(cipher.card.expMonth).toBeNull();
expect(cipher.card.expYear).toBeNull();
expect(cipher.fields.length).toBe(4);
expect(cipher.fields[0].name).toBe("type");
expect(cipher.fields[0].value).toBe("bank");
expect(cipher.fields[1].name).toBe("routing_number");
expect(cipher.fields[1].value).toBe("routingNumber");
expect(cipher.fields[2].name).toBe("country");
expect(cipher.fields[2].value).toBe("US");
expect(cipher.fields[3].name).toBe("issuing_bank");
expect(cipher.fields[3].value).toBe("US-ALLY");
// CreditCard
const cipher2 = result.ciphers.shift();
expect(cipher2.type).toBe(CipherType.Card);
expect(cipher2.name).toBe("John Doe");
expect(cipher2.card.brand).toBe("Visa");
expect(cipher2.card.cardholderName).toBe("John Doe");
expect(cipher2.card.number).toBe("41111111111111111");
expect(cipher2.card.code).toBe("123");
expect(cipher2.card.expMonth).toBe("1");
expect(cipher2.card.expYear).toBe("2023");
expect(cipher2.fields.length).toBe(2);
expect(cipher2.fields[0].name).toBe("type");
expect(cipher2.fields[0].value).toBe("credit_card");
expect(cipher2.fields[1].name).toBe("country");
expect(cipher2.fields[1].value).toBe("US");
});
it("should parse ids records", async () => {
const result = await importer.parse(identityData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
// Type card
const cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("John Doe card");
expect(cipher.identity.fullName).toBe("John Doe");
expect(cipher.identity.firstName).toBe("John");
expect(cipher.identity.middleName).toBeNull();
expect(cipher.identity.lastName).toBe("Doe");
expect(cipher.identity.licenseNumber).toBe("123123123");
expect(cipher.fields.length).toBe(3);
expect(cipher.fields[0].name).toEqual("type");
expect(cipher.fields[0].value).toEqual("card");
expect(cipher.fields[1].name).toEqual("issue_date");
expect(cipher.fields[1].value).toEqual("2022-1-30");
expect(cipher.fields[2].name).toEqual("expiration_date");
expect(cipher.fields[2].value).toEqual("2032-1-30");
// Type passport
const cipher2 = result.ciphers.shift();
expect(cipher2.type).toBe(CipherType.Identity);
expect(cipher2.name).toBe("John Doe passport");
expect(cipher2.identity.fullName).toBe("John Doe");
expect(cipher2.identity.firstName).toBe("John");
expect(cipher2.identity.middleName).toBeNull();
expect(cipher2.identity.lastName).toBe("Doe");
expect(cipher2.identity.passportNumber).toBe("123123123");
expect(cipher2.fields.length).toBe(4);
expect(cipher2.fields[0].name).toEqual("type");
expect(cipher2.fields[0].value).toEqual("passport");
expect(cipher2.fields[1].name).toEqual("issue_date");
expect(cipher2.fields[1].value).toEqual("2022-1-30");
expect(cipher2.fields[2].name).toEqual("expiration_date");
expect(cipher2.fields[2].value).toEqual("2032-1-30");
expect(cipher2.fields[3].name).toEqual("place_of_issue");
expect(cipher2.fields[3].value).toEqual("somewhere in Germany");
// Type license
const cipher3 = result.ciphers.shift();
expect(cipher3.type).toBe(CipherType.Identity);
expect(cipher3.name).toBe("John Doe license");
expect(cipher3.identity.fullName).toBe("John Doe");
expect(cipher3.identity.firstName).toBe("John");
expect(cipher3.identity.middleName).toBeNull();
expect(cipher3.identity.lastName).toBe("Doe");
expect(cipher3.identity.licenseNumber).toBe("1234556");
expect(cipher3.identity.state).toBe("DC");
expect(cipher3.fields.length).toBe(3);
expect(cipher3.fields[0].name).toEqual("type");
expect(cipher3.fields[0].value).toEqual("license");
expect(cipher3.fields[1].name).toEqual("issue_date");
expect(cipher3.fields[1].value).toEqual("2022-8-10");
expect(cipher3.fields[2].name).toEqual("expiration_date");
expect(cipher3.fields[2].value).toEqual("2022-10-10");
// Type social_security
const cipher4 = result.ciphers.shift();
expect(cipher4.type).toBe(CipherType.Identity);
expect(cipher4.name).toBe("John Doe social_security");
expect(cipher4.identity.fullName).toBe("John Doe");
expect(cipher4.identity.firstName).toBe("John");
expect(cipher4.identity.middleName).toBeNull();
expect(cipher4.identity.lastName).toBe("Doe");
expect(cipher4.identity.ssn).toBe("123123123");
expect(cipher4.fields.length).toBe(1);
expect(cipher4.fields[0].name).toEqual("type");
expect(cipher4.fields[0].value).toEqual("social_security");
// Type tax_number
const cipher5 = result.ciphers.shift();
expect(cipher5.type).toBe(CipherType.Identity);
expect(cipher5.name).toBe("tax_number");
expect(cipher5.identity.licenseNumber).toBe("123123123");
expect(cipher5.fields.length).toBe(1);
expect(cipher5.fields[0].name).toEqual("type");
expect(cipher5.fields[0].value).toEqual("tax_number");
});
it("should parse secureNote records", async () => {
const result = await importer.parse(secureNoteData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.SecureNote);
expect(cipher.name).toBe("01");
expect(cipher.notes).toBe("test");
});
it("should parse personal information records (multiple identities)", async () => {
const result = await importer.parse(multiplePersonalInfoData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(6);
// name
const cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.SecureNote);
expect(cipher.name).toBe("MR John Doe");
expect(cipher.fields.length).toBe(7);
expect(cipher.fields[0].name).toEqual("type");
expect(cipher.fields[0].value).toEqual("name");
expect(cipher.fields[1].name).toEqual("title");
expect(cipher.fields[1].value).toEqual("MR");
expect(cipher.fields[2].name).toEqual("first_name");
expect(cipher.fields[2].value).toEqual("John");
expect(cipher.fields[3].name).toEqual("last_name");
expect(cipher.fields[3].value).toEqual("Doe");
expect(cipher.fields[4].name).toEqual("login");
expect(cipher.fields[4].value).toEqual("jdoe");
expect(cipher.fields[5].name).toEqual("date_of_birth");
expect(cipher.fields[5].value).toEqual("2022-01-30");
expect(cipher.fields[6].name).toEqual("place_of_birth");
expect(cipher.fields[6].value).toEqual("world");
// email
const cipher2 = result.ciphers.shift();
expect(cipher2.type).toBe(CipherType.SecureNote);
expect(cipher2.name).toBe("Johns email");
expect(cipher2.fields.length).toBe(4);
expect(cipher2.fields[0].name).toEqual("type");
expect(cipher2.fields[0].value).toEqual("email");
expect(cipher2.fields[1].name).toEqual("email");
expect(cipher2.fields[1].value).toEqual("jdoe@example.com");
expect(cipher2.fields[2].name).toEqual("email_type");
expect(cipher2.fields[2].value).toEqual("personal");
expect(cipher2.fields[3].name).toEqual("item_name");
expect(cipher2.fields[3].value).toEqual("Johns email");
// number
const cipher3 = result.ciphers.shift();
expect(cipher3.type).toBe(CipherType.SecureNote);
expect(cipher3.name).toBe("John's number");
expect(cipher3.fields.length).toBe(3);
expect(cipher3.fields[0].name).toEqual("type");
expect(cipher3.fields[0].value).toEqual("number");
expect(cipher3.fields[1].name).toEqual("item_name");
expect(cipher3.fields[1].value).toEqual("John's number");
expect(cipher3.fields[2].name).toEqual("phone_number");
expect(cipher3.fields[2].value).toEqual("+49123123123");
// address
const cipher4 = result.ciphers.shift();
expect(cipher4.type).toBe(CipherType.SecureNote);
expect(cipher4.name).toBe("John's home address");
expect(cipher4.fields.length).toBe(12);
expect(cipher4.fields[0].name).toEqual("type");
expect(cipher4.fields[0].value).toEqual("address");
expect(cipher4.fields[1].name).toEqual("item_name");
expect(cipher4.fields[1].value).toEqual("John's home address");
expect(cipher4.fields[2].name).toEqual("address");
expect(cipher4.fields[2].value).toEqual("1 some street");
expect(cipher4.fields[3].name).toEqual("country");
expect(cipher4.fields[3].value).toEqual("de");
expect(cipher4.fields[4].name).toEqual("state");
expect(cipher4.fields[4].value).toEqual("DE-0-NW");
expect(cipher4.fields[5].name).toEqual("city");
expect(cipher4.fields[5].value).toEqual("some city");
expect(cipher4.fields[6].name).toEqual("zip");
expect(cipher4.fields[6].value).toEqual("123123");
expect(cipher4.fields[7].name).toEqual("address_recipient");
expect(cipher4.fields[7].value).toEqual("John");
expect(cipher4.fields[8].name).toEqual("address_building");
expect(cipher4.fields[8].value).toEqual("1");
expect(cipher4.fields[9].name).toEqual("address_apartment");
expect(cipher4.fields[9].value).toEqual("1");
expect(cipher4.fields[10].name).toEqual("address_floor");
expect(cipher4.fields[10].value).toEqual("1");
expect(cipher4.fields[11].name).toEqual("address_door_code");
expect(cipher4.fields[11].value).toEqual("123");
// website
const cipher5 = result.ciphers.shift();
expect(cipher5.type).toBe(CipherType.SecureNote);
expect(cipher5.name).toBe("Website");
expect(cipher5.fields.length).toBe(3);
expect(cipher5.fields[0].name).toEqual("type");
expect(cipher5.fields[0].value).toEqual("website");
expect(cipher5.fields[1].name).toEqual("item_name");
expect(cipher5.fields[1].value).toEqual("Website");
expect(cipher5.fields[2].name).toEqual("url");
expect(cipher5.fields[2].value).toEqual("website.com");
// 2nd name/identity
const cipher6 = result.ciphers.shift();
expect(cipher6.type).toBe(CipherType.SecureNote);
expect(cipher6.name).toBe("Mrs Jane Doe");
expect(cipher6.fields.length).toBe(7);
expect(cipher6.fields[0].name).toEqual("type");
expect(cipher6.fields[0].value).toEqual("name");
expect(cipher6.fields[1].name).toEqual("title");
expect(cipher6.fields[1].value).toEqual("Mrs");
expect(cipher6.fields[2].name).toEqual("first_name");
expect(cipher6.fields[2].value).toEqual("Jane");
expect(cipher6.fields[3].name).toEqual("last_name");
expect(cipher6.fields[3].value).toEqual("Doe");
expect(cipher6.fields[4].name).toEqual("login");
expect(cipher6.fields[4].value).toEqual("jdoe");
expect(cipher6.fields[5].name).toEqual("date_of_birth");
expect(cipher6.fields[5].value).toEqual("2022-01-30");
expect(cipher6.fields[6].name).toEqual("place_of_birth");
expect(cipher6.fields[6].value).toEqual("earth");
});
it("should combine personal information records to one identity if only one identity present", async () => {
const result = await importer.parse(personalInfoData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("MR John Doe");
expect(cipher.identity.fullName).toBe("MR John Doe");
expect(cipher.identity.title).toBe("MR");
expect(cipher.identity.firstName).toBe("John");
expect(cipher.identity.middleName).toBeNull();
expect(cipher.identity.lastName).toBe("Doe");
expect(cipher.identity.username).toBe("jdoe");
expect(cipher.identity.email).toBe("jdoe@example.com");
expect(cipher.identity.phone).toBe("+49123123123");
expect(cipher.fields.length).toBe(9);
expect(cipher.fields[0].name).toBe("date_of_birth");
expect(cipher.fields[0].value).toBe("2022-01-30");
expect(cipher.fields[1].name).toBe("place_of_birth");
expect(cipher.fields[1].value).toBe("world");
expect(cipher.fields[2].name).toBe("email_type");
expect(cipher.fields[2].value).toBe("personal");
expect(cipher.fields[3].name).toBe("address_recipient");
expect(cipher.fields[3].value).toBe("John");
expect(cipher.fields[4].name).toBe("address_building");
expect(cipher.fields[4].value).toBe("1");
expect(cipher.fields[5].name).toBe("address_apartment");
expect(cipher.fields[5].value).toBe("1");
expect(cipher.fields[6].name).toBe("address_floor");
expect(cipher.fields[6].value).toBe("1");
expect(cipher.fields[7].name).toBe("address_door_code");
expect(cipher.fields[7].value).toBe("123");
expect(cipher.fields[8].name).toBe("url");
expect(cipher.fields[8].value).toBe("website.com");
});
});

View File

@@ -0,0 +1,134 @@
import { CipherType } from "@bitwarden/common/vault/enums";
import { FieldView } from "@bitwarden/common/vault/models/view/field.view";
import { creditCard } from "../spec-data/enpass-json/credit-card";
import { folders } from "../spec-data/enpass-json/folders";
import { login } from "../spec-data/enpass-json/login";
import { loginAndroidUrl } from "../spec-data/enpass-json/login-android-url";
import { note } from "../spec-data/enpass-json/note";
import { EnpassJsonImporter } from "./enpass-json-importer";
function validateCustomField(fields: FieldView[], fieldName: string, expectedValue: any) {
expect(fields).toBeDefined();
const customField = fields.find((f) => f.name === fieldName);
expect(customField).toBeDefined();
expect(customField.value).toEqual(expectedValue);
}
describe("Enpass JSON Importer", () => {
it("should create folders/ nested folder and assignment", async () => {
const importer = new EnpassJsonImporter();
const testDataString = JSON.stringify(folders);
const result = await importer.parse(testDataString);
expect(result != null).toBe(true);
expect(result.folders.length).toEqual(2);
const folder1 = result.folders.shift();
expect(folder1.name).toEqual("Social");
// Created 2 folders and Twitter is child of Social
const folder2 = result.folders.shift();
expect(folder2.name).toEqual("Social/Twitter");
// Expect that the single cipher item is assigned to sub-folder "Social/Twitter"
const folderRelationship = result.folderRelationships.shift();
expect(folderRelationship).toEqual([0, 1]);
});
it("should parse login items", async () => {
const importer = new EnpassJsonImporter();
const testDataString = JSON.stringify(login);
const result = await importer.parse(testDataString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Login);
expect(cipher.name).toEqual("Amazon");
expect(cipher.subTitle).toEqual("emily@enpass.io");
expect(cipher.favorite).toBe(true);
expect(cipher.notes).toEqual("some notes on the login item");
expect(cipher.login.username).toEqual("emily@enpass.io");
expect(cipher.login.password).toEqual("$&W:v@}4\\iRpUXVbjPdPKDGbD<xK>");
expect(cipher.login.totp).toEqual("TOTP_SEED_VALUE");
expect(cipher.login.uris.length).toEqual(1);
const uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("https://www.amazon.com");
// remaining fields as custom fields
expect(cipher.fields.length).toEqual(3);
validateCustomField(cipher.fields, "Phone number", "12345678");
validateCustomField(cipher.fields, "Security question", "SECURITY_QUESTION");
validateCustomField(cipher.fields, "Security answer", "SECURITY_ANSWER");
});
it("should parse login items with Android Autofill information", async () => {
const importer = new EnpassJsonImporter();
const testDataString = JSON.stringify(loginAndroidUrl);
const result = await importer.parse(testDataString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Login);
expect(cipher.name).toEqual("Amazon");
expect(cipher.login.uris.length).toEqual(5);
expect(cipher.login.uris[0].uri).toEqual("https://www.amazon.com");
expect(cipher.login.uris[1].uri).toEqual("androidapp://com.amazon.0");
expect(cipher.login.uris[2].uri).toEqual("androidapp://com.amazon.1");
expect(cipher.login.uris[3].uri).toEqual("androidapp://com.amazon.2");
expect(cipher.login.uris[4].uri).toEqual("androidapp://com.amazon.3");
});
it("should parse credit card items", async () => {
const importer = new EnpassJsonImporter();
const testDataString = JSON.stringify(creditCard);
const result = await importer.parse(testDataString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Card);
expect(cipher.name).toEqual("Emily Sample Credit Card");
expect(cipher.subTitle).toEqual("Amex, *10005");
expect(cipher.favorite).toBe(true);
expect(cipher.notes).toEqual("some notes on the credit card");
expect(cipher.card.cardholderName).toEqual("Emily Sample");
expect(cipher.card.number).toEqual("3782 822463 10005");
expect(cipher.card.brand).toEqual("Amex");
expect(cipher.card.code).toEqual("1234");
expect(cipher.card.expMonth).toEqual("3");
expect(cipher.card.expYear).toEqual("2023");
// remaining fields as custom fields
expect(cipher.fields.length).toEqual(9);
validateCustomField(cipher.fields, "PIN", "9874");
validateCustomField(cipher.fields, "Username", "Emily_ENP");
validateCustomField(
cipher.fields,
"Login password",
"nnn tug shoot selfish bon liars convent dusty minnow uncheck",
);
validateCustomField(cipher.fields, "Website", "http://global.americanexpress.com/");
validateCustomField(cipher.fields, "Issuing bank", "American Express");
validateCustomField(cipher.fields, "Credit limit", "100000");
validateCustomField(cipher.fields, "Withdrawal limit", "50000");
validateCustomField(cipher.fields, "Interest rate", "1.5");
validateCustomField(cipher.fields, "If lost, call", "12345678");
});
it("should parse notes", async () => {
const importer = new EnpassJsonImporter();
const testDataString = JSON.stringify(note);
const result = await importer.parse(testDataString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.SecureNote);
expect(cipher.name).toEqual("some secure note title");
expect(cipher.favorite).toBe(false);
expect(cipher.notes).toEqual("some secure note content");
});
});

View File

@@ -0,0 +1,74 @@
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view";
import { LoginView } from "@bitwarden/common/vault/models/view/login.view";
import { FirefoxCsvImporter } from "./firefox-csv-importer";
import { data as firefoxAccountsData } from "./spec-data/firefox-csv/firefox-accounts-data.csv";
import { data as simplePasswordData } from "./spec-data/firefox-csv/simple-password-data.csv";
const CipherData = [
{
title: "should parse password",
csv: simplePasswordData,
expected: Object.assign(new CipherView(), {
id: null,
organizationId: null,
folderId: null,
name: "example.com",
login: Object.assign(new LoginView(), {
username: "foo",
password: "bar",
uris: [
Object.assign(new LoginUriView(), {
uri: "https://example.com",
}),
],
}),
notes: null,
type: 1,
}),
},
{
title: 'should skip "chrome://FirefoxAccounts"',
csv: firefoxAccountsData,
expected: Object.assign(new CipherView(), {
id: null,
organizationId: null,
folderId: null,
name: "example.com",
login: Object.assign(new LoginView(), {
username: "foo",
password: "bar",
uris: [
Object.assign(new LoginUriView(), {
uri: "https://example.com",
}),
],
}),
notes: null,
type: 1,
}),
},
];
describe("Firefox CSV Importer", () => {
CipherData.forEach((data) => {
it(data.title, async () => {
const importer = new FirefoxCsvImporter();
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]);
}
}
});
});
});

View File

@@ -22,7 +22,7 @@ export { KasperskyTxtImporter } from "./kaspersky-txt-importer";
export { KeePass2XmlImporter } from "./keepass2-xml-importer";
export { KeePassXCsvImporter } from "./keepassx-csv-importer";
export { KeeperCsvImporter, KeeperJsonImporter } from "./keeper";
export { LastPassCsvImporter } from "./lastpass-csv-importer";
export { LastPassCsvImporter } from "./lastpass";
export { LogMeOnceCsvImporter } from "./logmeonce-csv-importer";
export { MeldiumCsvImporter } from "./meldium-csv-importer";
export { MSecureCsvImporter } from "./msecure-csv-importer";

View File

@@ -0,0 +1,46 @@
import { FolderView } from "@bitwarden/common/vault/models/view/folder.view";
import { KeePass2XmlImporter } from "./keepass2-xml-importer";
import {
TestData,
TestData1,
TestData2,
} from "./spec-data/keepass2-xml/keepass2-xml-importer-testdata";
describe("KeePass2 Xml Importer", () => {
it("should parse XML data", async () => {
const importer = new KeePass2XmlImporter();
const result = await importer.parse(TestData);
expect(result != null).toBe(true);
});
it("parse XML should contains folders", async () => {
const importer = new KeePass2XmlImporter();
const folder = new FolderView();
folder.name = "Folder2";
const actual = [folder];
const result = await importer.parse(TestData);
expect(result.folders).toEqual(actual);
});
it("parse XML should contains login details", async () => {
const importer = new KeePass2XmlImporter();
const result = await importer.parse(TestData);
expect(result.ciphers[0].login.uri != null).toBe(true);
expect(result.ciphers[0].login.username != null).toBe(true);
expect(result.ciphers[0].login.password != null).toBe(true);
});
it("should return error with missing root tag", async () => {
const importer = new KeePass2XmlImporter();
const result = await importer.parse(TestData1);
expect(result.errorMessage).toBe("Missing `KeePassFile > Root` node.");
});
it("should return error with missing KeePassFile tag", async () => {
const importer = new KeePass2XmlImporter();
const result = await importer.parse(TestData2);
expect(result.success).toBe(false);
});
});

View File

@@ -0,0 +1,41 @@
import { KeePassXCsvImporter } from "./keepassx-csv-importer";
import { keepassxTestData } from "./spec-data/keepassx-csv/testdata.csv";
describe("KeePassX CSV Importer", () => {
let importer: KeePassXCsvImporter;
beforeEach(() => {
importer = new KeePassXCsvImporter();
});
describe("given login data", () => {
it("should parse login data when provided valid CSV", async () => {
const result = await importer.parse(keepassxTestData);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("Example Entry");
expect(cipher.login.username).toEqual("testuser");
expect(cipher.login.password).toEqual("password123");
expect(cipher.login.uris.length).toEqual(1);
const uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("https://example.com");
expect(cipher.notes).toEqual("Some notes");
});
it("should import TOTP when present in the CSV", async () => {
const result = await importer.parse(keepassxTestData);
expect(result != null).toBe(true);
const cipher = result.ciphers.pop();
expect(cipher.name).toEqual("Another Entry");
expect(cipher.login.username).toEqual("anotheruser");
expect(cipher.login.password).toEqual("anotherpassword");
expect(cipher.login.uris.length).toEqual(1);
const uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("https://another.com");
expect(cipher.notes).toEqual("Another set of notes");
expect(cipher.login.totp).toEqual("otpauth://totp/Another?secret=ABCD1234EFGH5678");
});
});
});

View File

@@ -0,0 +1,124 @@
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { testData as TestData } from "../spec-data/keeper-csv/testdata.csv";
import { KeeperCsvImporter } from "./keeper-csv-importer";
describe("Keeper CSV Importer", () => {
let importer: KeeperCsvImporter;
beforeEach(() => {
importer = new KeeperCsvImporter();
});
it("should parse login data", async () => {
const result = await importer.parse(TestData);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("Bar");
expect(cipher.login.username).toEqual("john.doe@example.com");
expect(cipher.login.password).toEqual("1234567890abcdef");
expect(cipher.login.uris.length).toEqual(1);
const uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("https://example.com/");
expect(cipher.notes).toEqual("These are some notes.");
const cipher2 = result.ciphers.shift();
expect(cipher2.name).toEqual("Bar 1");
expect(cipher2.login.username).toEqual("john.doe1@example.com");
expect(cipher2.login.password).toEqual("234567890abcdef1");
expect(cipher2.login.uris.length).toEqual(1);
const uriView2 = cipher2.login.uris.shift();
expect(uriView2.uri).toEqual("https://an.example.com/");
expect(cipher2.notes).toBeNull();
const cipher3 = result.ciphers.shift();
expect(cipher3.name).toEqual("Bar 2");
expect(cipher3.login.username).toEqual("john.doe2@example.com");
expect(cipher3.login.password).toEqual("34567890abcdef12");
expect(cipher3.notes).toBeNull();
expect(cipher3.login.uris.length).toEqual(1);
const uriView3 = cipher3.login.uris.shift();
expect(uriView3.uri).toEqual("https://another.example.com/");
});
it("should import TOTP when present", async () => {
const result = await importer.parse(TestData);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.login.totp).toBeNull();
const cipher2 = result.ciphers.shift();
expect(cipher2.login.totp).toBeNull();
const cipher3 = result.ciphers.shift();
expect(cipher3.login.totp).toEqual(
"otpauth://totp/Amazon:me@company.com?secret=JBSWY3DPEHPK3PXP&issuer=Amazon&algorithm=SHA1&digits=6&period=30",
);
});
it("should parse custom fields", async () => {
const result = await importer.parse(TestData);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.fields).toBeNull();
const cipher2 = result.ciphers.shift();
expect(cipher2.fields.length).toBe(2);
expect(cipher2.fields[0].name).toEqual("Account ID");
expect(cipher2.fields[0].value).toEqual("12345");
expect(cipher2.fields[1].name).toEqual("Org ID");
expect(cipher2.fields[1].value).toEqual("54321");
const cipher3 = result.ciphers.shift();
expect(cipher3.fields[0].name).toEqual("Account ID");
expect(cipher3.fields[0].value).toEqual("23456");
});
it("should create folders, with subfolders and relationships", async () => {
const result = await importer.parse(TestData);
expect(result != null).toBe(true);
const folders = result.folders;
expect(folders).not.toBeNull();
expect(folders.length).toBe(2);
const folder1 = folders.shift();
expect(folder1.name).toBe("Foo");
//With subfolders
const folder2 = folders.shift();
expect(folder2.name).toBe("Foo/Baz");
// [Cipher, Folder]
expect(result.folderRelationships.length).toBe(3);
expect(result.folderRelationships[0]).toEqual([0, 0]);
expect(result.folderRelationships[1]).toEqual([1, 0]);
expect(result.folderRelationships[2]).toEqual([2, 1]);
});
it("should create collections, with subcollections and relationships", async () => {
importer.organizationId = Utils.newGuid();
const result = await importer.parse(TestData);
expect(result != null).toBe(true);
const collections = result.collections;
expect(collections).not.toBeNull();
expect(collections.length).toBe(2);
const collections1 = collections.shift();
expect(collections1.name).toBe("Foo");
//With subCollection
const collections2 = collections.shift();
expect(collections2.name).toBe("Foo/Baz");
// [Cipher, Folder]
expect(result.collectionRelationships.length).toBe(3);
expect(result.collectionRelationships[0]).toEqual([0, 0]);
expect(result.collectionRelationships[1]).toEqual([1, 0]);
expect(result.collectionRelationships[2]).toEqual([2, 1]);
});
});

View File

@@ -0,0 +1,109 @@
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { testData as TestData } from "../spec-data/keeper-json/testdata.json";
import { KeeperJsonImporter } from "./keeper-json-importer";
describe("Keeper Json Importer", () => {
const testDataJson = JSON.stringify(TestData);
let importer: KeeperJsonImporter;
beforeEach(() => {
importer = new KeeperJsonImporter();
});
it("should parse login data", async () => {
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("Bank Account 1");
expect(cipher.login.username).toEqual("customer1234");
expect(cipher.login.password).toEqual("4813fJDHF4239fdk");
expect(cipher.login.uris.length).toEqual(1);
const uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("https://chase.com");
expect(cipher.notes).toEqual("These are some notes.");
const cipher2 = result.ciphers.shift();
expect(cipher2.name).toEqual("Bank Account 2");
expect(cipher2.login.username).toEqual("mybankusername");
expect(cipher2.login.password).toEqual("w4k4k193f$^&@#*%2");
expect(cipher2.login.uris.length).toEqual(1);
const uriView2 = cipher2.login.uris.shift();
expect(uriView2.uri).toEqual("https://amex.com");
expect(cipher2.notes).toEqual("Some great information here.");
const cipher3 = result.ciphers.shift();
expect(cipher3.name).toEqual("Some Account");
expect(cipher3.login.username).toEqual("someUserName");
expect(cipher3.login.password).toEqual("w4k4k1wergf$^&@#*%2");
expect(cipher3.notes).toBeNull();
expect(cipher3.fields).toBeNull();
expect(cipher3.login.uris.length).toEqual(1);
const uriView3 = cipher3.login.uris.shift();
expect(uriView3.uri).toEqual("https://example.com");
});
it("should import TOTP when present", async () => {
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.login.totp).toBeNull();
// 2nd Cipher
const cipher2 = result.ciphers.shift();
expect(cipher2.login.totp).toEqual(
"otpauth://totp/Amazon:me@company.com?secret=JBSWY3DPEHPK3PXP&issuer=Amazon&algorithm=SHA1&digits=6&period=30",
);
});
it("should parse custom fields", async () => {
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.fields.length).toBe(1);
expect(cipher.fields[0].name).toEqual("Account Number");
expect(cipher.fields[0].value).toEqual("123-456-789");
// 2nd Cipher
const cipher2 = result.ciphers.shift();
expect(cipher2.fields.length).toBe(2);
expect(cipher2.fields[0].name).toEqual("Security Group");
expect(cipher2.fields[0].value).toEqual("Public");
expect(cipher2.fields[1].name).toEqual("IP Address");
expect(cipher2.fields[1].value).toEqual("12.45.67.8");
});
it("should create folders and assigned ciphers to them", async () => {
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
const folders = result.folders;
expect(folders.length).toBe(2);
expect(folders[0].name).toBe("Optional Private Folder 1");
expect(folders[1].name).toBe("My Customer 1");
expect(result.folderRelationships[0]).toEqual([0, 0]);
expect(result.folderRelationships[1]).toEqual([1, 0]);
expect(result.folderRelationships[2]).toEqual([1, 1]);
});
it("should create collections if part of an organization", async () => {
importer.organizationId = Utils.newGuid();
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
const collections = result.collections;
expect(collections.length).toBe(2);
expect(collections[0].name).toBe("Optional Private Folder 1");
expect(collections[1].name).toBe("My Customer 1");
expect(result.collectionRelationships[0]).toEqual([0, 0]);
expect(result.collectionRelationships[1]).toEqual([1, 0]);
expect(result.collectionRelationships[2]).toEqual([1, 1]);
});
});

View File

@@ -0,0 +1 @@
export { LastPassCsvImporter } from "./lastpass-csv-importer";

View File

@@ -0,0 +1,203 @@
import { FieldType, CipherType } from "@bitwarden/common/vault/enums";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { FieldView } from "@bitwarden/common/vault/models/view/field.view";
import { ImportResult } from "../../models/import-result";
import { LastPassCsvImporter } from "./lastpass-csv-importer";
function baseExcept(result: ImportResult) {
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
}
function expectLogin(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Login);
expect(cipher.name).toBe("example.com");
expect(cipher.notes).toBe("super secure notes");
expect(cipher.login.uri).toBe("http://example.com");
expect(cipher.login.username).toBe("someUser");
expect(cipher.login.password).toBe("myPassword");
expect(cipher.login.totp).toBe("Y64VEVMBTSXCYIWRSHRNDZW62MPGVU2G");
}
const CipherData = [
{
title: "should parse expiration date",
csv: `url,username,password,extra,name,grouping,fav
http://sn,,,"NoteType:Credit Card
Name on Card:John Doe
Type:
Number:1234567812345678
Security Code:123
Start Date:October,2017
Expiration Date:June,2020
Notes:some text
",Credit-card,,0`,
expected: Object.assign(new CipherView(), {
id: null,
organizationId: null,
folderId: null,
name: "Credit-card",
notes: "some text\n",
type: 3,
card: {
cardholderName: "John Doe",
number: "1234567812345678",
code: "123",
expYear: "2020",
expMonth: "6",
},
fields: [
Object.assign(new FieldView(), {
name: "Start Date",
value: "October,2017",
type: FieldType.Text,
}),
],
}),
},
{
title: "should parse blank card note",
csv: `url,username,password,extra,name,grouping,fav
http://sn,,,"NoteType:Credit Card
Name on Card:
Type:
Number:
Security Code:
Start Date:,
Expiration Date:,
Notes:",empty,,0`,
expected: Object.assign(new CipherView(), {
id: null,
organizationId: null,
folderId: null,
name: "empty",
notes: null,
type: 3,
card: {
expMonth: undefined,
},
fields: [
Object.assign(new FieldView(), {
name: "Start Date",
value: ",",
type: FieldType.Text,
}),
],
}),
},
{
title: "should parse card expiration date w/ no exp year",
csv: `url,username,password,extra,name,grouping,fav
http://sn,,,"NoteType:Credit Card
Name on Card:John Doe
Type:Visa
Number:1234567887654321
Security Code:321
Start Date:,
Expiration Date:January,
Notes:",noyear,,0`,
expected: Object.assign(new CipherView(), {
id: null,
organizationId: null,
folderId: null,
name: "noyear",
notes: null,
type: 3,
card: {
cardholderName: "John Doe",
number: "1234567887654321",
code: "321",
expMonth: "1",
},
fields: [
Object.assign(new FieldView(), {
name: "Type",
value: "Visa",
type: FieldType.Text,
}),
Object.assign(new FieldView(), {
name: "Start Date",
value: ",",
type: FieldType.Text,
}),
],
}),
},
{
title: "should parse card expiration date w/ no month",
csv: `url,username,password,extra,name,grouping,fav
http://sn,,,"NoteType:Credit Card
Name on Card:John Doe
Type:Mastercard
Number:8765432112345678
Security Code:987
Start Date:,
Expiration Date:,2020
Notes:",nomonth,,0`,
expected: Object.assign(new CipherView(), {
id: null,
organizationId: null,
folderId: null,
name: "nomonth",
notes: null,
type: 3,
card: {
cardholderName: "John Doe",
number: "8765432112345678",
code: "987",
expYear: "2020",
expMonth: undefined,
},
fields: [
Object.assign(new FieldView(), {
name: "Type",
value: "Mastercard",
type: FieldType.Text,
}),
Object.assign(new FieldView(), {
name: "Start Date",
value: ",",
type: FieldType.Text,
}),
],
}),
},
];
describe("Lastpass CSV Importer", () => {
CipherData.forEach((data) => {
it(data.title, async () => {
const importer = new LastPassCsvImporter();
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]);
}
}
});
});
it("should parse login with totp", async () => {
const input = `url,username,password,totp,extra,name,grouping,fav
http://example.com,someUser,myPassword,Y64VEVMBTSXCYIWRSHRNDZW62MPGVU2G,super secure notes,example.com,,0`;
const importer = new LastPassCsvImporter();
const result = await importer.parse(input);
baseExcept(result);
const cipher = result.ciphers[0];
expectLogin(cipher);
});
});

View File

@@ -8,10 +8,9 @@ import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view"
import { LoginView } from "@bitwarden/common/vault/models/view/login.view";
import { SecureNoteView } from "@bitwarden/common/vault/models/view/secure-note.view";
import { ImportResult } from "../models/import-result";
import { BaseImporter } from "./base-importer";
import { Importer } from "./importer";
import { ImportResult } from "../../models/import-result";
import { BaseImporter } from "../base-importer";
import { Importer } from "../importer";
export class LastPassCsvImporter extends BaseImporter implements Importer {
parse(data: string): Promise<ImportResult> {

View File

@@ -0,0 +1,113 @@
import { CipherType } from "@bitwarden/common/vault/enums";
import { MSecureCsvImporter } from "./msecure-csv-importer";
describe("MSecureCsvImporter.parse", () => {
let importer: MSecureCsvImporter;
beforeEach(() => {
importer = new MSecureCsvImporter();
});
it("should correctly parse credit card entries as Secret Notes", async () => {
const mockCsvData =
`myCreditCard|155089404,Credit Card,,,Card Number|12|41111111111111111,Expiration Date|11|05/2026,Security Code|9|123,Name on Card|0|John Doe,PIN|9|1234,Issuing Bank|0|Visa,Phone Number|4|,Billing Address|0|,`.trim();
const result = await importer.parse(mockCsvData);
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expect(cipher.name).toBe("myCreditCard");
expect(cipher.type).toBe(CipherType.Card);
expect(cipher.card.number).toBe("41111111111111111");
expect(cipher.card.expiration).toBe("05 / 2026");
expect(cipher.card.code).toBe("123");
expect(cipher.card.cardholderName).toBe("John Doe");
expect(cipher.card.brand).toBe("Visa");
});
it("should correctly parse login entries", async () => {
const mockCsvData = `
Bitwarden|810974637,Login,,,Website|2|bitwarden.com,Username|7|bitwarden user,Password|8|bitpassword,
`.trim();
const result = await importer.parse(mockCsvData);
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expect(cipher.name).toBe("Bitwarden");
expect(cipher.type).toBe(CipherType.Login);
expect(cipher.login.username).toBe("bitwarden user");
expect(cipher.login.password).toBe("bitpassword");
expect(cipher.login.uris[0].uri).toContain("bitwarden.com");
});
it("should correctly parse login entries with notes", async () => {
const mockCsvData =
`Example|188987444,Login,,This is a note |,Website|2|example2.com,Username|7|username || lol,Password|8|this is a password,`.trim();
const result = await importer.parse(mockCsvData);
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expect(cipher.name).toBe("Example");
expect(cipher.type).toBe(CipherType.Login);
expect(cipher.login.username).toBe("username || lol");
expect(cipher.login.password).toBe("this is a password");
expect(cipher.login.uris[0].uri).toContain("example2.com");
expect(cipher.notes).toBe("This is a note |");
});
it("should correctly parse login entries with a tag", async () => {
const mockCsvData = `
Website with a tag|1401978655,Login,tag holding it,,Website|2|johndoe.com,Username|7|JohnDoeWebsite,Password|8|JohnDoePassword,
`.trim();
const result = await importer.parse(mockCsvData);
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expect(cipher.name).toBe("Website with a tag");
expect(cipher.type).toBe(CipherType.Login);
expect(cipher.login.username).toBe("JohnDoeWebsite");
expect(cipher.login.password).toBe("JohnDoePassword");
expect(cipher.login.uris[0].uri).toContain("johndoe.com");
expect(cipher.notes).toBeNull();
expect(result.folders[0].name).toContain("tag holding it");
});
it("should handle multiple entries correctly", async () => {
const mockCsvData =
`myCreditCard|155089404,Credit Card,,,Card Number|12|41111111111111111,Expiration Date|11|05/2026,Security Code|9|123,Name on Card|0|John Doe,PIN|9|1234,Issuing Bank|0|Visa,Phone Number|4|,Billing Address|0|,
Bitwarden|810974637,Login,,,Website|2|bitwarden.com,Username|7|bitwarden user,Password|8|bitpassword,
Example|188987444,Login,,This is a note |,Website|2|example2.com,Username|7|username || lol,Password|8|this is a password,
Website with a tag|1401978655,Login,tag holding it,,Website|2|johndoe.com,Username|7|JohnDoeWebsite,Password|8|JohnDoePassword,`.trim();
const result = await importer.parse(mockCsvData);
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(4);
// Check first entry (Credit Card)
const cipher1 = result.ciphers[0];
expect(cipher1.name).toBe("myCreditCard");
expect(cipher1.type).toBe(CipherType.Card);
// Check second entry (Login - Bitwarden)
const cipher2 = result.ciphers[1];
expect(cipher2.name).toBe("Bitwarden");
expect(cipher2.type).toBe(CipherType.Login);
// Check third entry (Login with note - Example)
const cipher3 = result.ciphers[2];
expect(cipher3.name).toBe("Example");
expect(cipher3.type).toBe(CipherType.Login);
// Check fourth entry (Login with tag - Website with a tag)
const cipher4 = result.ciphers[3];
expect(cipher4.name).toBe("Website with a tag");
expect(cipher4.type).toBe(CipherType.Login);
});
});

View File

@@ -0,0 +1,633 @@
import { CipherType } from "@bitwarden/common/vault/enums";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { MykiCsvImporter } from "./myki-csv-importer";
import { userAccountData } from "./spec-data/myki-csv/user-account.csv";
import { userCreditCardData } from "./spec-data/myki-csv/user-credit-card.csv";
import { userIdCardData } from "./spec-data/myki-csv/user-id-card.csv";
import { userIdentityData } from "./spec-data/myki-csv/user-identity.csv";
import { userNoteData } from "./spec-data/myki-csv/user-note.csv";
import { userTwoFaData } from "./spec-data/myki-csv/user-twofa.csv";
function expectDriversLicense(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Joe User's nickname");
expect(cipher.notes).toBe("Additional information");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("123456");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Driver's License");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("02/02/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("02/02/2024");
}
function expectPassport(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Passport ID card");
expect(cipher.notes).toBe("Additional information field");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.passportNumber).toBe("1234567");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Passport");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
function expectSocialSecurity(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Social Security ID card");
expect(cipher.notes).toBe("Additional information field text");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.ssn).toBe("123455678");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Social Security");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
function expectIdCard(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("ID card type ID card");
expect(cipher.notes).toBe("Additional Information field text");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("1234566");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("ID Card");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
function expectTaxNumber(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Tax number ID card");
expect(cipher.notes).toBe("Additional information text field");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("12345678");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Tax Number");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
function expectBankAccount(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Bank account ID card");
expect(cipher.notes).toBe("Additional text information here");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("12344556677");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Bank Account");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
function expectInsuranceCard(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Insurance card ID card");
expect(cipher.notes).toBe("Additional information text goes here");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("123456677");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Insurance Card");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2022");
}
function expectHealthCard(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Health card Id card");
expect(cipher.notes).toBe("More info");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("1234670");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Health Card");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
function expectMembershipCard(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Membership ID card");
expect(cipher.notes).toBe("Add'l info");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("12345709");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Membership");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
function expectDatabase(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Database ID card");
expect(cipher.notes).toBe("Addin't info");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("12345089u");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Database");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
function expectOutdoorLicense(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Outdoor license ID card");
expect(cipher.notes).toBe("Additional info");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("123890090");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Outdoor License");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
function expectRewardProgram(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Reward program Id card");
expect(cipher.notes).toBe("1234890");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("12345890b");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Reward Program");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
function expectSoftwareLicense(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Software license ID card");
expect(cipher.notes).toBe(
"It seems like the fields don't change, which makes it pretty useless that they have so many ID card types.",
);
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("1234567c");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Software License");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
function expectTourVisa(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Tour visa ID card");
expect(cipher.notes).toBe("Additional Information text");
expect(cipher.identity.fullName).toBe("Joe M User");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.licenseNumber).toBe("123456lkhj");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(5);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toEqual("tags");
expect(cipher.fields[1].value).toEqual("someTag");
expect(cipher.fields[2].name).toEqual("idType");
expect(cipher.fields[2].value).toEqual("Tour Visa");
expect(cipher.fields[3].name).toEqual("idIssuanceDate");
expect(cipher.fields[3].value).toEqual("03/07/2022");
expect(cipher.fields[4].name).toEqual("idExpirationDate");
expect(cipher.fields[4].value).toEqual("03/07/2028");
}
describe("Myki CSV Importer", () => {
let importer: MykiCsvImporter;
beforeEach(() => {
importer = new MykiCsvImporter();
});
it("should parse userAccount records", async () => {
const result = await importer.parse(userAccountData);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("PasswordNickname");
expect(cipher.login.username).toEqual("user.name@email.com");
expect(cipher.login.password).toEqual("abc123");
expect(cipher.login.totp).toEqual("someTOTPSeed");
expect(cipher.login.uris.length).toEqual(1);
const uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("http://www.google.com");
expect(cipher.notes).toEqual("This is the additional information text.");
expect(cipher.fields.length).toBe(2);
expect(cipher.fields[0].name).toBe("status");
expect(cipher.fields[0].value).toBe("active");
expect(cipher.fields[1].name).toBe("tags");
expect(cipher.fields[1].value).toBe("someTag");
});
it("should parse userTwoFa records", async () => {
const result = await importer.parse(userTwoFaData);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("2FA nickname");
expect(cipher.login.username).toBeNull();
expect(cipher.login.password).toBeNull();
expect(cipher.login.totp).toBe("someTOTPSeed");
expect(cipher.notes).toEqual("Additional information field content.");
expect(cipher.fields.length).toBe(2);
expect(cipher.fields[0].name).toBe("status");
expect(cipher.fields[0].value).toBe("active");
expect(cipher.fields[1].name).toBe("tags");
expect(cipher.fields[1].value).toBe("someTag");
});
it("should parse creditCard records", async () => {
const result = await importer.parse(userCreditCardData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.Card);
expect(cipher.name).toBe("Visa test card");
expect(cipher.card.brand).toBe("Visa");
expect(cipher.card.cardholderName).toBe("Joe User");
expect(cipher.card.number).toBe("4111111111111111");
expect(cipher.card.code).toBe("222");
expect(cipher.card.expMonth).toBe("04");
expect(cipher.card.expYear).toBe("24");
expect(cipher.notes).toBe("This is the additional information field");
expect(cipher.fields.length).toBe(2);
expect(cipher.fields[0].name).toBe("status");
expect(cipher.fields[0].value).toBe("active");
expect(cipher.fields[1].name).toBe("tags");
expect(cipher.fields[1].value).toBe("someTag");
});
it("should parse identity records", async () => {
const result = await importer.parse(userIdentityData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("Joe User's nickname");
expect(cipher.identity.fullName).toBe("Mr Joe M User");
expect(cipher.identity.title).toBe("Mr");
expect(cipher.identity.firstName).toBe("Joe");
expect(cipher.identity.middleName).toBe("M");
expect(cipher.identity.lastName).toBe("User");
expect(cipher.identity.email).toBe("joe.user@email.com");
expect(cipher.identity.address1).toBe("1 Example House");
expect(cipher.identity.address2).toBe("Suite 300");
expect(cipher.identity.city).toBe("Portland");
expect(cipher.identity.postalCode).toBe("04101");
expect(cipher.identity.country).toBe("United States");
expect(cipher.fields.length).toBe(4);
expect(cipher.fields[0].name).toEqual("status");
expect(cipher.fields[0].value).toEqual("active");
expect(cipher.fields[1].name).toBe("tags");
expect(cipher.fields[1].value).toBe("someTag");
expect(cipher.fields[2].name).toEqual("gender");
expect(cipher.fields[2].value).toEqual("Male");
expect(cipher.fields[3].name).toEqual("number");
expect(cipher.fields[3].value).toEqual("2223334444");
});
it("should parse secureNote records", async () => {
const result = await importer.parse(userNoteData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.SecureNote);
expect(cipher.name).toBe("The title of a secure note");
expect(cipher.notes).toBe("The content of a secure note. Lorem ipsum, etc.");
expect(cipher.fields.length).toBe(1);
expect(cipher.fields[0].name).toBe("status");
expect(cipher.fields[0].value).toBe("active");
});
it("should parse idCard records", async () => {
const result = await importer.parse(userIdCardData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(14);
// Driver's license
const cipher = result.ciphers.shift();
expectDriversLicense(cipher);
// Passport
const cipher2 = result.ciphers.shift();
expectPassport(cipher2);
// Social Security
const cipher3 = result.ciphers.shift();
expectSocialSecurity(cipher3);
// Id Card
const cipher4 = result.ciphers.shift();
expectIdCard(cipher4);
// Tax Number
const cipher5 = result.ciphers.shift();
expectTaxNumber(cipher5);
// Bank Account
const cipher6 = result.ciphers.shift();
expectBankAccount(cipher6);
// Insurance card
const cipher7 = result.ciphers.shift();
expectInsuranceCard(cipher7);
// Health card
const cipher8 = result.ciphers.shift();
expectHealthCard(cipher8);
// Membership card
const cipher9 = result.ciphers.shift();
expectMembershipCard(cipher9);
// Database card
const cipher10 = result.ciphers.shift();
expectDatabase(cipher10);
// Outdoor license
const cipher11 = result.ciphers.shift();
expectOutdoorLicense(cipher11);
// Reward program
const cipher12 = result.ciphers.shift();
expectRewardProgram(cipher12);
// Software license
const cipher13 = result.ciphers.shift();
expectSoftwareLicense(cipher13);
// Tour visa
const cipher14 = result.ciphers.shift();
expectTourVisa(cipher14);
});
});

View File

@@ -0,0 +1,91 @@
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { credentialsData } from "../spec-data/netwrix-csv/login-export.csv";
import { NetwrixPasswordSecureCsvImporter } from "./netwrix-passwordsecure-csv-importer";
describe("Netwrix Password Secure CSV Importer", () => {
let importer: NetwrixPasswordSecureCsvImporter;
beforeEach(() => {
importer = new NetwrixPasswordSecureCsvImporter();
});
it("passing invalid data returns false", async () => {
const result = await importer.parse("");
expect(result != null).toBe(true);
expect(result.success).toBe(false);
});
it("should parse login records", async () => {
const result = await importer.parse(credentialsData);
expect(result != null).toBe(true);
let cipher = result.ciphers.shift();
expect(cipher.name).toEqual("Test Entry 1");
expect(cipher.login.username).toEqual("someUser");
expect(cipher.login.password).toEqual("somePassword");
expect(cipher.login.totp).toEqual("someTOTPSeed");
expect(cipher.login.uris.length).toEqual(1);
let uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("https://www.example.com");
expect(cipher.notes).toEqual("some note for example.com");
cipher = result.ciphers.shift();
expect(cipher.name).toEqual("Test Entry 2");
expect(cipher.login.username).toEqual("jdoe");
expect(cipher.login.password).toEqual("})9+Kg2fz_O#W1§H1-<ox>0Zio");
expect(cipher.login.totp).toEqual("anotherTOTP");
expect(cipher.login.uris.length).toEqual(1);
uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("http://www.123.com");
expect(cipher.notes).toEqual("Description123");
cipher = result.ciphers.shift();
expect(cipher.name).toEqual("Test Entry 3");
expect(cipher.login.username).toEqual("username");
expect(cipher.login.password).toEqual("password");
expect(cipher.login.totp).toBeNull();
expect(cipher.login.uris.length).toEqual(1);
uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("http://www.internetsite.com");
expect(cipher.notes).toEqual("Information");
});
it("should add any unmapped fields as custom fields", async () => {
const result = await importer.parse(credentialsData);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.fields.length).toBe(1);
const field = cipher.fields.shift();
expect(field.name).toEqual("DataTags");
expect(field.value).toEqual("tag1, tag2, tag3");
});
it("should parse an item and create a folder", async () => {
const result = await importer.parse(credentialsData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.folders.length).toBe(2);
expect(result.folders[0].name).toBe("folderOrCollection1");
expect(result.folders[1].name).toBe("folderOrCollection2");
expect(result.folderRelationships[0]).toEqual([0, 0]);
expect(result.folderRelationships[1]).toEqual([1, 1]);
expect(result.folderRelationships[2]).toEqual([2, 0]);
});
it("should parse an item and create a collection when importing into an organization", async () => {
importer.organizationId = Utils.newGuid();
const result = await importer.parse(credentialsData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.collections.length).toBe(2);
expect(result.collections[0].name).toBe("folderOrCollection1");
expect(result.collections[1].name).toBe("folderOrCollection2");
expect(result.collectionRelationships[0]).toEqual([0, 0]);
expect(result.collectionRelationships[1]).toEqual([1, 1]);
expect(result.collectionRelationships[2]).toEqual([2, 0]);
});
});

View File

@@ -0,0 +1,236 @@
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { SecureNoteType, CipherType, FieldType } from "@bitwarden/common/vault/enums";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { IdentityView } from "@bitwarden/common/vault/models/view/identity.view";
import { NordPassCsvImporter } from "./nordpass-csv-importer";
import { data as creditCardData } from "./spec-data/nordpass-csv/nordpass.card.csv";
import { data as identityData } from "./spec-data/nordpass-csv/nordpass.identity.csv";
import { data as loginDataWithAdditionalUrls } from "./spec-data/nordpass-csv/nordpass.login-with-additinal-urls.csv";
import { data as loginData } from "./spec-data/nordpass-csv/nordpass.login.csv";
import { data as secureNoteData } from "./spec-data/nordpass-csv/nordpass.secure-note.csv";
const namesTestData = [
{
title: "Given #fullName should set firstName",
fullName: "MyFirstName",
expected: Object.assign(new IdentityView(), {
firstName: "MyFirstName",
middleName: null,
lastName: null,
}),
},
{
title: "Given #fullName should set first- and lastName",
fullName: "MyFirstName MyLastName",
expected: Object.assign(new IdentityView(), {
firstName: "MyFirstName",
middleName: null,
lastName: "MyLastName",
}),
},
{
title: "Given #fullName should set first-, middle and lastName",
fullName: "MyFirstName MyMiddleName MyLastName",
expected: Object.assign(new IdentityView(), {
firstName: "MyFirstName",
middleName: "MyMiddleName",
lastName: "MyLastName",
}),
},
{
title: "Given #fullName should set first-, middle and lastName with Jr",
fullName: "MyFirstName MyMiddleName MyLastName Jr",
expected: Object.assign(new IdentityView(), {
firstName: "MyFirstName",
middleName: "MyMiddleName",
lastName: "MyLastName Jr",
}),
},
{
title: "Given #fullName should set first-, middle and lastName with Jr and III",
fullName: "MyFirstName MyMiddleName MyLastName Jr III",
expected: Object.assign(new IdentityView(), {
firstName: "MyFirstName",
middleName: "MyMiddleName",
lastName: "MyLastName Jr III",
}),
},
];
function expectLogin(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Login);
expect(cipher.name).toBe("SomeVaultItemName");
expect(cipher.notes).toBe("Some note for the VaultItem");
expect(cipher.login.uri).toBe("https://example.com");
expect(cipher.login.uris.length).toBe(1);
expect(cipher.login.uris[0].uri).toBe("https://example.com");
expect(cipher.login.username).toBe("hello@bitwarden.com");
expect(cipher.login.password).toBe("someStrongPassword");
}
function expectLoginWithAdditionalUrls(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Login);
expect(cipher.name).toBe("SomeVaultItemName");
expect(cipher.notes).toBe("Some note for the VaultItem");
expect(cipher.login.uri).toBe("https://example.com");
expect(cipher.login.uris.length).toBe(2);
expect(cipher.login.uris[0].uri).toBe("https://example.com");
expect(cipher.login.uris[1].uri).toBe("https://example.net");
expect(cipher.login.username).toBe("hello@bitwarden.com");
expect(cipher.login.password).toBe("someStrongPassword");
}
function expectCreditCard(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Card);
expect(cipher.name).toBe("SomeVisa");
expect(cipher.card.brand).toBe("Visa");
expect(cipher.card.cardholderName).toBe("SomeHolder");
expect(cipher.card.number).toBe("4024007103939509");
expect(cipher.card.code).toBe("123");
expect(cipher.card.expMonth).toBe("1");
expect(cipher.card.expYear).toBe("2022");
}
function expectIdentity(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.name).toBe("SomeTitle");
expect(cipher.identity.fullName).toBe("MyFirstName MyMiddleName MyLastName");
expect(cipher.identity.firstName).toBe("MyFirstName");
expect(cipher.identity.middleName).toBe("MyMiddleName");
expect(cipher.identity.lastName).toBe("MyLastName");
expect(cipher.identity.email).toBe("hello@bitwarden.com");
expect(cipher.identity.phone).toBe("123456789");
expect(cipher.identity.address1).toBe("Test street 123");
expect(cipher.identity.address2).toBe("additional addressinfo");
expect(cipher.identity.postalCode).toBe("123456");
expect(cipher.identity.city).toBe("Cologne");
expect(cipher.identity.state).toBe("North-Rhine-Westphalia");
expect(cipher.identity.country).toBe("GERMANY");
expect(cipher.notes).toBe("SomeNoteToMyIdentity");
}
function expectSecureNote(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.SecureNote);
expect(cipher.name).toBe("MySuperSecureNoteTitle");
expect(cipher.secureNote.type).toBe(SecureNoteType.Generic);
expect(cipher.notes).toBe("MySuperSecureNote");
}
function expectFields(cipher: CipherView) {
expect(cipher.fields.length).toBe(2);
expect(cipher.fields[0].name).toBe("textLabel");
expect(cipher.fields[0].value).toBe("text value");
expect(cipher.fields[0].type).toBe(FieldType.Text);
expect(cipher.fields[1].name).toBe("hiddenLabel");
expect(cipher.fields[1].value).toBe("hidden value");
expect(cipher.fields[1].type).toBe(FieldType.Hidden);
}
describe("NordPass CSV Importer", () => {
let importer: NordPassCsvImporter;
beforeEach(() => {
importer = new NordPassCsvImporter();
});
it("should return false when not able to parse data", async () => {
const result = await importer.parse("");
expect(result).not.toBeNull();
expect(result.success).toBe(false);
});
it("should parse login records", async () => {
const result = await importer.parse(loginData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expectLogin(cipher);
expectFields(cipher); //for custom fields
});
it("should parse login records with additinal urls", async () => {
const result = await importer.parse(loginDataWithAdditionalUrls);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expectLoginWithAdditionalUrls(cipher);
});
it("should parse credit card records", async () => {
const result = await importer.parse(creditCardData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expectCreditCard(cipher);
});
it("should parse identity records", async () => {
const result = await importer.parse(
identityData.replace("#fullName", "MyFirstName MyMiddleName MyLastName"),
);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expectIdentity(cipher);
});
namesTestData.forEach((data) => {
it(data.title.replace("#fullName", data.fullName), async () => {
const result = await importer.parse(identityData.replace("#fullName", data.fullName));
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expect(cipher.identity.firstName).toBe(data.expected.firstName);
expect(cipher.identity.middleName).toBe(data.expected.middleName);
expect(cipher.identity.lastName).toBe(data.expected.lastName);
});
});
it("should parse secureNote records", async () => {
const result = await importer.parse(secureNoteData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expectSecureNote(cipher);
});
it("should parse an item and create a folder", async () => {
const result = await importer.parse(secureNoteData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.folders.length).toBe(1);
const folder = result.folders[0];
expect(folder.name).toBe("notesFolder");
});
it("should parse an item and create a collection if organizationId is set", async () => {
importer.organizationId = Utils.newGuid();
const result = await importer.parse(secureNoteData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.collections.length).toBe(1);
const collection = result.collections[0];
expect(collection.name).toBe("notesFolder");
});
});

View File

@@ -0,0 +1,528 @@
import { FieldType } from "@bitwarden/common/vault/enums";
import { OnePassword1PifImporter } from "./onepassword-1pif-importer";
const TestData: string =
"***aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee***\n" +
JSON.stringify({
uuid: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
updatedAt: 1486071244,
securityLevel: "SL5",
contentsHash: "aaaaaaaa",
title: "Imported Entry",
location: "https://www.google.com",
secureContents: {
fields: [
{
value: "user@test.net",
id: "email-input",
name: "email",
type: "T",
designation: "username",
},
{
value: "myservicepassword",
id: "password-input",
name: "password",
type: "P",
designation: "password",
},
],
sections: [
{
fields: [
{
k: "concealed",
n: "AAAAAAAAAAAABBBBBBBBBBBCCCCCCCCC",
v: "console-password-123",
t: "console password",
},
],
title: "Admin Console",
name: "admin_console",
},
],
passwordHistory: [
{
value: "old-password",
time: 1447791421,
},
],
},
URLs: [
{
label: "website",
url: "https://www.google.com",
},
],
txTimestamp: 1508941334,
createdAt: 1390426636,
typeName: "webforms.WebForm",
});
const WindowsOpVaultTestData = JSON.stringify({
category: "001",
created: 1544823719,
hmac: "NtyBmTTPOb88HV3JUKPx1xl/vcMhac9kvCfe/NtszY0=",
k: "**REMOVED LONG LINE FOR LINTER** -Kyle",
tx: 1553395669,
updated: 1553395669,
uuid: "528AB076FB5F4FBF960884B8E01619AC",
overview: {
title: "Google",
URLs: [
{
u: "google.com",
},
],
url: "google.com",
ps: 26,
ainfo: "googluser",
},
details: {
passwordHistory: [
{
value: "oldpass1",
time: 1553394449,
},
{
value: "oldpass2",
time: 1553394457,
},
{
value: "oldpass3",
time: 1553394458,
},
{
value: "oldpass4",
time: 1553394459,
},
{
value: "oldpass5",
time: 1553394460,
},
{
value: "oldpass6",
time: 1553394461,
},
],
fields: [
{
type: "T",
id: "username",
name: "username",
value: "googluser",
designation: "username",
},
{
type: "P",
id: "password",
name: "password",
value: "12345678901",
designation: "password",
},
],
notesPlain: "This is a note\r\n\r\nline1\r\nline2",
sections: [
{
title: "test",
name: "1214FD88CD30405D9EED14BEB4D61B60",
fields: [
{
k: "string",
n: "6CC3BD77482D4559A4B8BB2D360F821B",
v: "fgfg",
t: "fgggf",
},
{
k: "concealed",
n: "5CFE7BCAA1DF4578BBF7EB508959BFF3",
v: "dfgdfgfdg",
t: "pwfield",
},
],
},
],
},
});
const IdentityTestData = JSON.stringify({
uuid: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
updatedAt: 1553365894,
securityLevel: "SL5",
contentsHash: "eeeeeeee",
title: "Test Identity",
secureContents: {
lastname: "Fritzenberger",
zip: "223344",
birthdate_dd: "11",
homephone: "+49 333 222 111",
company: "Web Inc.",
firstname: "Frank",
birthdate_mm: "3",
country: "de",
sex: "male",
sections: [
{
fields: [
{
k: "string",
inputTraits: {
autocapitalization: "Words",
},
n: "firstname",
v: "Frank",
a: {
guarded: "yes",
},
t: "first name",
},
{
k: "string",
inputTraits: {
autocapitalization: "Words",
},
n: "initial",
v: "MD",
a: {
guarded: "yes",
},
t: "initial",
},
{
k: "string",
inputTraits: {
autocapitalization: "Words",
},
n: "lastname",
v: "Fritzenberger",
a: {
guarded: "yes",
},
t: "last name",
},
{
k: "menu",
v: "male",
n: "sex",
a: {
guarded: "yes",
},
t: "sex",
},
{
k: "date",
v: 1552305660,
n: "birthdate",
a: {
guarded: "yes",
},
t: "birth date",
},
{
k: "string",
inputTraits: {
autocapitalization: "Words",
},
n: "occupation",
v: "Engineer",
a: {
guarded: "yes",
},
t: "occupation",
},
{
k: "string",
inputTraits: {
autocapitalization: "Words",
},
n: "company",
v: "Web Inc.",
a: {
guarded: "yes",
},
t: "company",
},
{
k: "string",
inputTraits: {
autocapitalization: "Words",
},
n: "department",
v: "IT",
a: {
guarded: "yes",
},
t: "department",
},
{
k: "string",
inputTraits: {
autocapitalization: "Words",
},
n: "jobtitle",
v: "Developer",
a: {
guarded: "yes",
},
t: "job title",
},
],
title: "Identification",
name: "name",
},
{
fields: [
{
k: "address",
inputTraits: {
autocapitalization: "Sentences",
},
n: "address",
v: {
street: "Mainstreet 1",
city: "Berlin",
country: "de",
zip: "223344",
},
a: {
guarded: "yes",
},
t: "address",
},
{
k: "phone",
v: "+49 001 222 333 44",
n: "defphone",
a: {
guarded: "yes",
},
t: "default phone",
},
{
k: "phone",
v: "+49 333 222 111",
n: "homephone",
a: {
guarded: "yes",
},
t: "home",
},
{
k: "phone",
n: "cellphone",
a: {
guarded: "yes",
},
t: "mobile",
},
{
k: "phone",
n: "busphone",
a: {
guarded: "yes",
},
t: "business",
},
],
title: "Address",
name: "address",
},
{
fields: [
{
k: "string",
n: "username",
a: {
guarded: "yes",
},
t: "username",
},
{
k: "string",
n: "reminderq",
t: "reminder question",
},
{
k: "string",
n: "remindera",
t: "reminder answer",
},
{
k: "string",
inputTraits: {
keyboard: "EmailAddress",
},
n: "email",
v: "test@web.de",
a: {
guarded: "yes",
},
t: "email",
},
{
k: "string",
n: "website",
inputTraits: {
keyboard: "URL",
},
t: "website",
},
{
k: "string",
n: "icq",
t: "ICQ",
},
{
k: "string",
n: "skype",
t: "skype",
},
{
k: "string",
n: "aim",
t: "AOL/AIM",
},
{
k: "string",
n: "yahoo",
t: "Yahoo",
},
{
k: "string",
n: "msn",
t: "MSN",
},
{
k: "string",
n: "forumsig",
t: "forum signature",
},
],
title: "Internet Details",
name: "internet",
},
{
title: "Related Items",
name: "linked items",
},
],
initial: "MD",
address1: "Mainstreet 1",
city: "Berlin",
jobtitle: "Developer",
occupation: "Engineer",
department: "IT",
email: "test@web.de",
birthdate_yy: "2019",
homephone_local: "+49 333 222 111",
defphone_local: "+49 001 222 333 44",
defphone: "+49 001 222 333 44",
},
txTimestamp: 1553365894,
createdAt: 1553364679,
typeName: "identities.Identity",
});
describe("1Password 1Pif Importer", () => {
it("should parse data", async () => {
const importer = new OnePassword1PifImporter();
const result = await importer.parse(TestData);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.login.username).toEqual("user@test.net");
expect(cipher.login.password).toEqual("myservicepassword");
expect(cipher.login.uris.length).toEqual(1);
const uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("https://www.google.com");
});
it('should create concealed field as "hidden" type', async () => {
const importer = new OnePassword1PifImporter();
const result = await importer.parse(TestData);
expect(result != null).toBe(true);
const ciphers = result.ciphers;
expect(ciphers.length).toEqual(1);
const cipher = ciphers.shift();
const fields = cipher.fields;
expect(fields.length).toEqual(1);
const field = fields.shift();
expect(field.name).toEqual("console password");
expect(field.value).toEqual("console-password-123");
expect(field.type).toEqual(FieldType.Hidden);
});
it("should create identity records", async () => {
const importer = new OnePassword1PifImporter();
const result = await importer.parse(IdentityTestData);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("Test Identity");
const identity = cipher.identity;
expect(identity.firstName).toEqual("Frank");
expect(identity.middleName).toEqual("MD");
expect(identity.lastName).toEqual("Fritzenberger");
expect(identity.company).toEqual("Web Inc.");
expect(identity.address1).toEqual("Mainstreet 1");
expect(identity.country).toEqual("DE");
expect(identity.city).toEqual("Berlin");
expect(identity.postalCode).toEqual("223344");
expect(identity.phone).toEqual("+49 001 222 333 44");
expect(identity.email).toEqual("test@web.de");
// remaining fields as custom fields
expect(cipher.fields.length).toEqual(6);
const fields = cipher.fields;
expect(fields[0].name).toEqual("sex");
expect(fields[0].value).toEqual("male");
expect(fields[1].name).toEqual("birth date");
expect(fields[1].value).toEqual("Mon, 11 Mar 2019 12:01:00 GMT");
expect(fields[2].name).toEqual("occupation");
expect(fields[2].value).toEqual("Engineer");
expect(fields[3].name).toEqual("department");
expect(fields[3].value).toEqual("IT");
expect(fields[4].name).toEqual("job title");
expect(fields[4].value).toEqual("Developer");
expect(fields[5].name).toEqual("home");
expect(fields[5].value).toEqual("+49 333 222 111");
});
it("should create password history", async () => {
const importer = new OnePassword1PifImporter();
const result = await importer.parse(TestData);
const cipher = result.ciphers.shift();
expect(cipher.passwordHistory.length).toEqual(1);
const ph = cipher.passwordHistory.shift();
expect(ph.password).toEqual("old-password");
expect(ph.lastUsedDate.toISOString()).toEqual("2015-11-17T20:17:01.000Z");
});
it("should create password history from windows opvault 1pif format", async () => {
const importer = new OnePassword1PifImporter();
const result = await importer.parse(WindowsOpVaultTestData);
const cipher = result.ciphers.shift();
expect(cipher.passwordHistory.length).toEqual(5);
let ph = cipher.passwordHistory.shift();
expect(ph.password).toEqual("oldpass6");
expect(ph.lastUsedDate.toISOString()).toEqual("2019-03-24T02:27:41.000Z");
ph = cipher.passwordHistory.shift();
expect(ph.password).toEqual("oldpass5");
expect(ph.lastUsedDate.toISOString()).toEqual("2019-03-24T02:27:40.000Z");
ph = cipher.passwordHistory.shift();
expect(ph.password).toEqual("oldpass4");
expect(ph.lastUsedDate.toISOString()).toEqual("2019-03-24T02:27:39.000Z");
ph = cipher.passwordHistory.shift();
expect(ph.password).toEqual("oldpass3");
expect(ph.lastUsedDate.toISOString()).toEqual("2019-03-24T02:27:38.000Z");
ph = cipher.passwordHistory.shift();
expect(ph.password).toEqual("oldpass2");
expect(ph.lastUsedDate.toISOString()).toEqual("2019-03-24T02:27:37.000Z");
});
});

View File

@@ -0,0 +1,706 @@
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { FieldType, SecureNoteType, CipherType } from "@bitwarden/common/vault/enums";
import { FieldView } from "@bitwarden/common/vault/models/view/field.view";
import { APICredentialsData } from "../spec-data/onepassword-1pux/api-credentials";
import { BankAccountData } from "../spec-data/onepassword-1pux/bank-account";
import { CreditCardData } from "../spec-data/onepassword-1pux/credit-card";
import { DatabaseData } from "../spec-data/onepassword-1pux/database";
import { DriversLicenseData } from "../spec-data/onepassword-1pux/drivers-license";
import { EmailAccountData } from "../spec-data/onepassword-1pux/email-account";
import { EmailFieldData } from "../spec-data/onepassword-1pux/email-field";
import { EmailFieldOnIdentityData } from "../spec-data/onepassword-1pux/email-field-on-identity";
import { EmailFieldOnIdentityPrefilledData } from "../spec-data/onepassword-1pux/email-field-on-identity_prefilled";
import { IdentityData } from "../spec-data/onepassword-1pux/identity-data";
import { LoginData } from "../spec-data/onepassword-1pux/login-data";
import { MedicalRecordData } from "../spec-data/onepassword-1pux/medical-record";
import { MembershipData } from "../spec-data/onepassword-1pux/membership";
import { OnePuxExampleFile } from "../spec-data/onepassword-1pux/onepux_example";
import { OutdoorLicenseData } from "../spec-data/onepassword-1pux/outdoor-license";
import { PassportData } from "../spec-data/onepassword-1pux/passport";
import { PasswordData } from "../spec-data/onepassword-1pux/password";
import { RewardsProgramData } from "../spec-data/onepassword-1pux/rewards-program";
import { SanitizedExport } from "../spec-data/onepassword-1pux/sanitized-export";
import { SecureNoteData } from "../spec-data/onepassword-1pux/secure-note";
import { ServerData } from "../spec-data/onepassword-1pux/server";
import { SoftwareLicenseData } from "../spec-data/onepassword-1pux/software-license";
import { SSNData } from "../spec-data/onepassword-1pux/ssn";
import { WirelessRouterData } from "../spec-data/onepassword-1pux/wireless-router";
import { OnePassword1PuxImporter } from "./onepassword-1pux-importer";
function validateCustomField(fields: FieldView[], fieldName: string, expectedValue: any) {
expect(fields).toBeDefined();
const customField = fields.find((f) => f.name === fieldName);
expect(customField).toBeDefined();
expect(customField.value).toEqual(expectedValue);
}
function validateDuplicateCustomField(
fields: FieldView[],
fieldName: string,
expectedValues: string[],
) {
expect(fields).toBeDefined();
const customFieldValues = fields.filter((f) => f.name === fieldName).map((v) => v.value);
expect(customFieldValues).toEqual(expectedValues);
}
describe("1Password 1Pux Importer", () => {
const OnePuxExampleFileJson = JSON.stringify(OnePuxExampleFile);
const LoginDataJson = JSON.stringify(LoginData);
const CreditCardDataJson = JSON.stringify(CreditCardData);
const IdentityDataJson = JSON.stringify(IdentityData);
const SecureNoteDataJson = JSON.stringify(SecureNoteData);
const SanitizedExportJson = JSON.stringify(SanitizedExport);
it("should not import items with state 'archived'", async () => {
const importer = new OnePassword1PuxImporter();
const archivedLoginData = LoginData;
archivedLoginData["accounts"][0]["vaults"][0]["items"][0]["state"] = "archived";
const archivedDataJson = JSON.stringify(archivedLoginData);
const result = await importer.parse(archivedDataJson);
expect(result != null).toBe(true);
expect(result.ciphers.length).toBe(0);
});
it("should parse login data", async () => {
const importer = new OnePassword1PuxImporter();
const result = await importer.parse(LoginDataJson);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Login);
expect(cipher.name).toEqual("eToro");
expect(cipher.login.username).toEqual("username123123123@gmail.com");
expect(cipher.login.password).toEqual("password!");
expect(cipher.login.uris.length).toEqual(1);
expect(cipher.login.uri).toEqual("https://www.fakesite.com");
expect(cipher.login.totp).toEqual("otpseed777");
// remaining fields as custom fields
expect(cipher.fields.length).toEqual(3);
validateCustomField(cipher.fields, "terms", "false");
validateCustomField(cipher.fields, "policies", "true");
validateCustomField(cipher.fields, "Create an account", "username123123");
});
it("should parse notes", async () => {
const importer = new OnePassword1PuxImporter();
const result = await importer.parse(OnePuxExampleFileJson);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.notes).toEqual("This is a note. *bold*! _italic_!");
});
it("should set favourite if favIndex equals 1", async () => {
const importer = new OnePassword1PuxImporter();
const result = await importer.parse(OnePuxExampleFileJson);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.favorite).toBe(true);
});
it("should handle custom boolean fields", async () => {
const importer = new OnePassword1PuxImporter();
const result = await importer.parse(LoginDataJson);
expect(result != null).toBe(true);
const ciphers = result.ciphers;
expect(ciphers.length).toEqual(1);
const cipher = ciphers.shift();
expect(cipher.fields[0].name).toEqual("terms");
expect(cipher.fields[0].value).toEqual("false");
expect(cipher.fields[0].type).toBe(FieldType.Boolean);
expect(cipher.fields[1].name).toEqual("policies");
expect(cipher.fields[1].value).toEqual("true");
expect(cipher.fields[1].type).toBe(FieldType.Boolean);
});
it("should add fields of type email as custom fields", async () => {
const importer = new OnePassword1PuxImporter();
const EmailFieldDataJson = JSON.stringify(EmailFieldData);
const result = await importer.parse(EmailFieldDataJson);
expect(result != null).toBe(true);
const ciphers = result.ciphers;
expect(ciphers.length).toEqual(1);
const cipher = ciphers.shift();
expect(cipher.fields[0].name).toEqual("registered email");
expect(cipher.fields[0].value).toEqual("kriddler@nullvalue.test");
expect(cipher.fields[0].type).toBe(FieldType.Text);
expect(cipher.fields[1].name).toEqual("provider");
expect(cipher.fields[1].value).toEqual("myEmailProvider");
expect(cipher.fields[1].type).toBe(FieldType.Text);
});
it('should create concealed field as "hidden" type', async () => {
const importer = new OnePassword1PuxImporter();
const result = await importer.parse(OnePuxExampleFileJson);
expect(result != null).toBe(true);
const ciphers = result.ciphers;
expect(ciphers.length).toEqual(1);
const cipher = ciphers.shift();
const fields = cipher.fields;
expect(fields.length).toEqual(1);
const field = fields.shift();
expect(field.name).toEqual("PIN");
expect(field.value).toEqual("12345");
expect(field.type).toEqual(FieldType.Hidden);
});
it("should create password history", async () => {
const importer = new OnePassword1PuxImporter();
const result = await importer.parse(OnePuxExampleFileJson);
const cipher = result.ciphers.shift();
expect(cipher.passwordHistory.length).toEqual(1);
const ph = cipher.passwordHistory.shift();
expect(ph.password).toEqual("12345password");
expect(ph.lastUsedDate.toISOString()).toEqual("2016-03-18T17:32:35.000Z");
});
it("should create credit card records", async () => {
const importer = new OnePassword1PuxImporter();
const result = await importer.parse(CreditCardDataJson);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("Parent's Credit Card");
expect(cipher.notes).toEqual("My parents' credit card.");
const card = cipher.card;
expect(card.cardholderName).toEqual("Fred Engels");
expect(card.number).toEqual("6011111111111117");
expect(card.code).toEqual("1312");
expect(card.brand).toEqual("Discover");
expect(card.expMonth).toEqual("12");
expect(card.expYear).toEqual("2099");
// remaining fields as custom fields
expect(cipher.fields.length).toEqual(12);
validateCustomField(cipher.fields, "", "card");
validateCustomField(cipher.fields, "cash withdrawal limit", "$500");
validateCustomField(cipher.fields, "credit limit", "$1312");
validateCustomField(cipher.fields, "valid from", "200101");
validateCustomField(cipher.fields, "issuing bank", "Some bank");
validateCustomField(cipher.fields, "phone (local)", "123456");
validateCustomField(cipher.fields, "phone (toll free)", "0800123456");
validateCustomField(cipher.fields, "phone (intl)", "+49123456");
validateCustomField(cipher.fields, "website", "somebank.com");
validateCustomField(cipher.fields, "PIN", "1234");
validateCustomField(cipher.fields, "interest rate", "1%");
validateCustomField(cipher.fields, "issue number", "123456");
});
it("should create identity records", async () => {
const importer = new OnePassword1PuxImporter();
const result = await importer.parse(IdentityDataJson);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("George Engels");
const identity = cipher.identity;
expect(identity.firstName).toEqual("George");
expect(identity.middleName).toEqual("S");
expect(identity.lastName).toEqual("Engels");
expect(identity.company).toEqual("Acme Inc.");
expect(identity.address1).toEqual("1312 Main St.");
expect(identity.country).toEqual("US");
expect(identity.state).toEqual("California");
expect(identity.city).toEqual("Atlantis");
expect(identity.postalCode).toEqual("90210");
expect(identity.phone).toEqual("4565555555");
expect(identity.email).toEqual("gengels@nullvalue.test");
expect(identity.username).toEqual("gengels");
// remaining fields as custom fields
expect(cipher.fields.length).toEqual(17);
validateCustomField(cipher.fields, "sex", "male");
validateCustomField(cipher.fields, "birth date", "Thu, 01 Jan 1981 12:01:00 GMT");
validateCustomField(cipher.fields, "occupation", "Steel Worker");
validateCustomField(cipher.fields, "department", "QA");
validateCustomField(cipher.fields, "job title", "Quality Assurance Manager");
validateCustomField(cipher.fields, "home", "4575555555");
validateCustomField(cipher.fields, "cell", "4585555555");
validateCustomField(cipher.fields, "business", "4595555555");
validateCustomField(cipher.fields, "reminder question", "Who's a super cool guy?");
validateCustomField(cipher.fields, "reminder answer", "Me, buddy.");
validateCustomField(cipher.fields, "website", "cv.gengels.nullvalue.test");
validateCustomField(cipher.fields, "ICQ", "12345678");
validateCustomField(cipher.fields, "skype", "skypeisbad1619");
validateCustomField(cipher.fields, "AOL/AIM", "aollol@lololol.aol.com");
validateCustomField(cipher.fields, "Yahoo", "sk8rboi13@yah00.com");
validateCustomField(cipher.fields, "MSN", "msnothankyou@msn&m&m.com");
validateCustomField(cipher.fields, "forum signature", "super cool guy");
});
it("emails fields on identity types should be added to the identity email field", async () => {
const importer = new OnePassword1PuxImporter();
const EmailFieldOnIdentityDataJson = JSON.stringify(EmailFieldOnIdentityData);
const result = await importer.parse(EmailFieldOnIdentityDataJson);
expect(result != null).toBe(true);
const ciphers = result.ciphers;
expect(ciphers.length).toEqual(1);
const cipher = ciphers.shift();
const identity = cipher.identity;
expect(identity.email).toEqual("gengels@nullvalue.test");
expect(cipher.fields[0].name).toEqual("provider");
expect(cipher.fields[0].value).toEqual("myEmailProvider");
expect(cipher.fields[0].type).toBe(FieldType.Text);
});
it("emails fields on identity types should be added to custom fields if identity.email has been filled", async () => {
const importer = new OnePassword1PuxImporter();
const EmailFieldOnIdentityPrefilledDataJson = JSON.stringify(EmailFieldOnIdentityPrefilledData);
const result = await importer.parse(EmailFieldOnIdentityPrefilledDataJson);
expect(result != null).toBe(true);
const ciphers = result.ciphers;
expect(ciphers.length).toEqual(1);
const cipher = ciphers.shift();
const identity = cipher.identity;
expect(identity.email).toEqual("gengels@nullvalue.test");
expect(cipher.fields[0].name).toEqual("2nd email");
expect(cipher.fields[0].value).toEqual("kriddler@nullvalue.test");
expect(cipher.fields[0].type).toBe(FieldType.Text);
expect(cipher.fields[1].name).toEqual("provider");
expect(cipher.fields[1].value).toEqual("myEmailProvider");
expect(cipher.fields[1].type).toBe(FieldType.Text);
});
it("should parse category 005 - Password (Legacy)", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(PasswordData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Login);
expect(cipher.name).toEqual("SuperSecret Password");
expect(cipher.notes).toEqual("SuperSecret Password Notes");
expect(cipher.login.password).toEqual("GBq[AGb]4*Si3tjwuab^");
expect(cipher.login.uri).toEqual("https://n0t.y0ur.n0rm4l.w3bs1t3");
});
it("should parse category 100 - SoftwareLicense", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(SoftwareLicenseData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.SecureNote);
expect(cipher.name).toEqual("Limux Product Key");
expect(cipher.notes).toEqual("My Software License");
expect(cipher.fields.length).toEqual(13);
validateCustomField(cipher.fields, "version", "5.10.1000");
validateCustomField(cipher.fields, "license key", "265453-13457355-847327");
validateCustomField(cipher.fields, "licensed to", "Kay Riddler");
validateCustomField(cipher.fields, "registered email", "kriddler@nullvalue.test");
validateCustomField(cipher.fields, "company", "Riddles and Jigsaw Puzzles GmbH");
validateCustomField(
cipher.fields,
"download page",
"https://limuxcompany.nullvalue.test/5.10.1000/isos",
);
validateCustomField(cipher.fields, "publisher", "Limux Software and Hardware");
validateCustomField(cipher.fields, "website", "https://limuxcompany.nullvalue.test/");
validateCustomField(cipher.fields, "retail price", "$999");
validateCustomField(cipher.fields, "support email", "support@nullvalue.test");
validateCustomField(cipher.fields, "purchase date", "Thu, 01 Apr 2021 12:01:00 GMT");
validateCustomField(cipher.fields, "order number", "594839");
validateCustomField(cipher.fields, "order total", "$1086.59");
});
it("should parse category 101 - BankAccount", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(BankAccountData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Card);
expect(cipher.name).toEqual("Bank Account");
expect(cipher.notes).toEqual("My Bank Account");
expect(cipher.card.cardholderName).toEqual("Cool Guy");
expect(cipher.fields.length).toEqual(9);
validateCustomField(cipher.fields, "bank name", "Super Credit Union");
validateCustomField(cipher.fields, "type", "checking");
validateCustomField(cipher.fields, "routing number", "111000999");
validateCustomField(cipher.fields, "account number", "192837465918273645");
validateCustomField(cipher.fields, "SWIFT", "123456");
validateCustomField(cipher.fields, "IBAN", "DE12 123456");
validateCustomField(cipher.fields, "PIN", "5555");
validateCustomField(cipher.fields, "phone", "9399399933");
validateCustomField(cipher.fields, "address", "1 Fifth Avenue");
});
it("should parse category 102 - Database", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(DatabaseData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Login);
expect(cipher.name).toEqual("Database");
expect(cipher.notes).toEqual("My Database");
const login = cipher.login;
expect(login.username).toEqual("cooldbuser");
expect(login.password).toEqual("^+kTjhLaN7wVPAhGU)*J");
expect(cipher.fields.length).toEqual(7);
validateCustomField(cipher.fields, "type", "postgresql");
validateCustomField(cipher.fields, "server", "my.secret.db.server");
validateCustomField(cipher.fields, "port", "1337");
validateCustomField(cipher.fields, "database", "user_database");
validateCustomField(cipher.fields, "SID", "ASDIUFU-283234");
validateCustomField(cipher.fields, "alias", "cdbu");
validateCustomField(cipher.fields, "connection options", "ssh");
});
it("should parse category 103 - Drivers license", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(DriversLicenseData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("Michael Scarn");
expect(cipher.subTitle).toEqual("Michael Scarn");
expect(cipher.notes).toEqual("My Driver's License");
const identity = cipher.identity;
expect(identity.firstName).toEqual("Michael");
expect(identity.middleName).toBeNull();
expect(identity.lastName).toEqual("Scarn");
expect(identity.address1).toEqual("2120 Mifflin Rd.");
expect(identity.state).toEqual("Pennsylvania");
expect(identity.country).toEqual("United States");
expect(identity.licenseNumber).toEqual("12345678901");
expect(cipher.fields.length).toEqual(6);
validateCustomField(cipher.fields, "date of birth", "Sun, 01 Jan 1978 12:01:00 GMT");
validateCustomField(cipher.fields, "sex", "male");
validateCustomField(cipher.fields, "height", "5'11\"");
validateCustomField(cipher.fields, "license class", "C");
validateCustomField(cipher.fields, "conditions / restrictions", "B");
validateCustomField(cipher.fields, "expiry date", "203012");
});
it("should parse category 104 - Outdoor License", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(OutdoorLicenseData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Identity);
expect(cipher.name).toEqual("Harvest License");
expect(cipher.subTitle).toEqual("Cash Bandit");
expect(cipher.notes).toEqual("My Outdoor License");
const identity = cipher.identity;
expect(identity.firstName).toEqual("Cash");
expect(identity.middleName).toBeNull();
expect(identity.lastName).toEqual("Bandit");
expect(identity.state).toEqual("Washington");
expect(identity.country).toEqual("United States of America");
expect(cipher.fields.length).toEqual(4);
validateCustomField(cipher.fields, "valid from", "Thu, 01 Apr 2021 12:01:00 GMT");
validateCustomField(cipher.fields, "expires", "Fri, 01 Apr 2044 12:01:00 GMT");
validateCustomField(cipher.fields, "approved wildlife", "Bananas,blueberries,corn");
validateCustomField(cipher.fields, "maximum quota", "100/each");
});
it("should parse category 105 - Membership", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(MembershipData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Identity);
expect(cipher.name).toEqual("Library Card");
const identity = cipher.identity;
expect(identity.firstName).toEqual("George");
expect(identity.middleName).toBeNull();
expect(identity.lastName).toEqual("Engels");
expect(identity.company).toEqual("National Public Library");
expect(identity.phone).toEqual("9995555555");
expect(cipher.fields.length).toEqual(5);
validateCustomField(cipher.fields, "website", "https://npl.nullvalue.gov.test");
validateCustomField(cipher.fields, "member since", "199901");
validateCustomField(cipher.fields, "expiry date", "203412");
validateCustomField(cipher.fields, "member ID", "64783862");
validateCustomField(cipher.fields, "PIN", "19191");
});
it("should parse category 106 - Passport", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(PassportData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Identity);
expect(cipher.name).toEqual("Mr. Globewide");
const identity = cipher.identity;
expect(identity.firstName).toEqual("David");
expect(identity.middleName).toBeNull();
expect(identity.lastName).toEqual("Global");
expect(identity.passportNumber).toEqual("76436847");
expect(cipher.fields.length).toEqual(8);
validateCustomField(cipher.fields, "type", "US Passport");
validateCustomField(cipher.fields, "sex", "female");
validateCustomField(cipher.fields, "nationality", "International");
validateCustomField(cipher.fields, "issuing authority", "Department of State");
validateCustomField(cipher.fields, "date of birth", "Fri, 01 Apr 1983 12:01:00 GMT");
validateCustomField(cipher.fields, "place of birth", "A cave somewhere in Maine");
validateCustomField(cipher.fields, "issued on", "Wed, 01 Jan 2020 12:01:00 GMT");
validateCustomField(cipher.fields, "expiry date", "Sat, 01 Jan 2050 12:01:00 GMT");
});
it("should parse category 107 - RewardsProgram", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(RewardsProgramData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Identity);
expect(cipher.name).toEqual("Retail Reward Thing");
const identity = cipher.identity;
expect(identity.firstName).toEqual("Chef");
expect(identity.middleName).toBeNull();
expect(identity.lastName).toEqual("Coldroom");
expect(identity.company).toEqual("Super Cool Store Co.");
expect(cipher.fields.length).toEqual(7);
validateCustomField(cipher.fields, "member ID", "member-29813569");
validateCustomField(cipher.fields, "PIN", "99913");
validateCustomField(cipher.fields, "member ID (additional)", "additional member id");
validateCustomField(cipher.fields, "member since", "202101");
validateCustomField(cipher.fields, "customer service phone", "123456");
validateCustomField(cipher.fields, "phone for reservations", "123456");
validateCustomField(cipher.fields, "website", "supercoolstore.com");
});
it("should parse category 108 - SSN", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(SSNData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("SSN");
const identity = cipher.identity;
expect(identity.firstName).toEqual("Jack");
expect(identity.middleName).toBeNull();
expect(identity.lastName).toEqual("Judd");
expect(identity.ssn).toEqual("131-216-1900");
});
it("should parse category 109 - WirelessRouter", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(WirelessRouterData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.SecureNote);
expect(cipher.name).toEqual("Wireless Router");
expect(cipher.notes).toEqual("My Wifi Router Config");
expect(cipher.fields.length).toEqual(8);
validateCustomField(cipher.fields, "base station name", "pixel 2Xl");
validateCustomField(cipher.fields, "base station password", "BqatGTVQ9TCN72tLbjrsHqkb");
validateCustomField(cipher.fields, "server / ip address", "127.0.0.1");
validateCustomField(cipher.fields, "airport id", "some airportId");
validateCustomField(cipher.fields, "network name", "some network name");
validateCustomField(cipher.fields, "wireless security", "WPA");
validateCustomField(cipher.fields, "wireless network password", "wifipassword");
validateCustomField(cipher.fields, "attached storage password", "diskpassword");
});
it("should parse category 110 - Server", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(ServerData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Login);
expect(cipher.name).toEqual("Super Cool Server");
expect(cipher.notes).toEqual("My Server");
expect(cipher.login.username).toEqual("frankly-notsure");
expect(cipher.login.password).toEqual("*&YHJI87yjy78u");
expect(cipher.login.uri).toEqual("https://coolserver.nullvalue.test");
expect(cipher.fields.length).toEqual(7);
validateCustomField(
cipher.fields,
"admin console URL",
"https://coolserver.nullvalue.test/admin",
);
validateCustomField(cipher.fields, "admin console username", "frankly-idontknowwhatimdoing");
validateCustomField(cipher.fields, "console password", "^%RY&^YUiju8iUYHJI(U");
validateCustomField(cipher.fields, "name", "Private Hosting Provider Inc.");
validateCustomField(cipher.fields, "website", "https://phpi.nullvalue.test");
validateCustomField(cipher.fields, "support URL", "https://phpi.nullvalue.test/support");
validateCustomField(cipher.fields, "support phone", "8882569382");
});
it("should parse category 111 - EmailAccount", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(EmailAccountData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.SecureNote);
expect(cipher.name).toEqual("Email Config");
expect(cipher.notes).toEqual("My Email Config");
expect(cipher.fields.length).toEqual(17);
validateDuplicateCustomField(cipher.fields, "port number", ["587", "589"]);
validateDuplicateCustomField(cipher.fields, "auth method", ["kerberos_v5", "password"]);
validateDuplicateCustomField(cipher.fields, "username", [
"someuser@nullvalue.test",
"someuser@nullvalue.test",
]);
validateDuplicateCustomField(cipher.fields, "password", [
"u1jsf<UI*&YU&^T",
"(*1674%^UIUJ*UI(IUI8u98uyy",
]);
validateDuplicateCustomField(cipher.fields, "security", ["TLS", "TLS"]);
validateCustomField(cipher.fields, "type", "either");
validateCustomField(cipher.fields, "server", "mailserver.nullvalue.test");
validateCustomField(cipher.fields, "SMTP server", "mailserver.nullvalue.test");
validateCustomField(cipher.fields, "provider", "Telum");
validateCustomField(cipher.fields, "provider's website", "https://telum.nullvalue.test");
validateCustomField(cipher.fields, "phone (local)", "2346666666");
validateCustomField(cipher.fields, "phone (toll free)", "18005557777");
});
it("should parse category 112 - API Credentials", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(APICredentialsData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Login);
expect(cipher.name).toEqual("API Credential");
expect(cipher.notes).toEqual("My API Credential");
expect(cipher.login.username).toEqual("apiuser@nullvalue.test");
expect(cipher.login.password).toEqual("apiapiapiapiapiapiappy");
expect(cipher.login.uri).toEqual("http://not.your.everyday.hostname");
expect(cipher.fields.length).toEqual(4);
validateCustomField(cipher.fields, "type", "jwt");
validateCustomField(cipher.fields, "filename", "filename.jwt");
validateCustomField(cipher.fields, "valid from", "Mon, 04 Apr 2011 12:01:00 GMT");
validateCustomField(cipher.fields, "expires", "Tue, 01 Apr 2031 12:01:00 GMT");
});
it("should create secure notes", async () => {
const importer = new OnePassword1PuxImporter();
const result = await importer.parse(SecureNoteDataJson);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("Secure Note #1");
expect(cipher.notes).toEqual(
"This is my secure note. \n\nLorem ipsum expecto patronum. \nThe quick brown fox jumped over the lazy dog.",
);
expect(cipher.secureNote.type).toEqual(SecureNoteType.Generic);
});
it("should parse category 113 - Medical Record", async () => {
const importer = new OnePassword1PuxImporter();
const jsonString = JSON.stringify(MedicalRecordData);
const result = await importer.parse(jsonString);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.SecureNote);
expect(cipher.name).toEqual("Some Health Record");
expect(cipher.notes).toEqual("Some notes about my medical history");
expect(cipher.secureNote.type).toEqual(SecureNoteType.Generic);
expect(cipher.fields.length).toEqual(8);
validateCustomField(cipher.fields, "date", "Sat, 01 Jan 2022 12:01:00 GMT");
validateCustomField(cipher.fields, "location", "some hospital/clinic");
validateCustomField(cipher.fields, "healthcare professional", "Some Doctor");
validateCustomField(cipher.fields, "patient", "Me");
validateCustomField(cipher.fields, "reason for visit", "unwell");
validateCustomField(cipher.fields, "medication", "Insuline");
validateCustomField(cipher.fields, "dosage", "1");
validateCustomField(cipher.fields, "medication notes", "multiple times a day");
});
it("should create folders", async () => {
const importer = new OnePassword1PuxImporter();
const result = await importer.parse(SanitizedExportJson);
expect(result != null).toBe(true);
const folders = result.folders;
expect(folders.length).toBe(5);
expect(folders[0].name).toBe("Movies");
expect(folders[1].name).toBe("Finance");
expect(folders[2].name).toBe("Travel");
expect(folders[3].name).toBe("Education");
expect(folders[4].name).toBe("Starter Kit");
// Check that ciphers have a folder assigned to them
expect(result.ciphers.filter((c) => c.folderId === folders[0].id).length).toBeGreaterThan(0);
expect(result.ciphers.filter((c) => c.folderId === folders[1].id).length).toBeGreaterThan(0);
expect(result.ciphers.filter((c) => c.folderId === folders[2].id).length).toBeGreaterThan(0);
expect(result.ciphers.filter((c) => c.folderId === folders[3].id).length).toBeGreaterThan(0);
expect(result.ciphers.filter((c) => c.folderId === folders[4].id).length).toBeGreaterThan(0);
});
it("should create collections if part of an organization", async () => {
const importer = new OnePassword1PuxImporter();
importer.organizationId = Utils.newGuid();
const result = await importer.parse(SanitizedExportJson);
expect(result != null).toBe(true);
const collections = result.collections;
expect(collections.length).toBe(5);
expect(collections[0].name).toBe("Movies");
expect(collections[1].name).toBe("Finance");
expect(collections[2].name).toBe("Travel");
expect(collections[3].name).toBe("Education");
expect(collections[4].name).toBe("Starter Kit");
});
});

View File

@@ -0,0 +1,75 @@
import { CipherType } from "@bitwarden/common/vault/enums";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { data as creditCardData } from "../spec-data/onepassword-csv/credit-card.mac.csv";
import { data as identityData } from "../spec-data/onepassword-csv/identity.mac.csv";
import { data as multiTypeData } from "../spec-data/onepassword-csv/multiple-items.mac.csv";
import { OnePasswordMacCsvImporter } from "./onepassword-mac-csv-importer";
function expectIdentity(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.identity).toEqual(
expect.objectContaining({
firstName: "first name",
middleName: "mi",
lastName: "last name",
username: "userNam3",
company: "bitwarden",
phone: "8005555555",
email: "email@bitwarden.com",
}),
);
expect(cipher.notes).toContain("address\ncity state zip\nUnited States");
}
function expectCreditCard(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Card);
expect(cipher.card).toEqual(
expect.objectContaining({
number: "4111111111111111",
code: "111",
cardholderName: "test",
expMonth: "1",
expYear: "2030",
}),
);
}
describe("1Password mac CSV Importer", () => {
it("should parse identity records", async () => {
const importer = new OnePasswordMacCsvImporter();
const result = await importer.parse(identityData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expectIdentity(cipher);
});
it("should parse credit card records", async () => {
const importer = new OnePasswordMacCsvImporter();
const result = await importer.parse(creditCardData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expectCreditCard(cipher);
});
it("should parse csv's with multiple record type", async () => {
const importer = new OnePasswordMacCsvImporter();
const result = await importer.parse(multiTypeData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(4);
expectIdentity(result.ciphers[1]);
expectCreditCard(result.ciphers[2]);
});
});

View File

@@ -0,0 +1,87 @@
import { FieldType, CipherType } from "@bitwarden/common/vault/enums";
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { FieldView } from "@bitwarden/common/vault/models/view/field.view";
import { data as creditCardData } from "../spec-data/onepassword-csv/credit-card.windows.csv";
import { data as identityData } from "../spec-data/onepassword-csv/identity.windows.csv";
import { data as multiTypeData } from "../spec-data/onepassword-csv/multiple-items.windows.csv";
import { OnePasswordWinCsvImporter } from "./onepassword-win-csv-importer";
function expectIdentity(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Identity);
expect(cipher.identity).toEqual(
expect.objectContaining({
firstName: "first name",
middleName: "mi",
lastName: "last name",
username: "userNam3",
company: "bitwarden",
phone: "8005555555",
email: "email@bitwarden.com",
}),
);
expect(cipher.fields).toEqual(
expect.arrayContaining([
Object.assign(new FieldView(), {
type: FieldType.Text,
name: "address",
value: "address city state zip us",
}),
]),
);
}
function expectCreditCard(cipher: CipherView) {
expect(cipher.type).toBe(CipherType.Card);
expect(cipher.card).toEqual(
expect.objectContaining({
number: "4111111111111111",
code: "111",
cardholderName: "test",
expMonth: "1",
expYear: "1970",
}),
);
}
describe("1Password windows CSV Importer", () => {
let importer: OnePasswordWinCsvImporter;
beforeEach(() => {
importer = new OnePasswordWinCsvImporter();
});
it("should parse identity records", async () => {
const result = await importer.parse(identityData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expectIdentity(cipher);
});
it("should parse credit card records", async () => {
const result = await importer.parse(creditCardData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(1);
const cipher = result.ciphers[0];
expectCreditCard(cipher);
});
it("should parse csv's with multiple record types", async () => {
const result = await importer.parse(multiTypeData);
expect(result).not.toBeNull();
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(4);
expectIdentity(result.ciphers[1]);
expectCreditCard(result.ciphers[2]);
});
});

View File

@@ -120,7 +120,7 @@ export interface Value {
export interface Email {
email_address: string;
provider: string;
provider: string | null;
}
export interface Address {

View File

@@ -0,0 +1,34 @@
import { testData as EncryptedData } from "../spec-data/passky-json/passky-encrypted.json";
import { testData as UnencryptedData } from "../spec-data/passky-json/passky-unencrypted.json";
import { PasskyJsonImporter } from "./passky-json-importer";
describe("Passky Json Importer", () => {
let importer: PasskyJsonImporter;
beforeEach(() => {
importer = new PasskyJsonImporter();
});
it("should not import encrypted backups", async () => {
const testDataJson = JSON.stringify(EncryptedData);
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
expect(result.success).toBe(false);
expect(result.errorMessage).toBe("Unable to import an encrypted passky backup.");
});
it("should parse login data", async () => {
const testDataJson = JSON.stringify(UnencryptedData);
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("https://bitwarden.com/");
expect(cipher.login.username).toEqual("testUser");
expect(cipher.login.password).toEqual("testPassword");
expect(cipher.login.uris.length).toEqual(1);
const uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("https://bitwarden.com/");
expect(cipher.notes).toEqual("my notes");
});
});

View File

@@ -0,0 +1,168 @@
import { CipherType } from "@bitwarden/common/vault/enums";
import { ImportResult } from "../../models/import-result";
import { dutchHeaders } from "../spec-data/passwordxp-csv/dutch-headers";
import { germanHeaders } from "../spec-data/passwordxp-csv/german-headers";
import { noFolder } from "../spec-data/passwordxp-csv/no-folder.csv";
import { withFolders } from "../spec-data/passwordxp-csv/passwordxp-with-folders.csv";
import { withoutFolders } from "../spec-data/passwordxp-csv/passwordxp-without-folders.csv";
import { PasswordXPCsvImporter } from "./passwordxp-csv-importer";
async function importLoginWithCustomFields(importer: PasswordXPCsvImporter, csvData: string) {
const result: ImportResult = await importer.parse(csvData);
expect(result.success).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.Login);
expect(cipher.name).toBe("Title2");
expect(cipher.notes).toBe("Test Notes");
expect(cipher.login.username).toBe("Username2");
expect(cipher.login.password).toBe("12345678");
expect(cipher.login.uris[0].uri).toBe("http://URL2.com");
expect(cipher.fields.length).toBe(5);
let field = cipher.fields.shift();
expect(field.name).toBe("Account");
expect(field.value).toBe("Account2");
field = cipher.fields.shift();
expect(field.name).toBe("Modified");
expect(field.value).toBe("27-3-2024 08:11:21");
field = cipher.fields.shift();
expect(field.name).toBe("Created");
expect(field.value).toBe("27-3-2024 08:11:21");
field = cipher.fields.shift();
expect(field.name).toBe("Expire on");
expect(field.value).toBe("27-5-2024 08:11:21");
field = cipher.fields.shift();
expect(field.name).toBe("Modified by");
expect(field.value).toBe("someone");
}
describe("PasswordXPCsvImporter", () => {
let importer: PasswordXPCsvImporter;
beforeEach(() => {
importer = new PasswordXPCsvImporter();
});
it("should return success false if CSV data is null", async () => {
const data = "";
const result: ImportResult = await importer.parse(data);
expect(result.success).toBe(false);
});
it("should return success false if CSV headers did not get translated", async () => {
const data = germanHeaders.replace("Titel;", "UnknownTitle;");
const result: ImportResult = await importer.parse(data);
expect(result.success).toBe(false);
});
it("should skip rows starting with >>>", async () => {
const result: ImportResult = await importer.parse(noFolder);
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(0);
});
it("should parse CSV data and return success true", async () => {
const result: ImportResult = await importer.parse(withoutFolders);
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(4);
let cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.Login);
expect(cipher.name).toBe("Title2");
expect(cipher.notes).toBe("Test Notes");
expect(cipher.login.username).toBe("Username2");
expect(cipher.login.password).toBe("12345678");
expect(cipher.login.uris[0].uri).toBe("http://URL2.com");
cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.Login);
expect(cipher.name).toBe("Title Test 1");
expect(cipher.notes).toBe("Test Notes 2");
expect(cipher.login.username).toBe("Username1");
expect(cipher.login.password).toBe("Password1");
expect(cipher.login.uris[0].uri).toBe("http://URL1.com");
cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.SecureNote);
expect(cipher.name).toBe("Certificate 1");
expect(cipher.notes).toBe("Test Notes Certicate 1");
cipher = result.ciphers.shift();
expect(cipher.type).toBe(CipherType.Login);
expect(cipher.name).toBe("test");
expect(cipher.notes).toBe("Test Notes 3");
expect(cipher.login.username).toBe("testtest");
expect(cipher.login.password).toBe("test");
expect(cipher.login.uris[0].uri).toBe("http://test");
});
it("should parse CSV data with English headers and import unmapped columns as custom fields", async () => {
await importLoginWithCustomFields(importer, withoutFolders);
});
it("should parse CSV data with German headers and import unmapped columns as custom fields", async () => {
await importLoginWithCustomFields(importer, germanHeaders);
});
it("should parse CSV data with Dutch headers and import unmapped columns as custom fields", async () => {
await importLoginWithCustomFields(importer, dutchHeaders);
});
it("should parse CSV data with folders and assign items to them", async () => {
const result: ImportResult = await importer.parse(withFolders);
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(5);
expect(result.folders.length).toBe(3);
let folder = result.folders.shift();
expect(folder.name).toEqual("Test Folder");
folder = result.folders.shift();
expect(folder.name).toEqual("Cert folder");
folder = result.folders.shift();
expect(folder.name).toEqual("Cert folder/Nested folder");
expect(result.folderRelationships.length).toBe(4);
let folderRelationship = result.folderRelationships.shift();
expect(folderRelationship).toEqual([1, 0]);
folderRelationship = result.folderRelationships.shift();
expect(folderRelationship).toEqual([2, 1]);
folderRelationship = result.folderRelationships.shift();
expect(folderRelationship).toEqual([3, 1]);
folderRelationship = result.folderRelationships.shift();
expect(folderRelationship).toEqual([4, 2]);
folderRelationship = result.folderRelationships.shift();
});
it("should convert folders to collections when importing into an organization", async () => {
importer.organizationId = "someOrg";
const result: ImportResult = await importer.parse(withFolders);
expect(result.success).toBe(true);
expect(result.ciphers.length).toBe(5);
expect(result.collections.length).toBe(3);
expect(result.collections[0].name).toEqual("Test Folder");
expect(result.collectionRelationships[0]).toEqual([1, 0]);
expect(result.collections[1].name).toEqual("Cert folder");
expect(result.collectionRelationships[1]).toEqual([2, 1]);
expect(result.collectionRelationships[2]).toEqual([3, 1]);
expect(result.collections[2].name).toEqual("Cert folder/Nested folder");
expect(result.collectionRelationships.length).toBe(4);
let collectionRelationship = result.collectionRelationships.shift();
expect(collectionRelationship).toEqual([1, 0]);
collectionRelationship = result.collectionRelationships.shift();
expect(collectionRelationship).toEqual([2, 1]);
collectionRelationship = result.collectionRelationships.shift();
expect(collectionRelationship).toEqual([3, 1]);
collectionRelationship = result.collectionRelationships.shift();
expect(collectionRelationship).toEqual([4, 2]);
collectionRelationship = result.collectionRelationships.shift();
});
});

View File

@@ -0,0 +1,222 @@
import { MockProxy } from "jest-mock-extended";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { FieldType, CipherType } from "@bitwarden/common/vault/enums";
import { testData } from "../spec-data/protonpass-json/protonpass.json";
import { ProtonPassJsonImporter } from "./protonpass-json-importer";
describe("Protonpass Json Importer", () => {
let importer: ProtonPassJsonImporter;
let i18nService: MockProxy<I18nService>;
beforeEach(() => {
importer = new ProtonPassJsonImporter(i18nService);
});
it("should parse login data", async () => {
const testDataJson = JSON.stringify(testData);
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual("Test Login - Personal Vault");
expect(cipher.type).toEqual(CipherType.Login);
expect(cipher.login.username).toEqual("Username");
expect(cipher.login.password).toEqual("Password");
expect(cipher.login.uris.length).toEqual(2);
const uriView = cipher.login.uris.shift();
expect(uriView.uri).toEqual("https://example.com/");
expect(cipher.notes).toEqual("My login secure note.");
expect(cipher.fields.at(0).name).toEqual("email");
expect(cipher.fields.at(0).value).toEqual("Email");
expect(cipher.fields.at(3).name).toEqual("second 2fa secret");
expect(cipher.fields.at(3).value).toEqual("TOTPCODE");
expect(cipher.fields.at(3).type).toEqual(FieldType.Hidden);
});
it("should parse note data", async () => {
const testDataJson = JSON.stringify(testData);
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
result.ciphers.shift();
const noteCipher = result.ciphers.shift();
expect(noteCipher.type).toEqual(CipherType.SecureNote);
expect(noteCipher.name).toEqual("My Secure Note");
expect(noteCipher.notes).toEqual("Secure note contents.");
});
it("should parse credit card data", async () => {
const testDataJson = JSON.stringify(testData);
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
result.ciphers.shift();
result.ciphers.shift();
const creditCardCipher = result.ciphers.shift();
expect(creditCardCipher.type).toBe(CipherType.Card);
expect(creditCardCipher.card.number).toBe("1234222233334444");
expect(creditCardCipher.card.cardholderName).toBe("Test name");
expect(creditCardCipher.card.expMonth).toBe("1");
expect(creditCardCipher.card.expYear).toBe("2025");
expect(creditCardCipher.card.code).toBe("333");
expect(creditCardCipher.fields.at(0).name).toEqual("PIN");
expect(creditCardCipher.fields.at(0).value).toEqual("1234");
expect(creditCardCipher.fields.at(0).type).toEqual(FieldType.Hidden);
});
it("should create folders if not part of an organization", async () => {
const testDataJson = JSON.stringify(testData);
const result = await importer.parse(testDataJson);
const folders = result.folders;
expect(folders.length).toBe(2);
expect(folders[0].name).toBe("Personal");
expect(folders[1].name).toBe("Test");
// "My Secure Note" is assigned to folder "Personal"
expect(result.folderRelationships[1]).toEqual([1, 0]);
// "Other vault login" is assigned to folder "Test"
expect(result.folderRelationships[4]).toEqual([4, 1]);
});
it("should create collections if part of an organization", async () => {
const testDataJson = JSON.stringify(testData);
importer.organizationId = Utils.newGuid();
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
const collections = result.collections;
expect(collections.length).toBe(2);
expect(collections[0].name).toBe("Personal");
expect(collections[1].name).toBe("Test");
// "My Secure Note" is assigned to folder "Personal"
expect(result.collectionRelationships[1]).toEqual([1, 0]);
// "Other vault login" is assigned to folder "Test"
expect(result.collectionRelationships[4]).toEqual([4, 1]);
});
it("should not add deleted items", async () => {
const testDataJson = JSON.stringify(testData);
const result = await importer.parse(testDataJson);
const ciphers = result.ciphers;
for (const cipher of ciphers) {
expect(cipher.name).not.toBe("My Deleted Note");
}
expect(ciphers.length).toBe(5);
});
it("should set favorites", async () => {
const testDataJson = JSON.stringify(testData);
const result = await importer.parse(testDataJson);
const ciphers = result.ciphers;
expect(ciphers[0].favorite).toBe(true);
expect(ciphers[1].favorite).toBe(false);
expect(ciphers[2].favorite).toBe(true);
});
it("should skip unsupported items", async () => {
const testDataJson = JSON.stringify(testData);
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
const ciphers = result.ciphers;
expect(ciphers.length).toBe(5);
expect(ciphers[4].type).toEqual(CipherType.Login);
});
it("should parse identity data", async () => {
const testDataJson = JSON.stringify(testData);
const result = await importer.parse(testDataJson);
expect(result != null).toBe(true);
result.ciphers.shift();
result.ciphers.shift();
result.ciphers.shift();
const cipher = result.ciphers.shift();
expect(cipher.type).toEqual(CipherType.Identity);
expect(cipher.identity.firstName).toBe("Test");
expect(cipher.identity.middleName).toBe("1");
expect(cipher.identity.lastName).toBe("1");
expect(cipher.identity.email).toBe("test@gmail.com");
expect(cipher.identity.phone).toBe("7507951789");
expect(cipher.identity.company).toBe("Bitwarden");
expect(cipher.identity.ssn).toBe("98378264782");
expect(cipher.identity.passportNumber).toBe("7173716378612");
expect(cipher.identity.licenseNumber).toBe("21234");
expect(cipher.identity.address1).toBe("Bitwarden");
expect(cipher.identity.address2).toBe("23 Street");
expect(cipher.identity.address3).toBe("12th Foor Test County");
expect(cipher.identity.city).toBe("New York");
expect(cipher.identity.state).toBe("Test");
expect(cipher.identity.postalCode).toBe("4038456");
expect(cipher.identity.country).toBe("US");
expect(cipher.fields.length).toEqual(13);
expect(cipher.fields.at(0).name).toEqual("gender");
expect(cipher.fields.at(0).value).toEqual("Male");
expect(cipher.fields.at(0).type).toEqual(FieldType.Text);
expect(cipher.fields.at(1).name).toEqual("TestPersonal");
expect(cipher.fields.at(1).value).toEqual("Personal");
expect(cipher.fields.at(1).type).toEqual(FieldType.Text);
expect(cipher.fields.at(2).name).toEqual("TestAddress");
expect(cipher.fields.at(2).value).toEqual("Address");
expect(cipher.fields.at(2).type).toEqual(FieldType.Text);
expect(cipher.fields.at(3).name).toEqual("xHandle");
expect(cipher.fields.at(3).value).toEqual("@twiter");
expect(cipher.fields.at(3).type).toEqual(FieldType.Text);
expect(cipher.fields.at(4).name).toEqual("secondPhoneNumber");
expect(cipher.fields.at(4).value).toEqual("243538978");
expect(cipher.fields.at(4).type).toEqual(FieldType.Text);
expect(cipher.fields.at(5).name).toEqual("instagram");
expect(cipher.fields.at(5).value).toEqual("@insta");
expect(cipher.fields.at(5).type).toEqual(FieldType.Text);
expect(cipher.fields.at(6).name).toEqual("TestContact");
expect(cipher.fields.at(6).value).toEqual("Contact");
expect(cipher.fields.at(6).type).toEqual(FieldType.Hidden);
expect(cipher.fields.at(7).name).toEqual("jobTitle");
expect(cipher.fields.at(7).value).toEqual("Engineer");
expect(cipher.fields.at(7).type).toEqual(FieldType.Text);
expect(cipher.fields.at(8).name).toEqual("workPhoneNumber");
expect(cipher.fields.at(8).value).toEqual("78236476238746");
expect(cipher.fields.at(8).type).toEqual(FieldType.Text);
expect(cipher.fields.at(9).name).toEqual("TestWork");
expect(cipher.fields.at(9).value).toEqual("Work");
expect(cipher.fields.at(9).type).toEqual(FieldType.Hidden);
expect(cipher.fields.at(10).name).toEqual("TestSection");
expect(cipher.fields.at(10).value).toEqual("Section");
expect(cipher.fields.at(10).type).toEqual(FieldType.Text);
expect(cipher.fields.at(11).name).toEqual("TestSectionHidden");
expect(cipher.fields.at(11).value).toEqual("SectionHidden");
expect(cipher.fields.at(11).type).toEqual(FieldType.Hidden);
expect(cipher.fields.at(12).name).toEqual("TestExtra");
expect(cipher.fields.at(12).value).toEqual("Extra");
expect(cipher.fields.at(12).type).toEqual(FieldType.Text);
});
});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,37 @@
import { CipherType } from "@bitwarden/common/vault/enums";
import { RoboFormCsvImporter } from "./roboform-csv-importer";
import { data as dataNoFolder } from "./spec-data/roboform-csv/empty-folders";
import { data as dataFolder } from "./spec-data/roboform-csv/with-folders";
describe("Roboform CSV Importer", () => {
it("should parse CSV data", async () => {
const importer = new RoboFormCsvImporter();
const result = await importer.parse(dataNoFolder);
expect(result != null).toBe(true);
expect(result.folders.length).toBe(0);
expect(result.ciphers.length).toBe(5);
expect(result.ciphers[0].name).toBe("Bitwarden");
expect(result.ciphers[0].login.username).toBe("user@bitwarden.com");
expect(result.ciphers[0].login.password).toBe("password");
});
it("should parse CSV data with folders", async () => {
const importer = new RoboFormCsvImporter();
const result = await importer.parse(dataFolder);
expect(result != null).toBe(true);
expect(result.folders.length).toBe(3);
expect(result.ciphers.length).toBe(5);
});
it("should parse CSV data secure note", async () => {
const importer = new RoboFormCsvImporter();
const result = await importer.parse(dataNoFolder);
expect(result != null).toBe(true);
expect(result.ciphers[4].type).toBe(CipherType.SecureNote);
expect(result.ciphers[4].notes).toBe("This is a safe note");
expect(result.ciphers[4].name).toBe("note - 2023-03-31");
});
});

View File

@@ -0,0 +1,74 @@
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view";
import { LoginView } from "@bitwarden/common/vault/models/view/login.view";
import { SafariCsvImporter } from "./safari-csv-importer";
import { data as oldSimplePasswordData } from "./spec-data/safari-csv/old-simple-password-data.csv";
import { data as simplePasswordData } from "./spec-data/safari-csv/simple-password-data.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 SafariCsvImporter();
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]);
}
}
});
});
});

View File

@@ -0,0 +1,73 @@
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
import { LoginUriView } from "@bitwarden/common/vault/models/view/login-uri.view";
import { LoginView } from "@bitwarden/common/vault/models/view/login.view";
import { SecureSafeCsvImporter } from "./securesafe-csv-importer";
import { data_upperUrl, data_lowerUrl } from "./spec-data/securesafe-csv/securesafe-example.csv";
const CipherData = [
{
title: "should parse upper case url",
csv: data_upperUrl,
expected: Object.assign(new CipherView(), {
id: null,
organizationId: null,
folderId: null,
name: "Gmail",
login: Object.assign(new LoginView(), {
username: "test@gmail.com",
password: "test",
uris: [
Object.assign(new LoginUriView(), {
uri: "https://gmail.com",
}),
],
}),
notes: null,
type: 1,
}),
},
{
title: "should parse lower case url",
csv: data_lowerUrl,
expected: Object.assign(new CipherView(), {
id: null,
organizationId: null,
folderId: null,
name: "Gmail",
login: Object.assign(new LoginView(), {
username: "test@gmail.com",
password: "test",
uris: [
Object.assign(new LoginUriView(), {
uri: "https://gmail.com",
}),
],
}),
notes: null,
type: 1,
}),
},
];
describe("SecureSafe CSV Importer", () => {
CipherData.forEach((data) => {
it(data.title, async () => {
const importer = new SecureSafeCsvImporter();
const result = await importer.parse(data.csv);
expect(result != null).toBe(true);
expect(result.ciphers.length).toBeGreaterThan(0);
const cipher = result.ciphers.shift();
expect(cipher.name).toEqual(data.expected.name);
expect(cipher.login).toEqual(
expect.objectContaining({
username: data.expected.login.username,
password: data.expected.login.password,
}),
);
expect(cipher.login.uris.length).toEqual(1);
expect(cipher.login.uris[0].uri).toEqual(data.expected.login.uris[0].uri);
});
});
});

View File

@@ -0,0 +1,6 @@
export const emptyAccountEncrypted = `{
"encrypted": true,
"encKeyValidation_DO_NOT_EDIT": "",
"folders": [],
"items": []
}`;

View File

@@ -0,0 +1,37 @@
export const cipherWithCollections = `{
"encrypted": false,
"collections": [
{
"id": "8e3f5ba1-3e87-4ee8-8da9-b1180099ff9f",
"organizationId": "c6181652-66eb-4cd9-a7f2-b02a00e12352",
"name": "asdf",
"externalId": null
}
],
"items": [
{
"passwordHistory": null,
"revisionDate": "2024-02-16T09:20:48.383Z",
"creationDate": "2024-02-16T09:20:48.383Z",
"deletedDate": null,
"id": "f761a968-4b0f-4090-a568-b118009a07b5",
"organizationId": "c6181652-66eb-4cd9-a7f2-b02a00e12352",
"folderId": null,
"type": 1,
"reprompt": 0,
"name": "asdf123",
"notes": null,
"favorite": false,
"login": {
"fido2Credentials": [],
"uris": [],
"username": null,
"password": null,
"totp": null
},
"collectionIds": [
"8e3f5ba1-3e87-4ee8-8da9-b1180099ff9f"
]
}
]
}`;

View File

@@ -0,0 +1,10 @@
export const data = {
encrypted: true,
passwordProtected: true,
salt: "Oy0xcgVRzxQ+9NpB5GLehw==",
kdfIterations: 100000,
kdfType: 0,
encKeyValidation_DO_NOT_EDIT:
"2.sZs4Jc1HW9rhABzRRYR/gQ==|8kTDaDxafulnybpWoqVX8RAybhVRTr+dffNjms271Y7amQmIE1VSMwLbk+b2vxZb|IqOo6oXQtmv/Xb/GHDi42XG9c9ILePYtP5qq584VWcg=",
data: "2.D0AXAf7G/XIwq6EC7A0Suw==|4w+m0wHRo25y1T1Syh5wdAUyF8voqEy54waMEsbnK0Nzee959w54ru5D1NntvxZL4HFqkQLyR6jCFkn5g40f+MGJgihS/wvf4NcJJfLiiFo6MEDOQNBkxw7ZBGuHiKfVuBO5u36JgzQtZ8lyFaduGxFszuF5c+URiE9PDh9jY0//poVgHKwuLZuYFIW+f7h6T+shUWK0ya11lcHn/B/CA2xiI+YiKdNZreJrwN0yslpJ/f+MrOzagvftRjt0GNkwveCtwcYUw/zFvqvibUpKeHcRiXs8SaGoHJ5RTm69FbJ7C5tnLwoVT89Af156uvRAXV7yAC4oPcbU/3TGb6hqYosvi1QNyaqG3M9gxS6+AK0C4yWuNbMLDEr+MWiw0SWLVMKQEkCZ4oM+oTCx52otW3+2V9I8Pv3KmmhkvVvE4wBdweOJeRX53Tf5ySkmpIhCfzj6JMmxO+nmTXIhWnJChr4hPVh+ixv1GQK5thIPTCMXmAtXoTIFUx1KWjS6LjOdi2hKQueVI+XZjf0qnY2vTMxRg0ZsLBA2znQTx+DSEqumORb5T/lV73pWZiCNePSAE2msOm7tep+lm4O/VCViCfXjITAY196syhOK0XnhxJvPALchZY8sYRAfuw6hHoDiVr+JUieRoI7eUrhXBp+D6Py9TL/dS/rHe+C2Zhx+xwx2NfGt+xEp8ZAOOCxgZ0UTeSA/abm0Oz7tJIK1n26acQrgbr7rMeBymAX+5L5OWlwI1hGgEBfj6W0rrbSXf3VMfaFXZ5UsXi1VhzQmU3LyWENoDeImXFQj6zMbUSfcVwLsG5Fg8Ee/kO/wJPfG5BO51+/vFqQj6AkaMEcwg5xNrObHYfQ/DMhIn7YDM2zdzbNTdhnobGkz6YRKFPCgFe3EmIEPEpeh9S3eKE9C7MQsrR8jVSiseR/FipJLsN+W7iOwzeXdwxUFlC/0a98bTKvdrbMgNi6ZVXykHY/t2UyEGpxZGTHoZwhX01kiQrwzC4/+v/676ldxPluO9GY7MtrLveCDsiyBz15u43IGHayDEBNT0rqrOKLYmfzwCWoahRLZQrSmepe/FXqgPqRfyWc/Ro+w3sT9dXUkx3B5xxWgSyABowPV48yBUSJuefhKTpqgzkU+LzhNnWHjnxJzzQ2/|IhlRjnyhIoDM85qHX/bY2zaIU5YaRO/iFVTQDd3uFDo=",
};

View File

@@ -0,0 +1 @@
export const emptyUnencryptedExport = `{ "encrypted": false, "folders": [], "items": [] }`;

View File

@@ -0,0 +1,2 @@
export const data = `name,url,username,password
,android://N2H9MndUUUt3JuQSWAKexOU9oJLJeHR4nyUGac5E1TXKppkY7xtdRl6l8vKo1hQWCqAEy4gsNLUBIbVxpdmhOP==@com.xyz.example.app.android/,username@example.com,Qh6W4Wz55YGFNU`;

View File

@@ -0,0 +1,2 @@
export const data = `name,url,username,password
www.example.com,https://www.example.com/,username@example.com,wpC9qFvsbWQK5Z`;

View File

@@ -0,0 +1,2 @@
export const credentialsData_otpUrl = `username,username2,username3,title,password,note,url,category,otpUrl
jdoe,,,example.com,somePassword,some note for example.com,https://www.example.com,Entertainment,anotherTOTPSeed`;

View File

@@ -0,0 +1,2 @@
export const credentialsData = `username,username2,username3,title,password,note,url,category,otpSecret
jdoe,,,example.com,somePassword,some note for example.com,https://www.example.com,Entertainment,someTOTPSeed`;

View File

@@ -0,0 +1,6 @@
export const identityData = `type,number,name,issue_date,expiration_date,place_of_issue,state
card,123123123,John Doe,2022-1-30,2032-1-30,,
passport,123123123,John Doe,2022-1-30,2032-1-30,somewhere in Germany,
license,1234556,John Doe,2022-8-10,2022-10-10,,DC
social_security,123123123,John Doe,,,,
tax_number,123123123,,,,,`;

View File

@@ -0,0 +1,7 @@
export const multiplePersonalInfoData = `type,title,first_name,middle_name,last_name,login,date_of_birth,place_of_birth,email,email_type,item_name,phone_number,address,country,state,city,zip,address_recipient,address_building,address_apartment,address_floor,address_door_code,job_title,url
name,MR,John,,Doe,jdoe,2022-01-30,world,,,,,,,,,,,,,,,,
email,,,,,,,,jdoe@example.com,personal,Johns email,,,,,,,,,,,,,
number,,,,,,,,,,John's number,+49123123123,,,,,,,,,,,,
address,,,,,,,,,,John's home address,,1 some street,de,DE-0-NW,some city,123123,John,1,1,1,123,,
website,,,,,,,,,,Website,,,,,,,,,,,,,website.com
name,Mrs,Jane,,Doe,jdoe,2022-01-30,earth,,,,,,,,,,,,,,,,`;

View File

@@ -0,0 +1,3 @@
export const paymentsData = `type,account_name,account_holder,cc_number,code,expiration_month,expiration_year,routing_number,account_number,country,issuing_bank
bank,John's savings account,John Doe,,,,,routingNumber,accountNumber,US,US-ALLY
credit_card,John Doe,,41111111111111111,123,01,2023,,,US,`;

View File

@@ -0,0 +1,6 @@
export const personalInfoData = `type,title,first_name,middle_name,last_name,login,date_of_birth,place_of_birth,email,email_type,item_name,phone_number,address,country,state,city,zip,address_recipient,address_building,address_apartment,address_floor,address_door_code,job_title,url
name,MR,John,,Doe,jdoe,2022-01-30,world,,,,,,,,,,,,,,,,
email,,,,,,,,jdoe@example.com,personal,Johns email,,,,,,,,,,,,,
number,,,,,,,,,,John's number,+49123123123,,,,,,,,,,,,
address,,,,,,,,,,John's home address,,1 some street,de,DE-0-NW,some city,123123,John,1,1,1,123,,
website,,,,,,,,,,Website,,,,,,,,,,,,,website.com`;

View File

@@ -0,0 +1,2 @@
export const secureNoteData = `title,note
01,test`;

View File

@@ -0,0 +1,274 @@
import { EnpassJsonFile } from "../../enpass/types/enpass-json-type";
export const creditCard: EnpassJsonFile = {
folders: [],
items: [
{
archived: 0,
auto_submit: 1,
category: "creditcard",
createdAt: 1666449561,
favorite: 1,
fields: [
{
deleted: 0,
history: [
{
updated_at: 1534490234,
value: "Wendy Apple Seed",
},
{
updated_at: 1535521811,
value: "Emma",
},
{
updated_at: 1535522090,
value: "Emily",
},
],
label: "Cardholder",
order: 1,
sensitive: 0,
type: "ccName",
uid: 0,
updated_at: 1666449561,
value: "Emily Sample",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Type",
order: 2,
sensitive: 0,
type: "ccType",
uid: 17,
updated_at: 1666449561,
value: "American Express",
value_updated_at: 1666449561,
},
{
deleted: 0,
history: [
{
updated_at: 1534490234,
value: "1234 1234 5678 0000",
},
],
label: "Number",
order: 3,
sensitive: 0,
type: "ccNumber",
uid: 1,
updated_at: 1666449561,
value: "3782 822463 10005",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "CVC",
order: 4,
sensitive: 1,
type: "ccCvc",
uid: 2,
updated_at: 1666449561,
value: "1234",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "PIN",
order: 5,
sensitive: 1,
type: "ccPin",
uid: 3,
updated_at: 1666449561,
value: "9874",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Expiry date",
order: 6,
sensitive: 0,
type: "ccExpiry",
uid: 4,
updated_at: 1666449561,
value: "03/23",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "INTERNET BANKING",
order: 7,
sensitive: 0,
type: "section",
uid: 103,
updated_at: 1666449561,
value: "",
value_updated_at: 1666449561,
},
{
deleted: 0,
history: [
{
updated_at: 1534490234,
value: "WendySeed",
},
{
updated_at: 1535521811,
value: "Emma1",
},
{
updated_at: 1535522182,
value: "Emily1",
},
],
label: "Username",
order: 8,
sensitive: 0,
type: "username",
uid: 15,
updated_at: 1666449561,
value: "Emily_ENP",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Login password",
order: 9,
sensitive: 1,
type: "password",
uid: 16,
updated_at: 1666449561,
value: "nnn tug shoot selfish bon liars convent dusty minnow uncheck",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Transaction password",
order: 10,
sensitive: 1,
type: "ccTxnpassword",
uid: 9,
updated_at: 1666449561,
value: "",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Website",
order: 11,
sensitive: 0,
type: "url",
uid: 14,
updated_at: 1666449561,
value: "http://global.americanexpress.com/",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "ADDITIONAL DETAILS",
order: 12,
sensitive: 0,
type: "section",
uid: 104,
updated_at: 1666449561,
value: "",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Issuing bank",
order: 13,
sensitive: 0,
type: "ccBankname",
uid: 6,
updated_at: 1666449561,
value: "American Express",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Issued on",
order: 14,
sensitive: 0,
type: "date",
uid: 7,
updated_at: 1666449561,
value: "",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Valid from",
order: 15,
sensitive: 0,
type: "ccValidfrom",
uid: 18,
updated_at: 1666449561,
value: "",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Credit limit",
order: 16,
sensitive: 0,
type: "numeric",
uid: 10,
updated_at: 1666449561,
value: "100000",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Withdrawal limit",
order: 17,
sensitive: 0,
type: "numeric",
uid: 11,
updated_at: 1666449561,
value: "50000",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Interest rate",
order: 18,
sensitive: 0,
type: "numeric",
uid: 12,
updated_at: 1666449561,
value: "1.5",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "If lost, call",
order: 19,
sensitive: 0,
type: "phone",
uid: 8,
updated_at: 1666449561,
value: "12345678",
value_updated_at: 1666449561,
},
],
icon: {
fav: "global.americanexpress.com",
image: {
file: "cc/american_express",
},
type: 2,
uuid: "",
},
note: "some notes on the credit card",
subtitle: "***** 0000",
template_type: "creditcard.default",
title: "Emily Sample Credit Card",
trashed: 0,
updated_at: 1666554351,
uuid: "dbbc741b-81d6-491a-9660-92995fd8958c",
},
],
};

View File

@@ -0,0 +1,45 @@
import { EnpassJsonFile } from "../../enpass/types/enpass-json-type";
export const folders: EnpassJsonFile = {
folders: [
{
icon: "1008",
parent_uuid: "",
title: "Social",
updated_at: 1666449561,
uuid: "7b2ed0da-8cd9-445f-9a1a-490ca2b9ffbc",
},
{
icon: "1008",
parent_uuid: "7b2ed0da-8cd9-445f-9a1a-490ca2b9ffbc",
title: "Twitter",
updated_at: 1666450857,
uuid: "7fe8a8bc-b848-4f9f-9870-c2936317e74d",
},
],
items: [
{
archived: 0,
auto_submit: 1,
category: "note",
createdAt: 1666554621,
favorite: 0,
folders: ["7fe8a8bc-b848-4f9f-9870-c2936317e74d"],
icon: {
fav: "",
image: {
file: "misc/secure_note",
},
type: 1,
uuid: "",
},
note: "some secure note content",
subtitle: "",
template_type: "note.default",
title: "some secure note title",
trashed: 0,
updated_at: 1666554621,
uuid: "8b5ea2f6-f62b-4fec-a235-4a40946026b6",
},
],
};

View File

@@ -0,0 +1,80 @@
// @ts-strict-ignore
import { EnpassJsonFile } from "../../enpass/types/enpass-json-type";
import { login } from "./login";
export const loginAndroidUrl: EnpassJsonFile = {
folders: [],
items: [
{
archived: 0,
auto_submit: 1,
category: "login",
createdAt: 1666449561,
favorite: 1,
fields: [
...login.items[0].fields,
{
deleted: 0,
label: "Autofill Info",
order: 9,
sensitive: 0,
type: ".Android#",
uid: 7696,
updated_at: 1666551057,
value: "com.amazon.0",
value_updated_at: 1666551057,
},
{
deleted: 0,
label: "Autofill Info 1",
order: 9,
sensitive: 0,
type: ".Android#",
uid: 7696,
updated_at: 1666551057,
value:
"android://pMUhLBalOhcc3yK-84sMiGc2U856FVVUhm8PZveoRfNFT3ocT1KWZlciAkF2ED--B5i_fMuNlC6JfPxcHk1AQg==@com.amazon.1",
value_updated_at: 1666551057,
},
{
deleted: 0,
label: "Autofill Info2 ",
order: 9,
sensitive: 0,
type: ".Android#",
uid: 7696,
updated_at: 1666551057,
value: "android://com.amazon.2",
value_updated_at: 1666551057,
},
{
deleted: 0,
label: "Autofill Info 3",
order: 9,
sensitive: 0,
type: ".Android#",
uid: 7696,
updated_at: 1666551057,
value: "androidapp://com.amazon.3",
value_updated_at: 1666551057,
},
],
icon: {
fav: "www.amazon.com",
image: {
file: "web/amazon.com",
},
type: 1,
uuid: "",
},
note: "some notes on the login item",
subtitle: "emily@enpass.io",
template_type: "login.default",
title: "Amazon",
trashed: 0,
updated_at: 1666449561,
uuid: "f717cb7c-6cce-4b24-b023-ec8a429cc992",
},
],
};

View File

@@ -0,0 +1,130 @@
import { EnpassJsonFile } from "../../enpass/types/enpass-json-type";
export const login: EnpassJsonFile = {
folders: [],
items: [
{
archived: 0,
auto_submit: 1,
category: "login",
createdAt: 1666449561,
favorite: 1,
fields: [
{
deleted: 0,
label: "Username",
order: 1,
sensitive: 0,
type: "username",
uid: 10,
updated_at: 1666449561,
value: "",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "E-mail",
order: 2,
sensitive: 0,
type: "email",
uid: 12,
updated_at: 1666449561,
value: "emily@enpass.io",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Password",
order: 3,
sensitive: 1,
type: "password",
uid: 11,
updated_at: 1666449561,
value: "$&W:v@}4\\iRpUXVbjPdPKDGbD<xK>",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Website",
order: 4,
sensitive: 0,
type: "url",
uid: 13,
updated_at: 1666449561,
value: "https://www.amazon.com",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "ADDITIONAL DETAILS",
order: 5,
sensitive: 0,
type: "section",
uid: 101,
updated_at: 1666449561,
value: "",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Phone number",
order: 6,
sensitive: 0,
type: "phone",
uid: 14,
updated_at: 1666449561,
value: "12345678",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "TOTP",
order: 7,
sensitive: 0,
type: "totp",
uid: 102,
updated_at: 1666449561,
value: "TOTP_SEED_VALUE",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Security question",
order: 8,
sensitive: 0,
type: "text",
uid: 15,
updated_at: 1666449561,
value: "SECURITY_QUESTION",
value_updated_at: 1666449561,
},
{
deleted: 0,
label: "Security answer",
order: 9,
sensitive: 1,
type: "text",
uid: 16,
updated_at: 1666449561,
value: "SECURITY_ANSWER",
value_updated_at: 1666449561,
},
],
icon: {
fav: "www.amazon.com",
image: {
file: "web/amazon.com",
},
type: 1,
uuid: "",
},
note: "some notes on the login item",
subtitle: "emily@enpass.io",
template_type: "login.default",
title: "Amazon",
trashed: 0,
updated_at: 1666449561,
uuid: "f717cb7c-6cce-4b24-b023-ec8a429cc992",
},
],
};

View File

@@ -0,0 +1,29 @@
import { EnpassJsonFile } from "../../enpass/types/enpass-json-type";
export const note: EnpassJsonFile = {
folders: [],
items: [
{
archived: 0,
auto_submit: 1,
category: "note",
createdAt: 1666554621,
favorite: 0,
icon: {
fav: "",
image: {
file: "misc/secure_note",
},
type: 1,
uuid: "",
},
note: "some secure note content",
subtitle: "",
template_type: "note.default",
title: "some secure note title",
trashed: 0,
updated_at: 1666554621,
uuid: "8b5ea2f6-f62b-4fec-a235-4a40946026b6",
},
],
};

View File

@@ -0,0 +1,4 @@
export const data = `"url","username","password","httpRealm","formActionOrigin","guid","timeCreated","timeLastUsed","timePasswordChanged"
"chrome://FirefoxAccounts","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","{""version"":1,""accountData"":{""scopedKeys"":{""https://identity.mozilla.com/apps/oldsync"":{""kid"":""xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxx"",""k"":""xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"",""kty"":""xxx""},""sync:addon_storage"":{""kid"":""xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"",""k"":""xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"",""kty"":""xxx""}},""kSync"":""xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"",""kXCS"":""xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"",""kExtSync"":""xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"",""kExtKbHash"":""xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx""}}","Firefox Accounts credentials",,"{xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}","xxxxxxxxxxxxx","xxxxxxxxxxxxx","xxxxxxxxxxxxx"
"https://example.com","foo","bar",,"","{d61e37fa-2bc4-469a-bd66-41fd3b0005e0}","1612345678900","1612345678900","1612345678900"
`;

View File

@@ -0,0 +1,2 @@
export const data = `"url","username","password","httpRealm","formActionOrigin","guid","timeCreated","timeLastUsed","timePasswordChanged"
"https://example.com","foo","bar",,"","{d61e37fa-2bc4-469a-bd66-41fd3b0005e0}","1612345678900","1612345678900","1612345678900"`;

View File

@@ -0,0 +1,533 @@
export const TestData = `<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<KeePassFile>
<Meta>
<Generator>KeePass</Generator>
<DatabaseName />
<DatabaseNameChanged>2016-12-31T21:33:52Z</DatabaseNameChanged>
<DatabaseDescription />
<DatabaseDescriptionChanged>2016-12-31T21:33:52Z</DatabaseDescriptionChanged>
<DefaultUserName />
<DefaultUserNameChanged>2016-12-31T21:33:52Z</DefaultUserNameChanged>
<MaintenanceHistoryDays>365</MaintenanceHistoryDays>
<Color />
<MasterKeyChanged>2016-12-31T21:33:59Z</MasterKeyChanged>
<MasterKeyChangeRec>-1</MasterKeyChangeRec>
<MasterKeyChangeForce>-1</MasterKeyChangeForce>
<MemoryProtection>
<ProtectTitle>False</ProtectTitle>
<ProtectUserName>False</ProtectUserName>
<ProtectPassword>True</ProtectPassword>
<ProtectURL>False</ProtectURL>
<ProtectNotes>False</ProtectNotes>
</MemoryProtection>
<RecycleBinEnabled>True</RecycleBinEnabled>
<RecycleBinUUID>AAAAAAAAAAAAAAAAAAAAAA==</RecycleBinUUID>
<RecycleBinChanged>2016-12-31T21:33:52Z</RecycleBinChanged>
<EntryTemplatesGroup>AAAAAAAAAAAAAAAAAAAAAA==</EntryTemplatesGroup>
<EntryTemplatesGroupChanged>2016-12-31T21:33:52Z</EntryTemplatesGroupChanged>
<HistoryMaxItems>10</HistoryMaxItems>
<HistoryMaxSize>6291456</HistoryMaxSize>
<LastSelectedGroup>AAAAAAAAAAAAAAAAAAAAAA==</LastSelectedGroup>
<LastTopVisibleGroup>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleGroup>
<Binaries />
<CustomData />
</Meta>
<Root>
<Group>
<UUID>KvS57lVwl13AfGFLwkvq4Q==</UUID>
<Name>Root</Name>
<Notes />
<IconID>48</IconID>
<Times>
<CreationTime>2016-12-31T21:33:52Z</CreationTime>
<LastModificationTime>2016-12-31T21:33:52Z</LastModificationTime>
<LastAccessTime>2017-01-01T22:58:00Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:33:52Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>1</UsageCount>
<LocationChanged>2016-12-31T21:33:52Z</LocationChanged>
</Times>
<IsExpanded>True</IsExpanded>
<DefaultAutoTypeSequence />
<EnableAutoType>null</EnableAutoType>
<EnableSearching>null</EnableSearching>
<LastTopVisibleEntry>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleEntry>
<Group>
<UUID>P0ParXgGMBW6caOL2YrhqQ==</UUID>
<Name>Folder2</Name>
<Notes>a note about the folder</Notes>
<IconID>48</IconID>
<Times>
<CreationTime>2016-12-31T21:43:30Z</CreationTime>
<LastModificationTime>2016-12-31T21:43:43Z</LastModificationTime>
<LastAccessTime>2017-01-01T22:58:00Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:43:30Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>1</UsageCount>
<LocationChanged>2016-12-31T21:43:43Z</LocationChanged>
</Times>
<IsExpanded>True</IsExpanded>
<DefaultAutoTypeSequence />
<EnableAutoType>null</EnableAutoType>
<EnableSearching>null</EnableSearching>
<LastTopVisibleEntry>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleEntry>
<Entry>
<UUID>fAa543oYlgnJKkhKag5HLw==</UUID>
<IconID>1</IconID>
<ForegroundColor />
<BackgroundColor />
<OverrideURL />
<Tags />
<Times>
<CreationTime>2016-12-31T21:34:13Z</CreationTime>
<LastModificationTime>2016-12-31T21:40:23Z</LastModificationTime>
<LastAccessTime>2016-12-31T21:40:23Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:34:13Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>0</UsageCount>
<LocationChanged>2016-12-31T21:43:48Z</LocationChanged>
</Times>
<String>
<Key>att2</Key>
<Value>att2value</Value>
</String>
<String>
<Key>attr1</Key>
<Value>att1value
line1
line2</Value>
</String>
<String>
<Key>Notes</Key>
<Value>This is a note!!!
line1
line2</Value>
</String>
<String>
<Key>Password</Key>
<Value ProtectInMemory="True">googpass</Value>
</String>
<String>
<Key>Title</Key>
<Value>Google</Value>
</String>
<String>
<Key>URL</Key>
<Value>google.com</Value>
</String>
<String>
<Key>UserName</Key>
<Value>googleuser</Value>
</String>
<AutoType>
<Enabled>True</Enabled>
<DataTransferObfuscation>0</DataTransferObfuscation>
</AutoType>
<History>
<Entry>
<UUID>fAa543oYlgnJKkhKag5HLw==</UUID>
<IconID>0</IconID>
<ForegroundColor />
<BackgroundColor />
<OverrideURL />
<Tags />
<Times>
<CreationTime>2016-12-31T21:34:13Z</CreationTime>
<LastModificationTime>2016-12-31T21:34:40Z</LastModificationTime>
<LastAccessTime>2016-12-31T21:34:40Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:34:13Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>0</UsageCount>
<LocationChanged>2016-12-31T21:34:40Z</LocationChanged>
</Times>
<String>
<Key>Notes</Key>
<Value>This is a note!!!
line1
line2</Value>
</String>
<String>
<Key>Password</Key>
<Value ProtectInMemory="True">googpass</Value>
</String>
<String>
<Key>Title</Key>
<Value>Google</Value>
</String>
<String>
<Key>URL</Key>
<Value>google.com</Value>
</String>
<String>
<Key>UserName</Key>
<Value>googleuser</Value>
</String>
<AutoType>
<Enabled>True</Enabled>
<DataTransferObfuscation>0</DataTransferObfuscation>
</AutoType>
</Entry>
</History>
</Entry>
</Group>
</Group>
<DeletedObjects />
</Root>
</KeePassFile>`;
export const TestData1 = `<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<KeePassFile>
<Meta>
<Generator>KeePass</Generator>
<DatabaseName />
<DatabaseNameChanged>2016-12-31T21:33:52Z</DatabaseNameChanged>
<DatabaseDescription />
<DatabaseDescriptionChanged>2016-12-31T21:33:52Z</DatabaseDescriptionChanged>
<DefaultUserName />
<DefaultUserNameChanged>2016-12-31T21:33:52Z</DefaultUserNameChanged>
<MaintenanceHistoryDays>365</MaintenanceHistoryDays>
<Color />
<MasterKeyChanged>2016-12-31T21:33:59Z</MasterKeyChanged>
<MasterKeyChangeRec>-1</MasterKeyChangeRec>
<MasterKeyChangeForce>-1</MasterKeyChangeForce>
<MemoryProtection>
<ProtectTitle>False</ProtectTitle>
<ProtectUserName>False</ProtectUserName>
<ProtectPassword>True</ProtectPassword>
<ProtectURL>False</ProtectURL>
<ProtectNotes>False</ProtectNotes>
</MemoryProtection>
<RecycleBinEnabled>True</RecycleBinEnabled>
<RecycleBinUUID>AAAAAAAAAAAAAAAAAAAAAA==</RecycleBinUUID>
<RecycleBinChanged>2016-12-31T21:33:52Z</RecycleBinChanged>
<EntryTemplatesGroup>AAAAAAAAAAAAAAAAAAAAAA==</EntryTemplatesGroup>
<EntryTemplatesGroupChanged>2016-12-31T21:33:52Z</EntryTemplatesGroupChanged>
<HistoryMaxItems>10</HistoryMaxItems>
<HistoryMaxSize>6291456</HistoryMaxSize>
<LastSelectedGroup>AAAAAAAAAAAAAAAAAAAAAA==</LastSelectedGroup>
<LastTopVisibleGroup>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleGroup>
<Binaries />
<CustomData />
</Meta>
<Group>
<UUID>KvS57lVwl13AfGFLwkvq4Q==</UUID>
<Name>Root</Name>
<Notes />
<IconID>48</IconID>
<Times>
<CreationTime>2016-12-31T21:33:52Z</CreationTime>
<LastModificationTime>2016-12-31T21:33:52Z</LastModificationTime>
<LastAccessTime>2017-01-01T22:58:00Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:33:52Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>1</UsageCount>
<LocationChanged>2016-12-31T21:33:52Z</LocationChanged>
</Times>
<IsExpanded>True</IsExpanded>
<DefaultAutoTypeSequence />
<EnableAutoType>null</EnableAutoType>
<EnableSearching>null</EnableSearching>
<LastTopVisibleEntry>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleEntry>
<Group>
<UUID>P0ParXgGMBW6caOL2YrhqQ==</UUID>
<Name>Folder2</Name>
<Notes>a note about the folder</Notes>
<IconID>48</IconID>
<Times>
<CreationTime>2016-12-31T21:43:30Z</CreationTime>
<LastModificationTime>2016-12-31T21:43:43Z</LastModificationTime>
<LastAccessTime>2017-01-01T22:58:00Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:43:30Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>1</UsageCount>
<LocationChanged>2016-12-31T21:43:43Z</LocationChanged>
</Times>
<IsExpanded>True</IsExpanded>
<DefaultAutoTypeSequence />
<EnableAutoType>null</EnableAutoType>
<EnableSearching>null</EnableSearching>
<LastTopVisibleEntry>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleEntry>
<Entry>
<UUID>fAa543oYlgnJKkhKag5HLw==</UUID>
<IconID>1</IconID>
<ForegroundColor />
<BackgroundColor />
<OverrideURL />
<Tags />
<Times>
<CreationTime>2016-12-31T21:34:13Z</CreationTime>
<LastModificationTime>2016-12-31T21:40:23Z</LastModificationTime>
<LastAccessTime>2016-12-31T21:40:23Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:34:13Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>0</UsageCount>
<LocationChanged>2016-12-31T21:43:48Z</LocationChanged>
</Times>
<String>
<Key>att2</Key>
<Value>att2value</Value>
</String>
<String>
<Key>attr1</Key>
<Value>att1value
line1
line2</Value>
</String>
<String>
<Key>Notes</Key>
<Value>This is a note!!!
line1
line2</Value>
</String>
<String>
<Key>Password</Key>
<Value ProtectInMemory="True">googpass</Value>
</String>
<String>
<Key>Title</Key>
<Value>Google</Value>
</String>
<String>
<Key>URL</Key>
<Value>google.com</Value>
</String>
<String>
<Key>UserName</Key>
<Value>googleuser</Value>
</String>
<AutoType>
<Enabled>True</Enabled>
<DataTransferObfuscation>0</DataTransferObfuscation>
</AutoType>
<History>
<Entry>
<UUID>fAa543oYlgnJKkhKag5HLw==</UUID>
<IconID>0</IconID>
<ForegroundColor />
<BackgroundColor />
<OverrideURL />
<Tags />
<Times>
<CreationTime>2016-12-31T21:34:13Z</CreationTime>
<LastModificationTime>2016-12-31T21:34:40Z</LastModificationTime>
<LastAccessTime>2016-12-31T21:34:40Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:34:13Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>0</UsageCount>
<LocationChanged>2016-12-31T21:34:40Z</LocationChanged>
</Times>
<String>
<Key>Notes</Key>
<Value>This is a note!!!
line1
line2</Value>
</String>
<String>
<Key>Password</Key>
<Value ProtectInMemory="True">googpass</Value>
</String>
<String>
<Key>Title</Key>
<Value>Google</Value>
</String>
<String>
<Key>URL</Key>
<Value>google.com</Value>
</String>
<String>
<Key>UserName</Key>
<Value>googleuser</Value>
</String>
<AutoType>
<Enabled>True</Enabled>
<DataTransferObfuscation>0</DataTransferObfuscation>
</AutoType>
</Entry>
</History>
</Entry>
</Group>
</Group>
<DeletedObjects />
</KeePassFile>`;
export const TestData2 = `<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<Meta>
<Generator>KeePass</Generator>
<DatabaseName />
<DatabaseNameChanged>2016-12-31T21:33:52Z</DatabaseNameChanged>
<DatabaseDescription />
<DatabaseDescriptionChanged>2016-12-31T21:33:52Z</DatabaseDescriptionChanged>
<DefaultUserName />
<DefaultUserNameChanged>2016-12-31T21:33:52Z</DefaultUserNameChanged>
<MaintenanceHistoryDays>365</MaintenanceHistoryDays>
<Color />
<MasterKeyChanged>2016-12-31T21:33:59Z</MasterKeyChanged>
<MasterKeyChangeRec>-1</MasterKeyChangeRec>
<MasterKeyChangeForce>-1</MasterKeyChangeForce>
<MemoryProtection>
<ProtectTitle>False</ProtectTitle>
<ProtectUserName>False</ProtectUserName>
<ProtectPassword>True</ProtectPassword>
<ProtectURL>False</ProtectURL>
<ProtectNotes>False</ProtectNotes>
</MemoryProtection>
<RecycleBinEnabled>True</RecycleBinEnabled>
<RecycleBinUUID>AAAAAAAAAAAAAAAAAAAAAA==</RecycleBinUUID>
<RecycleBinChanged>2016-12-31T21:33:52Z</RecycleBinChanged>
<EntryTemplatesGroup>AAAAAAAAAAAAAAAAAAAAAA==</EntryTemplatesGroup>
<EntryTemplatesGroupChanged>2016-12-31T21:33:52Z</EntryTemplatesGroupChanged>
<HistoryMaxItems>10</HistoryMaxItems>
<HistoryMaxSize>6291456</HistoryMaxSize>
<LastSelectedGroup>AAAAAAAAAAAAAAAAAAAAAA==</LastSelectedGroup>
<LastTopVisibleGroup>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleGroup>
<Binaries />
<CustomData />
</Meta>
<Root>
<Group>
<UUID>KvS57lVwl13AfGFLwkvq4Q==</UUID>
<Name>Root</Name>
<Notes />
<IconID>48</IconID>
<Times>
<CreationTime>2016-12-31T21:33:52Z</CreationTime>
<LastModificationTime>2016-12-31T21:33:52Z</LastModificationTime>
<LastAccessTime>2017-01-01T22:58:00Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:33:52Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>1</UsageCount>
<LocationChanged>2016-12-31T21:33:52Z</LocationChanged>
</Times>
<IsExpanded>True</IsExpanded>
<DefaultAutoTypeSequence />
<EnableAutoType>null</EnableAutoType>
<EnableSearching>null</EnableSearching>
<LastTopVisibleEntry>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleEntry>
<Group>
<UUID>P0ParXgGMBW6caOL2YrhqQ==</UUID>
<Name>Folder2</Name>
<Notes>a note about the folder</Notes>
<IconID>48</IconID>
<Times>
<CreationTime>2016-12-31T21:43:30Z</CreationTime>
<LastModificationTime>2016-12-31T21:43:43Z</LastModificationTime>
<LastAccessTime>2017-01-01T22:58:00Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:43:30Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>1</UsageCount>
<LocationChanged>2016-12-31T21:43:43Z</LocationChanged>
</Times>
<IsExpanded>True</IsExpanded>
<DefaultAutoTypeSequence />
<EnableAutoType>null</EnableAutoType>
<EnableSearching>null</EnableSearching>
<LastTopVisibleEntry>AAAAAAAAAAAAAAAAAAAAAA==</LastTopVisibleEntry>
<Entry>
<UUID>fAa543oYlgnJKkhKag5HLw==</UUID>
<IconID>1</IconID>
<ForegroundColor />
<BackgroundColor />
<OverrideURL />
<Tags />
<Times>
<CreationTime>2016-12-31T21:34:13Z</CreationTime>
<LastModificationTime>2016-12-31T21:40:23Z</LastModificationTime>
<LastAccessTime>2016-12-31T21:40:23Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:34:13Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>0</UsageCount>
<LocationChanged>2016-12-31T21:43:48Z</LocationChanged>
</Times>
<String>
<Key>att2</Key>
<Value>att2value</Value>
</String>
<String>
<Key>attr1</Key>
<Value>att1value
line1
line2</Value>
</String>
<String>
<Key>Notes</Key>
<Value>This is a note!!!
line1
line2</Value>
</String>
<String>
<Key>Password</Key>
<Value ProtectInMemory="True">googpass</Value>
</String>
<String>
<Key>Title</Key>
<Value>Google</Value>
</String>
<String>
<Key>URL</Key>
<Value>google.com</Value>
</String>
<String>
<Key>UserName</Key>
<Value>googleuser</Value>
</String>
<AutoType>
<Enabled>True</Enabled>
<DataTransferObfuscation>0</DataTransferObfuscation>
</AutoType>
<History>
<Entry>
<UUID>fAa543oYlgnJKkhKag5HLw==</UUID>
<IconID>0</IconID>
<ForegroundColor />
<BackgroundColor />
<OverrideURL />
<Tags />
<Times>
<CreationTime>2016-12-31T21:34:13Z</CreationTime>
<LastModificationTime>2016-12-31T21:34:40Z</LastModificationTime>
<LastAccessTime>2016-12-31T21:34:40Z</LastAccessTime>
<ExpiryTime>2016-12-31T21:34:13Z</ExpiryTime>
<Expires>False</Expires>
<UsageCount>0</UsageCount>
<LocationChanged>2016-12-31T21:34:40Z</LocationChanged>
</Times>
<String>
<Key>Notes</Key>
<Value>This is a note!!!
line1
line2</Value>
</String>
<String>
<Key>Password</Key>
<Value ProtectInMemory="True">googpass</Value>
</String>
<String>
<Key>Title</Key>
<Value>Google</Value>
</String>
<String>
<Key>URL</Key>
<Value>google.com</Value>
</String>
<String>
<Key>UserName</Key>
<Value>googleuser</Value>
</String>
<AutoType>
<Enabled>True</Enabled>
<DataTransferObfuscation>0</DataTransferObfuscation>
</AutoType>
</Entry>
</History>
</Entry>
</Group>
</Group>
<DeletedObjects />
</Root>`;

View File

@@ -0,0 +1,3 @@
export const keepassxTestData = `Title,Username,Password,URL,Notes,TOTP
Example Entry,testuser,password123,https://example.com,Some notes,
Another Entry,anotheruser,anotherpassword,https://another.com,Another set of notes,otpauth://totp/Another?secret=ABCD1234EFGH5678`;

View File

@@ -0,0 +1,4 @@
export const testData = `"Foo","Bar","john.doe@example.com","1234567890abcdef","https://example.com/","These are some notes.",""
"Foo","Bar 1","john.doe1@example.com","234567890abcdef1","https://an.example.com/","","","Account ID","12345","Org ID","54321"
"Foo\\Baz","Bar 2","john.doe2@example.com","34567890abcdef12","https://another.example.com/","","","Account ID","23456","TFC:Keeper","otpauth://totp/Amazon:me@company.com?secret=JBSWY3DPEHPK3PXP&issuer=Amazon&algorithm=SHA1&digits=6&period=30"
`;

View File

@@ -0,0 +1,90 @@
import { KeeperJsonExport } from "../../keeper/types/keeper-json-types";
export const testData: KeeperJsonExport = {
shared_folders: [
{
path: "My Customer 1",
manage_users: true,
manage_records: true,
can_edit: true,
can_share: true,
permissions: [
{
uid: "kVM96KGEoGxhskZoSTd_jw",
manage_users: true,
manage_records: true,
},
{
name: "user@mycompany.com",
manage_users: true,
manage_records: true,
},
],
},
{
path: "Testing\\My Customer 2",
manage_users: true,
manage_records: true,
can_edit: true,
can_share: true,
permissions: [
{
uid: "ih1CggiQ-3ENXcn4G0sl-g",
manage_users: true,
manage_records: true,
},
{
name: "user@mycompany.com",
manage_users: true,
manage_records: true,
},
],
},
],
records: [
{
title: "Bank Account 1",
login: "customer1234",
password: "4813fJDHF4239fdk",
login_url: "https://chase.com",
notes: "These are some notes.",
custom_fields: {
"Account Number": "123-456-789",
},
folders: [
{
folder: "Optional Private Folder 1",
},
],
},
{
title: "Bank Account 2",
login: "mybankusername",
password: "w4k4k193f$^&@#*%2",
login_url: "https://amex.com",
notes: "Some great information here.",
custom_fields: {
"Security Group": "Public",
"IP Address": "12.45.67.8",
"TFC:Keeper":
"otpauth://totp/Amazon:me@company.com?secret=JBSWY3DPEHPK3PXP&issuer=Amazon&algorithm=SHA1&digits=6&period=30",
},
folders: [
{
folder: "Optional Private Folder 1",
},
{
shared_folder: "My Customer 1",
can_edit: true,
can_share: true,
},
],
},
{
title: "Some Account",
login: "someUserName",
password: "w4k4k1wergf$^&@#*%2",
login_url: "https://example.com",
},
],
};

View File

@@ -0,0 +1,3 @@
/* eslint-disable */
export const userAccountData = `nickname,url,username,password,additionalInfo,twofaSecret,status,tags
PasswordNickname,www.google.com,user.name@email.com,abc123,This is the additional information text.,someTOTPSeed,active,someTag`;

View File

@@ -0,0 +1,3 @@
/* eslint-disable */
export const userCreditCardData = `nickname,status,tags,cardNumber,cardName,exp_month,exp_year,cvv,additionalInfo
Visa test card,active,someTag,4111111111111111,Joe User,04,24,222,This is the additional information field`;

View File

@@ -0,0 +1,16 @@
/* eslint-disable */
export const userIdCardData = `nickname,status,tags,idType,idNumber,idName,idIssuanceDate,idExpirationDate,idCountry,additionalInfo
Joe User's nickname,active,someTag,Driver's License,123456,Joe M User,02/02/2022,02/02/2024,United States,Additional information
Passport ID card,active,someTag,Passport,1234567,Joe M User,03/07/2022,03/07/2028,United States,Additional information field
Social Security ID card,active,someTag,Social Security,123455678,Joe M User,03/07/2022,03/07/2028,United States,Additional information field text
ID card type ID card,active,someTag,ID Card,1234566,Joe M User,03/07/2022,03/07/2028,United States,Additional Information field text
Tax number ID card,active,someTag,Tax Number,12345678,Joe M User,03/07/2022,03/07/2028,United States,Additional information text field
Bank account ID card,active,someTag,Bank Account,12344556677,Joe M User,03/07/2022,03/07/2028,United States,Additional text information here
Insurance card ID card,active,someTag,Insurance Card,123456677,Joe M User,03/07/2022,03/07/2022,United States,Additional information text goes here
Health card Id card,active,someTag,Health Card,1234670,Joe M User,03/07/2022,03/07/2028,United States,More info
Membership ID card,active,someTag,Membership,12345709,Joe M User,03/07/2022,03/07/2028,United States,Add'l info
Database ID card,active,someTag,Database,12345089u,Joe M User,03/07/2022,03/07/2028,United States,Addin't info
Outdoor license ID card,active,someTag,Outdoor License,123890090,Joe M User,03/07/2022,03/07/2028,United States,Additional info
Reward program Id card,active,someTag,Reward Program,12345890b,Joe M User,03/07/2022,03/07/2028,United States,1234890
Software license ID card,active,someTag,Software License,1234567c,Joe M User,03/07/2022,03/07/2028,United States,"It seems like the fields don't change, which makes it pretty useless that they have so many ID card types."
Tour visa ID card,active,someTag,Tour Visa,123456lkhj,Joe M User,03/07/2022,03/07/2028,United States,Additional Information text`;

View File

@@ -0,0 +1,3 @@
/* eslint-disable */
export const userIdentityData = `nickname,status,tags,firstName,middleName,lastName,email,firstAddressLine,secondAddressLine,title,gender,number,city,country,zipCode,additionalInfo
Joe User's nickname,active,someTag,Joe,M,User,joe.user@email.com,1 Example House,Suite 300,Mr,Male,2223334444,Portland,United States,04101,Additional information field`;

View File

@@ -0,0 +1,3 @@
/* eslint-disable */
export const userNoteData = `nickname,status,content
The title of a secure note,active,"The content of a secure note. Lorem ipsum, etc."`;

View File

@@ -0,0 +1,3 @@
/* eslint-disable */
export const userTwoFaData = `nickname,status,tags,authToken,additionalInfo
2FA nickname,active,someTag,someTOTPSeed,"Additional information field content. "`;

View File

@@ -0,0 +1,4 @@
export const credentialsData = `"Organisationseinheit";"DataTags";"Beschreibung";"Benutzername";"Passwort";"Internetseite";"Informationen";"One-Time Passwort"
"folderOrCollection1";"tag1, tag2, tag3";"Test Entry 1";"someUser";"somePassword";"https://www.example.com";"some note for example.com";"someTOTPSeed"
"folderOrCollection2";"tag2";"Test Entry 2";"jdoe";"})9+Kg2fz_O#W1§H1-<ox>0Zio";"www.123.com";"Description123";"anotherTOTP"
"folderOrCollection1";"someTag";"Test Entry 3";"username";"password";"www.internetsite.com";"Information";""`;

View File

@@ -0,0 +1,2 @@
export const data = `name,url,additional_urls,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state,type,custom_fields
SomeVisa,,,,,,SomeHolder,4024007103939509,123,01 / 22,12345,,,,,,,,,,credit_card,`;

View File

@@ -0,0 +1,2 @@
export const data = `name,url,additional_urls,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state,type,custom_fields
SomeTitle,,,,,SomeNoteToMyIdentity,,,,,123456,,#fullName,123456789,hello@bitwarden.com,Test street 123,additional addressinfo,Cologne,Germany,North-Rhine-Westphalia,identity,`;

View File

@@ -0,0 +1,2 @@
export const data = `name,url,additional_urls,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state,type,custom_fields
SomeVaultItemName,https://example.com,"[""https://example.net""]",hello@bitwarden.com,someStrongPassword,Some note for the VaultItem,,,,,,SomeFolderForVaultItem,,,,,,,,,password,`;

View File

@@ -0,0 +1,2 @@
export const data = `name,url,additional_urls,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state,type,custom_fields
SomeVaultItemName,https://example.com,,hello@bitwarden.com,someStrongPassword,Some note for the VaultItem,,,,,,SomeFolderForVaultItem,,,,,,,,,password,"[{""label"":""textLabel"",""type"":""text"",""value"":""text value""},{""label"":""hiddenLabel"",""type"":""hidden"",""value"":""hidden value""}]"`;

View File

@@ -0,0 +1,3 @@
export const data = `name,url,additional_urls,username,password,note,cardholdername,cardnumber,cvc,expirydate,zipcode,folder,full_name,phone_number,email,address1,address2,city,country,state,type,custom_fields
notesFolder,,,,,,,,,,,,,,,,,,,,,
MySuperSecureNoteTitle,,,,,MySuperSecureNote,,,,,,notesFolder,,,,,,,,,note,`;

View File

@@ -0,0 +1,162 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const APICredentialsData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "6nqnjdqyk5mwvqbdgbdr47oabe",
favIndex: 0,
createdAt: 1619465969,
updatedAt: 1619466052,
state: "active",
categoryUuid: "112",
details: {
loginFields: [],
notesPlain: "My API Credential",
sections: [
{
title: "",
fields: [
{
title: "username",
id: "username",
value: {
string: "apiuser@nullvalue.test",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "no",
capitalization: "none",
},
},
{
title: "credential",
id: "credential",
value: {
concealed: "apiapiapiapiapiapiappy",
},
guarded: true,
multiline: false,
dontGenerate: true,
inputTraits: {
keyboard: "default",
correction: "no",
capitalization: "default",
},
},
{
title: "type",
id: "type",
value: {
menu: "jwt",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "filename",
id: "filename",
value: {
string: "filename.jwt",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "valid from",
id: "validFrom",
value: {
date: 1301918460,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "expires",
id: "expires",
value: {
date: 1932811260,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "hostname",
id: "hostname",
value: {
string: "not.your.everyday.hostname",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "uRL",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "",
title: "API Credential",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,214 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const BankAccountData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "u2l4sjbencvsowwjuj3dfpt73q",
favIndex: 0,
createdAt: 1619466056,
updatedAt: 1619466187,
state: "active",
categoryUuid: "101",
details: {
loginFields: [],
notesPlain: "My Bank Account",
sections: [
{
title: "",
fields: [
{
title: "bank name",
id: "bankName",
value: {
string: "Super Credit Union",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "name on account",
id: "owner",
value: {
string: "Cool Guy",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "type",
id: "accountType",
value: {
menu: "checking",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "routing number",
id: "routingNo",
value: {
string: "111000999",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numbersAndPunctuation",
correction: "default",
capitalization: "default",
},
},
{
title: "account number",
id: "accountNo",
value: {
string: "192837465918273645",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numbersAndPunctuation",
correction: "default",
capitalization: "default",
},
},
{
title: "SWIFT",
id: "swift",
value: {
string: "123456",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numbersAndPunctuation",
correction: "default",
capitalization: "default",
},
},
{
title: "IBAN",
id: "iban",
value: {
string: "DE12 123456",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numbersAndPunctuation",
correction: "default",
capitalization: "default",
},
},
{
title: "PIN",
id: "telephonePin",
value: {
concealed: "5555",
},
guarded: false,
multiline: false,
dontGenerate: true,
inputTraits: {
keyboard: "numberPad",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "Branch Information",
name: "branchInfo",
fields: [
{
title: "phone",
id: "branchPhone",
value: {
phone: "9399399933",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "namePhonePad",
correction: "default",
capitalization: "default",
},
},
{
title: "address",
id: "branchAddress",
value: {
string: "1 Fifth Avenue",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "sentences",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "Super Credit Union",
tags: ["Finance"],
title: "Bank Account",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,326 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const CreditCardData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "vpxi2esuujz7nrbojp34rd5aja",
favIndex: 0,
createdAt: 1619465282,
updatedAt: 1619465447,
state: "active",
categoryUuid: "002",
details: {
loginFields: [],
notesPlain: "My parents' credit card. ",
sections: [
{
title: "",
fields: [
{
title: "cardholder name",
id: "cardholder",
value: {
string: "Fred Engels",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "type",
id: "type",
value: {
creditCardType: "discover",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "number",
id: "ccnum",
value: {
creditCardNumber: "6011111111111117",
},
guarded: true,
clipboardFilter: "0123456789",
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numberPad",
correction: "default",
capitalization: "default",
},
},
{
title: "verification number",
id: "cvv",
value: {
concealed: "1312",
},
guarded: true,
multiline: false,
dontGenerate: true,
inputTraits: {
keyboard: "numberPad",
correction: "default",
capitalization: "default",
},
},
{
title: "expiry date",
id: "expiry",
value: {
monthYear: 209912,
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "valid from",
id: "validFrom",
value: {
monthYear: 200101,
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "",
id: "txbzvwzpck7ejhfres3733rbpm",
value: {
string: "card",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "Contact Information",
name: "contactInfo",
fields: [
{
title: "issuing bank",
id: "bank",
value: {
string: "Some bank",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "phone (local)",
id: "phoneLocal",
value: {
phone: "123456",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "namePhonePad",
correction: "default",
capitalization: "default",
},
},
{
title: "phone (toll free)",
id: "phoneTollFree",
value: {
phone: "0800123456",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "namePhonePad",
correction: "default",
capitalization: "default",
},
},
{
title: "phone (intl)",
id: "phoneIntl",
value: {
phone: "+49123456",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "namePhonePad",
correction: "default",
capitalization: "default",
},
},
{
title: "website",
id: "website",
value: {
url: "somebank.com",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "Additional Details",
name: "details",
fields: [
{
title: "PIN",
id: "pin",
value: {
concealed: "1234",
},
guarded: false,
multiline: false,
dontGenerate: true,
inputTraits: {
keyboard: "numberPad",
correction: "default",
capitalization: "default",
},
},
{
title: "credit limit",
id: "creditLimit",
value: {
string: "$1312",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numbersAndPunctuation",
correction: "default",
capitalization: "default",
},
},
{
title: "cash withdrawal limit",
id: "cashLimit",
value: {
string: "$500",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numbersAndPunctuation",
correction: "default",
capitalization: "default",
},
},
{
title: "interest rate",
id: "interest",
value: {
string: "1%",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numbersAndPunctuation",
correction: "default",
capitalization: "default",
},
},
{
title: "issue number",
id: "issuenumber",
value: {
string: "123456",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "no",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "1234 **** 6789",
tags: ["Finance"],
title: "Parent's Credit Card",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,192 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const DatabaseData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "ospvepl3ex2y6hjwwqwyvtf2sy",
favIndex: 0,
createdAt: 1619466193,
updatedAt: 1619466276,
state: "active",
categoryUuid: "102",
details: {
loginFields: [],
notesPlain: "My Database",
sections: [
{
title: "",
fields: [
{
title: "type",
id: "database_type",
value: {
menu: "postgresql",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "server",
id: "hostname",
value: {
string: "my.secret.db.server",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "uRL",
correction: "default",
capitalization: "default",
},
},
{
title: "port",
id: "port",
value: {
string: "1337",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numberPad",
correction: "default",
capitalization: "default",
},
},
{
title: "database",
id: "database",
value: {
string: "user_database",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "no",
capitalization: "none",
},
},
{
title: "username",
id: "username",
value: {
string: "cooldbuser",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "no",
capitalization: "none",
},
},
{
title: "password",
id: "password",
value: {
concealed: "^+kTjhLaN7wVPAhGU)*J",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "SID",
id: "sid",
value: {
string: "ASDIUFU-283234",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "alias",
id: "alias",
value: {
string: "cdbu",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "connection options",
id: "options",
value: {
string: "ssh",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "my.secret.db.server",
title: "Database",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,222 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const DriversLicenseData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "nntuge2g7s2wrlokyfhea354ay",
favIndex: 0,
createdAt: 1619466279,
updatedAt: 1619466425,
state: "active",
categoryUuid: "103",
details: {
loginFields: [],
notesPlain: "My Driver's License",
sections: [
{
title: "",
fields: [
{
title: "full name",
id: "fullname",
value: {
string: "Michael Scarn",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "address",
id: "address",
value: {
string: "2120 Mifflin Rd.",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "sentences",
},
},
{
title: "date of birth",
id: "birthdate",
value: {
date: 252504060,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "sex",
id: "sex",
value: {
gender: "male",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "height",
id: "height",
value: {
string: "5'11\"",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "number",
id: "number",
value: {
string: "12345678901",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "license class",
id: "class",
value: {
string: "C",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "conditions / restrictions",
id: "conditions",
value: {
string: "B",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "state",
id: "state",
value: {
string: "Pennsylvania",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "country",
id: "country",
value: {
string: "United States",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "expiry date",
id: "expiry_date",
value: {
monthYear: 203012,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "12345678901",
title: "Michael Scarn",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,324 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const EmailAccountData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "p3hohdgwpt4u2ra2fc3tvzomsm",
favIndex: 0,
createdAt: 1619466428,
updatedAt: 1619466585,
state: "active",
categoryUuid: "111",
details: {
loginFields: [],
notesPlain: "My Email Config",
sections: [
{
title: "",
fields: [
{
title: "type",
id: "pop_type",
value: {
menu: "either",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "username",
id: "pop_username",
value: {
string: "someuser@nullvalue.test",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "no",
capitalization: "none",
},
},
{
title: "server",
id: "pop_server",
value: {
string: "mailserver.nullvalue.test",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "uRL",
correction: "default",
capitalization: "default",
},
},
{
title: "port number",
id: "pop_port",
value: {
string: "587",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numberPad",
correction: "default",
capitalization: "default",
},
},
{
title: "password",
id: "pop_password",
value: {
concealed: "u1jsf<UI*&YU&^T",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "security",
id: "pop_security",
value: {
menu: "TLS",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "auth method",
id: "pop_authentication",
value: {
menu: "kerberos_v5",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "SMTP",
name: "SMTP",
fields: [
{
title: "SMTP server",
id: "smtp_server",
value: {
string: "mailserver.nullvalue.test",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "uRL",
correction: "default",
capitalization: "default",
},
},
{
title: "port number",
id: "smtp_port",
value: {
string: "589",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numberPad",
correction: "default",
capitalization: "default",
},
},
{
title: "username",
id: "smtp_username",
value: {
string: "someuser@nullvalue.test",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "no",
capitalization: "none",
},
},
{
title: "password",
id: "smtp_password",
value: {
concealed: "(*1674%^UIUJ*UI(IUI8u98uyy",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "security",
id: "smtp_security",
value: {
menu: "TLS",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "auth method",
id: "smtp_authentication",
value: {
menu: "password",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "Contact Information",
name: "Contact Information",
fields: [
{
title: "provider",
id: "provider",
value: {
string: "Telum",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "provider's website",
id: "provider_website",
value: {
string: "https://telum.nullvalue.test",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "uRL",
correction: "default",
capitalization: "default",
},
},
{
title: "phone (local)",
id: "phone_local",
value: {
string: "2346666666",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "namePhonePad",
correction: "default",
capitalization: "default",
},
},
{
title: "phone (toll free)",
id: "phone_tollfree",
value: {
string: "18005557777",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "namePhonePad",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "someuser@nullvalue.test",
title: "Email Config",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,86 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const EmailFieldOnIdentityData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "45mjttbbq3owgij2uis55pfrlq",
favIndex: 0,
createdAt: 1619465450,
updatedAt: 1619465789,
state: "active",
categoryUuid: "004",
details: {
loginFields: [],
notesPlain: "",
sections: [
{
title: "Identification",
name: "name",
fields: [],
},
{
title: "Address",
name: "address",
fields: [],
},
{
title: "Internet Details",
name: "internet",
fields: [
{
title: "E-mail",
id: "E-mail",
value: {
email: {
email_address: "gengels@nullvalue.test",
provider: "myEmailProvider",
},
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "emailAddress",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "George Engels",
title: "George Engels",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,101 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const EmailFieldOnIdentityPrefilledData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "45mjttbbq3owgij2uis55pfrlq",
favIndex: 0,
createdAt: 1619465450,
updatedAt: 1619465789,
state: "active",
categoryUuid: "004",
details: {
loginFields: [],
notesPlain: "",
sections: [
{
title: "Identification",
name: "name",
fields: [],
},
{
title: "Address",
name: "address",
fields: [],
},
{
title: "Internet Details",
name: "internet",
fields: [
{
title: "email",
id: "email",
value: {
string: "gengels@nullvalue.test",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "emailAddress",
correction: "default",
capitalization: "default",
},
},
{
title: "2nd email",
id: "2nd_email",
value: {
email: {
email_address: "kriddler@nullvalue.test",
provider: "myEmailProvider",
},
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "emailAddress",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "George Engels",
title: "George Engels",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,90 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const EmailFieldData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "47hvppiuwbanbza7bq6jpdjfxu",
favIndex: 1,
createdAt: 1619467985,
updatedAt: 1619468230,
state: "active",
categoryUuid: "100",
details: {
loginFields: [],
notesPlain: "My Software License",
sections: [
{
title: "",
fields: [],
},
{
title: "Customer",
name: "customer",
fields: [
{
title: "registered email",
id: "reg_email",
value: {
email: {
email_address: "kriddler@nullvalue.test",
provider: "myEmailProvider",
},
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "emailAddress",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "Publisher",
name: "publisher",
fields: [],
},
{
title: "Order",
name: "order",
fields: [],
},
],
passwordHistory: [],
},
overview: {
subtitle: "5.10.1000",
title: "Limux Product Key",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,451 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const IdentityData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "45mjttbbq3owgij2uis55pfrlq",
favIndex: 0,
createdAt: 1619465450,
updatedAt: 1619465789,
state: "active",
categoryUuid: "004",
details: {
loginFields: [],
notesPlain: "",
sections: [
{
title: "Identification",
name: "name",
fields: [
{
title: "first name",
id: "firstname",
value: {
string: "George",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "initial",
id: "initial",
value: {
string: "S",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "last name",
id: "lastname",
value: {
string: "Engels",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "sex",
id: "sex",
value: {
menu: "male",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "birth date",
id: "birthdate",
value: {
date: 347198460,
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "occupation",
id: "occupation",
value: {
string: "Steel Worker",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "company",
id: "company",
value: {
string: "Acme Inc.",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "department",
id: "department",
value: {
string: "QA",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "job title",
id: "jobtitle",
value: {
string: "Quality Assurance Manager",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
],
},
{
title: "Address",
name: "address",
fields: [
{
title: "address",
id: "address",
value: {
address: {
street: "1312 Main St.",
city: "Atlantis",
country: "us",
zip: "90210",
state: "California",
},
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "sentences",
},
},
{
title: "default phone",
id: "defphone",
value: {
phone: "4565555555",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "home",
id: "homephone",
value: {
phone: "4575555555",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "cell",
id: "cellphone",
value: {
phone: "4585555555",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "business",
id: "busphone",
value: {
phone: "4595555555",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "Internet Details",
name: "internet",
fields: [
{
title: "username",
id: "username",
value: {
string: "gengels",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "reminder question",
id: "reminderq",
value: {
string: "Who's a super cool guy?",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "reminder answer",
id: "remindera",
value: {
string: "Me, buddy.",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "email",
id: "email",
value: {
string: "gengels@nullvalue.test",
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "emailAddress",
correction: "default",
capitalization: "default",
},
},
{
title: "website",
id: "website",
value: {
string: "cv.gengels.nullvalue.test",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "uRL",
correction: "default",
capitalization: "default",
},
},
{
title: "ICQ",
id: "icq",
value: {
string: "12345678",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "skype",
id: "skype",
value: {
string: "skypeisbad1619",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "AOL/AIM",
id: "aim",
value: {
string: "aollol@lololol.aol.com",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "Yahoo",
id: "yahoo",
value: {
string: "sk8rboi13@yah00.com",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "MSN",
id: "msn",
value: {
string: "msnothankyou@msn&m&m.com",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "forum signature",
id: "forumsig",
value: {
string: "super cool guy",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "George Engels",
title: "George Engels",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,133 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const LoginData: ExportData = {
accounts: [
{
attrs: {
accountName: "Wendy Appleseed",
name: "Wendy Appleseed",
avatar: "profile-pic.png",
email: "wendy.c.appleseed@gmail.com",
uuid: "D4RI47B7BJDT25C2LWA7LEJLHZ",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "rr3lr6c2opoggvrete23q72ahi",
desc: "",
avatar: "pic.png",
name: "Personal",
type: "P",
},
items: [
{
uuid: "2b3hr6p5hinr7prtrj65bwmxqu",
favIndex: 0,
createdAt: 1635522833,
updatedAt: 1635522872,
state: "active",
categoryUuid: "001",
details: {
loginFields: [
{
value: "username123123123@gmail.com",
id: "",
name: "email",
fieldType: "E",
designation: "username",
},
{
value: "password!",
id: "",
name: "password",
fieldType: "P",
designation: "password",
},
{
value: "",
id: "terms",
name: "terms",
fieldType: "C",
},
{
value: "✓",
id: "policies",
name: "policies",
fieldType: "C",
},
],
sections: [
{
title: "Saved on www.fakesite.com",
name: "Section_mlvk6wzoifml4rbs4c3rfu4e2a",
fields: [
{
title: "Create an account",
id: "cyqyggt2otns6tbbqtsl6w2ceu",
value: {
string: "username123123",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "one-time password",
id: "TOTP_564mvwqapphpsjetnnuovmuxum",
value: {
totp: "otpseed777",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [
{
value: "123uio123oiu123uiopassword",
time: 1635522872,
},
{
value: "123uio123oiu123uiopassword123",
time: 1635522854,
},
{
value: "123uio123oiu123uiopassword123123",
time: 1635522848,
},
],
},
overview: {
subtitle: "username123123@gmail.com",
urls: [
{
label: "website",
url: "https://www.fakesite.com",
},
],
title: "eToro",
url: "https://www.fakesite.com",
ps: 54,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,190 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const MedicalRecordData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "42mj5boh5rxq7uqjrmkslmhosu",
favIndex: 0,
createdAt: 1641220207,
updatedAt: 1641220326,
state: "active",
categoryUuid: "113",
details: {
loginFields: [],
notesPlain: "Some notes about my medical history",
sections: [
{
title: "",
fields: [
{
title: "date",
id: "date",
value: {
date: 1641038460,
},
guarded: true,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "location",
id: "location",
value: {
string: "some hospital/clinic",
},
guarded: true,
multiline: false,
dontGenerate: false,
placeholder: "locationplaceholder",
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "healthcare professional",
id: "healthcareprofessional",
value: {
string: "Some Doctor",
},
guarded: true,
multiline: false,
dontGenerate: false,
placeholder: "nameplaceholder",
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "patient",
id: "patient",
value: {
string: "Me",
},
guarded: true,
multiline: false,
dontGenerate: false,
placeholder: "nameplaceholder",
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "reason for visit",
id: "reason",
value: {
string: "unwell",
},
guarded: true,
multiline: true,
dontGenerate: false,
placeholder: "reasonplaceholder",
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "sentences",
},
},
],
},
{
title: "medication",
name: "medication",
fields: [
{
title: "medication",
id: "medication",
value: {
string: "Insuline",
},
guarded: true,
multiline: false,
dontGenerate: false,
placeholder: "medicationplaceholder",
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "dosage",
id: "dosage",
value: {
string: "1",
},
guarded: true,
multiline: false,
dontGenerate: false,
placeholder: "dosageplaceholder",
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "medication notes",
id: "notes",
value: {
string: "multiple times a day",
},
guarded: true,
multiline: true,
dontGenerate: false,
placeholder: "notesplaceholder",
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "sentences",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "2022-01-01",
title: "Some Health Record",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,178 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const MembershipData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "ofdp2szoty2ujk6yv5ebn4wjr4",
favIndex: 1,
createdAt: 1619467269,
updatedAt: 1619467368,
state: "active",
categoryUuid: "105",
details: {
loginFields: [],
notesPlain: "My Library Card",
sections: [
{
title: "",
fields: [
{
title: "group",
id: "org_name",
value: {
string: "National Public Library",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "website",
id: "website",
value: {
url: "https://npl.nullvalue.gov.test",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "telephone",
id: "phone",
value: {
phone: "9995555555",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "member name",
id: "member_name",
value: {
string: "George Engels",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "member since",
id: "member_since",
value: {
monthYear: 199901,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "expiry date",
id: "expiry_date",
value: {
monthYear: 203412,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "member ID",
id: "membership_no",
value: {
string: "64783862",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "namePhonePad",
correction: "no",
capitalization: "default",
},
},
{
title: "PIN",
id: "pin",
value: {
concealed: "19191",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numberPad",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "George Engels",
tags: ["Education"],
title: "Library Card",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,92 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const OnePuxExampleFile: ExportData = {
accounts: [
{
attrs: {
accountName: "Wendy Appleseed",
name: "Wendy Appleseed",
avatar: "profile-pic.png",
email: "wendy.c.appleseed@gmail.com",
uuid: "D4RI47B7BJDT25C2LWA7LEJLHZ",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "rr3lr6c2opoggvrete23q72ahi",
desc: "",
avatar: "pic.png",
name: "Personal",
type: "P",
},
items: [
{
uuid: "fkruyzrldvizuqlnavfj3gltfe",
favIndex: 1,
createdAt: 1614298956,
updatedAt: 1635346445,
state: "active",
categoryUuid: "001",
details: {
loginFields: [
{
value: "most-secure-password-ever!",
id: "",
name: "password",
fieldType: "P",
designation: "password",
},
],
notesPlain: "This is a note. *bold*! _italic_!",
sections: [
{
title: "Security",
name: "Section_oazxddhvftfknycbbmh5ntwfa4",
fields: [
{
title: "PIN",
id: "CCEF647B399604E8F6Q6C8C3W31AFD407",
value: {
concealed: "12345",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [
{
value: "12345password",
time: 1458322355,
},
],
},
overview: {
subtitle: "",
urls: [
{
label: "",
url: "https://www.dropbox.com/",
},
],
title: "Dropbox",
url: "https://www.dropbox.com/",
ps: 100,
pbe: 86.13621,
pgrng: true,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,162 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const OutdoorLicenseData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "6fb73t5lk7vc52h3osw3ccmguy",
favIndex: 0,
createdAt: 1619467374,
updatedAt: 1619467492,
state: "active",
categoryUuid: "104",
details: {
loginFields: [],
notesPlain: "My Outdoor License",
sections: [
{
title: "",
fields: [
{
title: "full name",
id: "name",
value: {
string: "Cash Bandit",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "valid from",
id: "valid_from",
value: {
date: 1617278460,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "expires",
id: "expires",
value: {
date: 2343124860,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "approved wildlife",
id: "game",
value: {
string: "Bananas,blueberries,corn",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "maximum quota",
id: "quota",
value: {
string: "100/each",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "state",
id: "state",
value: {
string: "Washington",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "country",
id: "country",
value: {
string: "United States of America",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "Cash Bandit",
title: "Harvest License",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,223 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const PassportData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "hffila4ew2e3krfzp2tkdkdmea",
favIndex: 0,
createdAt: 1619467498,
updatedAt: 1619467655,
state: "active",
categoryUuid: "106",
details: {
loginFields: [],
notesPlain: "My Passport",
sections: [
{
title: "",
fields: [
{
title: "type",
id: "type",
value: {
string: "US Passport",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "allCharacters",
},
},
{
title: "issuing country",
id: "issuing_country",
value: {
string: "United States of America",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "number",
id: "number",
value: {
string: "76436847",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "namePhonePad",
correction: "default",
capitalization: "default",
},
},
{
title: "full name",
id: "fullname",
value: {
string: "David Global",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "sex",
id: "sex",
value: {
gender: "female",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "nationality",
id: "nationality",
value: {
string: "International",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "issuing authority",
id: "issuing_authority",
value: {
string: "Department of State",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "date of birth",
id: "birthdate",
value: {
date: 418046460,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "place of birth",
id: "birthplace",
value: {
string: "A cave somewhere in Maine",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "issued on",
id: "issue_date",
value: {
date: 1577880060,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "expiry date",
id: "expiry_date",
value: {
date: 2524651260,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "76436847",
tags: ["Travel"],
title: "Mr. Globewide",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,58 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const PasswordData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "qpdsrgpngzud3x3rbfvyrz3ane",
favIndex: 0,
createdAt: 1619465796,
updatedAt: 1619465869,
state: "active",
categoryUuid: "005",
details: {
loginFields: [],
notesPlain: "SuperSecret Password Notes",
sections: [],
passwordHistory: [],
password: "GBq[AGb]4*Si3tjwuab^",
},
overview: {
subtitle: "April 26, 2021 2:36 PM",
urls: [
{
label: "website",
url: "https://n0t.y0ur.n0rm4l.w3bs1t3",
},
],
title: "SuperSecret Password",
url: "https://n0t.y0ur.n0rm4l.w3bs1t3",
ps: 100,
pbe: 127.500786,
pgrng: true,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,200 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const RewardsProgramData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "3bmrdcml3tngvsr6zdlvd2xo4i",
favIndex: 0,
createdAt: 1619467659,
updatedAt: 1619467765,
state: "active",
categoryUuid: "107",
details: {
loginFields: [],
notesPlain: "My Reward Card",
sections: [
{
title: "",
fields: [
{
title: "company name",
id: "company_name",
value: {
string: "Super Cool Store Co.",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "member name",
id: "member_name",
value: {
string: "Chef Coldroom",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "member ID",
id: "membership_no",
value: {
string: "member-29813569",
},
guarded: false,
clipboardFilter:
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "no",
capitalization: "none",
},
},
{
title: "PIN",
id: "pin",
value: {
concealed: "99913",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numberPad",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "More Information",
name: "extra",
fields: [
{
title: "member ID (additional)",
id: "additional_no",
value: {
string: "additional member id",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "no",
capitalization: "none",
},
},
{
title: "member since",
id: "member_since",
value: {
monthYear: 202101,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "customer service phone",
id: "customer_service_phone",
value: {
phone: "123456",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "namePhonePad",
correction: "default",
capitalization: "default",
},
},
{
title: "phone for reservations",
id: "reservations_phone",
value: {
phone: "123456",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "namePhonePad",
correction: "default",
capitalization: "default",
},
},
{
title: "website",
id: "website",
value: {
url: "supercoolstore.com",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "Super Cool Store Co.",
title: "Retail Reward Thing",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,52 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const SecureNoteData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "gcozv72svonjgufn4q5hnyzwmu",
favIndex: 0,
createdAt: 1619465226,
updatedAt: 1619465278,
state: "active",
categoryUuid: "003",
details: {
loginFields: [],
notesPlain:
"This is my secure note. \n\nLorem ipsum expecto patronum. \nThe quick brown fox jumped over the lazy dog. ",
sections: [],
passwordHistory: [],
},
overview: {
subtitle: "This is my secure note. ",
title: "Secure Note #1",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,219 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const ServerData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "35szbzswhgeq3wyblg7odmshhu",
favIndex: 0,
createdAt: 1619467769,
updatedAt: 1619467906,
state: "active",
categoryUuid: "110",
details: {
loginFields: [],
notesPlain: "My Server",
sections: [
{
title: "",
fields: [
{
title: "URL",
id: "url",
value: {
string: "https://coolserver.nullvalue.test",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "uRL",
correction: "default",
capitalization: "default",
},
},
{
title: "username",
id: "username",
value: {
string: "frankly-notsure",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "no",
capitalization: "none",
},
},
{
title: "password",
id: "password",
value: {
concealed: "*&YHJI87yjy78u",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "Admin Console",
name: "admin_console",
fields: [
{
title: "admin console URL",
id: "admin_console_url",
value: {
string: "https://coolserver.nullvalue.test/admin",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "uRL",
correction: "default",
capitalization: "default",
},
},
{
title: "admin console username",
id: "admin_console_username",
value: {
string: "frankly-idontknowwhatimdoing",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "no",
capitalization: "none",
},
},
{
title: "console password",
id: "admin_console_password",
value: {
concealed: "^%RY&^YUiju8iUYHJI(U",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "Hosting Provider",
name: "hosting_provider_details",
fields: [
{
title: "name",
id: "name",
value: {
string: "Private Hosting Provider Inc.",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "website",
id: "website",
value: {
string: "https://phpi.nullvalue.test",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "uRL",
correction: "default",
capitalization: "default",
},
},
{
title: "support URL",
id: "support_contact_url",
value: {
string: "https://phpi.nullvalue.test/support",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "uRL",
correction: "default",
capitalization: "default",
},
},
{
title: "support phone",
id: "support_contact_phone",
value: {
string: "8882569382",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "namePhonePad",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "frankly-notsure",
title: "Super Cool Server",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,276 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const SoftwareLicenseData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "47hvppiuwbanbza7bq6jpdjfxu",
favIndex: 1,
createdAt: 1619467985,
updatedAt: 1619468230,
state: "active",
categoryUuid: "100",
details: {
loginFields: [],
notesPlain: "My Software License",
sections: [
{
title: "",
fields: [
{
title: "version",
id: "product_version",
value: {
string: "5.10.1000",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numbersAndPunctuation",
correction: "default",
capitalization: "default",
},
},
{
title: "license key",
id: "reg_code",
value: {
string: "265453-13457355-847327",
},
guarded: true,
multiline: true,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "Customer",
name: "customer",
fields: [
{
title: "licensed to",
id: "reg_name",
value: {
string: "Kay Riddler",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "registered email",
id: "reg_email",
value: {
email: {
email_address: "kriddler@nullvalue.test",
provider: null,
},
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "emailAddress",
correction: "default",
capitalization: "default",
},
},
{
title: "company",
id: "company",
value: {
string: "Riddles and Jigsaw Puzzles GmbH",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
],
},
{
title: "Publisher",
name: "publisher",
fields: [
{
title: "download page",
id: "download_link",
value: {
url: "https://limuxcompany.nullvalue.test/5.10.1000/isos",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "publisher",
id: "publisher_name",
value: {
string: "Limux Software and Hardware",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "website",
id: "publisher_website",
value: {
url: "https://limuxcompany.nullvalue.test/",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "retail price",
id: "retail_price",
value: {
string: "$999",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numbersAndPunctuation",
correction: "default",
capitalization: "default",
},
},
{
title: "support email",
id: "support_email",
value: {
email: {
email_address: "support@nullvalue.test",
provider: null,
},
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
{
title: "Order",
name: "order",
fields: [
{
title: "purchase date",
id: "order_date",
value: {
date: 1617278460,
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "order number",
id: "order_number",
value: {
string: "594839",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "order total",
id: "order_total",
value: {
string: "$1086.59",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "numbersAndPunctuation",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "5.10.1000",
title: "Limux Product Key",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,87 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const SSNData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "vi2biozc7sjnhr5sejk74nz26i",
favIndex: 1,
createdAt: 1619467910,
updatedAt: 1619467982,
state: "active",
categoryUuid: "108",
details: {
loginFields: [],
notesPlain: "My SSN",
sections: [
{
title: "",
fields: [
{
title: "name",
id: "name",
value: {
string: "Jack Judd",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "number",
id: "number",
value: {
concealed: "131-216-1900",
},
guarded: false,
multiline: false,
dontGenerate: true,
inputTraits: {
keyboard: "numbersAndPunctuation",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "Jack Judd",
title: "SSN",
url: "",
ps: 0,
pbe: 0.0,
pgrng: false,
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,174 @@
import { ExportData } from "../../onepassword/types/onepassword-1pux-importer-types";
export const WirelessRouterData: ExportData = {
accounts: [
{
attrs: {
accountName: "1Password Customer",
name: "1Password Customer",
avatar: "",
email: "username123123123@gmail.com",
uuid: "TRIZ3XV4JJFRXJ3BARILLTUA6E",
domain: "https://my.1password.com/",
},
vaults: [
{
attrs: {
uuid: "pqcgbqjxr4tng2hsqt5ffrgwju",
desc: "Just test entries",
avatar: "ke7i5rxnjrh3tj6uesstcosspu.png",
name: "T's Test Vault",
type: "U",
},
items: [
{
uuid: "fnnva6qkqdc3bv3qte2npnz6l4",
favIndex: 0,
createdAt: 1577652307,
updatedAt: 1577652307,
state: "active",
categoryUuid: "109",
details: {
loginFields: [],
notesPlain: "My Wifi Router Config",
sections: [
{
title: "",
fields: [
{
title: "base station name",
id: "name",
value: {
string: "pixel 2Xl",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "words",
},
},
{
title: "base station password",
id: "password",
value: {
concealed: "BqatGTVQ9TCN72tLbjrsHqkb",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "server / ip address",
id: "server",
value: {
string: "127.0.0.1",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "uRL",
correction: "default",
capitalization: "default",
},
},
{
title: "airport id",
id: "airport_id",
value: {
string: "some airportId",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "network name",
id: "network_name",
value: {
string: "some network name",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "wireless security",
id: "wireless_security",
value: {
menu: "WPA",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "wireless network password",
id: "wireless_password",
value: {
concealed: "wifipassword",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
{
title: "attached storage password",
id: "disk_password",
value: {
concealed: "diskpassword",
},
guarded: false,
multiline: false,
dontGenerate: false,
inputTraits: {
keyboard: "default",
correction: "default",
capitalization: "default",
},
},
],
},
],
passwordHistory: [],
},
overview: {
subtitle: "",
title: "Wireless Router",
url: "",
},
},
],
},
],
},
],
};

View File

@@ -0,0 +1,4 @@
/* eslint-disable */
export const data = `"account number(accountNo)","address(address)","address(branchAddress)","admin console URL(admin_console_url)","admin console username(admin_console_username)","AirPort ID(airport_id)","alias(alias)","AOL/AIM(aim)","approved wildlife(game)","attached storage password(disk_password)","auth method(pop_authentication)","auth method(smtp_authentication)","bank name(bankName)","base station name(name)","base station password(password)","birth date(birthdate)","business(busphone)","cardholder name(cardholder)","cash withdrawal limit(cashLimit)","cell(cellphone)","company name(company_name)","company(company)","conditions / restrictions(conditions)","connection options(options)","console password(admin_console_password)","country(country)","Created Date","credit limit(creditLimit)","customer service phone(customer_service_phone)","database(database)","date of birth(birthdate)","default phone(defphone)","department(department)","download page(download_link)","email(email)","expires(expires)","expiry date(expiry_date)","expiry date(expiry)","first name(firstname)","forum signature(forumsig)","full name(fullname)","full name(name)","group(org_name)","height(height)","home(homephone)","IBAN(iban)","ICQ(icq)","initial(initial)","interest rate(interest)","issue number(issuenumber)","issued on(issue_date)","issuing authority(issuing_authority)","issuing bank(bank)","issuing country(issuing_country)","job title(jobtitle)","last name(lastname)","license class(class)","license key(reg_code)","licensed to(reg_name)","maximum quota(quota)","member ID (additional)(additional_no)","member ID(membership_no)","member name(member_name)","member since(member_since)","Modified Date","MSN(msn)","name on account(owner)","name(name)","nationality(nationality)","network name(network_name)","Notes","number(ccnum)","number(number)","occupation(occupation)","order number(order_number)","order total(order_total)","Password","password(password)","password(pop_password)","password(smtp_password)","phone (intl)(phoneIntl)","phone (local)(phone_local)","phone (local)(phoneLocal)","phone (toll free)(phone_tollfree)","phone (toll free)(phoneTollFree)","phone for reservations(reservations_phone)","phone(branchPhone)","PIN(pin)","PIN(telephonePin)","place of birth(birthplace)","port number(pop_port)","port number(smtp_port)","port(port)","provider's website(provider_website)","provider(provider)","publisher(publisher_name)","purchase date(order_date)","registered email(reg_email)","reminder answer(remindera)","reminder question(reminderq)","retail price(retail_price)","routing number(routingNo)","Scope","security(pop_security)","security(smtp_security)","server / IP address(server)","server(hostname)","server(pop_server)","sex(sex)","SID(sid)","skype(skype)","SMTP server(smtp_server)","state(state)","support email(support_email)","support phone(support_contact_phone)","support URL(support_contact_url)","SWIFT(swift)","Tags","telephone(phone)","Title","Type","type(accountType)","type(database_type)","type(pop_type)","type(type)","URL","URL(url)","Username","username(pop_username)","username(smtp_username)","username(username)","valid from(valid_from)","valid from(validFrom)","verification number(cvv)","version(product_version)","website(publisher_website)","website(website)","wireless network password(wireless_password)","wireless security(wireless_security)","Yahoo(yahoo)",
,,,,,,,,,,,,,,,,,"test",,,,,,,,,"1606923869",,,,,,,,,,,"01/2030",,,,,,,,,,,,,,,,,,,,,,,,,,,"1606924056",,,,,,"","4111111111111111",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"{(
)}",,"test card","Credit Card",,,,"laser",,,,,,,,,"111",,,,,,,`;

View File

@@ -0,0 +1,2 @@
export const data = `"UUID","TITLE","SCOPE","AUTOSUBMIT","1: CARDHOLDER NAME","2: NUMBER","3: VERIFICATION NUMBER","4: EXPIRY DATE","SECTION 2: SECTION_PZET7LEKRQXZUINIEGH5ABA2UY","SECTION_PZET7LEKRQXZUINIEGH5ABA2UY 1: LABEL"
"sd26pt226etnsijbl3kqzi5bmm","test card","Default","Default","test","4111111111111111","111","1/3/1970 12:23 AM","section","field (phone)"`;

View File

@@ -0,0 +1,7 @@
/* eslint-disable */
export const data = `"account number(accountNo)","address(address)","address(branchAddress)","admin console URL(admin_console_url)","admin console username(admin_console_username)","AirPort ID(airport_id)","alias(alias)","AOL/AIM(aim)","approved wildlife(game)","attached storage password(disk_password)","auth method(pop_authentication)","auth method(smtp_authentication)","bank name(bankName)","base station name(name)","base station password(password)","birth date(birthdate)","business(busphone)","cardholder name(cardholder)","cash withdrawal limit(cashLimit)","cell(cellphone)","company name(company_name)","company(company)","conditions / restrictions(conditions)","connection options(options)","console password(admin_console_password)","country(country)","Created Date","credit limit(creditLimit)","customer service phone(customer_service_phone)","database(database)","date of birth(birthdate)","default phone(defphone)","department(department)","download page(download_link)","email(email)","expires(expires)","expiry date(expiry_date)","expiry date(expiry)","first name(firstname)","forum signature(forumsig)","full name(fullname)","full name(name)","group(org_name)","height(height)","home(homephone)","IBAN(iban)","ICQ(icq)","initial(initial)","interest rate(interest)","issue number(issuenumber)","issued on(issue_date)","issuing authority(issuing_authority)","issuing bank(bank)","issuing country(issuing_country)","job title(jobtitle)","last name(lastname)","license class(class)","license key(reg_code)","licensed to(reg_name)","maximum quota(quota)","member ID (additional)(additional_no)","member ID(membership_no)","member name(member_name)","member since(member_since)","Modified Date","MSN(msn)","name on account(owner)","name(name)","nationality(nationality)","network name(network_name)","Notes","number(ccnum)","number(number)","occupation(occupation)","order number(order_number)","order total(order_total)","Password","password(password)","password(pop_password)","password(smtp_password)","phone (intl)(phoneIntl)","phone (local)(phone_local)","phone (local)(phoneLocal)","phone (toll free)(phone_tollfree)","phone (toll free)(phoneTollFree)","phone for reservations(reservations_phone)","phone(branchPhone)","PIN(pin)","PIN(telephonePin)","place of birth(birthplace)","port number(pop_port)","port number(smtp_port)","port(port)","provider's website(provider_website)","provider(provider)","publisher(publisher_name)","purchase date(order_date)","registered email(reg_email)","reminder answer(remindera)","reminder question(reminderq)","retail price(retail_price)","routing number(routingNo)","Scope","security(pop_security)","security(smtp_security)","server / IP address(server)","server(hostname)","server(pop_server)","sex(sex)","SID(sid)","skype(skype)","SMTP server(smtp_server)","state(state)","support email(support_email)","support phone(support_contact_phone)","support URL(support_contact_url)","SWIFT(swift)","Tags","telephone(phone)","Title","Type","type(accountType)","type(database_type)","type(pop_type)","type(type)","URL","URL(url)","Username","username(pop_username)","username(smtp_username)","username(username)","valid from(valid_from)","valid from(validFrom)","verification number(cvv)","version(product_version)","website(publisher_website)","website(website)","wireless network password(wireless_password)","wireless security(wireless_security)","Yahoo(yahoo)",
,"address
city state zip
United States",,,,,,"",,,,,,,,"12/2/20","",,,"",,"bitwarden",,,,,"1606923754",,,,"12/2/20","8005555555","department",,"email@bitwarden.com",,,,"first name","",,,,,"",,"","mi",,,,,,,"job title","last name",,,,,,,,,"1607020883","",,,,,"Its you! 🖐 Select Edit to fill in more details, like your address and contact information.",,,"occupation",,,,,,,,,,,,,,,,,,,,,,,,,"","",,,,,,,,,"",,"",,,,,,,"{(
\\"Starter Kit\\"
)}",,"Identity Item","Identity",,,,,,,"userNam3",,,"userNam3",,,,,,"",,,"",`;

View File

@@ -0,0 +1,2 @@
export const data = `"UUID","TITLE","SCOPE","AUTOSUBMIT","TAGS","NOTES","SECTION 1: NAME","NAME 1: FIRST NAME","NAME 2: INITIAL","NAME 3: LAST NAME","NAME 4: BIRTH DATE","NAME 5: OCCUPATION","NAME 6: COMPANY","NAME 7: DEPARTMENT","NAME 8: JOB TITLE","SECTION 2: ADDRESS","ADDRESS 1: ADDRESS","ADDRESS 2: DEFAULT PHONE","SECTION 3: INTERNET","INTERNET 1: USERNAME","INTERNET 2: EMAIL","SECTION 4: MFJQKMWEOYDZDFH4YMR7WLJKIY","MFJQKMWEOYDZDFH4YMR7WLJKIY 1: SECTION FIELD","MFJQKMWEOYDZDFH4YMR7WLJKIY 2: SECTION FIELD"
"6v56y5z4tejwg37jsettta7d7m","Identity Item","Default","Default","Starter Kit","Its you! 🖐 Select Edit to fill in more details, like your address and contact information.","Identification","first name","mi","last name","12/2/2020 4:01 AM","occupation","bitwarden","department","job title","Address","address city state zip us","8005555555","Internet Details","userNam3","email@bitwarden.com","💡 Did you know?","1Password can fill names and addresses into webpages:","https://support.1password.com/credit-card-address-filling/"`;

View File

@@ -0,0 +1,15 @@
/* eslint-disable */
export const data = `"account number(accountNo)","address(address)","address(branchAddress)","admin console URL(admin_console_url)","admin console username(admin_console_username)","AirPort ID(airport_id)","alias(alias)","AOL/AIM(aim)","approved wildlife(game)","attached storage password(disk_password)","auth method(pop_authentication)","auth method(smtp_authentication)","bank name(bankName)","base station name(name)","base station password(password)","birth date(birthdate)","business(busphone)","cardholder name(cardholder)","cash withdrawal limit(cashLimit)","cell(cellphone)","company name(company_name)","company(company)","conditions / restrictions(conditions)","connection options(options)","console password(admin_console_password)","country(country)","Created Date","credit limit(creditLimit)","customer service phone(customer_service_phone)","database(database)","date of birth(birthdate)","default phone(defphone)","department(department)","download page(download_link)","email(email)","expires(expires)","expiry date(expiry_date)","expiry date(expiry)","first name(firstname)","forum signature(forumsig)","full name(fullname)","full name(name)","group(org_name)","height(height)","home(homephone)","IBAN(iban)","ICQ(icq)","initial(initial)","interest rate(interest)","issue number(issuenumber)","issued on(issue_date)","issuing authority(issuing_authority)","issuing bank(bank)","issuing country(issuing_country)","job title(jobtitle)","last name(lastname)","license class(class)","license key(reg_code)","licensed to(reg_name)","maximum quota(quota)","member ID (additional)(additional_no)","member ID(membership_no)","member name(member_name)","member since(member_since)","Modified Date","MSN(msn)","name on account(owner)","name(name)","nationality(nationality)","network name(network_name)","Notes","number(ccnum)","number(number)","occupation(occupation)","order number(order_number)","order total(order_total)","Password","password(password)","password(pop_password)","password(smtp_password)","phone (intl)(phoneIntl)","phone (local)(phone_local)","phone (local)(phoneLocal)","phone (toll free)(phone_tollfree)","phone (toll free)(phoneTollFree)","phone for reservations(reservations_phone)","phone(branchPhone)","PIN(pin)","PIN(telephonePin)","place of birth(birthplace)","port number(pop_port)","port number(smtp_port)","port(port)","provider's website(provider_website)","provider(provider)","publisher(publisher_name)","purchase date(order_date)","registered email(reg_email)","reminder answer(remindera)","reminder question(reminderq)","retail price(retail_price)","routing number(routingNo)","Scope","security(pop_security)","security(smtp_security)","server / IP address(server)","server(hostname)","server(pop_server)","sex(sex)","SID(sid)","skype(skype)","SMTP server(smtp_server)","state(state)","support email(support_email)","support phone(support_contact_phone)","support URL(support_contact_url)","SWIFT(swift)","Tags","telephone(phone)","Title","Type","type(accountType)","type(database_type)","type(pop_type)","type(type)","URL","URL(url)","Username","username(pop_username)","username(smtp_username)","username(username)","valid from(valid_from)","valid from(validFrom)","verification number(cvv)","version(product_version)","website(publisher_website)","website(website)","wireless network password(wireless_password)","wireless security(wireless_security)","Yahoo(yahoo)",
,,,,,,,,,,,,,,,,,,,,,,,,,,"1606923754",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"1606923754",,,,,,"Follow these steps to get started.",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"{(
\\"Starter Kit\\"
)}",,"🎉 Welcome to 1Password!","Secure Note",,,,,,,,,,,,,,,,,,,,
,"address
city state zip
United States",,,,,,,,,,,,,,"12/2/20",,,,,,"bitwarden",,,,,"1606923754",,,,"12/2/20","8005555555","department",,"email@bitwarden.com",,,,"first name",,,,,,,,,"mi",,,,,,,"job title","last name",,,,,,,,,"1607390191",,,,,,"Its you! 🖐 Select Edit to fill in more details, like your address and contact information.",,,"occupation",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"{(
\\"Starter Kit\\"
)}",,"Identity Item","Identity",,,,,,,"userNam3",,,"userNam3",,,,,,,,,,
,,,,,,,,,,,,,,,,,"test",,,,,,,,,"1606923869",,,,,,,,,,,"01/2030",,,,,,,,,,,,,,,,,,,,,,,,,,,"1607355631",,,,,,"","4111111111111111",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"{(
)}",,"test card","Credit Card",,,,"laser",,,,,,,,,"111",,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,"1606923754",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"1607020972",,,,,,"You can use this login to sign in to your account on 1password.com.",,,,,,"the account's password",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"{(
\\"Starter Kit\\"
)}",,"1Password Account","Login",,,,,"https://my.1password.com",,"email@bitwarden.com",,,,,,,,,,,,,`;

View File

@@ -0,0 +1,5 @@
export const data = `"UUID","TITLE","USERNAME","PASSWORD","URL","URLS","EMAIL","MASTER-PASSWORD","ACCOUNT-KEY","SCOPE","AUTOSUBMIT","TAGS","NOTES","SECTION 1: WXHDKEQREE3TH6QRFCPFPSD3AE","WXHDKEQREE3TH6QRFCPFPSD3AE 1: SECRET KEY","SECTION 1: NAME","NAME 1: FIRST NAME","NAME 2: INITIAL","NAME 3: LAST NAME","NAME 4: BIRTH DATE","NAME 5: OCCUPATION","NAME 6: COMPANY","NAME 7: DEPARTMENT","NAME 8: JOB TITLE","SECTION 2: ADDRESS","ADDRESS 1: ADDRESS","ADDRESS 2: DEFAULT PHONE","SECTION 3: INTERNET","INTERNET 1: USERNAME","INTERNET 2: EMAIL","SECTION 4: MFJQKMWEOYDZDFH4YMR7WLJKIY","MFJQKMWEOYDZDFH4YMR7WLJKIY 1: SECTION FIELD","MFJQKMWEOYDZDFH4YMR7WLJKIY 2: SECTION FIELD","1: CARDHOLDER NAME","2: NUMBER","3: VERIFICATION NUMBER","4: EXPIRY DATE","SECTION 2: SECTION_PZET7LEKRQXZUINIEGH5ABA2UY","SECTION_PZET7LEKRQXZUINIEGH5ABA2UY 1: LABEL","SECTION 1: 4PQVXPR4BMOPGC3DBMTP5U4OFY","4PQVXPR4BMOPGC3DBMTP5U4OFY 1: SECTION FIELD","4PQVXPR4BMOPGC3DBMTP5U4OFY 2: SECTION FIELD","SECTION 2: M2NTUZZBFOFTPAYXVXE6EMZ5JU","M2NTUZZBFOFTPAYXVXE6EMZ5JU 1: SECTION FIELD","M2NTUZZBFOFTPAYXVXE6EMZ5JU 2: SECTION FIELD","SECTION 3: WC3KPAWH6ZAEQB2ARJB6WYZ3DQ","WC3KPAWH6ZAEQB2ARJB6WYZ3DQ 1: SECTION FIELD","WC3KPAWH6ZAEQB2ARJB6WYZ3DQ 2: SECTION FIELD","WC3KPAWH6ZAEQB2ARJB6WYZ3DQ 3: SECTION FIELD","SECTION 4: TOHUYJEJEMGMI6GEQAZ2LJODFE","TOHUYJEJEMGMI6GEQAZ2LJODFE 1: SECTION FIELD","TOHUYJEJEMGMI6GEQAZ2LJODFE 2: SECTION FIELD","SECTION 5: O26UWJJTXRAANG3ONYYOUUJHDM","O26UWJJTXRAANG3ONYYOUUJHDM 1: SECTION FIELD","O26UWJJTXRAANG3ONYYOUUJHDM 2: WATCH VIDEOS","O26UWJJTXRAANG3ONYYOUUJHDM 3: GET SUPPORT","O26UWJJTXRAANG3ONYYOUUJHDM 4: READ THE BLOG","O26UWJJTXRAANG3ONYYOUUJHDM 5: CONTACT US"
"xjq32axcswefpcxu2mtxxqnufa","1Password Account","email@bitwarden.com","the account's password","https://my.1password.com","https://my.1password.com","email@bitwarden.com","the account's password","A3-76TR2N-NJG3TZ-9NXFX-WT8GF-6YQC9-R2659","Default","Default","Starter Kit","You can use this login to sign in to your account on 1password.com.","🔑 Secret Key","the account's secret key","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""
"6v56y5z4tejwg37jsettta7d7m","Identity Item","","","","","","","","Default","Default","Starter Kit","Its you! 🖐 Select Edit to fill in more details, like your address and contact information.","","","Identification","first name","mi","last name","12/2/2020 4:01 AM","occupation","bitwarden","department","job title","Address","address city state zip us","8005555555","Internet Details","userNam3","email@bitwarden.com","💡 Did you know?","1Password can fill names and addresses into webpages:","https://support.1password.com/credit-card-address-filling/","","","","","","","","","","","","","","","","","","","","","","","","",""
"sd26pt226etnsijbl3kqzi5bmm","test card","","","","","","","","Default","Default","","","","","","","","","","","","","","","","","","","","","","","test","4111111111111111","111","1/3/1970 12:23 AM","section","field (phone)","","","","","","","","","","","","","","","","","","",""
"oml2sgit3yk7737kxdis65o4xq","🎉 Welcome to 1Password!","","","","","","","","Default","Default","Starter Kit","Follow these steps to get started.","","","","","","","","","","","","","","","","","","","","","","","","","","","1⃣ Get the apps","https://1password.com/downloads","Install 1Password everywhere you need your passwords.","2⃣ Get 1Password in your browser","https://1password.com/downloads/#browsers","Install 1Password in your browser to save and fill passwords.","3⃣ Save your first password","1. Sign in to your favorite website.","2. 1Password will ask to save your username and password.","3. Click Save Login.","4⃣ Fill passwords and more","https://support.1password.com/explore/extension/","Save and fill passwords, credit cards, and addresses.","📚 Learn 1Password","Check out our videos and articles:","https://youtube.com/1PasswordVideos","https://support.1password.com/","https://blog.1password.com/","https://support.1password.com/contact-us/"`;

View File

@@ -0,0 +1,15 @@
import { PasskyJsonExport } from "../../passky/passky-json-types";
export const testData: PasskyJsonExport = {
encrypted: true,
passwords: [
{
website:
"w68uw6nCjUI3w7MNYsK7w6xqwqHDlXLCpsOEw4/Dq8KbIMK3w6fCvQJFFcOECsOlwprCqUAawqnDvsKbwrLCsCXCtcOlw4dp",
username: "bMKyUC0VPTx5woHCr8K9wpvDgGrClFAKw6VfJTgob8KVwqNoN8KIEA==",
password: "XcKxO2FjwqIJPkoHwqrDvcKtXcORw6TDlMOlw7TDvMORfmlNdMKOwq7DocO+",
message:
"w5jCrWTCgAV1RcO+DsOzw5zCvD5CwqLCtcKtw6sPwpbCmcOxwrfDlcOQw4h1wqomEhNtUkRgwrzCkxrClFBSHsO5wrfCrg==",
},
],
};

View File

@@ -0,0 +1,13 @@
import { PasskyJsonExport } from "../../passky/passky-json-types";
export const testData: PasskyJsonExport = {
encrypted: false,
passwords: [
{
website: "https://bitwarden.com/",
username: "testUser",
password: "testPassword",
message: "my notes",
},
],
};

View File

@@ -0,0 +1,7 @@
export const dutchHeaders = `Titel;Gebruikersnaam;Account;URL;Wachtwoord;Gewijzigd;Gemaakt;Verloopt op;Beschrijving;Gewijzigd door
>>>
Title2;Username2;Account2;http://URL2.com;12345678;27-3-2024 08:11:21;27-3-2024 08:11:21;27-5-2024 08:11:21;Test Notes;someone
Title Test 1;Username1;Account1;http://URL1.com;Password1;27-3-2024 08:10:52;27-3-2024 08:10:52;;Test Notes 2;
Certificate 1;;;;;27-3-2024 10:22:39;27-3-2024 10:22:39;;Test Notes Certicate 1;
test;testtest;;http://test;test;27-3-2024 12:36:59;27-3-2024 12:36:59;;Test Notes 3;
`;

View File

@@ -0,0 +1,7 @@
export const germanHeaders = `Titel;Benutzername;Konto;URL;Passwort;Geändert am;Erstellt am;Läuft ab am;Beschreibung;Geändert von
>>>
Title2;Username2;Account2;http://URL2.com;12345678;27-3-2024 08:11:21;27-3-2024 08:11:21;27-5-2024 08:11:21;Test Notes;someone
Title Test 1;Username1;Account1;http://URL1.com;Password1;27-3-2024 08:10:52;27-3-2024 08:10:52;;Test Notes 2;
Certificate 1;;;;;27-3-2024 10:22:39;27-3-2024 10:22:39;;Test Notes Certicate 1;
test;testtest;;http://test;test;27-3-2024 12:36:59;27-3-2024 12:36:59;;Test Notes 3;
`;

Some files were not shown because too many files have changed in this diff Show More