rustdesk 1 year ago
parent
commit
6f18a97644
6 changed files with 44 additions and 13 deletions
  1. 1 1
      Cargo.lock
  2. 1 1
      Cargo.toml
  3. 4 0
      debian/changelog
  4. 19 8
      src/relay_server.rs
  5. 18 2
      src/rendezvous_server.rs
  6. 1 1
      ui/setup.nsi

+ 1 - 1
Cargo.lock

@@ -779,7 +779,7 @@ dependencies = [
779 779
 
780 780
 [[package]]
781 781
 name = "hbbs"
782
-version = "1.1.11-1"
782
+version = "1.1.12"
783 783
 dependencies = [
784 784
  "async-speed-limit",
785 785
  "async-trait",

+ 1 - 1
Cargo.toml

@@ -1,6 +1,6 @@
1 1
 [package]
2 2
 name = "hbbs"
3
-version = "1.1.11-1"
3
+version = "1.1.12"
4 4
 authors = ["rustdesk <info@rustdesk.com>"]
5 5
 edition = "2021"
6 6
 build = "build.rs"

+ 4 - 0
debian/changelog

@@ -1,3 +1,7 @@
1
+rustdesk-server (1.1.12) UNRELEASED; urgency=medium
2
+  * WS real ip
3
+  * Bump s6-overlay to v3.2.0.0 and fix env warnings
4
+
1 5
 rustdesk-server (1.1.11-1) UNRELEASED; urgency=medium
2 6
   * set reuse port to make restart friendly
3 7
   * revert hbbr `-k` to not ruin back-compatibility

+ 19 - 8
src/relay_server.rs

@@ -392,19 +392,30 @@ async fn handle_connection(
392 392
 
393 393
 async fn make_pair(
394 394
     stream: TcpStream,
395
-    addr: SocketAddr,
395
+    mut addr: SocketAddr,
396 396
     key: &str,
397 397
     limiter: Limiter,
398 398
     ws: bool,
399 399
 ) -> ResultType<()> {
400 400
     if ws {
401
-        make_pair_(
402
-            tokio_tungstenite::accept_async(stream).await?,
403
-            addr,
404
-            key,
405
-            limiter,
406
-        )
407
-        .await;
401
+        use tokio_tungstenite::tungstenite::handshake::server::{Request, Response};
402
+        let callback = |req: &Request, response: Response| {
403
+            let headers = req.headers();
404
+            let real_ip = headers
405
+                .get("X-Real-IP")
406
+                .or_else(|| headers.get("X-Forwarded-For"))
407
+                .and_then(|header_value| header_value.to_str().ok());
408
+            if let Some(ip) = real_ip {
409
+                if ip.contains('.') {
410
+                    addr = format!("{ip}:0").parse().unwrap_or(addr);
411
+                } else {
412
+                    addr = format!("[{ip}]:0").parse().unwrap_or(addr);
413
+                }
414
+            }
415
+            Ok(response)
416
+        };
417
+        let ws_stream = tokio_tungstenite::accept_hdr_async(stream, callback).await?;
418
+        make_pair_(ws_stream, addr, key, limiter).await;
408 419
     } else {
409 420
         make_pair_(FramedStream::from(stream, addr), addr, key, limiter).await;
410 421
     }

+ 18 - 2
src/rendezvous_server.rs

@@ -1106,13 +1106,29 @@ impl RendezvousServer {
1106 1106
     async fn handle_listener_inner(
1107 1107
         &mut self,
1108 1108
         stream: TcpStream,
1109
-        addr: SocketAddr,
1109
+        mut addr: SocketAddr,
1110 1110
         key: &str,
1111 1111
         ws: bool,
1112 1112
     ) -> ResultType<()> {
1113 1113
         let mut sink;
1114 1114
         if ws {
1115
-            let ws_stream = tokio_tungstenite::accept_async(stream).await?;
1115
+            use tokio_tungstenite::tungstenite::handshake::server::{Request, Response};
1116
+            let callback = |req: &Request, response: Response| {
1117
+                let headers = req.headers();
1118
+                let real_ip = headers
1119
+                    .get("X-Real-IP")
1120
+                    .or_else(|| headers.get("X-Forwarded-For"))
1121
+                    .and_then(|header_value| header_value.to_str().ok());
1122
+                if let Some(ip) = real_ip {
1123
+                    if ip.contains('.') {
1124
+                        addr = format!("{ip}:0").parse().unwrap_or(addr);
1125
+                    } else {
1126
+                        addr = format!("[{ip}]:0").parse().unwrap_or(addr);
1127
+                    }
1128
+                }
1129
+                Ok(response)
1130
+            };
1131
+            let ws_stream = tokio_tungstenite::accept_hdr_async(stream, callback).await?;
1116 1132
             let (a, mut b) = ws_stream.split();
1117 1133
             sink = Some(Sink::Ws(a));
1118 1134
             while let Ok(Some(Ok(msg))) = timeout(30_000, b.next()).await {

+ 1 - 1
ui/setup.nsi

@@ -15,7 +15,7 @@
15 15
 !define PRODUCT_NAME "rustdesk_server"
16 16
 !define PRODUCT_DESCRIPTION "Installer for ${PRODUCT_NAME}"
17 17
 !define COPYRIGHT "Copyright © 2021"
18
-!define VERSION "1.1.10"
18
+!define VERSION "1.1.12"
19 19
 
20 20
 VIProductVersion "${VERSION}.0"
21 21
 VIAddVersionKey "ProductName" "${PRODUCT_NAME}"