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

[EC-598] fix: user interaction not being awaited sometimes

Only one handler can return a response. That handler needs to return true to indicated it's intention to eventually do so.
Our issue was that multiple handlers were returning truthy values, causing a race condition.
This commit is contained in:
Andreas Coroiu
2023-01-13 14:55:59 +01:00
parent 29c438a851
commit e41c849c18
2 changed files with 18 additions and 17 deletions

View File

@@ -42,18 +42,27 @@ export default class RuntimeBackground {
}
await this.checkOnInstalled();
const backgroundMessageListener = async (
const backgroundMessageListener = (
msg: any,
sender: chrome.runtime.MessageSender,
sendResponse: any
) => {
const response = await this.processMessage(msg, sender);
sendResponse(response);
const messagesWithResponse = ["fido2RegisterCredentialRequest", "fido2GetCredentialRequest"];
if (messagesWithResponse.includes(msg.command)) {
this.processMessage(msg, sender).then(
(value) => sendResponse({ result: value }),
(error) => sendResponse({ error: { ...error, message: error.message } })
);
return true;
}
this.processMessage(msg, sender);
return false;
};
BrowserApi.messageListener("runtime.background", (msg, sender, sendResponse) => {
backgroundMessageListener(msg, sender, sendResponse);
return true;
return backgroundMessageListener(msg, sender, sendResponse);
});
if (this.main.popupOnlyContext) {
(window as any).bitwardenBackgroundMessageListener = backgroundMessageListener;
@@ -209,17 +218,9 @@ export default class RuntimeBackground {
this.platformUtilsService.copyToClipboard(msg.identifier, { window: window });
break;
case "fido2RegisterCredentialRequest":
try {
return { result: await this.main.fido2Service.createCredential(msg.data) };
} catch (error) {
return { error: { ...error, message: error.message } };
}
return await this.main.fido2Service.createCredential(msg.data);
case "fido2GetCredentialRequest":
try {
return { result: await this.main.fido2Service.assertCredential(msg.data) };
} catch (error) {
return { error: { ...error, message: error.message } };
}
return await this.main.fido2Service.assertCredential(msg.data);
}
return undefined;
}

View File

@@ -139,8 +139,8 @@ export class BrowserApi {
callback: (message: any, sender: chrome.runtime.MessageSender, response: any) => unknown
) {
chrome.runtime.onMessage.addListener(
(msg: any, sender: chrome.runtime.MessageSender, response: any) => {
return callback(msg, sender, response);
(msg: any, sender: chrome.runtime.MessageSender, sendResponse: any) => {
return callback(msg, sender, sendResponse) === true;
}
);
}