mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-04-11 23:51:29 +03:00
Compare commits
4 Commits
nightly
...
24deed80f5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24deed80f5 | ||
|
|
732b250815 | ||
|
|
157dbdc543 | ||
|
|
6ba23683d5 |
@@ -269,7 +269,7 @@ impl KeyboardControllable for Enigo {
|
|||||||
for pos in 0..mod_len {
|
for pos in 0..mod_len {
|
||||||
let rpos = mod_len - 1 - pos;
|
let rpos = mod_len - 1 - pos;
|
||||||
if flag & (0x0001 << rpos) != 0 {
|
if flag & (0x0001 << rpos) != 0 {
|
||||||
self.key_up(modifiers[pos]);
|
self.key_up(modifiers[rpos]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,7 +298,18 @@ impl KeyboardControllable for Enigo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn key_up(&mut self, key: Key) {
|
fn key_up(&mut self, key: Key) {
|
||||||
keybd_event(KEYEVENTF_KEYUP, self.key_to_keycode(key), 0);
|
match key {
|
||||||
|
Key::Layout(c) => {
|
||||||
|
let code = self.get_layoutdependent_keycode(c);
|
||||||
|
if code as u16 != 0xFFFF {
|
||||||
|
let vk = code & 0x00FF;
|
||||||
|
keybd_event(KEYEVENTF_KEYUP, vk, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
keybd_event(KEYEVENTF_KEYUP, self.key_to_keycode(key), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_key_state(&mut self, key: Key) -> bool {
|
fn get_key_state(&mut self, key: Key) -> bool {
|
||||||
|
|||||||
Submodule libs/hbb_common updated: 5e07db7444...48c37de3e6
@@ -560,6 +560,9 @@ impl Connection {
|
|||||||
match data {
|
match data {
|
||||||
ipc::Data::Authorize => {
|
ipc::Data::Authorize => {
|
||||||
conn.require_2fa.take();
|
conn.require_2fa.take();
|
||||||
|
if !conn.connect_port_forward_if_needed().await {
|
||||||
|
break;
|
||||||
|
}
|
||||||
conn.send_logon_response().await;
|
conn.send_logon_response().await;
|
||||||
if conn.port_forward_socket.is_some() {
|
if conn.port_forward_socket.is_some() {
|
||||||
break;
|
break;
|
||||||
@@ -1338,6 +1341,47 @@ impl Connection {
|
|||||||
crate::post_request(url, v.to_string(), "").await
|
crate::post_request(url, v.to_string(), "").await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn normalize_port_forward_target(pf: &mut PortForward) -> (String, bool) {
|
||||||
|
let mut is_rdp = false;
|
||||||
|
if pf.host == "RDP" && pf.port == 0 {
|
||||||
|
pf.host = "localhost".to_owned();
|
||||||
|
pf.port = 3389;
|
||||||
|
is_rdp = true;
|
||||||
|
}
|
||||||
|
if pf.host.is_empty() {
|
||||||
|
pf.host = "localhost".to_owned();
|
||||||
|
}
|
||||||
|
(format!("{}:{}", pf.host, pf.port), is_rdp)
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn connect_port_forward_if_needed(&mut self) -> bool {
|
||||||
|
if self.port_forward_socket.is_some() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
let Some(login_request::Union::PortForward(mut pf)) = self.lr.union.clone() else {
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
let (mut addr, is_rdp) = Self::normalize_port_forward_target(&mut pf);
|
||||||
|
self.port_forward_address = addr.clone();
|
||||||
|
match timeout(3000, TcpStream::connect(&addr)).await {
|
||||||
|
Ok(Ok(sock)) => {
|
||||||
|
self.port_forward_socket = Some(Framed::new(sock, BytesCodec::new()));
|
||||||
|
true
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
if is_rdp {
|
||||||
|
addr = "RDP".to_owned();
|
||||||
|
}
|
||||||
|
self.send_login_error(format!(
|
||||||
|
"Failed to access remote {}, please make sure if it is open",
|
||||||
|
addr
|
||||||
|
))
|
||||||
|
.await;
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async fn send_logon_response(&mut self) {
|
async fn send_logon_response(&mut self) {
|
||||||
if self.authorized {
|
if self.authorized {
|
||||||
return;
|
return;
|
||||||
@@ -2178,33 +2222,8 @@ impl Connection {
|
|||||||
sleep(1.).await;
|
sleep(1.).await;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
let mut is_rdp = false;
|
let (addr, _is_rdp) = Self::normalize_port_forward_target(&mut pf);
|
||||||
if pf.host == "RDP" && pf.port == 0 {
|
self.port_forward_address = addr;
|
||||||
pf.host = "localhost".to_owned();
|
|
||||||
pf.port = 3389;
|
|
||||||
is_rdp = true;
|
|
||||||
}
|
|
||||||
if pf.host.is_empty() {
|
|
||||||
pf.host = "localhost".to_owned();
|
|
||||||
}
|
|
||||||
let mut addr = format!("{}:{}", pf.host, pf.port);
|
|
||||||
self.port_forward_address = addr.clone();
|
|
||||||
match timeout(3000, TcpStream::connect(&addr)).await {
|
|
||||||
Ok(Ok(sock)) => {
|
|
||||||
self.port_forward_socket = Some(Framed::new(sock, BytesCodec::new()));
|
|
||||||
}
|
|
||||||
_ => {
|
|
||||||
if is_rdp {
|
|
||||||
addr = "RDP".to_owned();
|
|
||||||
}
|
|
||||||
self.send_login_error(format!(
|
|
||||||
"Failed to access remote {}, please make sure if it is open",
|
|
||||||
addr
|
|
||||||
))
|
|
||||||
.await;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if !self.check_privacy_mode_on().await {
|
if !self.check_privacy_mode_on().await {
|
||||||
@@ -2276,6 +2295,9 @@ impl Connection {
|
|||||||
if err_msg.is_empty() {
|
if err_msg.is_empty() {
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
self.linux_headless_handle.wait_desktop_cm_ready().await;
|
self.linux_headless_handle.wait_desktop_cm_ready().await;
|
||||||
|
if !self.connect_port_forward_if_needed().await {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
self.send_logon_response().await;
|
self.send_logon_response().await;
|
||||||
self.try_start_cm(lr.my_id.clone(), lr.my_name.clone(), self.authorized);
|
self.try_start_cm(lr.my_id.clone(), lr.my_name.clone(), self.authorized);
|
||||||
} else {
|
} else {
|
||||||
@@ -2312,6 +2334,9 @@ impl Connection {
|
|||||||
if err_msg.is_empty() {
|
if err_msg.is_empty() {
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
self.linux_headless_handle.wait_desktop_cm_ready().await;
|
self.linux_headless_handle.wait_desktop_cm_ready().await;
|
||||||
|
if !self.connect_port_forward_if_needed().await {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
self.send_logon_response().await;
|
self.send_logon_response().await;
|
||||||
self.try_start_cm(lr.my_id, lr.my_name, self.authorized);
|
self.try_start_cm(lr.my_id, lr.my_name, self.authorized);
|
||||||
} else {
|
} else {
|
||||||
@@ -2330,6 +2355,9 @@ impl Connection {
|
|||||||
self.update_failure(failure, true, 1);
|
self.update_failure(failure, true, 1);
|
||||||
self.require_2fa.take();
|
self.require_2fa.take();
|
||||||
raii::AuthedConnID::set_session_2fa(self.session_key());
|
raii::AuthedConnID::set_session_2fa(self.session_key());
|
||||||
|
if !self.connect_port_forward_if_needed().await {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
self.send_logon_response().await;
|
self.send_logon_response().await;
|
||||||
self.try_start_cm(
|
self.try_start_cm(
|
||||||
self.lr.my_id.to_owned(),
|
self.lr.my_id.to_owned(),
|
||||||
@@ -2381,6 +2409,9 @@ impl Connection {
|
|||||||
if let Some((_instant, uuid_old)) = uuid_old {
|
if let Some((_instant, uuid_old)) = uuid_old {
|
||||||
if uuid == uuid_old {
|
if uuid == uuid_old {
|
||||||
self.from_switch = true;
|
self.from_switch = true;
|
||||||
|
if !self.connect_port_forward_if_needed().await {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
self.send_logon_response().await;
|
self.send_logon_response().await;
|
||||||
self.try_start_cm(
|
self.try_start_cm(
|
||||||
lr.my_id.clone(),
|
lr.my_id.clone(),
|
||||||
|
|||||||
@@ -809,7 +809,7 @@ fn record_key_is_control_key(record_key: u64) -> bool {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn record_key_is_chr(record_key: u64) -> bool {
|
fn record_key_is_chr(record_key: u64) -> bool {
|
||||||
record_key < KEY_CHAR_START
|
record_key >= KEY_CHAR_START
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@@ -1513,6 +1513,27 @@ fn get_control_key_value(key_event: &KeyEvent) -> i32 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn has_hotkey_modifiers(key_event: &KeyEvent) -> bool {
|
||||||
|
key_event.modifiers.iter().any(|ck| {
|
||||||
|
let v = ck.value();
|
||||||
|
v == ControlKey::Control.value()
|
||||||
|
|| v == ControlKey::RControl.value()
|
||||||
|
|| v == ControlKey::Meta.value()
|
||||||
|
|| v == ControlKey::RWin.value()
|
||||||
|
|| {
|
||||||
|
#[cfg(any(target_os = "windows", target_os = "linux"))]
|
||||||
|
{
|
||||||
|
v == ControlKey::Alt.value() || v == ControlKey::RAlt.value()
|
||||||
|
}
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
{
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fn release_unpressed_modifiers(en: &mut Enigo, key_event: &KeyEvent) {
|
fn release_unpressed_modifiers(en: &mut Enigo, key_event: &KeyEvent) {
|
||||||
let ck_value = get_control_key_value(key_event);
|
let ck_value = get_control_key_value(key_event);
|
||||||
fix_modifiers(&key_event.modifiers[..], en, ck_value);
|
fix_modifiers(&key_event.modifiers[..], en, ck_value);
|
||||||
@@ -1572,7 +1593,7 @@ fn need_to_uppercase(en: &mut Enigo) -> bool {
|
|||||||
get_modifier_state(Key::Shift, en) || get_modifier_state(Key::CapsLock, en)
|
get_modifier_state(Key::Shift, en) || get_modifier_state(Key::CapsLock, en)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn process_chr(en: &mut Enigo, chr: u32, down: bool) {
|
fn process_chr(en: &mut Enigo, chr: u32, down: bool, _hotkey: bool) {
|
||||||
// On Wayland with uinput mode, use clipboard for character input
|
// On Wayland with uinput mode, use clipboard for character input
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
if !crate::platform::linux::is_x11() && wayland_use_uinput() {
|
if !crate::platform::linux::is_x11() && wayland_use_uinput() {
|
||||||
@@ -1587,6 +1608,16 @@ fn process_chr(en: &mut Enigo, chr: u32, down: bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(any(target_os = "macos", target_os = "windows"))]
|
||||||
|
if !_hotkey {
|
||||||
|
if down {
|
||||||
|
if let Ok(chr) = char::try_from(chr) {
|
||||||
|
en.key_sequence(&chr.to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let key = char_value_to_key(chr);
|
let key = char_value_to_key(chr);
|
||||||
|
|
||||||
if down {
|
if down {
|
||||||
@@ -1856,7 +1887,7 @@ fn legacy_keyboard_mode(evt: &KeyEvent) {
|
|||||||
|
|
||||||
let record_key = chr as u64 + KEY_CHAR_START;
|
let record_key = chr as u64 + KEY_CHAR_START;
|
||||||
record_pressed_key(KeysDown::EnigoKey(record_key), down);
|
record_pressed_key(KeysDown::EnigoKey(record_key), down);
|
||||||
process_chr(&mut en, chr, down)
|
process_chr(&mut en, chr, down, has_hotkey_modifiers(evt))
|
||||||
}
|
}
|
||||||
Some(key_event::Union::Unicode(chr)) => {
|
Some(key_event::Union::Unicode(chr)) => {
|
||||||
// Same as Chr: release Shift for Unicode input
|
// Same as Chr: release Shift for Unicode input
|
||||||
|
|||||||
Reference in New Issue
Block a user