Browse Source

try to_v4 in mangle encode

rustdesk 3 years ago
parent
commit
55fcf241c6
1 changed files with 46 additions and 25 deletions
  1. 46 25
      libs/hbb_common/src/lib.rs

+ 46 - 25
libs/hbb_common/src/lib.rs

@@ -97,6 +97,17 @@ pub struct AddrMangle();
97 97
 
98 98
 impl AddrMangle {
99 99
     pub fn encode(addr: SocketAddr) -> Vec<u8> {
100
+        // not work with [:1]:<port>
101
+        let addr = match addr {
102
+            SocketAddr::V6(v6) => {
103
+                if let Some(v4) = v6.ip().to_ipv4() {
104
+                    SocketAddr::new(IpAddr::V4(v4), addr.port())
105
+                } else {
106
+                    addr
107
+                }
108
+            }
109
+            _ => addr,
110
+        };
100 111
         match addr {
101 112
             SocketAddr::V4(addr_v4) => {
102 113
                 let tm = (SystemTime::now()
@@ -269,9 +280,29 @@ pub fn get_time() -> i64 {
269 280
         .unwrap_or(0) as _
270 281
 }
271 282
 
283
+#[inline]
284
+pub fn is_ipv4_str(id: &str) -> bool {
285
+    regex::Regex::new(r"^\d+\.\d+\.\d+\.\d+(:\d+)?$")
286
+        .unwrap()
287
+        .is_match(id)
288
+}
289
+
290
+#[inline]
291
+pub fn is_ipv6_str(id: &str) -> bool {
292
+    regex::Regex::new(r"^((([a-fA-F0-9]{1,4}:{1,2})+[a-fA-F0-9]{1,4})|(\[([a-fA-F0-9]{1,4}:{1,2})+[a-fA-F0-9]{1,4}\]:\d+))$")
293
+        .unwrap()
294
+        .is_match(id)
295
+}
296
+
297
+#[inline]
298
+pub fn is_ip_str(id: &str) -> bool {
299
+    is_ipv4_str(id) || is_ipv6_str(id)
300
+}
301
+
272 302
 #[cfg(test)]
273
-mod tests {
303
+mod test {
274 304
     use super::*;
305
+
275 306
     #[test]
276 307
     fn test_mangle() {
277 308
         let addr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(192, 168, 16, 32), 21116));
@@ -293,30 +324,6 @@ mod tests {
293 324
             "failed"
294 325
         );
295 326
     }
296
-}
297
-
298
-#[inline]
299
-pub fn is_ipv4_str(id: &str) -> bool {
300
-    regex::Regex::new(r"^\d+\.\d+\.\d+\.\d+(:\d+)?$")
301
-        .unwrap()
302
-        .is_match(id)
303
-}
304
-
305
-#[inline]
306
-pub fn is_ipv6_str(id: &str) -> bool {
307
-    regex::Regex::new(r"^((([a-fA-F0-9]{1,4}:{1,2})+[a-fA-F0-9]{1,4})|(\[([a-fA-F0-9]{1,4}:{1,2})+[a-fA-F0-9]{1,4}\]:\d+))$")
308
-        .unwrap()
309
-        .is_match(id)
310
-}
311
-
312
-#[inline]
313
-pub fn is_ip_str(id: &str) -> bool {
314
-    is_ipv4_str(id) || is_ipv6_str(id)
315
-}
316
-
317
-#[cfg(test)]
318
-mod test_lib {
319
-    use super::*;
320 327
 
321 328
     #[test]
322 329
     fn test_ipv6() {
@@ -333,4 +340,18 @@ mod test_lib {
333 340
         assert_eq!(is_ipv6_str("[1:2::0]:"), false);
334 341
         assert_eq!(is_ipv6_str("1:2::0]:1"), false);
335 342
     }
343
+
344
+    #[test]
345
+    fn test_mangle2() {
346
+        let addr = "[::ffff:127.0.0.1]:8080".parse().unwrap();
347
+        let addr_v4 = "127.0.0.1:8080".parse().unwrap();
348
+        assert_eq!(AddrMangle::decode(&AddrMangle::encode(addr)), addr_v4);
349
+        assert_eq!(
350
+            AddrMangle::decode(&AddrMangle::encode("[::127.0.0.1]:8080".parse().unwrap())),
351
+            addr_v4
352
+        );
353
+        assert_eq!(AddrMangle::decode(&AddrMangle::encode(addr_v4)), addr_v4);
354
+        let addr_v6 = "[ef::fe]:8080".parse().unwrap();
355
+        assert_eq!(AddrMangle::decode(&AddrMangle::encode(addr_v6)), addr_v6);
356
+    }
336 357
 }