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:
@@ -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))
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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`);
|
||||||
|
|||||||
Reference in New Issue
Block a user