From 37141afece2b2dd9d7c2f3238373d90b8e748e7c Mon Sep 17 00:00:00 2001 From: fufesou Date: Mon, 6 Jul 2026 16:17:32 +0800 Subject: [PATCH] refact: remove feature cli (#15524) Signed-off-by: fufesou --- Cargo.lock | 25 +---- Cargo.toml | 3 - src/cli.rs | 199 --------------------------------------- src/client/file_trait.rs | 6 -- src/common.rs | 5 +- src/flutter_ffi.rs | 2 +- src/keyboard.rs | 8 +- src/lib.rs | 5 +- src/main.rs | 71 -------------- src/ui.rs | 6 +- src/ui_interface.rs | 1 - 11 files changed, 12 insertions(+), 319 deletions(-) delete mode 100644 src/cli.rs diff --git a/Cargo.lock b/Cargo.lock index 8ec2d4a53..0354e2448 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6588,7 +6588,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "556af5f5c953a2ee13f45753e581a38f9778e6551bc3ccc56d90b14628fe59d8" dependencies = [ "cfg-if 0.1.10", - "rpassword 2.1.0", + "rpassword", "tempfile", "termios 0.3.3", "winapi 0.3.9", @@ -7152,17 +7152,6 @@ dependencies = [ "winapi 0.2.8", ] -[[package]] -name = "rpassword" -version = "7.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" -dependencies = [ - "libc", - "rtoolbox", - "windows-sys 0.48.0", -] - [[package]] name = "rtcp" version = "0.14.0" @@ -7174,16 +7163,6 @@ dependencies = [ "webrtc-util", ] -[[package]] -name = "rtoolbox" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "rtp" version = "0.14.0" @@ -7283,7 +7262,6 @@ dependencies = [ "cfg-if 1.0.0", "chrono", "cidr-utils", - "clap 4.5.53", "clipboard", "clipboard-master", "cocoa 0.24.1", @@ -7341,7 +7319,6 @@ dependencies = [ "repng", "reqwest", "ringbuf", - "rpassword 7.3.1", "rubato", "runas", "rust-pulsectl", diff --git a/Cargo.toml b/Cargo.toml index c320401ad..36ad2200d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,6 @@ path = "src/service.rs" [features] inline = [] -cli = [] use_samplerate = ["samplerate"] use_rubato = ["rubato"] use_dasp = ["dasp"] @@ -62,8 +61,6 @@ dasp = { version = "0.11", features = ["signal", "interpolate-linear", "interpol rubato = { version = "0.12", optional = true } samplerate = { version = "0.2", optional = true } uuid = { version = "1.3", features = ["v4"] } -clap = "4.2" -rpassword = "7.2" num_cpus = "1.15" bytes = { version = "1.4", features = ["serde"] } default-net = "0.14" diff --git a/src/cli.rs b/src/cli.rs deleted file mode 100644 index 2f3b3550f..000000000 --- a/src/cli.rs +++ /dev/null @@ -1,199 +0,0 @@ -use crate::client::*; -use async_trait::async_trait; -use hbb_common::{ - config::PeerConfig, - config::READ_TIMEOUT, - futures::{SinkExt, StreamExt}, - log, - message_proto::*, - protobuf::Message as _, - rendezvous_proto::ConnType, - tokio::{self, sync::mpsc}, - Stream, -}; -use std::sync::{Arc, RwLock}; - -#[derive(Clone)] -pub struct Session { - id: String, - lc: Arc>, - sender: mpsc::UnboundedSender, - password: String, -} - -impl Session { - pub fn new(id: &str, sender: mpsc::UnboundedSender) -> Self { - let mut password = "".to_owned(); - if PeerConfig::load(id).password.is_empty() { - match rpassword::prompt_password("Enter password: ") { - Ok(p) => password = p, - Err(e) => { - log::error!("Failed to read password: {:?}", e); - password = "".to_owned(); - } - } - } - let session = Self { - id: id.to_owned(), - sender, - password, - lc: Default::default(), - }; - session.lc.write().unwrap().initialize( - id.to_owned(), - ConnType::PORT_FORWARD, - None, - false, - None, - None, - ); - session - } -} - -#[async_trait] -impl Interface for Session { - fn get_login_config_handler(&self) -> Arc> { - return self.lc.clone(); - } - - fn msgbox(&self, msgtype: &str, title: &str, text: &str, link: &str) { - match msgtype { - "input-password" => { - self.sender - .send(Data::Login((self.password.clone(), true))) - .ok(); - } - "re-input-password" => { - log::error!("{}: {}", title, text); - match rpassword::prompt_password("Enter password: ") { - Ok(password) => { - let login_data = Data::Login((password, true)); - self.sender.send(login_data).ok(); - } - Err(e) => { - log::error!("reinput password failed, {:?}", e); - } - } - } - msg if msg.contains("error") => { - log::error!("{}: {}: {}", msgtype, title, text); - } - _ => { - log::info!("{}: {}: {}", msgtype, title, text); - } - } - } - - fn handle_login_error(&self, err: &str) -> bool { - handle_login_error(self.lc.clone(), err, self) - } - - fn handle_peer_info(&self, pi: PeerInfo) { - self.lc.write().unwrap().handle_peer_info(&pi); - } - - async fn handle_hash(&self, pass: &str, hash: Hash, peer: &mut Stream) { - log::info!( - "password={}", - hbb_common::password_security::temporary_password() - ); - handle_hash(self.lc.clone(), &pass, hash, self, peer).await; - } - - async fn handle_login_from_ui( - &self, - os_username: String, - os_password: String, - password: String, - remember: bool, - peer: &mut Stream, - ) { - handle_login_from_ui( - self.lc.clone(), - os_username, - os_password, - password, - remember, - peer, - ) - .await; - } - - async fn handle_test_delay(&self, t: TestDelay, peer: &mut Stream) { - handle_test_delay(t, peer).await; - } - - fn send(&self, data: Data) { - self.sender.send(data).ok(); - } -} - -#[tokio::main(flavor = "current_thread")] -pub async fn connect_test(id: &str, key: String, token: String) { - let (sender, mut receiver) = mpsc::unbounded_channel::(); - let handler = Session::new(&id, sender); - match crate::client::Client::start(id, &key, &token, ConnType::PORT_FORWARD, handler).await { - Err(err) => { - log::error!("Failed to connect {}: {}", &id, err); - } - Ok((mut stream, direct)) => { - log::info!("direct: {}", direct); - // rpassword::prompt_password("Input anything to exit").ok(); - loop { - tokio::select! { - res = hbb_common::timeout(READ_TIMEOUT, stream.next()) => match res { - Err(_) => { - log::error!("Timeout"); - break; - } - Ok(Some(Ok(bytes))) => { - if let Ok(msg_in) = Message::parse_from_bytes(&bytes) { - match msg_in.union { - Some(message::Union::Hash(hash)) => { - log::info!("Got hash"); - break; - } - _ => {} - } - } - } - _ => {} - } - } - } - } - } -} - -#[tokio::main(flavor = "current_thread")] -pub async fn start_one_port_forward( - id: String, - port: i32, - remote_host: String, - remote_port: i32, - key: String, - token: String, -) { - crate::common::test_rendezvous_server(); - crate::common::test_nat_type(); - let (sender, mut receiver) = mpsc::unbounded_channel::(); - let handler = Session::new(&id, sender); - if let Err(err) = crate::port_forward::listen( - handler.id.clone(), - handler.password.clone(), - port, - handler.clone(), - receiver, - &key, - &token, - handler.lc.clone(), - remote_host, - remote_port, - ) - .await - { - log::error!("Failed to listen on {}: {}", port, err); - } - log::info!("port forward (:{}) exit", port); -} diff --git a/src/client/file_trait.rs b/src/client/file_trait.rs index 003767bcb..bd23883e5 100644 --- a/src/client/file_trait.rs +++ b/src/client/file_trait.rs @@ -6,7 +6,6 @@ pub trait FileManager: Interface { #[cfg(not(any( target_os = "android", target_os = "ios", - feature = "cli", feature = "flutter" )))] fn get_home_dir(&self) -> String { @@ -16,7 +15,6 @@ pub trait FileManager: Interface { #[cfg(not(any( target_os = "android", target_os = "ios", - feature = "cli", feature = "flutter" )))] fn get_next_job_id(&self) -> i32 { @@ -26,7 +24,6 @@ pub trait FileManager: Interface { #[cfg(not(any( target_os = "android", target_os = "ios", - feature = "cli", feature = "flutter" )))] fn update_next_job_id(&self, id: i32) { @@ -36,7 +33,6 @@ pub trait FileManager: Interface { #[cfg(not(any( target_os = "android", target_os = "ios", - feature = "cli", feature = "flutter" )))] fn read_dir(&self, path: String, include_hidden: bool) -> sciter::Value { @@ -90,7 +86,6 @@ pub trait FileManager: Interface { #[cfg(not(any( target_os = "android", target_os = "ios", - feature = "cli", feature = "flutter" )))] fn confirm_delete_files(&self, id: i32, file_num: i32) { @@ -100,7 +95,6 @@ pub trait FileManager: Interface { #[cfg(not(any( target_os = "android", target_os = "ios", - feature = "cli", feature = "flutter" )))] fn set_no_confirm(&self, id: i32) { diff --git a/src/common.rs b/src/common.rs index 69e3ec304..5aed8c1a4 100644 --- a/src/common.rs +++ b/src/common.rs @@ -764,15 +764,14 @@ async fn test_rendezvous_server_() { Config::reset_online(); } -// #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] pub fn test_rendezvous_server() { std::thread::spawn(test_rendezvous_server_); } pub fn refresh_rendezvous_server() { - #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] + #[cfg(any(target_os = "android", target_os = "ios"))] test_rendezvous_server(); - #[cfg(not(any(target_os = "android", target_os = "ios", feature = "cli")))] + #[cfg(not(any(target_os = "android", target_os = "ios")))] std::thread::spawn(|| { if crate::ipc::test_rendezvous_server().is_err() { test_rendezvous_server(); diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index d83cc3720..315df5e5b 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -1026,7 +1026,7 @@ pub fn main_set_option(key: String, value: String) { set_option(key, value.clone()); #[cfg(target_os = "android")] crate::rendezvous_mediator::RendezvousMediator::restart(); - #[cfg(any(target_os = "android", target_os = "ios", feature = "cli"))] + #[cfg(any(target_os = "android", target_os = "ios"))] crate::common::test_rendezvous_server(); } else { set_option(key, value.clone()); diff --git a/src/keyboard.rs b/src/keyboard.rs index e0466970e..3b6e57bea 100644 --- a/src/keyboard.rs +++ b/src/keyboard.rs @@ -2,7 +2,7 @@ use crate::flutter; #[cfg(target_os = "windows")] use crate::platform::windows::{get_char_from_vk, get_unicode_from_vk}; -#[cfg(not(any(feature = "flutter", feature = "cli")))] +#[cfg(not(feature = "flutter"))] use crate::ui::CUR_SESSION; use crate::ui_session_interface::{InvokeUiSession, Session}; #[cfg(not(any(target_os = "android", target_os = "ios")))] @@ -469,7 +469,7 @@ static mut IS_LEFT_OPTION_DOWN: bool = false; #[cfg(not(any(target_os = "android", target_os = "ios")))] fn get_keyboard_mode() -> String { - #[cfg(not(any(feature = "flutter", feature = "cli")))] + #[cfg(not(feature = "flutter"))] if let Some(session) = CUR_SESSION.lock().unwrap().as_ref() { return session.get_keyboard_mode(); } @@ -991,7 +991,7 @@ pub fn event_to_key_events( } pub fn send_key_event(key_event: &KeyEvent) { - #[cfg(not(any(feature = "flutter", feature = "cli")))] + #[cfg(not(feature = "flutter"))] if let Some(session) = CUR_SESSION.lock().unwrap().as_ref() { session.send_key_event(key_event); } @@ -1003,7 +1003,7 @@ pub fn send_key_event(key_event: &KeyEvent) { } pub fn get_peer_platform() -> String { - #[cfg(not(any(feature = "flutter", feature = "cli")))] + #[cfg(not(feature = "flutter"))] if let Some(session) = CUR_SESSION.lock().unwrap().as_ref() { return session.peer_platform(); } diff --git a/src/lib.rs b/src/lib.rs index 5621d5e2a..49cb2b7e9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,7 +24,6 @@ pub mod ipc; #[cfg(not(any( target_os = "android", target_os = "ios", - feature = "cli", feature = "flutter" )))] pub mod ui; @@ -38,11 +37,9 @@ pub mod flutter; pub mod flutter_ffi; use common::*; mod auth_2fa; -#[cfg(feature = "cli")] -pub mod cli; #[cfg(not(target_os = "ios"))] mod clipboard; -#[cfg(not(any(target_os = "android", target_os = "ios", feature = "cli")))] +#[cfg(not(any(target_os = "android", target_os = "ios")))] pub mod core_main; mod custom_server; mod lang; diff --git a/src/main.rs b/src/main.rs index 8d061bff8..dbafa3d0c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,7 +19,6 @@ fn main() { #[cfg(not(any( target_os = "android", target_os = "ios", - feature = "cli", feature = "flutter" )))] fn main() { @@ -32,73 +31,3 @@ fn main() { } common::global_clean(); } - -#[cfg(feature = "cli")] -fn main() { - if !common::global_init() { - return; - } - use clap::App; - use hbb_common::log; - let args = format!( - "-p, --port-forward=[PORT-FORWARD-OPTIONS] 'Format: remote-id:local-port:remote-port[:remote-host]' - -c, --connect=[REMOTE_ID] 'test only' - -k, --key=[KEY] '' - -s, --server=[] 'Start server'", - ); - let matches = App::new("rustdesk") - .version(crate::VERSION) - .author("Purslane Tech Pte. Ltd.") - .about("RustDesk command line tool") - .args_from_usage(&args) - .get_matches(); - use hbb_common::{config::LocalConfig, env_logger::*}; - init_from_env(Env::default().filter_or(DEFAULT_FILTER_ENV, "info")); - if let Some(p) = matches.value_of("port-forward") { - let options: Vec = p.split(":").map(|x| x.to_owned()).collect(); - if options.len() < 3 { - log::error!("Wrong port-forward options"); - return; - } - let mut port = 0; - if let Ok(v) = options[1].parse::() { - port = v; - } else { - log::error!("Wrong local-port"); - return; - } - let mut remote_port = 0; - if let Ok(v) = options[2].parse::() { - remote_port = v; - } else { - log::error!("Wrong remote-port"); - return; - } - let mut remote_host = "localhost".to_owned(); - if options.len() > 3 { - remote_host = options[3].clone(); - } - common::test_rendezvous_server(); - common::test_nat_type(); - let key = matches.value_of("key").unwrap_or("").to_owned(); - let token = LocalConfig::get_option("access_token"); - cli::start_one_port_forward( - options[0].clone(), - port, - remote_host, - remote_port, - key, - token, - ); - } else if let Some(p) = matches.value_of("connect") { - common::test_rendezvous_server(); - common::test_nat_type(); - let key = matches.value_of("key").unwrap_or("").to_owned(); - let token = LocalConfig::get_option("access_token"); - cli::connect_test(p, key, token); - } else if let Some(p) = matches.value_of("server") { - log::info!("id={}", hbb_common::config::Config::get_id()); - crate::start_server(true, false); - } - common::global_clean(); -} diff --git a/src/ui.rs b/src/ui.rs index 6d0d0927a..c95a8ec04 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -12,7 +12,7 @@ use hbb_common::{ log, }; -#[cfg(not(any(feature = "flutter", feature = "cli")))] +#[cfg(not(feature = "flutter"))] use crate::ui_session_interface::Session; use crate::{common::get_app_name, ipc, ui_interface::*}; @@ -29,7 +29,7 @@ lazy_static::lazy_static! { static ref STUPID_VALUES: Mutex>>> = Default::default(); } -#[cfg(not(any(feature = "flutter", feature = "cli")))] +#[cfg(not(feature = "flutter"))] lazy_static::lazy_static! { pub static ref CUR_SESSION: Arc>>> = Default::default(); } @@ -151,7 +151,7 @@ pub fn start(args: &mut [String]) { frame.register_behavior("native-remote", move || { let handler = remote::SciterSession::new(cmd.clone(), id.clone(), pass.clone(), args.clone()); - #[cfg(not(any(feature = "flutter", feature = "cli")))] + #[cfg(not(feature = "flutter"))] { *CUR_SESSION.lock().unwrap() = Some(handler.inner()); } diff --git a/src/ui_interface.rs b/src/ui_interface.rs index e01595ef7..1a8927840 100644 --- a/src/ui_interface.rs +++ b/src/ui_interface.rs @@ -711,7 +711,6 @@ pub fn is_can_input_monitoring(_prompt: bool) -> bool { #[inline] pub fn get_error() -> String { - #[cfg(not(any(feature = "cli")))] #[cfg(target_os = "linux")] { let dtype = crate::platform::linux::get_display_server();