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:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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$
|
||||||
|
|||||||
@@ -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>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user