Skip to content

Commit

Permalink
feat: disconnect identity
Browse files Browse the repository at this point in the history
- [x] Add disconnect identity action for home list
- [x] Add ready message for extension initialization
- [x] Get rid of jest deprecated methods
  • Loading branch information
0xmad committed Nov 8, 2023
1 parent c387dd6 commit 4a038ca
Show file tree
Hide file tree
Showing 110 changed files with 1,123 additions and 842 deletions.
61 changes: 34 additions & 27 deletions packages/app/src/background/backgroundPage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import browser, { type Runtime } from "webextension-polyfill";

import "@src/background/appInit";
import CryptKeeperController from "@src/background/cryptKeeper";
import { sendReadyMessageToTabs } from "@src/background/shared/browser";
import { createChromeOffscreen, deferredPromise, getBrowserPlatform } from "@src/background/shared/utils";
import { isDebugMode } from "@src/config/env";
import { BrowserPlatform } from "@src/constants";
Expand All @@ -28,30 +29,36 @@ browser.runtime.onConnect.addListener(async () => {
log.debug("CryptKeeper onConnect Event, initializing completed...");
});

try {
const browserPlatform = getBrowserPlatform();
const app = new CryptKeeperController();

app.initialize();

browser.runtime.onMessage.addListener(async (request: IRequestHandler, sender: Runtime.MessageSender) => {
log.debug("Background: request: ", request);

if (browserPlatform !== BrowserPlatform.Firefox && request.source === "offscreen") {
await createChromeOffscreen();
}

try {
const response = await app.handle(request, sender);
log.debug("Background: response: ", response);
return [null, response];
} catch (e) {
return [(e as Error).message, null];
}
});

log.debug("CryptKeeper initialization complete.");
resolveInitialization?.(true);
} catch (error) {
rejectInitialization?.(error);
}
const initialize = async () => {
try {
const browserPlatform = getBrowserPlatform();
const app = new CryptKeeperController();

app.initialize();

browser.runtime.onMessage.addListener(async (request: IRequestHandler, sender: Runtime.MessageSender) => {
log.debug("Background: request: ", request);

if (browserPlatform !== BrowserPlatform.Firefox && request.source === "offscreen") {
await createChromeOffscreen();
}

try {
const response = await app.handle(request, sender);
log.debug("Background: response: ", response);
return [null, response];
} catch (e) {
return [(e as Error).message, null];
}
});

await sendReadyMessageToTabs();

log.debug("CryptKeeper initialization complete.");
resolveInitialization?.(true);
} catch (error) {
rejectInitialization?.(error);
}
};

initialize();
Original file line number Diff line number Diff line change
Expand Up @@ -56,23 +56,23 @@ describe("background/controllers/browserUtils", () => {
browserUtils.addRemoveWindowListener(callback);
browserUtils.removeRemoveWindowListener(callback);

expect(browser.windows.onRemoved.addListener).toBeCalledTimes(1);
expect(browser.windows.onRemoved.removeListener).toBeCalledTimes(1);
expect(browser.windows.onRemoved.addListener).toHaveBeenCalledTimes(1);
expect(browser.windows.onRemoved.removeListener).toHaveBeenCalledTimes(1);
});

test("should clear storage properly", async () => {
const browserUtils = BrowserUtils.getInstance();

await browserUtils.clearStorage();

expect(browser.storage.sync.clear).toBeCalledTimes(1);
expect(browser.storage.sync.clear).toHaveBeenCalledTimes(1);
});

