|
|
@@ -117,15 +117,17 @@ impl PeerMap {
|
|
117
|
117
|
}
|
|
118
|
118
|
|
|
119
|
119
|
const REG_TIMEOUT: i32 = 30_000;
|
|
|
120
|
+pub const LICENSE_KEY: &'static str = "";
|
|
120
|
121
|
type Sink = SplitSink<Framed<TcpStream, BytesCodec>, Bytes>;
|
|
121
|
122
|
type Sender = mpsc::UnboundedSender<(RendezvousMessage, SocketAddr)>;
|
|
|
123
|
+static mut ROTATION_RELAY_SERVER: usize = 0;
|
|
122
|
124
|
|
|
123
|
125
|
#[derive(Clone)]
|
|
124
|
126
|
pub struct RendezvousServer {
|
|
125
|
127
|
tcp_punch: Arc<Mutex<HashMap<SocketAddr, Sink>>>,
|
|
126
|
128
|
pm: PeerMap,
|
|
127
|
129
|
tx: Sender,
|
|
128
|
|
- relay_server: String,
|
|
|
130
|
+ relay_servers: Vec<String>,
|
|
129
|
131
|
serial: i32,
|
|
130
|
132
|
rendezvous_servers: Vec<String>,
|
|
131
|
133
|
version: String,
|
|
|
@@ -136,7 +138,7 @@ impl RendezvousServer {
|
|
136
|
138
|
pub async fn start(
|
|
137
|
139
|
addr: &str,
|
|
138
|
140
|
addr2: &str,
|
|
139
|
|
- relay_server: String,
|
|
|
141
|
+ relay_servers: Vec<String>,
|
|
140
|
142
|
serial: i32,
|
|
141
|
143
|
rendezvous_servers: Vec<String>,
|
|
142
|
144
|
software_url: String,
|
|
|
@@ -151,7 +153,7 @@ impl RendezvousServer {
|
|
151
|
153
|
tcp_punch: Arc::new(Mutex::new(HashMap::new())),
|
|
152
|
154
|
pm: PeerMap::new()?,
|
|
153
|
155
|
tx: tx.clone(),
|
|
154
|
|
- relay_server,
|
|
|
156
|
+ relay_servers,
|
|
155
|
157
|
serial,
|
|
156
|
158
|
rendezvous_servers,
|
|
157
|
159
|
version,
|
|
|
@@ -241,7 +243,7 @@ impl RendezvousServer {
|
|
241
|
243
|
let mut res = TestNatResponse {
|
|
242
|
244
|
port: addr.port() as _,
|
|
243
|
245
|
..Default::default()
|
|
244
|
|
- }
|
|
|
246
|
+ };
|
|
245
|
247
|
if rs.serial > tar.serial {
|
|
246
|
248
|
let mut cu = ConfigUpdate::new();
|
|
247
|
249
|
cu.serial = rs.serial;
|
|
|
@@ -352,7 +354,10 @@ impl RendezvousServer {
|
|
352
|
354
|
self.rendezvous_servers = cu
|
|
353
|
355
|
.rendezvous_servers
|
|
354
|
356
|
.drain(..)
|
|
355
|
|
- .filter(|x| test_if_valid_server(x).is_ok())
|
|
|
357
|
+ .filter(|x| {
|
|
|
358
|
+ !x.is_empty()
|
|
|
359
|
+ && test_if_valid_server(x, "rendezvous-server").is_ok()
|
|
|
360
|
+ })
|
|
356
|
361
|
.collect();
|
|
357
|
362
|
log::info!(
|
|
358
|
363
|
"configure updated: serial={} rendezvous-servers={:?}",
|
|
|
@@ -505,6 +510,14 @@ impl RendezvousServer {
|
|
505
|
510
|
addr: SocketAddr,
|
|
506
|
511
|
ph: PunchHoleRequest,
|
|
507
|
512
|
) -> ResultType<(RendezvousMessage, Option<SocketAddr>)> {
|
|
|
513
|
+ if ph.licence_key != LICENSE_KEY {
|
|
|
514
|
+ let mut msg_out = RendezvousMessage::new();
|
|
|
515
|
+ msg_out.set_punch_hole_response(PunchHoleResponse {
|
|
|
516
|
+ failure: punch_hole_response::Failure::LICENCE_MISMATCH.into(),
|
|
|
517
|
+ ..Default::default()
|
|
|
518
|
+ });
|
|
|
519
|
+ return Ok((msg_out, None));
|
|
|
520
|
+ }
|
|
508
|
521
|
let id = ph.id;
|
|
509
|
522
|
// punch hole request from A, relay to B,
|
|
510
|
523
|
// check if in same intranet first,
|
|
|
@@ -539,9 +552,13 @@ impl RendezvousServer {
|
|
539
|
552
|
&peer.socket_addr,
|
|
540
|
553
|
&addr
|
|
541
|
554
|
);
|
|
|
555
|
+ let i = unsafe {
|
|
|
556
|
+ ROTATION_RELAY_SERVER += 1;
|
|
|
557
|
+ ROTATION_RELAY_SERVER % self.relay_servers.len()
|
|
|
558
|
+ };
|
|
542
|
559
|
msg_out.set_fetch_local_addr(FetchLocalAddr {
|
|
543
|
560
|
socket_addr,
|
|
544
|
|
- relay_server: self.relay_server.clone(),
|
|
|
561
|
+ relay_server: self.relay_servers[i].clone(),
|
|
545
|
562
|
..Default::default()
|
|
546
|
563
|
});
|
|
547
|
564
|
} else {
|
|
|
@@ -551,10 +568,14 @@ impl RendezvousServer {
|
|
551
|
568
|
&peer.socket_addr,
|
|
552
|
569
|
&addr
|
|
553
|
570
|
);
|
|
|
571
|
+ let i = unsafe {
|
|
|
572
|
+ ROTATION_RELAY_SERVER += 1;
|
|
|
573
|
+ ROTATION_RELAY_SERVER % self.relay_servers.len()
|
|
|
574
|
+ };
|
|
554
|
575
|
msg_out.set_punch_hole(PunchHole {
|
|
555
|
576
|
socket_addr,
|
|
556
|
577
|
nat_type: ph.nat_type,
|
|
557
|
|
- relay_server: self.relay_server.clone(),
|
|
|
578
|
+ relay_server: self.relay_servers[i].clone(),
|
|
558
|
579
|
..Default::default()
|
|
559
|
580
|
});
|
|
560
|
581
|
}
|
|
|
@@ -629,10 +650,14 @@ impl RendezvousServer {
|
|
629
|
650
|
}
|
|
630
|
651
|
}
|
|
631
|
652
|
|
|
632
|
|
-pub fn test_if_valid_server(host: &str) -> ResultType<SocketAddr> {
|
|
633
|
|
- if host.contains(":") {
|
|
|
653
|
+pub fn test_if_valid_server(host: &str, name: &str) -> ResultType<SocketAddr> {
|
|
|
654
|
+ let res = if host.contains(":") {
|
|
634
|
655
|
hbb_common::to_socket_addr(host)
|
|
635
|
656
|
} else {
|
|
636
|
657
|
hbb_common::to_socket_addr(&format!("{}:{}", host, 0))
|
|
|
658
|
+ };
|
|
|
659
|
+ if res.is_err() {
|
|
|
660
|
+ log::error!("Invalid {} {}: {:?}", name, host, res);
|
|
637
|
661
|
}
|
|
|
662
|
+ res
|
|
638
|
663
|
}
|