rustdesk лет назад: 3
Родитель
Сommit
55fcf241c6
1 измененных файлов с 46 добавлено и 25 удалено
  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
 impl AddrMangle {
98
 impl AddrMangle {
99
     pub fn encode(addr: SocketAddr) -> Vec<u8> {
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
         match addr {
111
         match addr {
101
             SocketAddr::V4(addr_v4) => {
112
             SocketAddr::V4(addr_v4) => {
102
                 let tm = (SystemTime::now()
113
                 let tm = (SystemTime::now()
@@ -269,9 +280,29 @@ pub fn get_time() -> i64 {
269
         .unwrap_or(0) as _
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
 #[cfg(test)]
302
 #[cfg(test)]
273
-mod tests {
303
+mod test {
274
     use super::*;
304
     use super::*;
305
+
275
     #[test]
306
     #[test]
276
     fn test_mangle() {
307
     fn test_mangle() {
277
         let addr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(192, 168, 16, 32), 21116));
308
         let addr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(192, 168, 16, 32), 21116));
@@ -293,30 +324,6 @@ mod tests {
293
             "failed"
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
     #[test]
328
     #[test]
322
     fn test_ipv6() {
329
     fn test_ipv6() {
@@ -333,4 +340,18 @@ mod test_lib {
333
         assert_eq!(is_ipv6_str("[1:2::0]:"), false);
340
         assert_eq!(is_ipv6_str("[1:2::0]:"), false);
334
         assert_eq!(is_ipv6_str("1:2::0]:1"), false);
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
 }