rustdesk 1 год назад
Родитель
Сommit
6f18a97644
6 измененных файлов с 44 добавлено и 13 удалено
  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
 [[package]]
780
 [[package]]
781
 name = "hbbs"
781
 name = "hbbs"
782
-version = "1.1.11-1"
782
+version = "1.1.12"
783
 dependencies = [
783
 dependencies = [
784
  "async-speed-limit",
784
  "async-speed-limit",
785
  "async-trait",
785
  "async-trait",

+ 1 - 1
Cargo.toml

@@ -1,6 +1,6 @@
1
 [package]
1
 [package]
2
 name = "hbbs"
2
 name = "hbbs"
3
-version = "1.1.11-1"
3
+version = "1.1.12"
4
 authors = ["rustdesk <info@rustdesk.com>"]
4
 authors = ["rustdesk <info@rustdesk.com>"]
5
 edition = "2021"
5
 edition = "2021"
6
 build = "build.rs"
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
 rustdesk-server (1.1.11-1) UNRELEASED; urgency=medium
5
 rustdesk-server (1.1.11-1) UNRELEASED; urgency=medium
2
   * set reuse port to make restart friendly
6
   * set reuse port to make restart friendly
3
   * revert hbbr `-k` to not ruin back-compatibility
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
 async fn make_pair(
393
 async fn make_pair(
394
     stream: TcpStream,
394
     stream: TcpStream,
395
-    addr: SocketAddr,
395
+    mut addr: SocketAddr,
396
     key: &str,
396
     key: &str,
397
     limiter: Limiter,
397
     limiter: Limiter,
398
     ws: bool,
398
     ws: bool,
399
 ) -> ResultType<()> {
399
 ) -> ResultType<()> {
400
     if ws {
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
     } else {
419
     } else {
409
         make_pair_(FramedStream::from(stream, addr), addr, key, limiter).await;
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
     async fn handle_listener_inner(
1106
     async fn handle_listener_inner(
1107
         &mut self,
1107
         &mut self,
1108
         stream: TcpStream,
1108
         stream: TcpStream,
1109
-        addr: SocketAddr,
1109
+        mut addr: SocketAddr,
1110
         key: &str,
1110
         key: &str,
1111
         ws: bool,
1111
         ws: bool,
1112
     ) -> ResultType<()> {
1112
     ) -> ResultType<()> {
1113
         let mut sink;
1113
         let mut sink;
1114
         if ws {
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
             let (a, mut b) = ws_stream.split();
1132
             let (a, mut b) = ws_stream.split();
1117
             sink = Some(Sink::Ws(a));
1133
             sink = Some(Sink::Ws(a));
1118
             while let Ok(Some(Ok(msg))) = timeout(30_000, b.next()).await {
1134
             while let Ok(Some(Ok(msg))) = timeout(30_000, b.next()).await {

+ 1 - 1
ui/setup.nsi

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