94 lines
2.3 KiB
TypeScript
94 lines
2.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
importAegisBackup,
|
|
importAndOtpBackup,
|
|
importFreeOtpBackup,
|
|
importTwoFasBackup,
|
|
} from "../../src/otp/vendor-backups";
|
|
|
|
const secret = "JBSWY3DPEHPK3PXP";
|
|
|
|
describe("vendor OTP backup importers", () => {
|
|
it("imports Aegis plaintext entries and skips non-portable token types", () => {
|
|
const result = importAegisBackup(
|
|
JSON.stringify({
|
|
db: {
|
|
entries: [
|
|
{
|
|
type: "totp",
|
|
name: "alice",
|
|
issuer: "Example",
|
|
info: { secret, algo: "SHA1", digits: 6, period: 30 },
|
|
},
|
|
{ type: "steam", name: "game", issuer: "Steam", info: { secret } },
|
|
],
|
|
},
|
|
}),
|
|
);
|
|
expect(result.profiles[0]).toMatchObject({
|
|
issuer: "Example",
|
|
account: "alice",
|
|
});
|
|
expect(result.warnings[0]).toMatch(/steam/iu);
|
|
});
|
|
|
|
it("imports 2FAS, andOTP and FreeOTP field layouts", () => {
|
|
expect(
|
|
importTwoFasBackup(
|
|
JSON.stringify({
|
|
services: [
|
|
{
|
|
name: "Example",
|
|
secret,
|
|
otp: {
|
|
account: "alice",
|
|
issuer: "Issuer",
|
|
tokenType: "TOTP",
|
|
algorithm: "SHA1",
|
|
digits: 6,
|
|
period: 30,
|
|
},
|
|
},
|
|
],
|
|
}),
|
|
).profiles[0],
|
|
).toMatchObject({ account: "alice", issuer: "Issuer" });
|
|
expect(
|
|
importAndOtpBackup(
|
|
JSON.stringify([
|
|
{
|
|
secret,
|
|
issuer: "Example",
|
|
label: "bob",
|
|
type: "TOTP",
|
|
algorithm: "SHA1",
|
|
digits: 6,
|
|
period: 30,
|
|
},
|
|
]),
|
|
).profiles[0]!.account,
|
|
).toBe("bob");
|
|
expect(
|
|
importFreeOtpBackup(
|
|
JSON.stringify([
|
|
{
|
|
secret: [49, 50, 51, 52],
|
|
issuerExt: "Example",
|
|
label: "carol",
|
|
type: "totp",
|
|
algo: "SHA1",
|
|
digits: 6,
|
|
period: 30,
|
|
},
|
|
]),
|
|
).profiles[0]!.account,
|
|
).toBe("carol");
|
|
});
|
|
|
|
it("refuses encrypted Aegis content instead of guessing", () => {
|
|
expect(() =>
|
|
importAegisBackup(JSON.stringify({ db: "ciphertext", header: {} })),
|
|
).toThrow(/encrypted/iu);
|
|
});
|
|
});
|