diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index 3c34324f5..8f15c4b8f 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -596,6 +596,18 @@ impl Config { config.store(); } + // * Manually make sure no gen_keypair more than once + // for uuid, avoid deadlock + pub fn get_key_pair_without_lock() -> (Vec<u8>, Vec<u8>) { + let mut config = Config::load_::<Config>(""); + if config.key_pair.0.is_empty() { + let (pk, sk) = sign::gen_keypair(); + config.key_pair = (sk.0.to_vec(), pk.0.into()); + Config::store_(&config, ""); + } + config.key_pair.clone() + } + pub fn get_key_pair() -> (Vec<u8>, Vec<u8>) { // lock here to make sure no gen_keypair more than once let mut config = CONFIG.write().unwrap(); diff --git a/libs/hbb_common/src/lib.rs b/libs/hbb_common/src/lib.rs index a5443db0f..a9f25d31b 100644 --- a/libs/hbb_common/src/lib.rs +++ b/libs/hbb_common/src/lib.rs @@ -39,6 +39,10 @@ pub use tokio_socks::IntoTargetAddr; pub use tokio_socks::TargetAddr; pub mod password_security; +lazy_static::lazy_static!{ + static ref UUID: Vec<u8> = gen_uuid(); +} + #[cfg(feature = "quic")] pub type Stream = quic::Connection; #[cfg(not(feature = "quic"))] @@ -202,12 +206,23 @@ pub fn get_modified_time(path: &std::path::Path) -> SystemTime { .unwrap_or(UNIX_EPOCH) } -pub fn get_uuid() -> Vec<u8> { +fn gen_uuid() -> Vec<u8> { #[cfg(not(any(target_os = "android", target_os = "ios")))] if let Ok(id) = machine_uid::get() { - return id.into(); + id.into() + } else { + Config::get_key_pair().1 } - Config::get_key_pair().1 + #[cfg(any(target_os = "android", target_os = "ios"))] + Config::get_key_pair_without_lock().1 +} + +pub fn init_uuid() { + let _ = *UUID; +} + +pub fn get_uuid() -> Vec<u8> { + UUID.to_owned() } #[cfg(test)] diff --git a/src/ipc.rs b/src/ipc.rs index 6d2dd102f..2324f691c 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -87,6 +87,7 @@ pub enum FS { }, } +#[cfg(not(any(target_os = "android", target_os = "ios")))] #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(tag = "t", content = "c")] pub enum DataKeyboard { @@ -103,6 +104,7 @@ pub enum DataKeyboardResponse { GetKeyState(bool), } +#[cfg(not(any(target_os = "android", target_os = "ios", feature = "cli")))] #[derive(Debug, Serialize, Deserialize, Clone)] #[serde(tag = "t", content = "c")] pub enum DataMouse { @@ -171,8 +173,11 @@ pub enum Data { ClipboardFileEnabled(bool), PrivacyModeState((i32, PrivacyModeState)), TestRendezvousServer, + #[cfg(not(any(target_os = "android", target_os = "ios", feature = "cli")))] Keyboard(DataKeyboard), + #[cfg(not(any(target_os = "android", target_os = "ios", feature = "cli")))] KeyboardResponse(DataKeyboardResponse), + #[cfg(not(any(target_os = "android", target_os = "ios", feature = "cli")))] Mouse(DataMouse), Control(DataControl), Empty, diff --git a/src/mobile.rs b/src/mobile.rs index 298947bc7..b21618d46 100644 --- a/src/mobile.rs +++ b/src/mobile.rs @@ -478,8 +478,8 @@ impl Interface for Session { } } - async fn handle_hash(&mut self, hash: Hash, peer: &mut Stream) { - handle_hash(self.lc.clone(), hash, self, peer).await; + async fn handle_hash(&mut self, pass: &str, hash: Hash, peer: &mut Stream) { + handle_hash(self.lc.clone(), pass, hash, self, peer).await; } async fn handle_login_from_ui(&mut self, password: String, remember: bool, peer: &mut Stream) { @@ -611,7 +611,7 @@ impl Connection { } } Some(message::Union::Hash(hash)) => { - self.session.handle_hash(hash, peer).await; + self.session.handle_hash("", hash, peer).await; } Some(message::Union::LoginResponse(lr)) => match lr.union { Some(login_response::Union::Error(err)) => { @@ -629,7 +629,7 @@ impl Connection { let content = if cb.compress { decompress(&cb.content) } else { - cb.content + cb.content.into() }; if let Ok(content) = String::from_utf8(content) { self.session @@ -1212,15 +1212,13 @@ pub mod connection_manager { Some(Data::Login { id, is_file_transfer, - port_forward, peer_id, name, authorized, keyboard, clipboard, audio, - file, - file_transfer_enabled, + .. }) => { current_id = id; let mut client = Client { diff --git a/src/mobile_ffi.rs b/src/mobile_ffi.rs index 6a0b71a5e..cf3405a06 100644 --- a/src/mobile_ffi.rs +++ b/src/mobile_ffi.rs @@ -3,7 +3,7 @@ use crate::mobile::connection_manager::{self, get_clients_length, get_clients_st use crate::mobile::{self, Session}; use crate::common::{make_fd_to_json}; use flutter_rust_bridge::{StreamSink, ZeroCopyBuffer}; -use hbb_common::ResultType; +use hbb_common::{ResultType, init_uuid}; use hbb_common::{ config::{self, Config, LocalConfig, PeerConfig, ONLINE}, fs, log, @@ -16,7 +16,6 @@ use std::{ }; fn initialize(app_dir: &str) { - *config::APP_DIR.write().unwrap() = app_dir.to_owned(); #[cfg(target_os = "android")] { android_logger::init_once( @@ -30,6 +29,8 @@ fn initialize(app_dir: &str) { use hbb_common::env_logger::*; init_from_env(Env::default().filter_or(DEFAULT_FILTER_ENV, "debug")); } + *config::APP_DIR.write().unwrap() = app_dir.to_owned(); + init_uuid(); crate::common::test_rendezvous_server(); crate::common::test_nat_type(); #[cfg(target_os = "android")] @@ -118,7 +119,7 @@ unsafe extern "C" fn get_by_name(name: *const c_char, arg: *const c_char) -> *co res = Config::get_id(); } "server_password" => { - res = Config::get_password(); + todo!() } "connect_statue" => { res = ONLINE @@ -163,7 +164,7 @@ unsafe extern "C" fn get_by_name(name: *const c_char, arg: *const c_char) -> *co } } "uuid" => { - res = base64::encode(crate::get_uuid()); + res = base64::encode(hbb_common::get_uuid()); } _ => { log::error!("Unknown name of get_by_name: {}", name); @@ -458,11 +459,7 @@ unsafe extern "C" fn set_by_name(name: *const c_char, value: *const c_char) { } // Server Side "update_password" => { - if value.is_empty() { - Config::set_password(&Config::get_auto_password()); - } else { - Config::set_password(value); - } + todo!() } #[cfg(target_os = "android")] "chat_server_mode" => { diff --git a/src/server/audio_service.rs b/src/server/audio_service.rs index 02db0bffd..addc06644 100644 --- a/src/server/audio_service.rs +++ b/src/server/audio_service.rs @@ -347,7 +347,7 @@ fn send_f32(data: &[f32], encoder: &mut Encoder, sp: &GenericService) { Ok(data) => { let mut msg_out = Message::new(); msg_out.set_audio_frame(AudioFrame { - data, + data: data.into(), timestamp: crate::common::get_time(), ..Default::default() }); diff --git a/src/server/video_service.rs b/src/server/video_service.rs index 506bd0c7e..03a068871 100644 --- a/src/server/video_service.rs +++ b/src/server/video_service.rs @@ -644,7 +644,7 @@ pub fn handle_one_frame_encoded( })?; let mut send_conn_ids: HashSet<i32> = Default::default(); let vp9_frame = EncodedVideoFrame { - data: frame.to_vec(), + data: frame.to_vec().into(), key: true, pts: ms, ..Default::default()