mirror of
https://github.com/bitwarden/browser
synced 2025-12-15 15:53:27 +00:00
* Validate checksum on decrypt of URI * Add uri checksum to domain during encryption * Move hash to stateless encrypt service * Add checksum field to all the other models necessary for syncing with server * Remove old test in favor of `describe` block * PM-4185 Added a boolean to control checksum validation * PM-4185 Fi unit tests * [PM-4810][PM-4825][PM-4880] Fix encrypted import and add null check (#6935) * PM-4810 Bumped up version * PM-4880 Add null check * PM-4825 Fix encrypted export * PM-5462 Fix item saving with blank URI (#7640) * PM-4185 Add back uriChecksum setting --------- Co-authored-by: Carlos Gonçalves <cgoncalves@bitwarden.com> Co-authored-by: Matt Bishop <mbishop@bitwarden.com> Co-authored-by: gbubemismith <gsmithwalter@gmail.com> Co-authored-by: bnagawiecki <107435978+bnagawiecki@users.noreply.github.com>
122 lines
3.2 KiB
TypeScript
122 lines
3.2 KiB
TypeScript
import { MockProxy, mock } from "jest-mock-extended";
|
|
import { Jsonify } from "type-fest";
|
|
|
|
import { mockEnc, mockFromJson } from "../../../../spec";
|
|
import { EncryptService } from "../../../platform/abstractions/encrypt.service";
|
|
import { EncString } from "../../../platform/models/domain/enc-string";
|
|
import { UriMatchType } from "../../enums";
|
|
import { LoginUriData } from "../data/login-uri.data";
|
|
|
|
import { LoginUri } from "./login-uri";
|
|
|
|
describe("LoginUri", () => {
|
|
let data: LoginUriData;
|
|
|
|
beforeEach(() => {
|
|
data = {
|
|
uri: "encUri",
|
|
uriChecksum: "encUriChecksum",
|
|
match: UriMatchType.Domain,
|
|
};
|
|
});
|
|
|
|
it("Convert from empty", () => {
|
|
const data = new LoginUriData();
|
|
const loginUri = new LoginUri(data);
|
|
|
|
expect(loginUri).toEqual({
|
|
match: null,
|
|
uri: null,
|
|
uriChecksum: null,
|
|
});
|
|
});
|
|
|
|
it("Convert", () => {
|
|
const loginUri = new LoginUri(data);
|
|
|
|
expect(loginUri).toEqual({
|
|
match: 0,
|
|
uri: { encryptedString: "encUri", encryptionType: 0 },
|
|
uriChecksum: { encryptedString: "encUriChecksum", encryptionType: 0 },
|
|
});
|
|
});
|
|
|
|
it("toLoginUriData", () => {
|
|
const loginUri = new LoginUri(data);
|
|
expect(loginUri.toLoginUriData()).toEqual(data);
|
|
});
|
|
|
|
it("Decrypt", async () => {
|
|
const loginUri = new LoginUri();
|
|
loginUri.match = UriMatchType.Exact;
|
|
loginUri.uri = mockEnc("uri");
|
|
|
|
const view = await loginUri.decrypt(null);
|
|
|
|
expect(view).toEqual({
|
|
_canLaunch: null,
|
|
_domain: null,
|
|
_host: null,
|
|
_hostname: null,
|
|
_uri: "uri",
|
|
match: 3,
|
|
});
|
|
});
|
|
|
|
describe("validateChecksum", () => {
|
|
let encryptService: MockProxy<EncryptService>;
|
|
|
|
beforeEach(() => {
|
|
encryptService = mock();
|
|
global.bitwardenContainerService = {
|
|
getEncryptService: () => encryptService,
|
|
getCryptoService: () => null,
|
|
};
|
|
});
|
|
|
|
it("returns true if checksums match", async () => {
|
|
const loginUri = new LoginUri();
|
|
loginUri.uriChecksum = mockEnc("checksum");
|
|
encryptService.hash.mockResolvedValue("checksum");
|
|
|
|
const actual = await loginUri.validateChecksum("uri", null, null);
|
|
|
|
expect(actual).toBe(true);
|
|
expect(encryptService.hash).toHaveBeenCalledWith("uri", "sha256");
|
|
});
|
|
|
|
it("returns false if checksums don't match", async () => {
|
|
const loginUri = new LoginUri();
|
|
loginUri.uriChecksum = mockEnc("checksum");
|
|
encryptService.hash.mockResolvedValue("incorrect checksum");
|
|
|
|
const actual = await loginUri.validateChecksum("uri", null, null);
|
|
|
|
expect(actual).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe("fromJSON", () => {
|
|
it("initializes nested objects", () => {
|
|
jest.spyOn(EncString, "fromJSON").mockImplementation(mockFromJson);
|
|
|
|
const actual = LoginUri.fromJSON({
|
|
uri: "myUri",
|
|
uriChecksum: "myUriChecksum",
|
|
match: UriMatchType.Domain,
|
|
} as Jsonify<LoginUri>);
|
|
|
|
expect(actual).toEqual({
|
|
uri: "myUri_fromJSON",
|
|
uriChecksum: "myUriChecksum_fromJSON",
|
|
match: UriMatchType.Domain,
|
|
});
|
|
expect(actual).toBeInstanceOf(LoginUri);
|
|
});
|
|
|
|
it("returns null if object is null", () => {
|
|
expect(LoginUri.fromJSON(null)).toBeNull();
|
|
});
|
|
});
|
|
});
|