1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-16 16:23:44 +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(); await this.checkOnInstalled();
const backgroundMessageListener = async ( const backgroundMessageListener = (
msg: any, msg: any,
sender: chrome.runtime.MessageSender, sender: chrome.runtime.MessageSender,
sendResponse: any sendResponse: any
) => { ) => {
const response = await this.processMessage(msg, sender); const messagesWithResponse = ["fido2RegisterCredentialRequest", "fido2GetCredentialRequest"];
sendResponse(response);
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) => { BrowserApi.messageListener("runtime.background", (msg, sender, sendResponse) => {
backgroundMessageListener(msg, sender, sendResponse); return backgroundMessageListener(msg, sender, sendResponse);
return true;
}); });
if (this.main.popupOnlyContext) { if (this.main.popupOnlyContext) {
(window as any).bitwardenBackgroundMessageListener = backgroundMessageListener; (window as any).bitwardenBackgroundMessageListener = backgroundMessageListener;
@@ -209,17 +218,9 @@ export default class RuntimeBackground {
this.platformUtilsService.copyToClipboard(msg.identifier, { window: window }); this.platformUtilsService.copyToClipboard(msg.identifier, { window: window });
break; break;
case "fido2RegisterCredentialRequest": case "fido2RegisterCredentialRequest":
try { return await this.main.fido2Service.createCredential(msg.data);
return { result: await this.main.fido2Service.createCredential(msg.data) };
} catch (error) {
return { error: { ...error, message: error.message } };
}
case "fido2GetCredentialRequest": case "fido2GetCredentialRequest":
try { return await this.main.fido2Service.assertCredential(msg.data);
return { result: await this.main.fido2Service.assertCredential(msg.data) };
} catch (error) {
return { error: { ...error, message: error.message } };
}
} }
return undefined; return undefined;
} }

View File

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