diff --git a/Cargo.lock b/Cargo.lock index d5640b1..25a613c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1067,6 +1067,27 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -2660,6 +2681,16 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", +] + [[package]] name = "libusb1-sys" version = "0.7.0" @@ -2991,6 +3022,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + [[package]] name = "option-operations" version = "0.5.0" @@ -3512,6 +3549,7 @@ dependencies = [ "async-trait", "bytes", "clap 4.5.20", + "dirs", "enumflags2", "futures-util", "ironrdp", @@ -3701,6 +3739,17 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + [[package]] name = "regex" version = "1.11.1" diff --git a/qemu-display/src/display.rs b/qemu-display/src/display.rs index 7209cd0..8c5ec15 100644 --- a/qemu-display/src/display.rs +++ b/qemu-display/src/display.rs @@ -8,8 +8,9 @@ use zbus::{ fdo, fdo::ManagedObjects, names::{BusName, OwnedUniqueName, UniqueName, WellKnownName}, + proxy::OwnerChangedStream, zvariant::OwnedObjectPath, - Connection, proxy::OwnerChangedStream, + Connection, }; #[cfg(unix)] diff --git a/qemu-rdp/Cargo.toml b/qemu-rdp/Cargo.toml index 94fc687..ae5601f 100644 --- a/qemu-rdp/Cargo.toml +++ b/qemu-rdp/Cargo.toml @@ -32,3 +32,4 @@ ironrdp = { git = "https://github.com/Devolutions/IronRDP", features = [ futures-util = "0.3" zbus.workspace = true enumflags2 = "0.7.10" +dirs = "5.0.1" diff --git a/qemu-rdp/src/args.rs b/qemu-rdp/src/args.rs index f2ad157..c4892a4 100644 --- a/qemu-rdp/src/args.rs +++ b/qemu-rdp/src/args.rs @@ -21,7 +21,7 @@ pub struct Args { #[derive(Debug, Subcommand)] pub enum Commands { /// Start a RDP server - #[command(arg_required_else_help = true)] + #[command()] Serve(ServerArgs), } @@ -34,11 +34,11 @@ pub struct ServerArgs { /// Path to tls certificate #[clap(short, long, value_parser)] - pub cert: PathBuf, + pub cert: Option, /// Path to private key #[clap(short, long, value_parser)] - pub key: PathBuf, + pub key: Option, /// RemoteFx encoding #[clap(value_enum, long, default_value = "enable")] diff --git a/qemu-rdp/src/server/mod.rs b/qemu-rdp/src/server/mod.rs index f44fa4f..fef3fce 100644 --- a/qemu-rdp/src/server/mod.rs +++ b/qemu-rdp/src/server/mod.rs @@ -3,7 +3,9 @@ mod display; mod input; mod sound; -use anyhow::Error; +use std::path::PathBuf; + +use anyhow::{bail, Error}; use enumflags2::BitFlags; use ironrdp::server::{Credentials, ServerEvent, TlsIdentityCtx}; @@ -35,6 +37,25 @@ impl Server { } pub async fn run(&mut self) -> Result<(), Error> { + let (cert, key) = match (&self.args.cert, &self.args.key) { + (Some(cert), Some(key)) => (cert.as_path().to_owned(), key.as_path().to_owned()), + (None, None) => { + let mut config_dir = dirs::config_dir().expect("configuration directory"); + config_dir.push("qemu-rdp"); + let cert: PathBuf = [config_dir.clone(), PathBuf::from("cert.der")] + .iter() + .collect(); + let key: PathBuf = [config_dir, PathBuf::from("key.der")].iter().collect(); + (cert, key) + } + _ => { + bail!("Provide both --cert and --key") + } + }; + + println!("Waiting for org.qemu..."); + Display::lookup(&self.dbus, true, None).await?; + let dbus_display = Display::new::<()>(&self.dbus, None).await?; let handler = InputHandler::connect(&dbus_display).await?; @@ -48,8 +69,7 @@ impl Server { } }; - let tls = - TlsIdentityCtx::init_from_paths(self.args.cert.as_path(), self.args.key.as_path())?; + let tls = TlsIdentityCtx::init_from_paths(&cert, &key)?; let mut server = RdpServer::builder() .with_addr(self.args.bind_addr) .with_hybrid(tls.make_acceptor()?, tls.pub_key) @@ -80,7 +100,11 @@ impl Server { .request_name_with_flags("org.QemuDisplay", BitFlags::EMPTY) .await?; - server.run().await + println!("Starting RDP server, args: {:?}", self.args); + println!("Cert: {cert:?}, Key: {key:?}"); + server.run().await?; + println!("RDP server ended"); + Ok(()) } } diff --git a/qemu-rdw/src/main.rs b/qemu-rdw/src/main.rs index 281c5df..0a11c68 100644 --- a/qemu-rdw/src/main.rs +++ b/qemu-rdw/src/main.rs @@ -77,7 +77,7 @@ async fn display_from_opt(opt: Rc>) -> Option