open-trade лет назад: 5
Родитель
Сommit
f1646522d1
5 измененных файлов с 687 добавлено и 656 удалено
  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

Разница между файлами не показана из-за своего большого размера
+ 625 - 635
Cargo.lock


+ 2 - 2
Cargo.toml

@@ -13,13 +13,13 @@ path = "src/hbbr/main.rs"
13
 
13
 
14
 [dependencies]
14
 [dependencies]
15
 hbb_common = { path = "libs/hbb_common" }
15
 hbb_common = { path = "libs/hbb_common" }
16
-sled = "0.31"
16
+sled = "0.34"
17
 serde_derive = "1.0"
17
 serde_derive = "1.0"
18
 serde = "1.0"
18
 serde = "1.0"
19
 serde_json = "1.0"
19
 serde_json = "1.0"
20
 lazy_static = "1.4"
20
 lazy_static = "1.4"
21
 clap = "2.33"
21
 clap = "2.33"
22
-rust-ini = "0.15"
22
+rust-ini = "0.16"
23
 
23
 
24
 [build-dependencies]
24
 [build-dependencies]
25
 cc = "1.0"
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
         -s, --serial=[NUMBER(default=0)] 'Sets configure update serial number'
16
         -s, --serial=[NUMBER(default=0)] 'Sets configure update serial number'
17
         -R, --rendezvous-servers=[HOSTS] 'Sets rendezvous servers, seperated by colon'
17
         -R, --rendezvous-servers=[HOSTS] 'Sets rendezvous servers, seperated by colon'
18
         -u, --software-url=[URL] 'Sets download url of RustDesk software of newest version'
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
     let matches = App::new("hbbs")
28
     let matches = App::new("hbbs")
23
         .version(crate::VERSION)
29
         .version(crate::VERSION)
@@ -44,28 +50,38 @@ async fn main() -> ResultType<()> {
44
         return default.to_owned();
50
         return default.to_owned();
45
     };
51
     };
46
     let port = get_arg("port", DEFAULT_PORT);
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
     let serial: i32 = get_arg("serial", "").parse().unwrap_or(0);
68
     let serial: i32 = get_arg("serial", "").parse().unwrap_or(0);
53
     let rendezvous_servers: Vec<String> = get_arg("rendezvous-servers", "")
69
     let rendezvous_servers: Vec<String> = get_arg("rendezvous-servers", "")
54
         .split(",")
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
         .map(|x| x.to_owned())
72
         .map(|x| x.to_owned())
57
         .collect();
73
         .collect();
58
     let addr = format!("0.0.0.0:{}", port);
74
     let addr = format!("0.0.0.0:{}", port);
59
     log::info!("Listening on {}", addr);
75
     log::info!("Listening on {}", addr);
60
     let addr2 = format!("0.0.0.0:{}", port.parse::<i32>().unwrap_or(0) - 1);
76
     let addr2 = format!("0.0.0.0:{}", port.parse::<i32>().unwrap_or(0) - 1);
61
     log::info!("Listening on {}, extra port for NAT test", addr2);
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
     log::info!("serial={}", serial);
79
     log::info!("serial={}", serial);
64
     log::info!("rendezvous-servers={:?}", rendezvous_servers);
80
     log::info!("rendezvous-servers={:?}", rendezvous_servers);
