propagates the hash-handler continuation result through both connection loops, allowing incoming-only rejection to terminate the connection while preserving existing login flows.

This commit is contained in:
rustdesk
2026-08-10 16:45:27 +08:00
parent d407db9fae
commit 947cb3f17b
4 changed files with 17 additions and 10 deletions

View File

@@ -3548,7 +3548,7 @@ pub async fn handle_hash(
hash: Hash,
interface: &impl Interface,
peer: &mut Stream,
) {
) -> bool {
lc.write().unwrap().hash = hash.clone();
// Take care of password application order
@@ -3572,7 +3572,7 @@ pub async fn handle_hash(
lc.write().unwrap().allow_switch_back_once();
send_switch_login_request(lc.clone(), peer, uuid).await;
lc.write().unwrap().password_source = Default::default();
return;
return true;
}
}
}
@@ -3587,7 +3587,7 @@ pub async fn handle_hash(
let mut msg = Message::new();
msg.set_misc(misc);
allow_err!(peer.send(&msg).await);
return;
return false;
}
}
// last password
@@ -3651,7 +3651,7 @@ pub async fn handle_hash(
interface.msgbox("terminal-admin-login", "", "", "");
}
lc.write().unwrap().hash = hash;
return;
return true;
}
let password = if password.is_empty() {
@@ -3677,6 +3677,7 @@ pub async fn handle_hash(
send_login(lc.clone(), os_username, os_password, password, peer).await;
lc.write().unwrap().hash = hash;
true
}
#[inline]
@@ -3804,7 +3805,7 @@ pub trait Interface: Send + Clone + 'static + Sized {
fn on_error(&self, err: &str) {
self.msgbox("error", "Error", err, "");
}
async fn handle_hash(&self, pass: &str, hash: Hash, peer: &mut Stream);
async fn handle_hash(&self, pass: &str, hash: Hash, peer: &mut Stream) -> bool;
async fn handle_login_from_ui(
&self,
os_username: String,

View File

@@ -1353,9 +1353,13 @@ impl<T: InvokeUiSession> Remote<T> {
}
}
Some(message::Union::Hash(hash)) => {
self.handler
if !self
.handler
.handle_hash(&self.handler.password.clone(), hash, peer)
.await;
.await
{
return false;
}
}
Some(message::Union::LoginResponse(lr)) => match lr.union {
Some(login_response::Union::Error(err)) => {

View File

@@ -150,7 +150,9 @@ async fn connect_and_login(
let msg_in = Message::parse_from_bytes(&bytes)?;
match msg_in.union {
Some(message::Union::Hash(hash)) => {
interface.handle_hash(password, hash, &mut stream).await;
if !interface.handle_hash(password, hash, &mut stream).await {
return Ok(None);
}
}
Some(message::Union::LoginResponse(lr)) => match lr.union {
Some(login_response::Union::Error(err)) => {

View File

@@ -1878,8 +1878,8 @@ impl<T: InvokeUiSession> Interface for Session<T> {
}
}
async fn handle_hash(&self, pass: &str, hash: Hash, peer: &mut Stream) {
handle_hash(self.lc.clone(), pass, hash, self, peer).await;
async fn handle_hash(&self, pass: &str, hash: Hash, peer: &mut Stream) -> bool {
handle_hash(self.lc.clone(), pass, hash, self, peer).await
}
async fn handle_login_from_ui(