rustdesk-api
rustdesk-api copied to clipboard
handle_punch_hole_request 中如何获取发起控制的peer id
我想请问一下 rendezvous_server.rs 中 handle_punch_hole_request 如何何获取发起控制的peer id
现在是只可以获取到ph 被控端的信息
#[inline]
async fn handle_punch_hole_request(
&mut self,
addr: SocketAddr,
ph: PunchHoleRequest,
key: &str,
ws: bool,
) -> ResultType<(RendezvousMessage, Option<SocketAddr>)> {
let mut ph = ph;
if !key.is_empty() && ph.licence_key != key {
let mut msg_out = RendezvousMessage::new();
msg_out.set_punch_hole_response(PunchHoleResponse {
failure: punch_hole_response::Failure::LICENSE_MISMATCH.into(),
..Default::default()
});
return Ok((msg_out, None));
}
// if secret is not empty check token by jwt
if MUST_LOGIN.load(Ordering::SeqCst) {
if ph.token.is_empty() {
let mut msg_out = RendezvousMessage::new();
msg_out.set_punch_hole_response(PunchHoleResponse {
other_failure: String::from("Connection failed, please login!"),
..Default::default()
});
return Ok((msg_out, None));
} else if !jwt::SECRET.is_empty() {
let token = ph.token;
let token = jwt::verify_token(token.as_str());
if token.is_err() {
let mut msg_out = RendezvousMessage::new();
msg_out.set_punch_hole_response(PunchHoleResponse {
//提示重新登录
other_failure: String::from("Token error, please log out and log back in!"),
..Default::default()
});
return Ok((msg_out, None));
}
}
}
let id = ph.id;
// punch hole request from A, relay to B,
// check if in same intranet first,
// fetch local addrs if in same intranet.
// because punch hole won't work if in the same intranet,
// all routers will drop such self-connections.
if let Some(peer) = self.pm.get(&id).await {
let (elapsed, peer_addr) = {
let r = peer.read().await;
(r.last_reg_time.elapsed().as_millis() as i32, r.socket_addr)
};
if elapsed >= REG_TIMEOUT {
let mut msg_out = RendezvousMessage::new();
msg_out.set_punch_hole_response(PunchHoleResponse {
failure: punch_hole_response::Failure::OFFLINE.into(),
..Default::default()
});
return Ok((msg_out, None));
}
let mut msg_out = RendezvousMessage::new();
let peer_is_lan = self.is_lan(peer_addr);
let is_lan = self.is_lan(addr);
let mut relay_server = self.get_relay_server(addr.ip(), peer_addr.ip());
if ALWAYS_USE_RELAY.load(Ordering::SeqCst) || (peer_is_lan ^ is_lan) {
if peer_is_lan {
// https://github.com/rustdesk/rustdesk-server/issues/24
relay_server = self.inner.local_ip.clone()
}
ph.nat_type = NatType::SYMMETRIC.into(); // will force relay
}
let same_intranet: bool = !ws
&& (peer_is_lan && is_lan || {
match (peer_addr, addr) {
(SocketAddr::V4(a), SocketAddr::V4(b)) => a.ip() == b.ip(),
(SocketAddr::V6(a), SocketAddr::V6(b)) => a.ip() == b.ip(),
_ => false,
}
});
let socket_addr = AddrMangle::encode(addr).into();
if same_intranet {
log::debug!(
"Fetch local addr {:?} {:?} request from {:?}",
id,
peer_addr,
addr
);
msg_out.set_fetch_local_addr(FetchLocalAddr {
socket_addr,
relay_server,
..Default::default()
});
} else {
log::debug!(
"Punch hole {:?} {:?} request from {:?}",
id,
peer_addr,
addr
);
msg_out.set_punch_hole(PunchHole {
socket_addr,
nat_type: ph.nat_type,
relay_server,
..Default::default()
});
}
//
Ok((msg_out, Some(peer_addr)))
} else {
let mut msg_out = RendezvousMessage::new();
msg_out.set_punch_hole_response(PunchHoleResponse {
failure: punch_hole_response::Failure::ID_NOT_EXIST.into(),
..Default::default()
});
Ok((msg_out, None))
}
}