diff --git a/libs/hbb_common/protos/message.proto b/libs/hbb_common/protos/message.proto index 5069fa2b0..dec00f21e 100644 --- a/libs/hbb_common/protos/message.proto +++ b/libs/hbb_common/protos/message.proto @@ -64,6 +64,7 @@ message LoginRequest { } bool video_ack_required = 9; uint64 session_id = 10; + string version = 11; } message ChatMessage { string text = 1; } diff --git a/libs/hbb_common/src/fs.rs b/libs/hbb_common/src/fs.rs index 4880b4622..6cc795a0d 100644 --- a/libs/hbb_common/src/fs.rs +++ b/libs/hbb_common/src/fs.rs @@ -276,7 +276,7 @@ impl TransferJob { show_hidden: bool, is_remote: bool, files: Vec, - enable_override_detection: bool, + enable_overwrite_detection: bool, ) -> Self { log::info!("new write {}", path); let total_size = files.iter().map(|x| x.size as u64).sum(); @@ -289,7 +289,7 @@ impl TransferJob { is_remote, files, total_size, - enable_overwrite_detection: enable_override_detection, + enable_overwrite_detection, ..Default::default() } } @@ -301,7 +301,7 @@ impl TransferJob { file_num: i32, show_hidden: bool, is_remote: bool, - enable_override_detection: bool, + enable_overwrite_detection: bool, ) -> ResultType { log::info!("new read {}", path); let files = get_recursive_files(&path, show_hidden)?; @@ -315,7 +315,7 @@ impl TransferJob { is_remote, files, total_size, - enable_overwrite_detection: enable_override_detection, + enable_overwrite_detection, ..Default::default() }) } diff --git a/src/client.rs b/src/client.rs index 172fb6d3d..2d8e6be36 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1151,6 +1151,7 @@ impl LoginConfigHandler { my_name: crate::username(), option: self.get_option_message(true).into(), session_id: self.session_id, + version: crate::VERSION.to_string(), ..Default::default() }; if self.is_file_transfer { diff --git a/src/ipc.rs b/src/ipc.rs index 7ed6f4fd5..13ad67283 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -57,6 +57,7 @@ pub enum FS { id: i32, file_num: i32, files: Vec<(String, u64)>, + overwrite_detection: bool, }, CancelWrite { id: i32, diff --git a/src/mobile.rs b/src/mobile.rs index b21618d46..d19e7afb9 100644 --- a/src/mobile.rs +++ b/src/mobile.rs @@ -1377,9 +1377,8 @@ pub mod connection_manager { id, file_num, mut files, + overwrite_detection } => { - // in mobile, can_enable_override_detection is always true - let od = true; WRITE_JOBS.lock().unwrap().push(fs::TransferJob::new_write( id, "".to_string(), @@ -1395,7 +1394,7 @@ pub mod connection_manager { ..Default::default() }) .collect(), - true, + overwrite_detection )); } ipc::FS::CancelWrite { id } => { diff --git a/src/server/connection.rs b/src/server/connection.rs index 2fae6296d..2062ba31d 100644 --- a/src/server/connection.rs +++ b/src/server/connection.rs @@ -1099,8 +1099,9 @@ impl Connection { } Some(file_action::Union::Send(s)) => { let id = s.id; - let od = - can_enable_overwrite_detection(get_version_number(VERSION)); + let od = can_enable_overwrite_detection(get_version_number( + &self.lr.version, + )); let path = s.path.clone(); match fs::TransferJob::new_read( id, @@ -1123,6 +1124,11 @@ impl Connection { } } Some(file_action::Union::Receive(r)) => { + // note: 1.1.10 introduced identical file detection, which breaks original logic of send/recv files + // whenever got send/recv request, check peer version to ensure old version of rustdesk + let od = can_enable_overwrite_detection(get_version_number( + &self.lr.version, + )); self.send_fs(ipc::FS::NewWrite { path: r.path, id: r.id, @@ -1133,6 +1139,7 @@ impl Connection { .drain(..) .map(|f| (f.name, f.modified_time)) .collect(), + overwrite_detection: od, }); } Some(file_action::Union::RemoveDir(d)) => { diff --git a/src/ui/cm.rs b/src/ui/cm.rs index 45038d753..38bfc9359 100644 --- a/src/ui/cm.rs +++ b/src/ui/cm.rs @@ -160,8 +160,8 @@ impl ConnectionManager { id, file_num, mut files, + overwrite_detection } => { - let od = can_enable_overwrite_detection(get_version_number(VERSION)); // cm has no show_hidden context // dummy remote, show_hidden, is_remote write_jobs.push(fs::TransferJob::new_write( @@ -179,7 +179,7 @@ impl ConnectionManager { ..Default::default() }) .collect(), - od, + overwrite_detection, )); } ipc::FS::CancelWrite { id } => {