|
|
@@ -39,6 +39,8 @@ use hbb_common::{
|
|
39
|
39
|
};
|
|
40
|
40
|
use ipnetwork::Ipv4Network;
|
|
41
|
41
|
|
|
|
42
|
+use crate::jwt;
|
|
|
43
|
+use std::io::Error;
|
|
42
|
44
|
use std::{
|
|
43
|
45
|
collections::HashMap,
|
|
44
|
46
|
net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr},
|
|
|
@@ -46,7 +48,6 @@ use std::{
|
|
46
|
48
|
sync::Arc,
|
|
47
|
49
|
time::Instant,
|
|
48
|
50
|
};
|
|
49
|
|
-use crate::jwt;
|
|
50
|
51
|
|
|
51
|
52
|
#[derive(Clone, Debug)]
|
|
52
|
53
|
enum Data {
|
|
|
@@ -62,6 +63,7 @@ struct SafeWsSink {
|
|
62
|
63
|
sink: WsSink,
|
|
63
|
64
|
encrypt: Option<Encrypt>,
|
|
64
|
65
|
}
|
|
|
66
|
+
|
|
65
|
67
|
struct SafeTcpStreamSink {
|
|
66
|
68
|
sink: TcpStreamSink,
|
|
67
|
69
|
encrypt: Option<Encrypt>,
|
|
|
@@ -124,7 +126,7 @@ pub struct RendezvousServer {
|
|
124
|
126
|
relay_servers0: Arc<RelayServers>,
|
|
125
|
127
|
rendezvous_servers: Arc<Vec<String>>,
|
|
126
|
128
|
inner: Arc<Inner>,
|
|
127
|
|
- ws_map: Arc<Mutex<HashMap<SocketAddr, Sink>>>
|
|
|
129
|
+ ws_map: Arc<Mutex<HashMap<SocketAddr, Sink>>>,
|
|
128
|
130
|
}
|
|
129
|
131
|
|
|
130
|
132
|
enum LoopFailure {
|
|
|
@@ -183,7 +185,7 @@ impl RendezvousServer {
|
|
183
|
185
|
secure_tcp_pk_b,
|
|
184
|
186
|
secure_tcp_sk_b,
|
|
185
|
187
|
}),
|
|
186
|
|
- ws_map: Arc::new(Mutex::new(HashMap::new()))
|
|
|
188
|
+ ws_map: Arc::new(Mutex::new(HashMap::new())),
|
|
187
|
189
|
};
|
|
188
|
190
|
log::info!("mask: {:?}", rs.inner.mask);
|
|
189
|
191
|
log::info!("local-ip: {:?}", rs.inner.local_ip);
|
|
|
@@ -211,11 +213,13 @@ impl RendezvousServer {
|
|
211
|
213
|
|
|
212
|
214
|
let must_login = get_arg("must-login");
|
|
213
|
215
|
log::debug!("must_login={}", must_login);
|
|
214
|
|
- if must_login.to_uppercase() == "Y" ||
|
|
215
|
|
- (must_login == "" && std::env::var("MUST_LOGIN")
|
|
216
|
|
- .unwrap_or_default()
|
|
217
|
|
- .to_uppercase()
|
|
218
|
|
- == "Y") {
|
|
|
216
|
+ if must_login.to_uppercase() == "Y"
|
|
|
217
|
+ || (must_login == ""
|
|
|
218
|
+ && std::env::var("MUST_LOGIN")
|
|
|
219
|
+ .unwrap_or_default()
|
|
|
220
|
+ .to_uppercase()
|
|
|
221
|
+ == "Y")
|
|
|
222
|
+ {
|
|
219
|
223
|
MUST_LOGIN.store(true, Ordering::SeqCst);
|
|
220
|
224
|
}
|
|
221
|
225
|
|
|
|
@@ -498,7 +502,7 @@ impl RendezvousServer {
|
|
498
|
502
|
// B registered
|
|
499
|
503
|
if !rp.id.is_empty() {
|
|
500
|
504
|
log::trace!("New peer registered: {:?} {:?}", &rp.id, &addr);
|
|
501
|
|
- let request_pk = self.update_addr(rp.id, addr).await;
|
|
|
505
|
+ let request_pk = self.update_addr(rp.id, addr).await;
|
|
502
|
506
|
let mut msg_out = RendezvousMessage::new();
|
|
503
|
507
|
msg_out.set_register_peer_response(RegisterPeerResponse {
|
|
504
|
508
|
request_pk,
|
|
|
@@ -772,11 +776,7 @@ impl RendezvousServer {
|
|
772
|
776
|
}
|
|
773
|
777
|
|
|
774
|
778
|
#[inline]
|
|
775
|
|
- async fn update_addr(
|
|
776
|
|
- &mut self,
|
|
777
|
|
- id: String,
|
|
778
|
|
- socket_addr: SocketAddr,
|
|
779
|
|
- ) -> bool {
|
|
|
779
|
+ async fn update_addr(&mut self, id: String, socket_addr: SocketAddr) -> bool {
|
|
780
|
780
|
let (request_pk, ip_change) = if let Some(old) = self.pm.get_in_memory(&id).await {
|
|
781
|
781
|
let mut old = old.write().await;
|
|
782
|
782
|
let ip = socket_addr.ip();
|
|
|
@@ -888,7 +888,7 @@ impl RendezvousServer {
|
|
888
|
888
|
ph: PunchHoleRequest,
|
|
889
|
889
|
key: &str,
|
|
890
|
890
|
ws: bool,
|
|
891
|
|
- ) -> ResultType<(RendezvousMessage, Option<(SocketAddr)>)> {
|
|
|
891
|
+ ) -> ResultType<(RendezvousMessage, Option<SocketAddr>)> {
|
|
892
|
892
|
let mut ph = ph;
|
|
893
|
893
|
if !key.is_empty() && ph.licence_key != key {
|
|
894
|
894
|
let mut msg_out = RendezvousMessage::new();
|
|
|
@@ -987,7 +987,7 @@ impl RendezvousServer {
|
|
987
|
987
|
});
|
|
988
|
988
|
}
|
|
989
|
989
|
//
|
|
990
|
|
- Ok((msg_out, Some((peer_addr))))
|
|
|
990
|
+ Ok((msg_out, Some(peer_addr)))
|
|
991
|
991
|
} else {
|
|
992
|
992
|
let mut msg_out = RendezvousMessage::new();
|
|
993
|
993
|
msg_out.set_punch_hole_response(PunchHoleResponse {
|
|
|
@@ -1064,38 +1064,6 @@ impl RendezvousServer {
|
|
1064
|
1064
|
Ok(())
|
|
1065
|
1065
|
}
|
|
1066
|
1066
|
|
|
1067
|
|
- /**
|
|
1068
|
|
- async fn handle_tcp_punch_hole_request(
|
|
1069
|
|
- &mut self,
|
|
1070
|
|
- addr: SocketAddr,
|
|
1071
|
|
- ph: PunchHoleRequest,
|
|
1072
|
|
- key: &str,
|
|
1073
|
|
- ws: bool,
|
|
1074
|
|
- ) -> ResultType<()> {
|
|
1075
|
|
- let (msg, to_addr) = self.handle_punch_hole_request(addr, ph, key, ws).await?;
|
|
1076
|
|
- log::debug!(
|
|
1077
|
|
- "handle_tcp_punch_hole_request: {:?} to {:?}",
|
|
1078
|
|
- &msg, &to_addr
|
|
1079
|
|
- );
|
|
1080
|
|
- //
|
|
1081
|
|
-
|
|
1082
|
|
- if let Some(addr) = to_addr {
|
|
1083
|
|
- // self.send_to_tcp_sync(msg, addr).await?;
|
|
1084
|
|
- //这里无法判断目标addr是否是ws,请求无法发送到目标peer
|
|
1085
|
|
- if self.tcp_punch.lock().await.contains_key(&try_into_v4(addr)) {
|
|
1086
|
|
- self.send_to_tcp_sync(msg, addr).await?; //这里如果client使用ws,可以,但如果不用ws就必须用下面的,怎么判断呢
|
|
1087
|
|
- //这样判断还是不行,如果client从ws切换回udp,tcp_punch中还是有残留,会导致发送失败,应该做个新的hashmap存??
|
|
1088
|
|
- } else {
|
|
1089
|
|
- self.tx.send(Data::Msg(msg.into(), addr))?;
|
|
1090
|
|
- }
|
|
1091
|
|
- // self.tx.send(Data::Msg(msg.into(), addr))?;
|
|
1092
|
|
-
|
|
1093
|
|
- } else {
|
|
1094
|
|
- self.send_to_tcp_sync(msg, addr).await?;
|
|
1095
|
|
- }
|
|
1096
|
|
- Ok(())
|
|
1097
|
|
- }**/
|
|
1098
|
|
-
|
|
1099
|
1067
|
#[inline]
|
|
1100
|
1068
|
async fn handle_udp_punch_hole_request(
|
|
1101
|
1069
|
&mut self,
|
|
|
@@ -1310,11 +1278,7 @@ impl RendezvousServer {
|
|
1310
|
1278
|
MUST_LOGIN.store(false, Ordering::SeqCst);
|
|
1311
|
1279
|
}
|
|
1312
|
1280
|
} else {
|
|
1313
|
|
- let _ = writeln!(
|
|
1314
|
|
- res,
|
|
1315
|
|
- "MUST_LOGIN: {:?}",
|
|
1316
|
|
- MUST_LOGIN.load(Ordering::SeqCst)
|
|
1317
|
|
- );
|
|
|
1281
|
+ let _ = writeln!(res, "MUST_LOGIN: {:?}", MUST_LOGIN.load(Ordering::SeqCst));
|
|
1318
|
1282
|
}
|
|
1319
|
1283
|
}
|
|
1320
|
1284
|
_ => {}
|
|
|
@@ -1420,7 +1384,16 @@ impl RendezvousServer {
|
|
1420
|
1384
|
if !key.is_empty() {
|
|
1421
|
1385
|
self.key_exchange_phase1(addr, &mut sink).await;
|
|
1422
|
1386
|
}
|
|
1423
|
|
- while let Ok(Some(Ok(bytes))) = timeout(30_000, b.next()).await {
|
|
|
1387
|
+ while let Ok(Some(Ok(mut bytes))) = timeout(30_000, b.next()).await {
|
|
|
1388
|
+ // log::debug!("receive tcp data from {:?} {:?}", addr, bytes);
|
|
|
1389
|
+ if let Some(Sink::Tss(s)) = sink.as_mut() {
|
|
|
1390
|
+ if let Some(key) = s.encrypt.as_mut() {
|
|
|
1391
|
+ if let Err(err) = key.dec(&mut bytes) {
|
|
|
1392
|
+ log::error!("dec tcp data from {:?} err: {:?}", addr, err);
|
|
|
1393
|
+ break;
|
|
|
1394
|
+ }
|
|
|
1395
|
+ }
|
|
|
1396
|
+ }
|
|
1424
|
1397
|
if !self.handle_tcp(&bytes, &mut sink, addr, key, ws).await {
|
|
1425
|
1398
|
break;
|
|
1426
|
1399
|
}
|