mirror of
https://github.com/bitwarden/browser
synced 2026-01-03 17:13:47 +00:00
* Desktop Autotype use managed object for IPC vault data payload * claude feedback 1 * check for falsey values * add unit test * remove unecessary async * helper result type * dear claude
167 lines
4.5 KiB
TypeScript
167 lines
4.5 KiB
TypeScript
import { ipcRenderer } from "electron";
|
|
|
|
import type { autofill } from "@bitwarden/desktop-napi";
|
|
|
|
import { Command } from "../platform/main/autofill/command";
|
|
import { RunCommandParams, RunCommandResult } from "../platform/main/autofill/native-autofill.main";
|
|
|
|
import { AutotypeVaultData } from "./models/autotype-vault-data";
|
|
|
|
export default {
|
|
runCommand: <C extends Command>(params: RunCommandParams<C>): Promise<RunCommandResult<C>> =>
|
|
ipcRenderer.invoke("autofill.runCommand", params),
|
|
|
|
listenPasskeyRegistration: (
|
|
fn: (
|
|
clientId: number,
|
|
sequenceNumber: number,
|
|
request: autofill.PasskeyRegistrationRequest,
|
|
completeCallback: (
|
|
error: Error | null,
|
|
response: autofill.PasskeyRegistrationResponse,
|
|
) => void,
|
|
) => void,
|
|
) => {
|
|
ipcRenderer.on(
|
|
"autofill.passkeyRegistration",
|
|
(
|
|
event,
|
|
data: {
|
|
clientId: number;
|
|
sequenceNumber: number;
|
|
request: autofill.PasskeyRegistrationRequest;
|
|
},
|
|
) => {
|
|
const { clientId, sequenceNumber, request } = data;
|
|
fn(clientId, sequenceNumber, request, (error, response) => {
|
|
if (error) {
|
|
ipcRenderer.send("autofill.completeError", {
|
|
clientId,
|
|
sequenceNumber,
|
|
error: error.message,
|
|
});
|
|
return;
|
|
}
|
|
|
|
ipcRenderer.send("autofill.completePasskeyRegistration", {
|
|
clientId,
|
|
sequenceNumber,
|
|
response,
|
|
});
|
|
});
|
|
},
|
|
);
|
|
},
|
|
|
|
listenPasskeyAssertion: (
|
|
fn: (
|
|
clientId: number,
|
|
sequenceNumber: number,
|
|
request: autofill.PasskeyAssertionRequest,
|
|
completeCallback: (error: Error | null, response: autofill.PasskeyAssertionResponse) => void,
|
|
) => void,
|
|
) => {
|
|
ipcRenderer.on(
|
|
"autofill.passkeyAssertion",
|
|
(
|
|
event,
|
|
data: {
|
|
clientId: number;
|
|
sequenceNumber: number;
|
|
request: autofill.PasskeyAssertionRequest;
|
|
},
|
|
) => {
|
|
const { clientId, sequenceNumber, request } = data;
|
|
fn(clientId, sequenceNumber, request, (error, response) => {
|
|
if (error) {
|
|
ipcRenderer.send("autofill.completeError", {
|
|
clientId,
|
|
sequenceNumber,
|
|
error: error.message,
|
|
});
|
|
return;
|
|
}
|
|
|
|
ipcRenderer.send("autofill.completePasskeyAssertion", {
|
|
clientId,
|
|
sequenceNumber,
|
|
response,
|
|
});
|
|
});
|
|
},
|
|
);
|
|
},
|
|
listenPasskeyAssertionWithoutUserInterface: (
|
|
fn: (
|
|
clientId: number,
|
|
sequenceNumber: number,
|
|
request: autofill.PasskeyAssertionWithoutUserInterfaceRequest,
|
|
completeCallback: (error: Error | null, response: autofill.PasskeyAssertionResponse) => void,
|
|
) => void,
|
|
) => {
|
|
ipcRenderer.on(
|
|
"autofill.passkeyAssertionWithoutUserInterface",
|
|
(
|
|
event,
|
|
data: {
|
|
clientId: number;
|
|
sequenceNumber: number;
|
|
request: autofill.PasskeyAssertionWithoutUserInterfaceRequest;
|
|
},
|
|
) => {
|
|
const { clientId, sequenceNumber, request } = data;
|
|
fn(clientId, sequenceNumber, request, (error, response) => {
|
|
if (error) {
|
|
ipcRenderer.send("autofill.completeError", {
|
|
clientId,
|
|
sequenceNumber,
|
|
error: error.message,
|
|
});
|
|
return;
|
|
}
|
|
|
|
ipcRenderer.send("autofill.completePasskeyAssertion", {
|
|
clientId,
|
|
sequenceNumber,
|
|
response,
|
|
});
|
|
});
|
|
},
|
|
);
|
|
},
|
|
configureAutotype: (enabled: boolean, keyboardShortcut: string[]) => {
|
|
ipcRenderer.send("autofill.configureAutotype", { enabled, keyboardShortcut });
|
|
},
|
|
listenAutotypeRequest: (
|
|
fn: (
|
|
windowTitle: string,
|
|
completeCallback: (error: Error | null, response: AutotypeVaultData | null) => void,
|
|
) => void,
|
|
) => {
|
|
ipcRenderer.on(
|
|
"autofill.listenAutotypeRequest",
|
|
(
|
|
event,
|
|
data: {
|
|
windowTitle: string;
|
|
},
|
|
) => {
|
|
const { windowTitle } = data;
|
|
|
|
fn(windowTitle, (error, vaultData) => {
|
|
if (error) {
|
|
ipcRenderer.send("autofill.completeError", {
|
|
windowTitle,
|
|
error: error.message,
|
|
});
|
|
return;
|
|
}
|
|
if (vaultData !== null) {
|
|
ipcRenderer.send("autofill.completeAutotypeRequest", vaultData);
|
|
}
|
|
});
|
|
},
|
|
);
|
|
},
|
|
};
|