diff --git a/apps/desktop/src/main/native-messaging.main.ts b/apps/desktop/src/main/native-messaging.main.ts index ae549ace384..daa0d9de12f 100644 --- a/apps/desktop/src/main/native-messaging.main.ts +++ b/apps/desktop/src/main/native-messaging.main.ts @@ -6,6 +6,7 @@ import * as util from "util"; import { ipcMain } from "electron"; import * as ipc from "node-ipc"; +import { getIpcSocketRoot } from "../proxy/ipc"; import { LogService } from "@bitwarden/common/abstractions/log.service"; @@ -25,11 +26,9 @@ export class NativeMessagingMain { async listen() { ipc.config.id = "bitwarden"; ipc.config.retry = 1500; - if (process.platform === "darwin") { - if (!existsSync(`${homedir()}/tmp`)) { - await fs.mkdir(`${homedir()}/tmp`); - } - ipc.config.socketRoot = `${homedir()}/tmp/`; + const ipcSocketRoot = getIpcSocketRoot(); + if (ipcSocketRoot != null) { + ipc.config.socketRoot = ipcSocketRoot; } ipc.serve(() => { diff --git a/apps/desktop/src/proxy/ipc.ts b/apps/desktop/src/proxy/ipc.ts index 228179a5e4c..0160d6bf294 100644 --- a/apps/desktop/src/proxy/ipc.ts +++ b/apps/desktop/src/proxy/ipc.ts @@ -1,13 +1,38 @@ /* eslint-disable no-console */ +import { createHash } from "crypto"; +import { existsSync, mkdirSync } from "fs"; import { homedir } from "os"; +import { join as path_join } from "path"; import * as ipc from "node-ipc"; +export function getIpcSocketRoot(): string | null { + let socketRoot = null; + + switch (process.platform) { + case "darwin": { + const ipcSocketRootDir = path_join(homedir(), "tmp"); + if (!existsSync(ipcSocketRootDir)) { + mkdirSync(ipcSocketRootDir); + } + socketRoot = ipcSocketRootDir + "/"; + break; + } + case "win32": { + // Let node-ipc use a unique IPC pipe //./pipe/xxxxxxxxxxxxxxxxx.app.bitwarden per user. + // Hashing prevents problems with reserved characters and file length limitations. + socketRoot = createHash("sha1").update(homedir()).digest("hex") + "."; + } + } + return socketRoot; +} + ipc.config.id = "proxy"; ipc.config.retry = 1500; ipc.config.logger = console.warn; // Stdout is used for native messaging -if (process.platform === "darwin") { - ipc.config.socketRoot = `${homedir()}/tmp/`; +const ipcSocketRoot = getIpcSocketRoot(); +if (ipcSocketRoot != null) { + ipc.config.socketRoot = ipcSocketRoot; } export default class IPC {