Fix: Add TOTP import support to KeePassX CSV importer (#11574)

KeePassX CSV importer was missing TOTP field support. Added logic to parse TOTP fields from the CSV and include them in the vault entries. Added unit tests to verify TOTP import functionality.
This commit is contained in:
Zilong Xue 2024-10-18 13:37:32 -05:00 committed by GitHub
parent 0e23f5e0cd
commit 81d1274111
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 47 additions and 0 deletions

View File

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

View File

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

View File

@ -30,6 +30,8 @@ export class KeePassXCsvImporter extends BaseImporter implements Importer {
cipher.login.username = this.getValueOrDefault(value.Username);
cipher.login.password = this.getValueOrDefault(value.Password);
cipher.login.uris = this.makeUriArray(value.URL);
cipher.login.totp = this.getValueOrDefault(value.TOTP);
this.cleanupCipher(cipher);
result.ciphers.push(cipher);
});