1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-16 16:23:44 +00:00

[EC-598] feat: add abort controller all the way to service

This commit is contained in:
Andreas Coroiu
2023-01-27 17:02:11 +01:00
parent f6eae754b3
commit 1ad0bc547a
6 changed files with 42 additions and 10 deletions

View File

@@ -18,6 +18,7 @@ export default class RuntimeBackground {
private pageDetailsToAutoFill: any[] = []; private pageDetailsToAutoFill: any[] = [];
private onInstalledReason: string = null; private onInstalledReason: string = null;
private lockedVaultPendingNotifications: LockedVaultPendingNotificationsItem[] = []; private lockedVaultPendingNotifications: LockedVaultPendingNotificationsItem[] = [];
private abortControllers = new Map<string, AbortController>();
constructor( constructor(
private main: MainBackground, private main: MainBackground,
@@ -218,10 +219,17 @@ export default class RuntimeBackground {
case "getClickedElementResponse": case "getClickedElementResponse":
this.platformUtilsService.copyToClipboard(msg.identifier, { window: window }); this.platformUtilsService.copyToClipboard(msg.identifier, { window: window });
break; break;
case "fido2AbortRequest":
this.abortControllers.get(msg.abortedRequestId)?.abort();
break;
case "fido2RegisterCredentialRequest": case "fido2RegisterCredentialRequest":
return await this.main.fido2Service.createCredential(msg.data); return await this.main.fido2Service
.createCredential(msg.data, this.createAbortController(msg.requestId))
.finally(() => this.abortControllers.delete(msg.requestId));
case "fido2GetCredentialRequest": case "fido2GetCredentialRequest":
return await this.main.fido2Service.assertCredential(msg.data); return await this.main.fido2Service
.assertCredential(msg.data, this.createAbortController(msg.requestId))
.finally(() => this.abortControllers.delete(msg.requestId));
} }
return undefined; return undefined;
} }
@@ -258,4 +266,10 @@ export default class RuntimeBackground {
} }
}, 100); }, 100);
} }
private createAbortController(id: string): AbortController {
const abortController = new AbortController();
this.abortControllers.set(id, abortController);
return abortController;
}
} }

View File

@@ -1,4 +1,4 @@
import { MessageType } from "./messaging/message"; import { Message, MessageType } from "./messaging/message";
import { Messenger } from "./messaging/messenger"; import { Messenger } from "./messaging/messenger";
const s = document.createElement("script"); const s = document.createElement("script");
@@ -8,12 +8,20 @@ s.src = chrome.runtime.getURL("content/webauthn/page-script.js");
const messenger = Messenger.forDOMCommunication(window); const messenger = Messenger.forDOMCommunication(window);
messenger.handler = async (message, abortController) => { messenger.handler = async (message, abortController) => {
const abortHandler = () =>
chrome.runtime.sendMessage({
command: "fido2AbortRequest",
abortedRequestId: message.metadata.requestId,
});
abortController.signal.addEventListener("abort", abortHandler);
if (message.type === MessageType.CredentialCreationRequest) { if (message.type === MessageType.CredentialCreationRequest) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
chrome.runtime.sendMessage( chrome.runtime.sendMessage(
{ {
command: "fido2RegisterCredentialRequest", command: "fido2RegisterCredentialRequest",
data: message.data, data: message.data,
requestId: message.metadata.requestId,
}, },
(response) => { (response) => {
if (response.error !== undefined) { if (response.error !== undefined) {
@@ -35,6 +43,7 @@ messenger.handler = async (message, abortController) => {
{ {
command: "fido2GetCredentialRequest", command: "fido2GetCredentialRequest",
data: message.data, data: message.data,
requestId: message.metadata.requestId,
}, },
(response) => { (response) => {
if (response.error !== undefined) { if (response.error !== undefined) {
@@ -47,7 +56,9 @@ messenger.handler = async (message, abortController) => {
}); });
} }
); );
}); }).finally(() =>
abortController.signal.removeEventListener("abort", abortHandler)
) as Promise<Message>;
} }
return undefined; return undefined;

View File

@@ -66,7 +66,7 @@ describe("Messenger", () => {
}); });
}); });
type TestMessage = Message & { testId: string }; type TestMessage = MessageWithMetadata & { testId: string };
function createRequest(): TestMessage { function createRequest(): TestMessage {
return { testId: Utils.newGuid(), type: "TestRequest" } as any; return { testId: Utils.newGuid(), type: "TestRequest" } as any;

View File

@@ -12,7 +12,7 @@ export type Channel = {
export type Metadata = { requestId: string }; export type Metadata = { requestId: string };
export type MessageWithMetadata = Message & { metadata: Metadata }; export type MessageWithMetadata = Message & { metadata: Metadata };
type Handler = ( type Handler = (
message: Message, message: MessageWithMetadata,
abortController?: AbortController abortController?: AbortController
) => Promise<Message | undefined>; ) => Promise<Message | undefined>;
@@ -37,7 +37,7 @@ export class Messenger {
} }
handler?: Handler; handler?: Handler;
abortControllers = new Map<string, AbortController>(); private abortControllers = new Map<string, AbortController>();
constructor(private channel: Channel) { constructor(private channel: Channel) {
this.channel.messages$ this.channel.messages$

View File

@@ -85,6 +85,12 @@ export class OriginMismatchError extends Fido2Error {
} }
export abstract class Fido2Service { export abstract class Fido2Service {
createCredential: (params: CredentialRegistrationParams) => Promise<CredentialRegistrationResult>; createCredential: (
assertCredential: (params: CredentialAssertParams) => Promise<CredentialAssertResult>; params: CredentialRegistrationParams,
abortController?: AbortController
) => Promise<CredentialRegistrationResult>;
assertCredential: (
params: CredentialAssertParams,
abortController?: AbortController
) => Promise<CredentialAssertResult>;
} }

View File

@@ -45,7 +45,8 @@ export class Fido2Service implements Fido2ServiceAbstraction {
) {} ) {}
async createCredential( async createCredential(
params: CredentialRegistrationParams params: CredentialRegistrationParams,
abortController?: AbortController
): Promise<CredentialRegistrationResult> { ): Promise<CredentialRegistrationResult> {
const presence = await this.fido2UserInterfaceService.confirmNewCredential({ const presence = await this.fido2UserInterfaceService.confirmNewCredential({
credentialName: params.rp.name, credentialName: params.rp.name,