1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-11 14:04:03 +00:00

Fix windows build

This commit is contained in:
Bernd Schoolmann
2025-10-16 13:59:51 +02:00
parent 0f36693af1
commit e387125ccd
7 changed files with 40 additions and 43 deletions

View File

@@ -3643,6 +3643,7 @@ dependencies = [
"p256",
"p384",
"p521",
"pin-project",
"rsa 0.10.0-rc.8",
"sha2 0.10.9",
"signature 3.0.0-rc.4",

View File

@@ -24,6 +24,7 @@ inout = { version = "=0.2.0-rc.6" }
homedir = { workspace = true }
log = { workspace = true }
rsa = { version = "=0.10.0-rc.8", features = ["sha2"] }
pin-project = { workspace = true }
sha2 = "0.10.9"
ssh-encoding = "=0.3.0-rc.2"
ssh-key = { version = "=0.7.0-rc.3", features = [

View File

@@ -57,6 +57,10 @@ impl BitwardenDesktopAgent {
pub fn is_running(&self) -> bool {
!self.cancellation_token.is_cancelled()
}
pub fn cancellation_token(&self) -> CancellationToken {
self.cancellation_token.clone()
}
}
impl Agent for &BitwardenDesktopAgent {

View File

@@ -1,7 +1,4 @@
use homedir::my_home;
use tracing::info;
use crate::{agent::BitwardenDesktopAgent, transport::unix_listener_stream::UnixListenerStream};
use crate::{agent::BitwardenDesktopAgent, transport::named_pipe_listener_stream::NamedPipeServerStream};
pub struct PlatformListener {}
@@ -16,6 +13,11 @@ impl PlatformListener {
{
Self::spawn_macos_listeners(agent);
}
#[cfg(target_os = "windows")]
{
Self::spawn_windows_listeners(agent);
}
}
#[cfg(target_os = "linux")]
@@ -64,4 +66,12 @@ impl PlatformListener {
tokio::spawn(UnixListenerStream::listen(path, agent));
}
#[cfg(target_os = "windows")]
pub fn spawn_windows_listeners(agent: BitwardenDesktopAgent) {
tokio::spawn(async move {
const PIPE_NAME: &str = r"\\.\pipe\openssh-ssh-agent";
tokio::spawn(NamedPipeServerStream::listen(PIPE_NAME.to_string(), agent));
});
}
}

View File

@@ -1,4 +1,5 @@
#[cfg(windows)]
mod named_pipe_listener_stream;
pub mod peer_info;
pub mod named_pipe_listener_stream;
#[cfg(not(windows))]
pub mod unix_listener_stream;
pub mod peer_info;

View File

@@ -3,23 +3,17 @@ use std::os::windows::prelude::AsRawHandle as _;
use std::{
io,
pin::Pin,
sync::{
atomic::{AtomicBool, Ordering},
Arc,
},
task::{Context, Poll},
};
use tokio::{
net::windows::named_pipe::{NamedPipeServer, ServerOptions},
select,
};
use tokio_util::sync::CancellationToken;
use tracing::{error, info};
use windows::Win32::{Foundation::HANDLE, System::Pipes::GetNamedPipeClientProcessId};
use crate::ssh_agent::peerinfo::{self, models::PeerInfo};
const PIPE_NAME: &str = r"\\.\pipe\openssh-ssh-agent";
use crate::agent::BitwardenDesktopAgent;
use crate::transport::peer_info::PeerInfo;
#[pin_project::pin_project]
pub struct NamedPipeServerStream {
@@ -27,30 +21,32 @@ pub struct NamedPipeServerStream {
}
impl NamedPipeServerStream {
// FIXME: Remove unwraps! They panic and terminate the whole application.
#[allow(clippy::unwrap_used)]
pub fn new(cancellation_token: CancellationToken, is_running: Arc<AtomicBool>) -> Self {
pub async fn listen(
pipe_name: String,
agent: BitwardenDesktopAgent,
) -> Result<NamedPipeServerStream, anyhow::Error> {
info!("Starting SSH Named Pipe listener");
let (tx, rx) = tokio::sync::mpsc::channel(16);
tokio::spawn(async move {
info!("Creating named pipe server on {}", PIPE_NAME);
let mut listener = match ServerOptions::new().create(PIPE_NAME) {
info!("Creating named pipe server on {}", pipe_name.clone());
let mut listener = match ServerOptions::new().create(pipe_name.clone()) {
Ok(pipe) => pipe,
Err(e) => {
error!(error = %e, "Encountered an error creating the first pipe. The system's openssh service must likely be disabled");
cancellation_token.cancel();
is_running.store(false, Ordering::Relaxed);
return;
}
};
let cancellation_token = agent.cancellation_token();
loop {
info!("Waiting for connection");
select! {
_ = cancellation_token.cancelled() => {
info!("[SSH Agent Native Module] Cancellation token triggered, stopping named pipe server");
info!("Cancellation token triggered, stopping named pipe server");
break;
}
_ = listener.connect() => {
info!("[SSH Agent Native Module] Incoming connection");
info!("Incoming connection");
let handle = HANDLE(listener.as_raw_handle());
let mut pid = 0;
unsafe {
@@ -60,23 +56,14 @@ impl NamedPipeServerStream {
}
};
let peer_info = peerinfo::gather::get_peer_info(pid);
let peer_info = match peer_info {
Err(e) => {
error!(error = %e, pid = %pid, "Failed getting process info");
continue
},
Ok(info) => info,
};
let peer_info = PeerInfo::new(pid as u32, crate::transport::peer_info::PeerType::NamedPipe);
tx.send((listener, peer_info)).await.unwrap();
listener = match ServerOptions::new().create(PIPE_NAME) {
listener = match ServerOptions::new().create(pipe_name.clone()) {
Ok(pipe) => pipe,
Err(e) => {
error!(error = %e, "Encountered an error creating a new pipe");
cancellation_token.cancel();
is_running.store(false, Ordering::Relaxed);
return;
}
};
@@ -84,7 +71,8 @@ impl NamedPipeServerStream {
}
}
});
Self { rx }
Ok(NamedPipeServerStream { rx })
}
}

View File

@@ -6,7 +6,6 @@ use sysinfo::{Pid, System};
/// This can be later extended to include more information (icon, app name) for the corresponding application.
#[derive(Clone)]
pub struct PeerInfo {
uid: u32,
pid: u32,
process_name: String,
peer_type: PeerType,
@@ -32,7 +31,6 @@ impl PeerInfo {
);
if let Some(process) = system.process(Pid::from_u32(peer_pid)) {
Ok(Self {
uid: **process.user_id().ok_or(())?,
pid: peer_pid,
process_name: process.name().to_str().ok_or(())?.to_string(),
peer_type,
@@ -44,17 +42,12 @@ impl PeerInfo {
pub fn unknown() -> Self {
Self {
uid: 0,
pid: 0,
process_name: "Unknown application".to_string(),
peer_type: PeerType::UnixSocket,
}
}
pub fn uid(&self) -> u32 {
self.uid
}
pub fn pid(&self) -> u32 {
self.pid
}
@@ -67,7 +60,6 @@ impl PeerInfo {
impl Debug for PeerInfo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("PeerInfo")
.field("uid", &self.uid)
.field("pid", &self.pid)
.field("process_name", &self.process_name)
.field("peer_type", &self.peer_type)