Add peercred for unix

This commit is contained in:
Bernd Schoolmann 2024-11-18 11:27:13 +01:00
parent 3f9e332a5a
commit 1e7511b7dc
No known key found for this signature in database
8 changed files with 138 additions and 6 deletions

View File

@ -523,6 +523,25 @@ dependencies = [
"libc",
]
[[package]]
name = "crossbeam-deque"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.20"
@ -695,6 +714,7 @@ dependencies = [
"sha2",
"ssh-encoding",
"ssh-key",
"sysinfo",
"thiserror",
"tokio",
"tokio-stream",
@ -813,6 +833,12 @@ dependencies = [
"subtle",
]
[[package]]
name = "either"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
[[package]]
name = "embed_plist"
version = "1.2.2"
@ -1517,6 +1543,15 @@ dependencies = [
"minimal-lexical",
]
[[package]]
name = "ntapi"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4"
dependencies = [
"winapi",
]
[[package]]
name = "num-bigint-dig"
version = "0.8.4"
@ -1989,6 +2024,26 @@ dependencies = [
"getrandom",
]
[[package]]
name = "rayon"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
dependencies = [
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
]
[[package]]
name = "recvmsg"
version = "1.0.0"
@ -2388,6 +2443,20 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "sysinfo"
version = "0.32.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3b5ae3f4f7d64646c46c4cae4e3f01d1c5d255c7406fdd7c7f999a94e488791"
dependencies = [
"core-foundation-sys",
"libc",
"memchr",
"ntapi",
"rayon",
"windows",
]
[[package]]
name = "system-deps"
version = "6.2.2"

View File

@ -60,6 +60,7 @@ rand_chacha = "=0.3.1"
pkcs8 = { version = "=0.10.2", features = ["alloc", "encryption", "pem"] }
rsa = "=0.9.6"
ed25519 = { version = "=2.2.3", features = ["pkcs8"] }
sysinfo = "0.32.0"
[target.'cfg(windows)'.dependencies]
widestring = { version = "=1.1.0", optional = true }

View File

@ -12,6 +12,7 @@ mod platform_ssh_agent;
pub mod generator;
pub mod importer;
mod peercred_unix_listener_stream;
#[derive(Clone)]
pub struct BitwardenDesktopAgent {

View File

@ -0,0 +1,59 @@
use futures::Stream;
use std::io;
use std::pin::Pin;
use std::task::{Context, Poll};
use sysinfo::{Pid, System};
use tokio::net::{UnixListener, UnixStream};
#[derive(Debug)]
pub struct PeercredUnixListenerStream {
inner: UnixListener,
}
impl PeercredUnixListenerStream {
pub fn new(listener: UnixListener) -> Self {
Self { inner: listener }
}
pub fn into_inner(self) -> UnixListener {
self.inner
}
}
impl Stream for PeercredUnixListenerStream {
type Item = io::Result<UnixStream>;
fn poll_next(
self: Pin<&mut Self>,
cx: &mut Context<'_>,
) -> Poll<Option<io::Result<UnixStream>>> {
match self.inner.poll_accept(cx) {
Poll::Ready(Ok((stream, _))) => {
println!("{:?}", stream.peer_cred());
println!("{:?}", stream.peer_cred().unwrap().pid());
let peer = stream.peer_cred().unwrap();
let s = System::new_all();
if let Some(process) = s.process(Pid::from_u32(peer.pid().unwrap() as u32)) {
println!("name {:?}", process.name());
println!("cmd {:?}", process.cmd());
}
Poll::Ready(Some(Ok(stream)))
}
Poll::Ready(Err(err)) => Poll::Ready(Some(Err(err))),
Poll::Pending => Poll::Pending,
}
}
}
impl AsRef<UnixListener> for PeercredUnixListenerStream {
fn as_ref(&self) -> &UnixListener {
&self.inner
}
}
impl AsMut<UnixListener> for PeercredUnixListenerStream {
fn as_mut(&mut self) -> &mut UnixListener {
&mut self.inner
}
}

View File

@ -8,6 +8,8 @@ use homedir::my_home;
use tokio::{net::UnixListener, sync::Mutex};
use tokio_util::sync::CancellationToken;
use crate::ssh_agent::peercred_unix_listener_stream::PeercredUnixListenerStream;
use super::BitwardenDesktopAgent;
impl BitwardenDesktopAgent {
@ -51,11 +53,11 @@ impl BitwardenDesktopAgent {
let _ = std::fs::remove_file(sockname);
match UnixListener::bind(sockname) {
Ok(listener) => {
let wrapper = tokio_stream::wrappers::UnixListenerStream::new(listener);
let stream = PeercredUnixListenerStream::new(listener);
let cloned_keystore = cloned_agent_state.keystore.clone();
let cloned_cancellation_token = cloned_agent_state.cancellation_token.clone();
let _ = ssh_agent::serve(
wrapper,
stream,
cloned_agent_state,
cloned_keystore,
cloned_cancellation_token,

View File

@ -1,7 +1,7 @@
{
"name": "@bitwarden/desktop",
"description": "A secure and free password manager for all of your devices.",
"version": "2024.11.0",
"version": "2024.12.0",
"keywords": [
"bitwarden",
"password",

View File

@ -1,12 +1,12 @@
{
"name": "@bitwarden/desktop",
"version": "2024.11.0",
"version": "2024.12.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@bitwarden/desktop",
"version": "2024.11.0",
"version": "2024.12.0",
"license": "GPL-3.0",
"dependencies": {
"@bitwarden/desktop-napi": "file:../desktop_native/napi",

View File

@ -2,7 +2,7 @@
"name": "@bitwarden/desktop",
"productName": "Bitwarden",
"description": "A secure and free password manager for all of your devices.",
"version": "2024.11.0",
"version": "2024.12.0",
"author": "Bitwarden Inc. <hello@bitwarden.com> (https://bitwarden.com)",
"homepage": "https://bitwarden.com",
"license": "GPL-3.0",