diff --git a/Cargo.lock b/Cargo.lock index 5c3313336..3a6abcaf7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3975,7 +3975,7 @@ dependencies = [ [[package]] name = "rdev" version = "0.5.0-2" -source = "git+https://github.com/asur4s/rdev#895c8fb1a6106714793e8877d35d2b7a1c57ce9c" +source = "git+https://github.com/asur4s/rdev#0ad53987fa6f0e37a7bc000358f71c3802de4e7c" dependencies = [ "cocoa", "core-foundation 0.9.3", diff --git a/Cargo.toml b/Cargo.toml index 26ac9b006..f3a0377d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,7 @@ default-net = "0.11.0" wol-rs = "0.9.1" flutter_rust_bridge = { git = "https://github.com/SoLongAndThanksForAllThePizza/flutter_rust_bridge", optional = true } errno = "0.2.8" +rdev = { git = "https://github.com/asur4s/rdev" } [target.'cfg(not(target_os = "linux"))'.dependencies] reqwest = { version = "0.11", features = ["json", "rustls-tls"], default-features=false } @@ -76,7 +77,6 @@ sciter-rs = { git = "https://github.com/open-trade/rust-sciter", branch = "dyn" sys-locale = "0.2" enigo = { path = "libs/enigo", features = [ "with_serde" ] } clipboard = { path = "libs/clipboard" } -rdev = { git = "https://github.com/asur4s/rdev" } ctrlc = "3.2" arboard = "2.0" #minreq = { version = "2.4", features = ["punycode", "https-native"] } diff --git a/DEBIAN/postinst b/DEBIAN/postinst index d643c5caf..b30664ce0 100755 --- a/DEBIAN/postinst +++ b/DEBIAN/postinst @@ -5,8 +5,10 @@ set -e if [ "$1" = configure ]; then INITSYS=$(ls -al /proc/1/exe | awk -F' ' '{print $NF}' | awk -F'/' '{print $NF}') - + if [ "systemd" == "$INITSYS" ]; then + ln -s /usr/lib/rustdesk/flutter_hbb /usr/bin/rustdesk + if [ -e /etc/systemd/system/rustdesk.service ]; then rm /etc/systemd/system/rustdesk.service /usr/lib/systemd/system/rustdesk.service /usr/lib/systemd/user/rustdesk.service >/dev/null 2>&1 fi @@ -18,7 +20,12 @@ if [ "$1" = configure ]; then systemctl start rustdesk cp /usr/share/rustdesk/files/systemd/rustdesk.service.user /usr/lib/systemd/user/rustdesk.service - curUser=$(who | awk '{print $1}' | head -1) - systemctl --machine=${curUser}@.host --user daemon-reload + ubuntuVersion=$(grep -oP 'VERSION_ID="\K[\d]+' /etc/os-release | bc -l) + waylandSupportVersion=21 + if [ "$ubuntuVersion" -ge "$waylandSupportVersion" ] + then + curUser=$(who | awk '{print $1}' | head -1) + systemctl --machine=${curUser}@.host --user daemon-reload + fi fi fi diff --git a/DEBIAN/prerm b/DEBIAN/prerm index 3bb453198..e9e3931ac 100755 --- a/DEBIAN/prerm +++ b/DEBIAN/prerm @@ -5,12 +5,17 @@ set -e case $1 in remove|upgrade) INITSYS=$(ls -al /proc/1/exe | awk -F' ' '{print $NF}' | awk -F'/' '{print $NF}') + if [ "systemd" == "${INITSYS}" ]; then + rm /usr/bin/rustdesk + systemctl stop rustdesk || true systemctl disable rustdesk || true serverUser=$(ps -ef | grep -E 'rustdesk +--server' | awk '{print $1}' | head -1) - if [ "$serverUser" != "" ] && [ "$serverUser" != "root" ] + ubuntuVersion=$(grep -oP 'VERSION_ID="\K[\d]+' /etc/os-release | bc -l) + waylandSupportVersion=21 + if [ "$serverUser" != "" ] && [ "$serverUser" != "root" ] && [ "$ubuntuVersion" -ge "$waylandSupportVersion" ] then systemctl --machine=${serverUser}@.host --user stop rustdesk || true fi diff --git a/build.py b/build.py index 5be59503c..27b5af744 100755 --- a/build.py +++ b/build.py @@ -121,20 +121,40 @@ def get_features(args): print("features:", features) return features +def generate_control_file(version): + control_file_path = "../DEBIAN/control" + os.system('/bin/rm -rf %s' % control_file_path) + + content = """Package: rustdesk +Version: %s +Architecture: amd64 +Maintainer: open-trade +Homepage: https://rustdesk.com +Depends: libgtk-3-0, libxcb-randr0, libxdo3, libxfixes3, libxcb-shape0, libxcb-xfixes0, libasound2, libsystemd0, pulseaudio, curl +Description: A remote control software. + +""" % version + file = open(control_file_path, "w") + file.write(content) + file.close() def build_flutter_deb(version): os.chdir('flutter') - os.system('/bin/rm -rf tmpdeb/') os.system('dpkg-deb -R rustdesk.deb tmpdeb') os.system('flutter build linux --release') - os.system('rm tmpdeb/usr/bin/rustdesk') + os.system('strip build/linux/x64/release/liblibrustdesk.so') + + os.system('mkdir -p tmpdeb/usr/bin/') os.system('mkdir -p tmpdeb/usr/lib/rustdesk') os.system('mkdir -p tmpdeb/usr/share/rustdesk/files/systemd/') - os.system('mkdir -p tmpdeb/usr/share/polkit-1/actions') + os.system('mkdir -p tmpdeb/usr/share/applications/') + os.system( 'cp -r build/linux/x64/release/bundle/* tmpdeb/usr/lib/rustdesk/') os.system( 'pushd tmpdeb && ln -s /usr/lib/rustdesk/flutter_hbb usr/bin/rustdesk && popd') + os.system( + 'cp build/linux/x64/release/liblibrustdesk.so tmpdeb/usr/lib/rustdesk/librustdesk.so') os.system( 'cp ../rustdesk.service tmpdeb/usr/share/rustdesk/files/systemd/') os.system( @@ -143,14 +163,15 @@ def build_flutter_deb(version): 'cp ../128x128@2x.png tmpdeb/usr/share/rustdesk/files/rustdesk.png') os.system( 'cp ../rustdesk.desktop tmpdeb/usr/share/applications/rustdesk.desktop') - os.system( - 'cp ../com.rustdesk.RustDesk.policy tmpdeb/usr/share/polkit-1/actions/') - os.system("echo \"#!/bin/sh\" >> tmpdeb/usr/share/rustdesk/files/polkit && chmod a+x tmpdeb/usr/share/rustdesk/files/polkit") os.system('mkdir -p tmpdeb/DEBIAN') + generate_control_file(version) os.system('cp -a ../DEBIAN/* tmpdeb/DEBIAN/') md5_file('usr/share/rustdesk/files/systemd/rustdesk.service') md5_file('usr/share/rustdesk/files/systemd/rustdesk.service.user') - os.system('dpkg-deb -b tmpdeb rustdesk.deb; /bin/rm -rf tmpdeb/') + os.system('dpkg-deb -b tmpdeb rustdesk.deb;') + + os.system('/bin/rm -rf tmpdeb/') + os.system('/bin/rm -rf ../DEBIAN/control') os.rename('rustdesk.deb', '../rustdesk-%s.deb' % version) os.chdir("..") diff --git a/src/client.rs b/src/client.rs index a625efb31..cc1f78b78 100644 --- a/src/client.rs +++ b/src/client.rs @@ -4,7 +4,7 @@ use std::{ ops::{Deref, Not}, sync::{atomic::AtomicBool, mpsc, Arc, Mutex, RwLock}, }; - +use std::sync::atomic::Ordering; pub use async_trait::async_trait; #[cfg(not(any(target_os = "android", target_os = "linux")))] use cpal::{ @@ -1891,3 +1891,7 @@ fn decode_id_pk(signed: &[u8], key: &sign::PublicKey) -> ResultType<(String, [u8 bail!("Wrong public length"); } } + +pub fn disable_keyboard_listening() { + crate::ui_session_interface::KEYBOARD_HOOKED.store(false, Ordering::SeqCst); +} \ No newline at end of file diff --git a/src/core_main.rs b/src/core_main.rs index 02ac5e646..cecbf4115 100644 --- a/src/core_main.rs +++ b/src/core_main.rs @@ -1,6 +1,6 @@ use hbb_common::log; -use crate::{start_os_service, flutter::connection_manager, start_server}; +use crate::{flutter::connection_manager, start_os_service, start_server}; /// Main entry of the RustDesk Core. /// Return true if the app should continue running with UI(possibly Flutter), false if the app should exit. @@ -14,6 +14,9 @@ pub fn core_main() -> bool { connection_manager::start_listen_ipc_thread(); return true; } + + use hbb_common::env_logger::*; + init_from_env(Env::default().filter_or(DEFAULT_FILTER_ENV, "info")); if args[1] == "--service" { log::info!("start --service"); start_os_service(); diff --git a/src/flutter.rs b/src/flutter.rs index eb66260c9..81b455b04 100644 --- a/src/flutter.rs +++ b/src/flutter.rs @@ -328,6 +328,7 @@ pub fn session_start_(id: &str, event_stream: StreamSink) -> ResultTy *session.event_stream.write().unwrap() = Some(event_stream); let session = session.clone(); std::thread::spawn(move || { + crate::client::disable_keyboard_listening(); io_loop(session); }); Ok(()) diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index 43cd35754..7af3a2fbd 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -22,7 +22,7 @@ use std::sync::{Arc, Mutex, RwLock}; /// IS_IN KEYBOARD_HOOKED sciter only pub static IS_IN: AtomicBool = AtomicBool::new(false); -static KEYBOARD_HOOKED: AtomicBool = AtomicBool::new(false); +pub static KEYBOARD_HOOKED: AtomicBool = AtomicBool::new(true); #[cfg(windows)] static mut IS_ALT_GR: bool = false; @@ -1166,7 +1166,7 @@ impl Session { if self.is_port_forward() || self.is_file_transfer() { return; } - if KEYBOARD_HOOKED.swap(true, Ordering::SeqCst) { + if !KEYBOARD_HOOKED.load(Ordering::SeqCst){ return; } log::info!("keyboard hooked");