Trace reconnect mouse input handling
ci / test (push) Has been cancelled
ci / fuzz-smoke (push) Has been cancelled
ci / windows-client (push) Has been cancelled
ci / package-release (linux-x86_64, ubuntu-latest) (push) Has been cancelled
ci / package-release (macos-aarch64, macos-14) (push) Has been cancelled
ci / package-release (macos-x86_64, macos-13) (push) Has been cancelled
ci / package-release (windows-x86_64, windows-latest) (push) Has been cancelled
ci / remote-bench (push) Has been cancelled
ci / test (push) Has been cancelled
ci / fuzz-smoke (push) Has been cancelled
ci / windows-client (push) Has been cancelled
ci / package-release (linux-x86_64, ubuntu-latest) (push) Has been cancelled
ci / package-release (macos-aarch64, macos-14) (push) Has been cancelled
ci / package-release (macos-x86_64, macos-13) (push) Has been cancelled
ci / package-release (windows-x86_64, windows-latest) (push) Has been cancelled
ci / remote-bench (push) Has been cancelled
This commit is contained in:
@@ -67,6 +67,15 @@ static AGENT_SOCK_COUNTER: AtomicU64 = AtomicU64::new(0);
|
||||
/// before it is swept by the cleanup task.
|
||||
const NATIVE_HANDSHAKE_TTL_SECS: u64 = 30;
|
||||
|
||||
fn hex_id(id: [u8; 16]) -> String {
|
||||
let mut out = String::with_capacity(32);
|
||||
for byte in id {
|
||||
use std::fmt::Write as _;
|
||||
let _ = write!(&mut out, "{byte:02x}");
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
#[derive(Debug, Parser)]
|
||||
#[command(
|
||||
name = "dosh-server",
|
||||
@@ -1602,9 +1611,22 @@ async fn handle_resume(
|
||||
peer: SocketAddr,
|
||||
packet: &protocol::Packet,
|
||||
) -> Result<()> {
|
||||
dosh::trace::event(
|
||||
"server.resume_start",
|
||||
&[
|
||||
("peer", peer.to_string()),
|
||||
("client", hex_id(packet.header.conn_id)),
|
||||
("seq", packet.header.seq.to_string()),
|
||||
("ack", packet.header.ack.to_string()),
|
||||
],
|
||||
);
|
||||
let (key, session_name) = match find_client_decrypt_key(state, &packet.header) {
|
||||
Ok(found) => found,
|
||||
Err(_) => {
|
||||
dosh::trace::event(
|
||||
"server.resume_unknown_client",
|
||||
&[("client", hex_id(packet.header.conn_id))],
|
||||
);
|
||||
return send_reject_to_client(socket, peer, packet.header.conn_id, "unknown client")
|
||||
.await;
|
||||
}
|
||||
@@ -1623,8 +1645,25 @@ async fn handle_resume(
|
||||
.get_mut(&packet.header.conn_id)
|
||||
.ok_or_else(|| anyhow!("unknown client"))?;
|
||||
if !client.replay.accept(packet.header.seq) {
|
||||
dosh::trace::event(
|
||||
"server.resume_replay_drop",
|
||||
&[
|
||||
("session", req.session.clone()),
|
||||
("seq", packet.header.seq.to_string()),
|
||||
],
|
||||
);
|
||||
return Ok(());
|
||||
}
|
||||
if client.endpoint != peer {
|
||||
dosh::trace::event(
|
||||
"server.resume_roam",
|
||||
&[
|
||||
("session", req.session.clone()),
|
||||
("from", client.endpoint.to_string()),
|
||||
("to", peer.to_string()),
|
||||
],
|
||||
);
|
||||
}
|
||||
client.endpoint = peer;
|
||||
client.last_acked = req.last_rendered_seq;
|
||||
client.cols = req.cols;
|
||||
@@ -1662,6 +1701,14 @@ async fn handle_resume(
|
||||
&body,
|
||||
)?;
|
||||
let _ = send_udp(socket, &out, peer).await?;
|
||||
dosh::trace::event(
|
||||
"server.resume_ok",
|
||||
&[
|
||||
("session", frame.session),
|
||||
("output_seq", frame.output_seq.to_string()),
|
||||
("bytes", frame.bytes.len().to_string()),
|
||||
],
|
||||
);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -1673,6 +1720,7 @@ async fn handle_input(
|
||||
let (key, session_name) = find_client_decrypt_key(state, &packet.header)?;
|
||||
let body = protocol::decrypt_body(packet, &key, CLIENT_TO_SERVER)?;
|
||||
let input: Input = protocol::from_body(&body)?;
|
||||
let input_summary = dosh::trace::bytes_summary(&input.bytes);
|
||||
let mut locked = state.lock().expect("server state poisoned");
|
||||
let session = locked
|
||||
.sessions
|
||||
@@ -1683,13 +1731,37 @@ async fn handle_input(
|
||||
.get_mut(&packet.header.conn_id)
|
||||
.ok_or_else(|| anyhow!("unknown client"))?;
|
||||
if !client.replay.accept(packet.header.seq) {
|
||||
dosh::trace::event(
|
||||
"server.input_replay_drop",
|
||||
&[
|
||||
("session", session_name.clone()),
|
||||
("seq", packet.header.seq.to_string()),
|
||||
("summary", input_summary),
|
||||
],
|
||||
);
|
||||
return Ok(());
|
||||
}
|
||||
if client.endpoint != peer {
|
||||
dosh::trace::event(
|
||||
"server.input_roam",
|
||||
&[
|
||||
("session", session_name.clone()),
|
||||
("from", client.endpoint.to_string()),
|
||||
("to", peer.to_string()),
|
||||
],
|
||||
);
|
||||
client.endpoint = peer;
|
||||
}
|
||||
client.last_seen = Instant::now();
|
||||
if !mode_allows_terminal_updates(&client.mode) {
|
||||
dosh::trace::event(
|
||||
"server.input_rejected_mode",
|
||||
&[
|
||||
("session", session_name),
|
||||
("mode", client.mode.clone()),
|
||||
("summary", input_summary),
|
||||
],
|
||||
);
|
||||
return Ok(());
|
||||
}
|
||||
session
|
||||
@@ -1697,6 +1769,14 @@ async fn handle_input(
|
||||
.as_ref()
|
||||
.context("terminal session has no pty")?
|
||||
.write_all(&input.bytes)?;
|
||||
dosh::trace::event(
|
||||
"server.pty_write",
|
||||
&[
|
||||
("session", session_name),
|
||||
("seq", packet.header.seq.to_string()),
|
||||
("summary", input_summary),
|
||||
],
|
||||
);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user