1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-13 14:53:33 +00:00

[PM-2907] Shopify Passkey Broken on Firefox When Extension is Installed (#6003)

* [PM-2907] Shopify Passkey Broken on Firefox When Extension is Installed

* [PM-2907] Shopify Passkey Broken on Firefox When Extension is Installed

* [PM-2907] Shopify Passkey Broken on Firefox When Extension is Installed
This commit is contained in:
Cesar Gonzalez
2023-08-17 08:14:58 -05:00
committed by GitHub
parent abe16005f6
commit 93676824c2
4 changed files with 85 additions and 63 deletions

View File

@@ -52,7 +52,11 @@ export default class RuntimeBackground {
sender: chrome.runtime.MessageSender, sender: chrome.runtime.MessageSender,
sendResponse: any sendResponse: any
) => { ) => {
const messagesWithResponse = ["fido2RegisterCredentialRequest", "fido2GetCredentialRequest"]; const messagesWithResponse = [
"checkFido2FeatureEnabled",
"fido2RegisterCredentialRequest",
"fido2GetCredentialRequest",
];
if (messagesWithResponse.includes(msg.command)) { if (messagesWithResponse.includes(msg.command)) {
this.processMessage(msg, sender).then( this.processMessage(msg, sender).then(
@@ -233,6 +237,8 @@ export default class RuntimeBackground {
case "fido2AbortRequest": case "fido2AbortRequest":
this.abortControllers.get(msg.abortedRequestId)?.abort(); this.abortControllers.get(msg.abortedRequestId)?.abort();
break; break;
case "checkFido2FeatureEnabled":
return await this.main.fido2ClientService.isFido2FeatureEnabled();
case "fido2RegisterCredentialRequest": case "fido2RegisterCredentialRequest":
return await this.main.fido2ClientService return await this.main.fido2ClientService
.createCredential(msg.data, this.createAbortController(msg.requestId)) .createCredential(msg.data, this.createAbortController(msg.requestId))

View File

@@ -1,65 +1,80 @@
import { Message, 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"); function checkFido2FeatureEnabled() {
s.src = chrome.runtime.getURL("content/fido2/page-script.js"); chrome.runtime.sendMessage(
(document.head || document.documentElement).appendChild(s); { command: "checkFido2FeatureEnabled" },
(response: { result?: boolean }) => initializeFido2ContentScript(response.result)
);
}
const messenger = Messenger.forDOMCommunication(window); function initializeFido2ContentScript(isFido2FeatureEnabled: boolean) {
if (isFido2FeatureEnabled !== true) {
messenger.handler = async (message, abortController) => { return;
const abortHandler = () =>
chrome.runtime.sendMessage({
command: "fido2AbortRequest",
abortedRequestId: message.metadata.requestId,
});
abortController.signal.addEventListener("abort", abortHandler);
if (message.type === MessageType.CredentialCreationRequest) {
return new Promise((resolve, reject) => {
chrome.runtime.sendMessage(
{
command: "fido2RegisterCredentialRequest",
data: message.data,
requestId: message.metadata.requestId,
},
(response) => {
if (response.error !== undefined) {
return reject(response.error);
}
resolve({
type: MessageType.CredentialCreationResponse,
result: response.result,
});
}
);
});
} }
if (message.type === MessageType.CredentialGetRequest) { const s = document.createElement("script");
return new Promise((resolve, reject) => { s.src = chrome.runtime.getURL("content/fido2/page-script.js");
chrome.runtime.sendMessage( (document.head || document.documentElement).appendChild(s);
{
command: "fido2GetCredentialRequest", const messenger = Messenger.forDOMCommunication(window);
data: message.data,
requestId: message.metadata.requestId, messenger.handler = async (message, abortController) => {
}, const abortHandler = () =>
(response) => { chrome.runtime.sendMessage({
if (response.error !== undefined) { command: "fido2AbortRequest",
return reject(response.error); abortedRequestId: message.metadata.requestId,
});
abortController.signal.addEventListener("abort", abortHandler);
if (message.type === MessageType.CredentialCreationRequest) {
return new Promise((resolve, reject) => {
chrome.runtime.sendMessage(
{
command: "fido2RegisterCredentialRequest",
data: message.data,
requestId: message.metadata.requestId,
},
(response) => {
if (response.error !== undefined) {
return reject(response.error);
}
resolve({
type: MessageType.CredentialCreationResponse,
result: response.result,
});
} }
);
});
}
resolve({ if (message.type === MessageType.CredentialGetRequest) {
type: MessageType.CredentialGetResponse, return new Promise((resolve, reject) => {
result: response.result, chrome.runtime.sendMessage(
}); {
} command: "fido2GetCredentialRequest",
); data: message.data,
}).finally(() => requestId: message.metadata.requestId,
abortController.signal.removeEventListener("abort", abortHandler) },
) as Promise<Message>; (response) => {
} if (response.error !== undefined) {
return reject(response.error);
}
return undefined; resolve({
}; type: MessageType.CredentialGetResponse,
result: response.result,
});
}
);
}).finally(() =>
abortController.signal.removeEventListener("abort", abortHandler)
) as Promise<Message>;
}
return undefined;
};
}
checkFido2FeatureEnabled();

View File

@@ -11,6 +11,7 @@ export abstract class Fido2ClientService {
params: AssertCredentialParams, params: AssertCredentialParams,
abortController?: AbortController abortController?: AbortController
) => Promise<AssertCredentialResult>; ) => Promise<AssertCredentialResult>;
isFido2FeatureEnabled: () => Promise<boolean>;
} }
export interface CreateCredentialParams { export interface CreateCredentialParams {

View File

@@ -34,13 +34,15 @@ export class Fido2ClientService implements Fido2ClientServiceAbstraction {
private logService?: LogService private logService?: LogService
) {} ) {}
async isFido2FeatureEnabled(): Promise<boolean> {
return await this.configService.getFeatureFlagBool(FeatureFlag.Fido2VaultCredentials);
}
async createCredential( async createCredential(
params: CreateCredentialParams, params: CreateCredentialParams,
abortController = new AbortController() abortController = new AbortController()
): Promise<CreateCredentialResult> { ): Promise<CreateCredentialResult> {
const enableFido2VaultCredentials = await this.configService.getFeatureFlagBool( const enableFido2VaultCredentials = await this.isFido2FeatureEnabled();
FeatureFlag.Fido2VaultCredentials
);
if (!enableFido2VaultCredentials) { if (!enableFido2VaultCredentials) {
this.logService?.warning(`[Fido2Client] Fido2VaultCredential is not enabled`); this.logService?.warning(`[Fido2Client] Fido2VaultCredential is not enabled`);
@@ -191,9 +193,7 @@ export class Fido2ClientService implements Fido2ClientServiceAbstraction {
params: AssertCredentialParams, params: AssertCredentialParams,
abortController = new AbortController() abortController = new AbortController()
): Promise<AssertCredentialResult> { ): Promise<AssertCredentialResult> {
const enableFido2VaultCredentials = await this.configService.getFeatureFlagBool( const enableFido2VaultCredentials = await this.isFido2FeatureEnabled();
FeatureFlag.Fido2VaultCredentials
);
if (!enableFido2VaultCredentials) { if (!enableFido2VaultCredentials) {
this.logService?.warning(`[Fido2Client] Fido2VaultCredential is not enabled`); this.logService?.warning(`[Fido2Client] Fido2VaultCredential is not enabled`);