test("should push event properly", async () => {
const browserUtils = BrowserUtils.getInstance();

await browserUtils.pushEvent({ type: "type" }, { urlOrigin: "http://localhost:3000" });

expect(browser.tabs.sendMessage).toBeCalledTimes(2);
expect(browser.tabs.sendMessage).toHaveBeenCalledTimes(2);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ describe("background/controllers/requestManager", () => {

const requests = requestManager.getRequests();
expect(requests).toHaveLength(1);
expect(pushMessage).toBeCalledTimes(1);
expect(pushMessage).toBeCalledWith(setPendingRequests(requests));
expect(pushMessage).toHaveBeenCalledTimes(1);
expect(pushMessage).toHaveBeenCalledWith(setPendingRequests(requests));

const finalized = await requestManager.finalizeRequest({
id: nonce.toString(),
Expand All @@ -75,9 +75,9 @@ describe("background/controllers/requestManager", () => {

expect(finalized).toBe(true);
expect(requestPromise).resolves.toStrictEqual({ done: true });
expect(pushMessage).toBeCalledTimes(2);
expect(mockDefaultBrowserUtils.addRemoveWindowListener).toBeCalledTimes(1);
expect(mockDefaultBrowserUtils.removeRemoveWindowListener).toBeCalledTimes(1);
expect(pushMessage).toHaveBeenCalledTimes(2);
expect(mockDefaultBrowserUtils.addRemoveWindowListener).toHaveBeenCalledTimes(1);
expect(mockDefaultBrowserUtils.removeRemoveWindowListener).toHaveBeenCalledTimes(1);
});

test("should reject request properly", async () => {
Expand Down
1 change: 1 addition & 0 deletions packages/app/src/background/cryptKeeper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ export default class CryptKeeperController {

// Connections
this.handler.add(RPCInternalAction.CONNECT, this.lockService.ensure, this.connectionService.connect);
this.handler.add(RPCInternalAction.DISCONNECT, this.lockService.ensure, this.connectionService.disconnect);
this.handler.add(
RPCInternalAction.REVEAL_CONNECTED_IDENTITY_COMMITMENT,
this.lockService.ensure,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,8 @@ describe("background/services/approval", () => {
expect(canSkipApprove).toBe(true);

(SimpleStorage as jest.Mock).mock.instances.forEach((instance: MockStorage) => {
expect(instance.set).toBeCalledTimes(1);
expect(instance.set).toBeCalledWith(mockSerializedApprovals);
expect(instance.set).toHaveBeenCalledTimes(1);
expect(instance.set).toHaveBeenCalledWith(mockSerializedApprovals);
});
});

Expand All @@ -146,7 +146,7 @@ describe("background/services/approval", () => {
expect(result).toStrictEqual({ urlOrigin: "unknown", canSkipApprove: false });

(SimpleStorage as jest.Mock).mock.instances.forEach((instance: MockStorage) => {
expect(instance.set).toBeCalledTimes(1);
expect(instance.set).toHaveBeenCalledTimes(1);
});
});
});
Expand All @@ -159,8 +159,8 @@ describe("background/services/approval", () => {
expect(hosts).toStrictEqual(mockDefaultHosts);

(SimpleStorage as jest.Mock).mock.instances.forEach((instance: MockStorage) => {
expect(instance.set).toBeCalledTimes(1);
expect(instance.set).toBeCalledWith(mockSerializedApprovals);
expect(instance.set).toHaveBeenCalledTimes(1);
expect(instance.set).toHaveBeenCalledWith(mockSerializedApprovals);
});
});

Expand All @@ -184,7 +184,7 @@ describe("background/services/approval", () => {
expect(hosts).toHaveLength(0);

(SimpleStorage as jest.Mock).mock.instances.forEach((instance: MockStorage) => {
expect(instance.set).toBeCalledTimes(1);
expect(instance.set).toHaveBeenCalledTimes(1);
});
});

Expand Down Expand Up @@ -246,15 +246,15 @@ describe("background/services/approval", () => {
await approvalService.uploadEncryptedStorage("encrypted", "password");

(SimpleStorage as jest.Mock).mock.instances.forEach((instance: MockStorage) => {
expect(instance.set).toBeCalledTimes(1);
expect(instance.set).toHaveBeenCalledTimes(1);
});
});

test("should not upload encrypted approvals if there is no data", async () => {
await approvalService.uploadEncryptedStorage("", "");

(SimpleStorage as jest.Mock).mock.instances.forEach((instance: MockStorage) => {
expect(instance.set).toBeCalledTimes(0);
expect(instance.set).toHaveBeenCalledTimes(0);
});
});

Expand All @@ -269,16 +269,16 @@ describe("background/services/approval", () => {

await approvalService.downloadStorage();

expect(storage.get).toBeCalledTimes(1);
expect(storage.get).toHaveBeenCalledTimes(1);
});

test("should restore storage properly", async () => {
const [storage] = (SimpleStorage as jest.Mock).mock.instances as [MockStorage];

await approvalService.restoreStorage("storage");

expect(storage.set).toBeCalledTimes(1);
expect(storage.set).toBeCalledWith("storage");
expect(storage.set).toHaveBeenCalledTimes(1);
expect(storage.set).toHaveBeenCalledWith("storage");
});

test("should throw error when trying to restore incorrect data", async () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,8 @@ describe("background/services/backup/BackupService", () => {
);

backupService.getBackupables().forEach((service) => {
expect(service.downloadStorage).toBeCalledTimes(0);
expect(service.restoreStorage).toBeCalledTimes(0);
expect(service.downloadStorage).toHaveBeenCalledTimes(0);
expect(service.restoreStorage).toHaveBeenCalledTimes(0);
});

backupService
Expand Down Expand Up @@ -191,8 +191,8 @@ describe("background/services/backup/BackupService", () => {
await expect(backupService.upload({ content: fileContent, ...defaultPasswords })).rejects.toThrow("error");

backupService.getBackupables().forEach((service) => {
expect(service.downloadStorage).toBeCalledTimes(1);
expect(service.restoreStorage).toBeCalledTimes(1);
expect(service.downloadStorage).toHaveBeenCalledTimes(1);
expect(service.restoreStorage).toHaveBeenCalledTimes(1);
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ describe("background/services/bandada/BandadaService", () => {

const result = await service.addMember(defaultAddMemberArgs);

expect(fetchSpy).toBeCalledTimes(1);
expect(fetchSpy).toHaveBeenCalledTimes(1);
expect(result).toBe(true);
});

Expand All @@ -76,7 +76,7 @@ describe("background/services/bandada/BandadaService", () => {

const result = await service.addMember({ ...defaultAddMemberArgs, apiKey: undefined, inviteCode: "code" });

expect(fetchSpy).toBeCalledTimes(1);
expect(fetchSpy).toHaveBeenCalledTimes(1);
expect(result).toBe(true);
});

Expand All @@ -88,7 +88,7 @@ describe("background/services/bandada/BandadaService", () => {
const service = BandadaService.getInstance();

await expect(service.addMember(defaultAddMemberArgs)).rejects.toThrowError("Error 1,Error 2");
expect(fetchSpy).toBeCalledTimes(1);
expect(fetchSpy).toHaveBeenCalledTimes(1);
});

test("should throw error if add member is called without required params", async () => {
Expand All @@ -114,7 +114,7 @@ describe("background/services/bandada/BandadaService", () => {

const proof = await service.generateMerkleProof(defaultGenerateProofArgs);

expect(fetchSpy).toBeCalledTimes(1);
expect(fetchSpy).toHaveBeenCalledTimes(1);
expect(proof).toStrictEqual(defaultMerkleProof);
});

Expand All @@ -126,7 +126,7 @@ describe("background/services/bandada/BandadaService", () => {
const service = BandadaService.getInstance();

await expect(service.generateMerkleProof(defaultGenerateProofArgs)).rejects.toThrowError("Error");
expect(fetchSpy).toBeCalledTimes(1);
expect(fetchSpy).toHaveBeenCalledTimes(1);
});

test("should check membership properly", async () => {
Expand All @@ -138,7 +138,7 @@ describe("background/services/bandada/BandadaService", () => {

const result = await service.checkGroupMembership(defaultCheckMembershipArgs);

expect(fetchSpy).toBeCalledTimes(1);
expect(fetchSpy).toHaveBeenCalledTimes(1);
expect(result).toBe(true);
});

Expand All @@ -151,7 +151,7 @@ describe("background/services/bandada/BandadaService", () => {

const result = await service.checkGroupMembership(defaultCheckMembershipArgs);

expect(fetchSpy).toBeCalledTimes(1);
expect(fetchSpy).toHaveBeenCalledTimes(1);
expect(result).toBe(false);
});

Expand All @@ -163,6 +163,6 @@ describe("background/services/bandada/BandadaService", () => {
const service = BandadaService.getInstance();

await expect(service.checkGroupMembership(defaultCheckMembershipArgs)).rejects.toThrowError("Error");
expect(fetchSpy).toBeCalledTimes(1);
expect(fetchSpy).toHaveBeenCalledTimes(1);
});
});
Loading

0 comments on commit 4a038ca

Please sign in to comment.