mirror of
https://github.com/rustdesk/rustdesk.git
synced 2026-05-07 06:38:11 +03:00
Compare commits
10 Commits
dependabot
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5439ec38b6 | ||
|
|
8b8a64f870 | ||
|
|
92509f8e8a | ||
|
|
0221634a4d | ||
|
|
9d1f86fbc6 | ||
|
|
f29dec7b13 | ||
|
|
d5d0b01266 | ||
|
|
5abae617dc | ||
|
|
52d62da002 | ||
|
|
253d632709 |
@@ -1745,6 +1745,9 @@ pub struct LoginConfigHandler {
|
|||||||
pub direct: Option<bool>,
|
pub direct: Option<bool>,
|
||||||
pub received: bool,
|
pub received: bool,
|
||||||
switch_uuid: Option<String>,
|
switch_uuid: Option<String>,
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
switch_back_allowed: bool,
|
||||||
pub save_ab_password_to_recent: bool, // true: connected with ab password
|
pub save_ab_password_to_recent: bool, // true: connected with ab password
|
||||||
pub other_server: Option<(String, String, String)>,
|
pub other_server: Option<(String, String, String)>,
|
||||||
pub custom_fps: Arc<Mutex<Option<usize>>>,
|
pub custom_fps: Arc<Mutex<Option<usize>>>,
|
||||||
@@ -1861,6 +1864,11 @@ impl LoginConfigHandler {
|
|||||||
|
|
||||||
self.direct = None;
|
self.direct = None;
|
||||||
self.received = false;
|
self.received = false;
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
{
|
||||||
|
self.switch_back_allowed = false;
|
||||||
|
}
|
||||||
self.switch_uuid = switch_uuid;
|
self.switch_uuid = switch_uuid;
|
||||||
self.adapter_luid = adapter_luid;
|
self.adapter_luid = adapter_luid;
|
||||||
self.selected_windows_session_id = None;
|
self.selected_windows_session_id = None;
|
||||||
@@ -1874,6 +1882,23 @@ impl LoginConfigHandler {
|
|||||||
self.is_terminal_admin = is_terminal_admin;
|
self.is_terminal_admin = is_terminal_admin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
pub fn allow_switch_back_once(&mut self) {
|
||||||
|
self.switch_back_allowed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
pub fn consume_switch_back_permission(&mut self) -> bool {
|
||||||
|
if self.switch_back_allowed {
|
||||||
|
self.switch_back_allowed = false;
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Check if the client should auto login.
|
/// Check if the client should auto login.
|
||||||
/// Return password if the client should auto login, otherwise return empty string.
|
/// Return password if the client should auto login, otherwise return empty string.
|
||||||
pub fn should_auto_login(&self) -> String {
|
pub fn should_auto_login(&self) -> String {
|
||||||
@@ -3377,6 +3402,36 @@ pub fn handle_login_error(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
async fn consume_local_switch_sides_uuid(id: &str, uuid: &Uuid) -> bool {
|
||||||
|
let Ok(mut conn) = crate::ipc::connect(1000, "").await else {
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
let uuid = uuid.to_string();
|
||||||
|
if conn
|
||||||
|
.send(&crate::ipc::Data::SwitchSidesUuid(
|
||||||
|
uuid.clone(),
|
||||||
|
id.to_owned(),
|
||||||
|
None,
|
||||||
|
))
|
||||||
|
.await
|
||||||
|
.is_err()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
match conn.next_timeout(1000).await {
|
||||||
|
Ok(Some(crate::ipc::Data::SwitchSidesUuid(
|
||||||
|
returned_uuid,
|
||||||
|
returned_id,
|
||||||
|
Some(true),
|
||||||
|
))) => {
|
||||||
|
returned_uuid == uuid && returned_id == id
|
||||||
|
}
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Handle hash message sent by peer.
|
/// Handle hash message sent by peer.
|
||||||
/// Hash will be used for login.
|
/// Hash will be used for login.
|
||||||
///
|
///
|
||||||
@@ -3397,12 +3452,22 @@ pub async fn handle_hash(
|
|||||||
// Take care of password application order
|
// Take care of password application order
|
||||||
|
|
||||||
// switch_uuid
|
// switch_uuid
|
||||||
let uuid = lc.write().unwrap().switch_uuid.take();
|
#[cfg(feature = "flutter")]
|
||||||
if let Some(uuid) = uuid {
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
if let Ok(uuid) = uuid::Uuid::from_str(&uuid) {
|
{
|
||||||
send_switch_login_request(lc.clone(), peer, uuid).await;
|
let uuid = lc.write().unwrap().switch_uuid.take();
|
||||||
lc.write().unwrap().password_source = Default::default();
|
if let Some(uuid) = uuid {
|
||||||
return;
|
if let Ok(uuid) = uuid::Uuid::from_str(&uuid) {
|
||||||
|
let id = lc.read().unwrap().id.clone();
|
||||||
|
if !consume_local_switch_sides_uuid(&id, &uuid).await {
|
||||||
|
log::warn!("Ignored untrusted switch_uuid");
|
||||||
|
} else {
|
||||||
|
lc.write().unwrap().allow_switch_back_once();
|
||||||
|
send_switch_login_request(lc.clone(), peer, uuid).await;
|
||||||
|
lc.write().unwrap().password_source = Default::default();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// last password
|
// last password
|
||||||
|
|||||||
@@ -1923,9 +1923,23 @@ impl<T: InvokeUiSession> Remote<T> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
Some(misc::Union::SwitchBack(_)) => {
|
Some(misc::Union::SwitchBack(_)) => {
|
||||||
#[cfg(feature = "flutter")]
|
let allow_switch_back = self
|
||||||
self.handler.switch_back(&self.handler.get_id());
|
.handler
|
||||||
|
.lc
|
||||||
|
.write()
|
||||||
|
.unwrap()
|
||||||
|
.consume_switch_back_permission();
|
||||||
|
if allow_switch_back {
|
||||||
|
self.handler.switch_back(&self.handler.get_id());
|
||||||
|
} else {
|
||||||
|
log::warn!(
|
||||||
|
"Ignored unsolicited SwitchBack from {}",
|
||||||
|
self.handler.get_id()
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#[cfg(all(feature = "flutter", feature = "plugin_framework"))]
|
#[cfg(all(feature = "flutter", feature = "plugin_framework"))]
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
|||||||
@@ -2213,7 +2213,7 @@ pub fn cm_elevate_portable(conn_id: i32) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn cm_switch_back(conn_id: i32) {
|
pub fn cm_switch_back(conn_id: i32) {
|
||||||
#[cfg(not(any(target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
crate::ui_cm_interface::switch_back(conn_id);
|
crate::ui_cm_interface::switch_back(conn_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
22
src/ipc.rs
22
src/ipc.rs
@@ -285,7 +285,14 @@ pub enum Data {
|
|||||||
Empty,
|
Empty,
|
||||||
Disconnected,
|
Disconnected,
|
||||||
DataPortableService(DataPortableService),
|
DataPortableService(DataPortableService),
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
SwitchSidesRequest(String),
|
SwitchSidesRequest(String),
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
SwitchSidesUuid(String, String, Option<bool>),
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
SwitchSidesBack,
|
SwitchSidesBack,
|
||||||
UrlLink(String),
|
UrlLink(String),
|
||||||
VoiceCallIncoming,
|
VoiceCallIncoming,
|
||||||
@@ -771,6 +778,8 @@ async fn handle(data: Data, stream: &mut Connection) {
|
|||||||
Data::TestRendezvousServer => {
|
Data::TestRendezvousServer => {
|
||||||
crate::test_rendezvous_server();
|
crate::test_rendezvous_server();
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
Data::SwitchSidesRequest(id) => {
|
Data::SwitchSidesRequest(id) => {
|
||||||
let uuid = uuid::Uuid::new_v4();
|
let uuid = uuid::Uuid::new_v4();
|
||||||
crate::server::insert_switch_sides_uuid(id, uuid.clone());
|
crate::server::insert_switch_sides_uuid(id, uuid.clone());
|
||||||
@@ -780,6 +789,19 @@ async fn handle(data: Data, stream: &mut Connection) {
|
|||||||
.await
|
.await
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
Data::SwitchSidesUuid(uuid, id, None) => {
|
||||||
|
let allowed = uuid
|
||||||
|
.parse::<uuid::Uuid>()
|
||||||
|
.map(|uuid| crate::server::remove_pending_switch_sides_uuid(&id, &uuid))
|
||||||
|
.unwrap_or(false);
|
||||||
|
allow_err!(
|
||||||
|
stream
|
||||||
|
.send(&Data::SwitchSidesUuid(uuid, id, Some(allowed)))
|
||||||
|
.await
|
||||||
|
);
|
||||||
|
}
|
||||||
#[cfg(all(feature = "flutter", feature = "plugin_framework"))]
|
#[cfg(all(feature = "flutter", feature = "plugin_framework"))]
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
Data::Plugin(plugin) => crate::plugin::ipc::handle_plugin(plugin, stream).await,
|
Data::Plugin(plugin) => crate::plugin::ipc::handle_plugin(plugin, stream).await,
|
||||||
|
|||||||
@@ -743,6 +743,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Display Name", "Anzeigename"),
|
("Display Name", "Anzeigename"),
|
||||||
("password-hidden-tip", "Ein permanentes Passwort wurde festgelegt (ausgeblendet)."),
|
("password-hidden-tip", "Ein permanentes Passwort wurde festgelegt (ausgeblendet)."),
|
||||||
("preset-password-in-use-tip", "Das voreingestellte Passwort wird derzeit verwendet."),
|
("preset-password-in-use-tip", "Das voreingestellte Passwort wird derzeit verwendet."),
|
||||||
("Enable privacy mode", ""),
|
("Enable privacy mode", "Datenschutzmodus aktivieren"),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -743,6 +743,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Display Name", "Nom d’affichage"),
|
("Display Name", "Nom d’affichage"),
|
||||||
("password-hidden-tip", "Le mot de passe permanent est défini (masqué)."),
|
("password-hidden-tip", "Le mot de passe permanent est défini (masqué)."),
|
||||||
("preset-password-in-use-tip", "Le mot de passe prédéfini est actuellement utilisé."),
|
("preset-password-in-use-tip", "Le mot de passe prédéfini est actuellement utilisé."),
|
||||||
("Enable privacy mode", ""),
|
("Enable privacy mode", "Activer le mode de confidentialité"),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -743,6 +743,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Display Name", "Visualizza nome"),
|
("Display Name", "Visualizza nome"),
|
||||||
("password-hidden-tip", "È impostata una password permanente (nascosta)."),
|
("password-hidden-tip", "È impostata una password permanente (nascosta)."),
|
||||||
("preset-password-in-use-tip", "È attualmente in uso la password preimpostata."),
|
("preset-password-in-use-tip", "È attualmente in uso la password preimpostata."),
|
||||||
("Enable privacy mode", ""),
|
("Enable privacy mode", "Abilita modalità privacy"),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -743,6 +743,6 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("Display Name", "Отображаемое имя"),
|
("Display Name", "Отображаемое имя"),
|
||||||
("password-hidden-tip", "Установлен постоянный пароль (скрытый)."),
|
("password-hidden-tip", "Установлен постоянный пароль (скрытый)."),
|
||||||
("preset-password-in-use-tip", "Установленный пароль сейчас используется."),
|
("preset-password-in-use-tip", "Установленный пароль сейчас используется."),
|
||||||
("Enable privacy mode", ""),
|
("Enable privacy mode", "Использовать режим конфиденциальности"),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -741,8 +741,8 @@ pub static ref T: std::collections::HashMap<&'static str, &'static str> =
|
|||||||
("keep-awake-during-incoming-sessions-label", "Gelen oturumlar süresince ekranı açık tutun"),
|
("keep-awake-during-incoming-sessions-label", "Gelen oturumlar süresince ekranı açık tutun"),
|
||||||
("Continue with {}", "{} ile devam et"),
|
("Continue with {}", "{} ile devam et"),
|
||||||
("Display Name", "Görünen Ad"),
|
("Display Name", "Görünen Ad"),
|
||||||
("password-hidden-tip", "Şifre gizli"),
|
("password-hidden-tip", "Parola gizli"),
|
||||||
("preset-password-in-use-tip", "Önceden ayarlanmış şifre kullanılıyor"),
|
("preset-password-in-use-tip", "Önceden ayarlanmış parola kullanılıyor"),
|
||||||
("Enable privacy mode", ""),
|
("Enable privacy mode", "Gizlilik modunu etkinleştir"),
|
||||||
].iter().cloned().collect();
|
].iter().cloned().collect();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,11 +73,17 @@ lazy_static::lazy_static! {
|
|||||||
static ref ALIVE_CONNS: Arc::<Mutex<Vec<i32>>> = Default::default();
|
static ref ALIVE_CONNS: Arc::<Mutex<Vec<i32>>> = Default::default();
|
||||||
pub static ref AUTHED_CONNS: Arc::<Mutex<Vec<AuthedConn>>> = Default::default();
|
pub static ref AUTHED_CONNS: Arc::<Mutex<Vec<AuthedConn>>> = Default::default();
|
||||||
pub static ref CONTROL_PERMISSIONS_ARRAY: Arc::<Mutex<Vec<(i32, ControlPermissions)>>> = Default::default();
|
pub static ref CONTROL_PERMISSIONS_ARRAY: Arc::<Mutex<Vec<(i32, ControlPermissions)>>> = Default::default();
|
||||||
static ref SWITCH_SIDES_UUID: Arc::<Mutex<HashMap<String, (Instant, uuid::Uuid)>>> = Default::default();
|
|
||||||
static ref WAKELOCK_SENDER: Arc::<Mutex<std::sync::mpsc::Sender<(usize, usize)>>> = Arc::new(Mutex::new(start_wakelock_thread()));
|
static ref WAKELOCK_SENDER: Arc::<Mutex<std::sync::mpsc::Sender<(usize, usize)>>> = Arc::new(Mutex::new(start_wakelock_thread()));
|
||||||
static ref WAKELOCK_KEEP_AWAKE_OPTION: Arc::<Mutex<Option<bool>>> = Default::default();
|
static ref WAKELOCK_KEEP_AWAKE_OPTION: Arc::<Mutex<Option<bool>>> = Default::default();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
lazy_static::lazy_static! {
|
||||||
|
static ref SWITCH_SIDES_UUID: Arc::<Mutex<HashMap<String, (Instant, uuid::Uuid)>>> = Default::default();
|
||||||
|
static ref PENDING_SWITCH_SIDES_UUID: Arc::<Mutex<HashMap<String, (Instant, uuid::Uuid)>>> = Default::default();
|
||||||
|
}
|
||||||
|
|
||||||
fn constant_time_eq(a: &[u8], b: &[u8]) -> bool {
|
fn constant_time_eq(a: &[u8], b: &[u8]) -> bool {
|
||||||
if a.len() != b.len() {
|
if a.len() != b.len() {
|
||||||
return false;
|
return false;
|
||||||
@@ -775,6 +781,8 @@ impl Connection {
|
|||||||
log::error!("Failed to start portable service from cm: {:?}", e);
|
log::error!("Failed to start portable service from cm: {:?}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
ipc::Data::SwitchSidesBack => {
|
ipc::Data::SwitchSidesBack => {
|
||||||
let mut misc = Misc::new();
|
let mut misc = Misc::new();
|
||||||
misc.set_switch_back(SwitchBack::default());
|
misc.set_switch_back(SwitchBack::default());
|
||||||
@@ -2579,6 +2587,7 @@ impl Connection {
|
|||||||
}
|
}
|
||||||
} else if let Some(message::Union::SwitchSidesResponse(_s)) = msg.union {
|
} else if let Some(message::Union::SwitchSidesResponse(_s)) = msg.union {
|
||||||
#[cfg(feature = "flutter")]
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
if let Some(lr) = _s.lr.clone().take() {
|
if let Some(lr) = _s.lr.clone().take() {
|
||||||
self.handle_login_request_without_validation(&lr).await;
|
self.handle_login_request_without_validation(&lr).await;
|
||||||
SWITCH_SIDES_UUID
|
SWITCH_SIDES_UUID
|
||||||
@@ -3294,8 +3303,13 @@ impl Connection {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#[cfg(feature = "flutter")]
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
Some(misc::Union::SwitchSidesRequest(s)) => {
|
Some(misc::Union::SwitchSidesRequest(s)) => {
|
||||||
if let Ok(uuid) = uuid::Uuid::from_slice(&s.uuid.to_vec()[..]) {
|
if let Ok(uuid) = uuid::Uuid::from_slice(&s.uuid.to_vec()[..]) {
|
||||||
|
crate::server::insert_pending_switch_sides_uuid(
|
||||||
|
self.lr.my_id.clone(),
|
||||||
|
uuid.clone(),
|
||||||
|
);
|
||||||
crate::run_me(vec![
|
crate::run_me(vec![
|
||||||
"--connect",
|
"--connect",
|
||||||
&self.lr.my_id,
|
&self.lr.my_id,
|
||||||
@@ -4938,6 +4952,8 @@ impl Connection {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
pub fn insert_switch_sides_uuid(id: String, uuid: uuid::Uuid) {
|
pub fn insert_switch_sides_uuid(id: String, uuid: uuid::Uuid) {
|
||||||
SWITCH_SIDES_UUID
|
SWITCH_SIDES_UUID
|
||||||
.lock()
|
.lock()
|
||||||
@@ -4945,6 +4961,27 @@ pub fn insert_switch_sides_uuid(id: String, uuid: uuid::Uuid) {
|
|||||||
.insert(id, (tokio::time::Instant::now(), uuid));
|
.insert(id, (tokio::time::Instant::now(), uuid));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
pub fn insert_pending_switch_sides_uuid(id: String, uuid: uuid::Uuid) {
|
||||||
|
let mut uuids = PENDING_SWITCH_SIDES_UUID.lock().unwrap();
|
||||||
|
uuids.retain(|_, (instant, _)| instant.elapsed() < Duration::from_secs(10));
|
||||||
|
uuids.insert(id, (tokio::time::Instant::now(), uuid));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
|
pub fn remove_pending_switch_sides_uuid(id: &str, uuid: &uuid::Uuid) -> bool {
|
||||||
|
let mut uuids = PENDING_SWITCH_SIDES_UUID.lock().unwrap();
|
||||||
|
uuids.retain(|_, (instant, _)| instant.elapsed() < Duration::from_secs(10));
|
||||||
|
if uuids.get(id).map(|(_, stored_uuid)| stored_uuid == uuid) == Some(true) {
|
||||||
|
uuids.remove(id);
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
async fn start_ipc(
|
async fn start_ipc(
|
||||||
mut rx_to_cm: mpsc::UnboundedReceiver<ipc::Data>,
|
mut rx_to_cm: mpsc::UnboundedReceiver<ipc::Data>,
|
||||||
|
|||||||
@@ -464,7 +464,7 @@ pub fn has_active_clients() -> bool {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
#[cfg(feature = "flutter")]
|
#[cfg(feature = "flutter")]
|
||||||
#[cfg(not(any(target_os = "ios")))]
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
pub fn switch_back(id: i32) {
|
pub fn switch_back(id: i32) {
|
||||||
if let Some(client) = CLIENTS.read().unwrap().get(&id) {
|
if let Some(client) = CLIENTS.read().unwrap().get(&id) {
|
||||||
allow_err!(client.tx.send(Data::SwitchSidesBack));
|
allow_err!(client.tx.send(Data::SwitchSidesBack));
|
||||||
|
|||||||
@@ -1464,10 +1464,11 @@ impl<T: InvokeUiSession> Session<T> {
|
|||||||
self.send(Data::ElevateWithLogon(username, password));
|
self.send(Data::ElevateWithLogon(username, password));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(target_os = "ios"))]
|
#[cfg(any(target_os = "android", target_os = "ios", not(feature = "flutter")))]
|
||||||
pub fn switch_sides(&self) {}
|
pub fn switch_sides(&self) {}
|
||||||
|
|
||||||
#[cfg(not(any(target_os = "ios")))]
|
#[cfg(feature = "flutter")]
|
||||||
|
#[cfg(not(any(target_os = "android", target_os = "ios")))]
|
||||||
#[tokio::main(flavor = "current_thread")]
|
#[tokio::main(flavor = "current_thread")]
|
||||||
pub async fn switch_sides(&self) {
|
pub async fn switch_sides(&self) {
|
||||||
match crate::ipc::connect(1000, "").await {
|
match crate::ipc::connect(1000, "").await {
|
||||||
|
|||||||
Reference in New Issue
Block a user