diff --git a/apps/desktop/desktop_native/core/src/ipc/server.rs b/apps/desktop/desktop_native/core/src/ipc/server.rs index 053b432220..0aa1cf3017 100644 --- a/apps/desktop/desktop_native/core/src/ipc/server.rs +++ b/apps/desktop/desktop_native/core/src/ipc/server.rs @@ -1,4 +1,8 @@ -use std::{error::Error, path::Path, vec}; +use std::{ + error::Error, + path::{Path, PathBuf}, + vec, +}; use futures::TryFutureExt; @@ -29,6 +33,7 @@ pub enum MessageType { } pub struct Server { + pub path: PathBuf, cancel_token: CancellationToken, server_to_clients_send: broadcast::Sender, } @@ -66,6 +71,7 @@ impl Server { // Create the server and start listening for incoming connections // in a separate task to avoid blocking the current task let server = Server { + path: path.to_owned(), cancel_token: cancel_token.clone(), server_to_clients_send, }; diff --git a/apps/desktop/desktop_native/napi/index.d.ts b/apps/desktop/desktop_native/napi/index.d.ts index 6d1a7b8abb..08f9f45b1b 100644 --- a/apps/desktop/desktop_native/napi/index.d.ts +++ b/apps/desktop/desktop_native/napi/index.d.ts @@ -109,6 +109,8 @@ export declare namespace ipc { * @param callback This function will be called whenever a message is received from a client. */ static listen(name: string, callback: (error: null | Error, message: IpcMessage) => void): Promise + /** Return the path to the IPC server. */ + getPath(): string /** Stop the IPC server. */ stop(): void /** diff --git a/apps/desktop/desktop_native/napi/src/lib.rs b/apps/desktop/desktop_native/napi/src/lib.rs index 60a8326a8e..841d2155f1 100644 --- a/apps/desktop/desktop_native/napi/src/lib.rs +++ b/apps/desktop/desktop_native/napi/src/lib.rs @@ -487,6 +487,12 @@ pub mod ipc { Ok(IpcServer { server }) } + /// Return the path to the IPC server. + #[napi] + pub fn get_path(&self) -> String { + self.server.path.to_string_lossy().to_string() + } + /// Stop the IPC server. #[napi] pub fn stop(&self) -> napi::Result<()> { diff --git a/apps/desktop/desktop_native/proxy/src/main.rs b/apps/desktop/desktop_native/proxy/src/main.rs index 7d3b4ecfca..bfd84b206d 100644 --- a/apps/desktop/desktop_native/proxy/src/main.rs +++ b/apps/desktop/desktop_native/proxy/src/main.rs @@ -8,14 +8,14 @@ use tokio_util::codec::LengthDelimitedCodec; #[cfg(target_os = "macos")] embed_plist::embed_info_plist!("../../../resources/info.desktop_proxy.plist"); -fn init_logging(log_path: &Path, level: log::LevelFilter) { +fn init_logging(log_path: &Path, console_level: LevelFilter, file_level: LevelFilter) { use simplelog::{ColorChoice, CombinedLogger, Config, SharedLogger, TermLogger, TerminalMode}; let config = Config::default(); let mut loggers: Vec> = Vec::new(); loggers.push(TermLogger::new( - level, + console_level, config.clone(), TerminalMode::Stderr, ColorChoice::Auto, @@ -23,7 +23,7 @@ fn init_logging(log_path: &Path, level: log::LevelFilter) { match std::fs::File::create(log_path) { Ok(file) => { - loggers.push(simplelog::WriteLogger::new(level, config, file)); + loggers.push(simplelog::WriteLogger::new(file_level, config, file)); } Err(e) => { eprintln!("Can't create file: {}", e); @@ -57,7 +57,12 @@ async fn main() { path }; - init_logging(&log_path, LevelFilter::Info); + let level = std::env::var("PROXY_LOG_LEVEL") + .ok() + .and_then(|s| s.parse().ok()) + .unwrap_or(LevelFilter::Info); + + init_logging(&log_path, level, LevelFilter::Info); info!("Starting Bitwarden IPC Proxy."); diff --git a/apps/desktop/src/main/native-messaging.main.ts b/apps/desktop/src/main/native-messaging.main.ts index 16594792f7..42be83a303 100644 --- a/apps/desktop/src/main/native-messaging.main.ts +++ b/apps/desktop/src/main/native-messaging.main.ts @@ -93,11 +93,23 @@ export class NativeMessagingMain { break; } case ipc.IpcMessageType.Message: - this.windowMain.win.webContents.send("nativeMessaging", JSON.parse(msg.message)); + try { + const msgJson = JSON.parse(msg.message); + this.logService.debug("Native messaging message:", msgJson); + this.windowMain.win?.webContents.send("nativeMessaging", msgJson); + } catch (e) { + this.logService.warning("Error processing message:", e, msg.message); + } + break; + + default: + this.logService.warning("Unknown message type:", msg.kind, msg.message); break; } }); + this.logService.info("Native messaging server started at:", this.ipcServer.getPath()); + ipcMain.on("nativeMessagingReply", (event, msg) => { if (msg != null) { this.send(msg); @@ -110,6 +122,7 @@ export class NativeMessagingMain { } send(message: object) { + this.logService.debug("Native messaging reply:", message); this.ipcServer?.send(JSON.stringify(message)); }