65
     RendezvousServer::start(
81
     RendezvousServer::start(
66
         &addr,
82
         &addr,
67
         &addr2,
83
         &addr2,
68
-        relay_server,
84
+        relay_servers,
69
         serial,
85
         serial,
70
         rendezvous_servers,
86
         rendezvous_servers,
71
         get_arg("software-url", ""),
87
         get_arg("software-url", ""),

+ 34 - 9
src/rendezvous_server.rs

@@ -117,15 +117,17 @@ impl PeerMap {
117
 }
117
 }
118
 
118
 
119
 const REG_TIMEOUT: i32 = 30_000;
119
 const REG_TIMEOUT: i32 = 30_000;
120
+pub const LICENSE_KEY: &'static str = "";
120
 type Sink = SplitSink<Framed<TcpStream, BytesCodec>, Bytes>;
121
 type Sink = SplitSink<Framed<TcpStream, BytesCodec>, Bytes>;
121
 type Sender = mpsc::UnboundedSender<(RendezvousMessage, SocketAddr)>;
122
 type Sender = mpsc::UnboundedSender<(RendezvousMessage, SocketAddr)>;
123
+static mut ROTATION_RELAY_SERVER: usize = 0;
122
 
124
 
123
 #[derive(Clone)]
125
 #[derive(Clone)]
124
 pub struct RendezvousServer {
126
 pub struct RendezvousServer {
125
     tcp_punch: Arc<Mutex<HashMap<SocketAddr, Sink>>>,
127
     tcp_punch: Arc<Mutex<HashMap<SocketAddr, Sink>>>,
126
     pm: PeerMap,
128
     pm: PeerMap,
127
     tx: Sender,
129
     tx: Sender,
128
-    relay_server: String,
130
+    relay_servers: Vec<String>,
129
     serial: i32,
131
     serial: i32,
130
     rendezvous_servers: Vec<String>,
132
     rendezvous_servers: Vec<String>,
131
     version: String,
133
     version: String,
@@ -136,7 +138,7 @@ impl RendezvousServer {
136
     pub async fn start(
138
     pub async fn start(
137
         addr: &str,
139
         addr: &str,
138
         addr2: &str,
140
         addr2: &str,
139
-        relay_server: String,
141
+        relay_servers: Vec<String>,
140
         serial: i32,
142
         serial: i32,
141
         rendezvous_servers: Vec<String>,
143
         rendezvous_servers: Vec<String>,
142
         software_url: String,
144
         software_url: String,
@@ -151,7 +153,7 @@ impl RendezvousServer {
151
             tcp_punch: Arc::new(Mutex::new(HashMap::new())),
153
             tcp_punch: Arc::new(Mutex::new(HashMap::new())),
152
             pm: PeerMap::new()?,
154
             pm: PeerMap::new()?,
153
             tx: tx.clone(),
155
             tx: tx.clone(),
154
-            relay_server,
156
+            relay_servers,
155
             serial,
157
             serial,
156
             rendezvous_servers,
158
             rendezvous_servers,
157
             version,
159
             version,
@@ -241,7 +243,7 @@ impl RendezvousServer {
241
                                         let mut res = TestNatResponse {
243
                                         let mut res = TestNatResponse {
242
                                             port: addr.port() as _,
244
                                             port: addr.port() as _,
243
                                             ..Default::default()
245
                                             ..Default::default()
244
-                                        }
246
+                                        };
245
                                         if rs.serial > tar.serial {
247
                                         if rs.serial > tar.serial {
246
                                             let mut cu = ConfigUpdate::new();
248
                                             let mut cu = ConfigUpdate::new();
247
                                             cu.serial = rs.serial;
249
                                             cu.serial = rs.serial;
@@ -352,7 +354,10 @@ impl RendezvousServer {
352
                         self.rendezvous_servers = cu
354
                         self.rendezvous_servers = cu
353
                             .rendezvous_servers
355
                             .rendezvous_servers
354
                             .drain(..)
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
                             .collect();
361
                             .collect();
357
                         log::info!(
362
                         log::info!(
358
                             "configure updated: serial={} rendezvous-servers={:?}",
363
                             "configure updated: serial={} rendezvous-servers={:?}",
@@ -505,6 +510,14 @@ impl RendezvousServer {
505
         addr: SocketAddr,
510
         addr: SocketAddr,
506
         ph: PunchHoleRequest,
511
         ph: PunchHoleRequest,
507
     ) -> ResultType<(RendezvousMessage, Option<SocketAddr>)> {
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
         let id = ph.id;
521
         let id = ph.id;
509
         // punch hole request from A, relay to B,
522
         // punch hole request from A, relay to B,
510
         // check if in same intranet first,
523
         // check if in same intranet first,
@@ -539,9 +552,13 @@ impl RendezvousServer {
539
                     &peer.socket_addr,
552
                     &peer.socket_addr,
540
                     &addr
553
                     &addr
541
                 );
554
                 );
555
+                let i = unsafe {
556
+                    ROTATION_RELAY_SERVER += 1;
557
+                    ROTATION_RELAY_SERVER % self.relay_servers.len()
558
+                };
542
                 msg_out.set_fetch_local_addr(FetchLocalAddr {
559
                 msg_out.set_fetch_local_addr(FetchLocalAddr {
543
                     socket_addr,
560
                     socket_addr,
544
-                    relay_server: self.relay_server.clone(),
561
+                    relay_server: self.relay_servers[i].clone(),
545
                     ..Default::default()
562
                     ..Default::default()
546
                 });
563
                 });
547
             } else {
564
             } else {
@@ -551,10 +568,14 @@ impl RendezvousServer {
551
                     &peer.socket_addr,
568
                     &peer.socket_addr,
552
                     &addr
569
                     &addr
553
                 );
570
                 );
571
+                let i = unsafe {
572
+                    ROTATION_RELAY_SERVER += 1;
573
+                    ROTATION_RELAY_SERVER % self.relay_servers.len()
574
+                };
554
                 msg_out.set_punch_hole(PunchHole {
575
                 msg_out.set_punch_hole(PunchHole {
555
                     socket_addr,
576
                     socket_addr,
556
                     nat_type: ph.nat_type,
577
                     nat_type: ph.nat_type,
557
-                    relay_server: self.relay_server.clone(),
578
+                    relay_server: self.relay_servers[i].clone(),
558
                     ..Default::default()
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
         hbb_common::to_socket_addr(host)
655
         hbb_common::to_socket_addr(host)
635
     } else {
656
     } else {
636
         hbb_common::to_socket_addr(&format!("{}:{}", host, 0))
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
 }