open-trade 5 years ago
parent
commit
f1646522d1
5 changed files with 687 additions and 656 deletions
  1. 625 635
      Cargo.lock
  2. 2 2
      Cargo.toml
  3. 1 1
      libs/hbb_common
  4. 25 9
      src/main.rs
  5. 34 9
      src/rendezvous_server.rs

File diff suppressed because it is too large
+ 625 - 635
Cargo.lock


+ 2 - 2
Cargo.toml

@@ -13,13 +13,13 @@ path = "src/hbbr/main.rs"
13 13
 
14 14
 [dependencies]
15 15
 hbb_common = { path = "libs/hbb_common" }
16
-sled = "0.31"
16
+sled = "0.34"
17 17
 serde_derive = "1.0"
18 18
 serde = "1.0"
19 19
 serde_json = "1.0"
20 20
 lazy_static = "1.4"
21 21
 clap = "2.33"
22
-rust-ini = "0.15"
22
+rust-ini = "0.16"
23 23
 
24 24
 [build-dependencies]
25 25
 cc = "1.0"

+ 1 - 1
libs/hbb_common

@@ -1 +1 @@
1
-Subproject commit 3f862eaa423823b6a4c9a62e6b36f3b692cfd06f
1
+Subproject commit 9a236b24483f3215a911a8f6e6171972467ccd24

+ 25 - 9
src/main.rs

@@ -16,8 +16,14 @@ async fn main() -> ResultType<()> {
16 16
         -s, --serial=[NUMBER(default=0)] 'Sets configure update serial number'
17 17
         -R, --rendezvous-servers=[HOSTS] 'Sets rendezvous servers, seperated by colon'
18 18
         -u, --software-url=[URL] 'Sets download url of RustDesk software of newest version'
19
-    -r, --relay-server=[HOST] 'Sets the default relay server'",
20
-        DEFAULT_PORT
19
+        -r, --relay-server{}=[HOST] 'Sets the default relay server{}'",
20
+        DEFAULT_PORT,
21
+        if LICENSE_KEY.is_empty() { "" } else { "s" },
22
+        if LICENSE_KEY.is_empty() {
23
+            ""
24
+        } else {
25
+            "s, seperated by colon, only available for licensed users"
26
+        }
21 27
     );
22 28
     let matches = App::new("hbbs")
23 29
         .version(crate::VERSION)
@@ -44,28 +50,38 @@ async fn main() -> ResultType<()> {
44 50
         return default.to_owned();
45 51
     };
46 52
     let port = get_arg("port", DEFAULT_PORT);
47
-    let mut relay_server = get_arg("relay-server", "");
48
-    if let Err(err) = test_if_valid_server(&relay_server) {
49
-        relay_server = "".to_owned();
50
-        log::error!("Invalid relay-server: {}", err);
53
+    let mut relay_servers: Vec<String> = get_arg(
54
+        &format!(
55
+            "relay-server{}",
56
+            if LICENSE_KEY.is_empty() { "" } else { "s" }
57
+        ),
58
+        "",
59
+    )
60
+    .split(",")
61
+    .filter(|x| !x.is_empty() && test_if_valid_server(x, "relay-server").is_ok())
62
+    .map(|x| x.to_owned())
63
+    .collect();
64
+    if relay_servers.len() > 1 && LICENSE_KEY.is_empty() {
65
+        log::error!("Only support multiple relay servers for licenced users");
66
+        relay_servers = vec![relay_servers[0].clone()];
51 67
     }
52 68
     let serial: i32 = get_arg("serial", "").parse().unwrap_or(0);
53 69
     let rendezvous_servers: Vec<String> = get_arg("rendezvous-servers", "")
54 70
         .split(",")
55
-        .filter(|x| test_if_valid_server(x).is_ok())
71
+        .filter(|x| !x.is_empty() && test_if_valid_server(x, "rendezvous-server").is_ok())
56 72
         .map(|x| x.to_owned())
57 73
         .collect();
58 74
     let addr = format!("0.0.0.0:{}", port);
59 75
     log::info!("Listening on {}", addr);
60 76
     let addr2 = format!("0.0.0.0:{}", port.parse::<i32>().unwrap_or(0) - 1);
61 77
     log::info!("Listening on {}, extra port for NAT test", addr2);
62
-    log::info!("relay-server={}", relay_server);
78
+    log::info!("relay-servers={:?}", relay_servers);
63 79
     log::info!("serial={}", serial);
64 80
     log::info!("rendezvous-servers={:?}", rendezvous_servers);
65 81
     RendezvousServer::start(
66 82
         &addr,
67 83
         &addr2,
68
-        relay_server,
84
+        relay_servers,
69 85
         serial,
70 86
         rendezvous_servers,
71 87
         get_arg("software-url", ""),

+ 34 - 9
src/rendezvous_server.rs

@@ -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
 }