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:
committed by
GitHub
parent
1bf917c08a
commit
d7baa6078d
124
libs/importer/src/importers/base-importer.spec.ts
Normal file
124
libs/importer/src/importers/base-importer.spec.ts
Normal 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);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
72
libs/importer/src/importers/chrome-csv-importer.spec.ts
Normal file
72
libs/importer/src/importers/chrome-csv-importer.spec.ts
Normal 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]);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -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");
|
||||
});
|
||||
});
|
||||
134
libs/importer/src/importers/enpass/enpass-json-importer.spec.ts
Normal file
134
libs/importer/src/importers/enpass/enpass-json-importer.spec.ts
Normal 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");
|
||||
});
|
||||
});
|
||||
74
libs/importer/src/importers/firefox-csv-importer.spec.ts
Normal file
74
libs/importer/src/importers/firefox-csv-importer.spec.ts
Normal 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]);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -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";
|
||||
|
||||
46
libs/importer/src/importers/keepass2-xml-importer.spec.ts
Normal file
46
libs/importer/src/importers/keepass2-xml-importer.spec.ts
Normal 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);
|
||||
});
|
||||
});
|
||||
41
libs/importer/src/importers/keepassx-csv-importer.spec.ts
Normal file
41
libs/importer/src/importers/keepassx-csv-importer.spec.ts
Normal 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");
|
||||
});
|
||||
});
|
||||
});
|
||||
124
libs/importer/src/importers/keeper/keeper-csv-importer.spec.ts
Normal file
124
libs/importer/src/importers/keeper/keeper-csv-importer.spec.ts
Normal 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]);
|
||||
});
|
||||
});
|
||||
109
libs/importer/src/importers/keeper/keeper-json-importer.spec.ts
Normal file
109
libs/importer/src/importers/keeper/keeper-json-importer.spec.ts
Normal 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]);
|
||||
});
|
||||
});
|
||||
1
libs/importer/src/importers/lastpass/index.ts
Normal file
1
libs/importer/src/importers/lastpass/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export { LastPassCsvImporter } from "./lastpass-csv-importer";
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
@@ -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> {
|
||||
113
libs/importer/src/importers/msecure-csv-importer.spec.ts
Normal file
113
libs/importer/src/importers/msecure-csv-importer.spec.ts
Normal 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);
|
||||
});
|
||||
});
|
||||
633
libs/importer/src/importers/myki-csv-importer.spec.ts
Normal file
633
libs/importer/src/importers/myki-csv-importer.spec.ts
Normal 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);
|
||||
});
|
||||
});
|
||||
@@ -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]);
|
||||
});
|
||||
});
|
||||
236
libs/importer/src/importers/nordpass-csv-importer.spec.ts
Normal file
236
libs/importer/src/importers/nordpass-csv-importer.spec.ts
Normal 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");
|
||||
});
|
||||
});
|
||||
@@ -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");
|
||||
});
|
||||
});
|
||||
@@ -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");
|
||||
});
|
||||
});
|
||||
@@ -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]);
|
||||
});
|
||||
});
|
||||
@@ -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]);
|
||||
});
|
||||
});
|
||||
@@ -120,7 +120,7 @@ export interface Value {
|
||||
|
||||
export interface Email {
|
||||
email_address: string;
|
||||
provider: string;
|
||||
provider: string | null;
|
||||
}
|
||||
|
||||
export interface Address {
|
||||
|
||||
@@ -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");
|
||||
});
|
||||
});
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
@@ -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);
|
||||
});
|
||||
});
|
||||
283
libs/importer/src/importers/psono/psono-json-importer.spec.ts
Normal file
283
libs/importer/src/importers/psono/psono-json-importer.spec.ts
Normal file
File diff suppressed because one or more lines are too long
37
libs/importer/src/importers/roboform-csv-importer.spec.ts
Normal file
37
libs/importer/src/importers/roboform-csv-importer.spec.ts
Normal 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");
|
||||
});
|
||||
});
|
||||
74
libs/importer/src/importers/safari-csv-importer.spec.ts
Normal file
74
libs/importer/src/importers/safari-csv-importer.spec.ts
Normal 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]);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
73
libs/importer/src/importers/securesafe-csv-importer.spec.ts
Normal file
73
libs/importer/src/importers/securesafe-csv-importer.spec.ts
Normal 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);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,6 @@
|
||||
export const emptyAccountEncrypted = `{
|
||||
"encrypted": true,
|
||||
"encKeyValidation_DO_NOT_EDIT": "",
|
||||
"folders": [],
|
||||
"items": []
|
||||
}`;
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
]
|
||||
}`;
|
||||
@@ -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=",
|
||||
};
|
||||
@@ -0,0 +1 @@
|
||||
export const emptyUnencryptedExport = `{ "encrypted": false, "folders": [], "items": [] }`;
|
||||
@@ -0,0 +1,2 @@
|
||||
export const data = `name,url,username,password
|
||||
,android://N2H9MndUUUt3JuQSWAKexOU9oJLJeHR4nyUGac5E1TXKppkY7xtdRl6l8vKo1hQWCqAEy4gsNLUBIbVxpdmhOP==@com.xyz.example.app.android/,username@example.com,Qh6W4Wz55YGFNU`;
|
||||
@@ -0,0 +1,2 @@
|
||||
export const data = `name,url,username,password
|
||||
www.example.com,https://www.example.com/,username@example.com,wpC9qFvsbWQK5Z`;
|
||||
@@ -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`;
|
||||
@@ -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`;
|
||||
@@ -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,,,,,`;
|
||||
@@ -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,,,,,,,,,,,,,,,,`;
|
||||
@@ -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,`;
|
||||
@@ -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`;
|
||||
@@ -0,0 +1,2 @@
|
||||
export const secureNoteData = `title,note
|
||||
01,test`;
|
||||
274
libs/importer/src/importers/spec-data/enpass-json/credit-card.ts
Normal file
274
libs/importer/src/importers/spec-data/enpass-json/credit-card.ts
Normal 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",
|
||||
},
|
||||
],
|
||||
};
|
||||
45
libs/importer/src/importers/spec-data/enpass-json/folders.ts
Normal file
45
libs/importer/src/importers/spec-data/enpass-json/folders.ts
Normal 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",
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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",
|
||||
},
|
||||
],
|
||||
};
|
||||
130
libs/importer/src/importers/spec-data/enpass-json/login.ts
Normal file
130
libs/importer/src/importers/spec-data/enpass-json/login.ts
Normal 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",
|
||||
},
|
||||
],
|
||||
};
|
||||
29
libs/importer/src/importers/spec-data/enpass-json/note.ts
Normal file
29
libs/importer/src/importers/spec-data/enpass-json/note.ts
Normal 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",
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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"
|
||||
`;
|
||||
@@ -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"`;
|
||||
@@ -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>`;
|
||||
@@ -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`;
|
||||
@@ -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"
|
||||
`;
|
||||
@@ -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",
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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`;
|
||||
@@ -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`;
|
||||
@@ -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`;
|
||||
@@ -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`;
|
||||
@@ -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."`;
|
||||
@@ -0,0 +1,3 @@
|
||||
/* eslint-disable */
|
||||
export const userTwoFaData = `nickname,status,tags,authToken,additionalInfo
|
||||
2FA nickname,active,someTag,someTOTPSeed,"Additional information field content. "`;
|
||||
@@ -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";""`;
|
||||
@@ -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,`;
|
||||
@@ -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,`;
|
||||
@@ -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,`;
|
||||
@@ -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""}]"`;
|
||||
@@ -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,`;
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
219
libs/importer/src/importers/spec-data/onepassword-1pux/server.ts
Normal file
219
libs/importer/src/importers/spec-data/onepassword-1pux/server.ts
Normal 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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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: "",
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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",,,,,,,`;
|
||||
@@ -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)"`;
|
||||
@@ -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","",,,,,"It’s you! 🖐 Select Edit to fill in more details, like your address and contact information.",,,"occupation",,,,,,,,,,,,,,,,,,,,,,,,,"","",,,,,,,,,"",,"",,,,,,,"{(
|
||||
\\"Starter Kit\\"
|
||||
)}",,"Identity Item","Identity",,,,,,,"userNam3",,,"userNam3",,,,,,"",,,"",`;
|
||||
@@ -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","It’s 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/"`;
|
||||
@@ -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",,,,,,"It’s 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",,,,,,,,,,,,,`;
|
||||
@@ -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","It’s 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/"`;
|
||||
@@ -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==",
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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",
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -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;
|
||||
`;
|
||||
@@ -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
Reference in New Issue
Block a user