mirror of
https://github.com/rustdesk/rustdesk-server.git
synced 2025-07-03 00:05:47 +00:00
working on key
This commit is contained in:
parent
135d855505
commit
d837379a13
397
Cargo.lock
generated
397
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -1 +1 @@
|
|||||||
Subproject commit 1ba798488119d8d31950efca724440feb87cba54
|
Subproject commit 5e977383041f35f856ee2dfc5fcf07c8300e2da5
|
@ -27,6 +27,7 @@ use std::{
|
|||||||
struct Peer {
|
struct Peer {
|
||||||
socket_addr: SocketAddr,
|
socket_addr: SocketAddr,
|
||||||
last_reg_time: Instant,
|
last_reg_time: Instant,
|
||||||
|
pk: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Peer {
|
impl Default for Peer {
|
||||||
@ -36,6 +37,7 @@ impl Default for Peer {
|
|||||||
last_reg_time: Instant::now()
|
last_reg_time: Instant::now()
|
||||||
.checked_sub(std::time::Duration::from_secs(3600))
|
.checked_sub(std::time::Duration::from_secs(3600))
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
|
pk: Vec::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -44,6 +46,8 @@ impl Default for Peer {
|
|||||||
struct PeerSerde {
|
struct PeerSerde {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
ip: String,
|
ip: String,
|
||||||
|
#[serde(default)]
|
||||||
|
pk: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@ -61,27 +65,63 @@ impl PeerMap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn insert(&mut self, key: String, peer: Peer) {
|
async fn update_addr(&mut self, key: String, socket_addr: SocketAddr) {
|
||||||
let ip = peer.socket_addr.ip();
|
let mut lock = self.map.write().unwrap();
|
||||||
if self
|
let last_reg_time = Instant::now();
|
||||||
.map
|
if let Some(old) = lock.get_mut(&key) {
|
||||||
.write()
|
old.socket_addr = socket_addr;
|
||||||
.unwrap()
|
old.last_reg_time = last_reg_time;
|
||||||
.insert(key.clone(), peer)
|
} else {
|
||||||
.is_none()
|
let mut me = self.clone();
|
||||||
{
|
tokio::spawn(async move {
|
||||||
let ip = ip.to_string();
|
let v = me.db.get(key.clone()).await;
|
||||||
self.db.insert(key, PeerSerde { ip });
|
let pk = if let Some(v) = super::SledAsync::deserialize::<PeerSerde>(&v) {
|
||||||
|
v.pk
|
||||||
|
} else {
|
||||||
|
Vec::new()
|
||||||
|
};
|
||||||
|
me.map.write().unwrap().insert(
|
||||||
|
key,
|
||||||
|
Peer {
|
||||||
|
socket_addr,
|
||||||
|
last_reg_time,
|
||||||
|
pk,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
fn update_key(&mut self, key: String, socket_addr: SocketAddr, pk: Vec<u8>) {
|
||||||
|
let mut lock = self.map.write().unwrap();
|
||||||
|
lock.insert(
|
||||||
|
key.clone(),
|
||||||
|
Peer {
|
||||||
|
socket_addr,
|
||||||
|
last_reg_time: Instant::now(),
|
||||||
|
pk: pk.clone(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
let ip = socket_addr.ip().to_string();
|
||||||
|
self.db.insert(key, PeerSerde { ip, pk });
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
async fn get(&mut self, key: String) -> Option<Peer> {
|
async fn get(&mut self, key: String) -> Option<Peer> {
|
||||||
let p = self.map.read().unwrap().get(&key).map(|x| x.clone());
|
let p = self.map.read().unwrap().get(&key).map(|x| x.clone());
|
||||||
if p.is_some() {
|
if p.is_some() {
|
||||||
return p;
|
return p;
|
||||||
} else {
|
} else {
|
||||||
if let Some(_) = self.db.get(key).await {
|
let v = self.db.get(key.clone()).await;
|
||||||
|
if let Some(v) = super::SledAsync::deserialize::<PeerSerde>(&v) {
|
||||||
|
self.map.write().unwrap().insert(
|
||||||
|
key,
|
||||||
|
Peer {
|
||||||
|
pk: v.pk,
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
);
|
||||||
return Some(Peer::default());
|
return Some(Peer::default());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -168,18 +208,20 @@ impl RendezvousServer {
|
|||||||
// B registered
|
// B registered
|
||||||
if rp.id.len() > 0 {
|
if rp.id.len() > 0 {
|
||||||
log::debug!("New peer registered: {:?} {:?}", &rp.id, &addr);
|
log::debug!("New peer registered: {:?} {:?}", &rp.id, &addr);
|
||||||
self.pm.insert(
|
self.pm.update_addr(rp.id, addr).await;
|
||||||
rp.id,
|
|
||||||
Peer {
|
|
||||||
socket_addr: addr,
|
|
||||||
last_reg_time: Instant::now(),
|
|
||||||
},
|
|
||||||
);
|
|
||||||
let mut msg_out = RendezvousMessage::new();
|
let mut msg_out = RendezvousMessage::new();
|
||||||
msg_out.set_register_peer_response(RegisterPeerResponse::default());
|
msg_out.set_register_peer_response(RegisterPeerResponse::default());
|
||||||
socket.send(&msg_out, addr).await?
|
socket.send(&msg_out, addr).await?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Some(rendezvous_message::Union::register_key(rk)) => {
|
||||||
|
let id = rk.id;
|
||||||
|
if let Some(peer) = self.pm.get(id.clone()).await {
|
||||||
|
if peer.pk.is_empty() {
|
||||||
|
self.pm.update_key(id, addr, rk.key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Some(rendezvous_message::Union::punch_hole_request(ph)) => {
|
Some(rendezvous_message::Union::punch_hole_request(ph)) => {
|
||||||
let id = ph.id;
|
let id = ph.id;
|
||||||
if self.pm.is_in_memory(&id) {
|
if self.pm.is_in_memory(&id) {
|
||||||
|
@ -79,7 +79,7 @@ impl SledAsync {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn _deserialize<'a, T: serde::Deserialize<'a>>(v: &'a Option<sled::IVec>) -> Option<T> {
|
pub fn deserialize<'a, T: serde::Deserialize<'a>>(v: &'a Option<sled::IVec>) -> Option<T> {
|
||||||
if let Some(v) = v {
|
if let Some(v) = v {
|
||||||
if let Ok(v) = std::str::from_utf8(v) {
|
if let Ok(v) = std::str::from_utf8(v) {
|
||||||
if let Ok(v) = serde_json::from_str::<T>(&v) {
|
if let Ok(v) = serde_json::from_str::<T>(&v) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user