From d0173fbdc58f39bddbf8188e8e1e3d4892f4873e Mon Sep 17 00:00:00 2001 From: 21pages Date: Mon, 11 Sep 2023 16:04:51 +0800 Subject: [PATCH] install service period protection how to reproduce: install, click stop service, click start service and click no on uac, it'll show "Service is not running" but can be connected. Signed-off-by: 21pages --- src/platform/linux.rs | 3 ++- src/platform/mod.rs | 24 ++++++++++++++++++++++++ src/platform/windows.rs | 1 + src/rendezvous_mediator.rs | 4 +++- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/platform/linux.rs b/src/platform/linux.rs index 944e24c15..fb48a9307 100644 --- a/src/platform/linux.rs +++ b/src/platform/linux.rs @@ -1074,7 +1074,7 @@ mod desktop { pub fn refresh(&mut self) { if !self.sid.is_empty() && is_active_and_seat0(&self.sid) { - return; + return; } let seat0_values = get_values_of_seat0(&[0, 1, 2]); @@ -1183,6 +1183,7 @@ pub fn uninstall_service(show_new_window: bool) -> bool { } pub fn install_service() -> bool { + let _installing = crate::platform::InstallingService::new(); if !has_cmd("systemctl") { return false; } diff --git a/src/platform/mod.rs b/src/platform/mod.rs index e962ef9d5..6a428d9c3 100644 --- a/src/platform/mod.rs +++ b/src/platform/mod.rs @@ -23,9 +23,18 @@ pub mod linux_desktop_manager; #[cfg(not(any(target_os = "android", target_os = "ios")))] use hbb_common::{message_proto::CursorData, ResultType}; +use std::sync::{Arc, Mutex}; #[cfg(not(any(target_os = "macos", target_os = "android", target_os = "ios")))] const SERVICE_INTERVAL: u64 = 300; +lazy_static::lazy_static! { + static ref INSTALLING_SERVICE: Arc>= Default::default(); +} + +pub fn installing_service() -> bool { + INSTALLING_SERVICE.lock().unwrap().clone() +} + pub fn is_xfce() -> bool { #[cfg(target_os = "linux")] { @@ -71,6 +80,21 @@ pub fn get_active_username() -> String { #[cfg(target_os = "android")] pub const PA_SAMPLE_RATE: u32 = 48000; +pub(crate) struct InstallingService; // please use new + +impl InstallingService { + pub fn new() -> Self { + *INSTALLING_SERVICE.lock().unwrap() = true; + Self + } +} + +impl Drop for InstallingService { + fn drop(&mut self) { + *INSTALLING_SERVICE.lock().unwrap() = false; + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/platform/windows.rs b/src/platform/windows.rs index feadffb2c..41ac9e5ea 100644 --- a/src/platform/windows.rs +++ b/src/platform/windows.rs @@ -2167,6 +2167,7 @@ pub fn uninstall_service(show_new_window: bool) -> bool { pub fn install_service() -> bool { log::info!("Installing service..."); + let _installing = crate::platform::InstallingService::new(); let (_, _, _, exe) = get_install_info(); let tmp_path = std::env::temp_dir().to_string_lossy().to_string(); let tray_shortcut = get_tray_shortcut(&exe, &tmp_path).unwrap_or_default(); diff --git a/src/rendezvous_mediator.rs b/src/rendezvous_mediator.rs index 924c0c709..20219cc89 100644 --- a/src/rendezvous_mediator.rs +++ b/src/rendezvous_mediator.rs @@ -79,7 +79,9 @@ impl RendezvousMediator { crate::platform::linux_desktop_manager::start_xdesktop(); loop { Config::reset_online(); - if Config::get_option("stop-service").is_empty() { + if Config::get_option("stop-service").is_empty() + && !crate::platform::installing_service() + { if !nat_tested { crate::test_nat_type(); nat_tested = true;