Browse Source

feat: Add MUST_LOGIN Env

lejianwen 1 year ago
parent
commit
4e37dc8090
2 changed files with 50 additions and 4 deletions
  1. 2 1
      src/main.rs
  2. 48 3
      src/rendezvous_server.rs

+ 2 - 1
src/main.rs

@@ -22,7 +22,8 @@ fn main() -> ResultType<()> {
22
         -r, --relay-servers=[HOST] 'Sets the default relay servers, separated by comma'
22
         -r, --relay-servers=[HOST] 'Sets the default relay servers, separated by comma'
23
         -M, --rmem=[NUMBER(default={RMEM})] 'Sets UDP recv buffer size, set system rmem_max first, e.g., sudo sysctl -w net.core.rmem_max=52428800. vi /etc/sysctl.conf, net.core.rmem_max=52428800, sudo sysctl –p'
23
         -M, --rmem=[NUMBER(default={RMEM})] 'Sets UDP recv buffer size, set system rmem_max first, e.g., sudo sysctl -w net.core.rmem_max=52428800. vi /etc/sysctl.conf, net.core.rmem_max=52428800, sudo sysctl –p'
24
         , --mask=[MASK] 'Determine if the connection comes from LAN, e.g. 192.168.0.0/16'
24
         , --mask=[MASK] 'Determine if the connection comes from LAN, e.g. 192.168.0.0/16'
25
-        -k, --key=[KEY] 'Only allow the client with the same key'",
25
+        -k, --key=[KEY] 'Only allow the client with the same key'
26
+        , --must-login=[Y|N] 'Only allow the client with login'",
26
     );
27
     );
27
     init_args(&args, "hbbs", "RustDesk ID/Rendezvous Server");
28
     init_args(&args, "hbbs", "RustDesk ID/Rendezvous Server");
28
     let port = get_arg_or("port", RENDEZVOUS_PORT.to_string()).parse::<i32>()?;
29
     let port = get_arg_or("port", RENDEZVOUS_PORT.to_string()).parse::<i32>()?;

+ 48 - 3
src/rendezvous_server.rs

@@ -71,6 +71,7 @@ static ROTATION_RELAY_SERVER: AtomicUsize = AtomicUsize::new(0);
71
 type RelayServers = Vec<String>;
71
 type RelayServers = Vec<String>;
72
 const CHECK_RELAY_TIMEOUT: u64 = 3_000;
72
 const CHECK_RELAY_TIMEOUT: u64 = 3_000;
73
 static ALWAYS_USE_RELAY: AtomicBool = AtomicBool::new(false);
73
 static ALWAYS_USE_RELAY: AtomicBool = AtomicBool::new(false);
74
+static MUST_LOGIN: AtomicBool = AtomicBool::new(false);
74
 
75
 
75
 #[derive(Clone)]
76
 #[derive(Clone)]
76
 struct Inner {
77
 struct Inner {
@@ -175,6 +176,25 @@ impl RendezvousServer {
175
                 "N"
176
                 "N"
176
             }
177
             }
177
         );
178
         );
179
+
180
+        let must_login = get_arg("must-login");
181
+        log::debug!("must_login={}", must_login);
182
+        if must_login.to_uppercase() == "Y" ||
183
+            (must_login == "" && std::env::var("MUST_LOGIN")
184
+            .unwrap_or_default()
185
+            .to_uppercase()
186
+            == "Y") {
187
+            MUST_LOGIN.store(true, Ordering::SeqCst);
188
+        }
189
+
190
+        log::info!(
191
+            "MUST_LOGIN={}",
192
+            if MUST_LOGIN.load(Ordering::SeqCst) {
193
+                "Y"
194
+            } else {
195
+                "N"
196
+            }
197
+        );
178
         if test_addr.to_lowercase() != "no" {
198
         if test_addr.to_lowercase() != "no" {
179
             let test_addr = if test_addr.is_empty() {
199
             let test_addr = if test_addr.is_empty() {
180
                 listener.local_addr()?
200
                 listener.local_addr()?
@@ -756,6 +776,15 @@ impl RendezvousServer {
756
             });
776
             });
757
             return Ok((msg_out, None));
777
             return Ok((msg_out, None));
758
         }
778
         }
779
+        // Todo check token by jwt
780
+        if ph.token.is_empty() && MUST_LOGIN.load(Ordering::SeqCst) {
781
+            let mut msg_out = RendezvousMessage::new();
782
+            msg_out.set_punch_hole_response(PunchHoleResponse {
783
+                other_failure: String::from("Connection failed, please login first"),
784
+                ..Default::default()
785
+            });
786
+            return Ok((msg_out, None));
787
+        }
759
         let id = ph.id;
788
         let id = ph.id;
760
         // punch hole request from A, relay to B,
789
         // punch hole request from A, relay to B,
761
         // check if in same intranet first,
790
         // check if in same intranet first,
@@ -988,13 +1017,14 @@ impl RendezvousServer {
988
         match fds.next() {
1017
         match fds.next() {
989
             Some("h") => {
1018
             Some("h") => {
990
                 res = format!(
1019
                 res = format!(
991
-                    "{}\n{}\n{}\n{}\n{}\n{}\n",
1020
+                    "{}\n{}\n{}\n{}\n{}\n{}\n{}\n",
992
                     "relay-servers(rs) <separated by ,>",
1021
                     "relay-servers(rs) <separated by ,>",
993
                     "reload-geo(rg)",
1022
                     "reload-geo(rg)",
994
                     "ip-blocker(ib) [<ip>|<number>] [-]",
1023
                     "ip-blocker(ib) [<ip>|<number>] [-]",
995
                     "ip-changes(ic) [<id>|<number>] [-]",
1024
                     "ip-changes(ic) [<id>|<number>] [-]",
996
-                    "always-use-relay(aur)",
997
-                    "test-geo(tg) <ip1> <ip2>"
1025
+                    "always-use-relay(aur) [Y|N]",
1026
+                    "test-geo(tg) <ip1> <ip2>",
1027
+                    "must-login(ml) [Y|N]",
998
                 )
1028
                 )
999
             }
1029
             }
1000
             Some("relay-servers" | "rs") => {
1030
             Some("relay-servers" | "rs") => {
@@ -1121,6 +1151,21 @@ impl RendezvousServer {
1121
                     }
1151
                     }
1122
                 }
1152
                 }
1123
             }
1153
             }
1154
+            Some("must-login" | "ml") => {
1155
+                if let Some(rs) = fds.next() {
1156
+                    if rs.to_uppercase() == "Y" {
1157
+                        MUST_LOGIN.store(true, Ordering::SeqCst);
1158
+                    } else {
1159
+                        MUST_LOGIN.store(false, Ordering::SeqCst);
1160
+                    }
1161
+                } else {
1162
+                    let _ = writeln!(
1163
+                        res,
1164
+                        "MUST_LOGIN: {:?}",
1165
+                        MUST_LOGIN.load(Ordering::SeqCst)
1166
+                    );
1167
+                }
1168
+            }
1124
             _ => {}
1169
             _ => {}
1125
         }
1170
         }
1126
         res
1171
         res