Просмотр исходного кода

fix slow connection, '/' in pub key, and hbbr wait for key, and possible
solution for https://github.com/rustdesk/rustdesk-server/issues/24

rustdesk лет назад: 3
Родитель
Сommit
39153ce147

+ 136 - 131
Cargo.lock

@@ -67,9 +67,9 @@ dependencies = [
67 67
 
68 68
 [[package]]
69 69
 name = "atoi"
70
-version = "0.4.0"
70
+version = "1.0.0"
71 71
 source = "registry+https://github.com/rust-lang/crates.io-index"
72
-checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5"
72
+checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e"
73 73
 dependencies = [
74 74
  "num-traits",
75 75
 ]
@@ -118,7 +118,7 @@ dependencies = [
118 118
  "sync_wrapper",
119 119
  "tokio",
120 120
  "tower",
121
- "tower-http 0.3.3",
121
+ "tower-http",
122 122
  "tower-layer",
123 123
  "tower-service",
124 124
 ]
@@ -145,9 +145,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
145 145
 
146 146
 [[package]]
147 147
 name = "bcrypt"
148
-version = "0.12.1"
148
+version = "0.13.0"
149 149
 source = "registry+https://github.com/rust-lang/crates.io-index"
150
-checksum = "6fe4fef31efb0f76133ae8e3576a88e58edb7cfc5584c81c758c349ba46b43fc"
150
+checksum = "a7e7c93a3fb23b2fdde989b2c9ec4dd153063ec81f408507f84c090cd91c6641"
151 151
 dependencies = [
152 152
  "base64",
153 153
  "blowfish",
@@ -161,15 +161,6 @@ version = "1.3.2"
161 161
 source = "registry+https://github.com/rust-lang/crates.io-index"
162 162
 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
163 163
 
164
-[[package]]
165
-name = "block-buffer"
166
-version = "0.9.0"
167
-source = "registry+https://github.com/rust-lang/crates.io-index"
168
-checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
169
-dependencies = [
170
- "generic-array",
171
-]
172
-
173 164
 [[package]]
174 165
 name = "block-buffer"
175 166
 version = "0.10.2"
@@ -282,6 +273,12 @@ dependencies = [
282 273
  "toml",
283 274
 ]
284 275
 
276
+[[package]]
277
+name = "const-sha1"
278
+version = "0.2.0"
279
+source = "registry+https://github.com/rust-lang/crates.io-index"
280
+checksum = "fb58b6451e8c2a812ad979ed1d83378caa5e927eef2622017a45f251457c2c9d"
281
+
285 282
 [[package]]
286 283
 name = "core-foundation"
287 284
 version = "0.9.3"
@@ -309,18 +306,18 @@ dependencies = [
309 306
 
310 307
 [[package]]
311 308
 name = "crc"
312
-version = "2.1.0"
309
+version = "3.0.0"
313 310
 source = "registry+https://github.com/rust-lang/crates.io-index"
314
-checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23"
311
+checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3"
315 312
 dependencies = [
316 313
  "crc-catalog",
317 314
 ]
318 315
 
319 316
 [[package]]
320 317
 name = "crc-catalog"
321
-version = "1.1.1"
318
+version = "2.1.0"
322 319
 source = "registry+https://github.com/rust-lang/crates.io-index"
323
-checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403"
320
+checksum = "2d0165d2900ae6778e36e80bbc4da3b5eefccee9ba939761f9c2882a5d9af3ff"
324 321
 
325 322
 [[package]]
326 323
 name = "crossbeam"
@@ -414,22 +411,13 @@ dependencies = [
414 411
  "tokio",
415 412
 ]
416 413
 
417
-[[package]]
418
-name = "digest"
419
-version = "0.9.0"
420
-source = "registry+https://github.com/rust-lang/crates.io-index"
421
-checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
422
-dependencies = [
423
- "generic-array",
424
-]
425
-
426 414
 [[package]]
427 415
 name = "digest"
428 416
 version = "0.10.3"
429 417
 source = "registry+https://github.com/rust-lang/crates.io-index"
430 418
 checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506"
431 419
 dependencies = [
432
- "block-buffer 0.10.2",
420
+ "block-buffer",
433 421
  "crypto-common",
434 422
 ]
435 423
 
@@ -504,6 +492,12 @@ dependencies = [
504 492
  "termcolor",
505 493
 ]
506 494
 
495
+[[package]]
496
+name = "event-listener"
497
+version = "2.5.2"
498
+source = "registry+https://github.com/rust-lang/crates.io-index"
499
+checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71"
500
+
507 501
 [[package]]
508 502
 name = "fastrand"
509 503
 version = "1.7.0"
@@ -719,9 +713,6 @@ name = "hashbrown"
719 713
 version = "0.11.2"
720 714
 source = "registry+https://github.com/rust-lang/crates.io-index"
721 715
 checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
722
-dependencies = [
723
- "ahash",
724
-]
725 716
 
726 717
 [[package]]
727 718
 name = "hashbrown"
@@ -734,11 +725,11 @@ dependencies = [
734 725
 
735 726
 [[package]]
736 727
 name = "hashlink"
737
-version = "0.7.0"
728
+version = "0.8.0"
738 729
 source = "registry+https://github.com/rust-lang/crates.io-index"
739
-checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf"
730
+checksum = "d452c155cb93fecdfb02a73dd57b5d8e442c2063bd7aac72f1bc5e4263a43086"
740 731
 dependencies = [
741
- "hashbrown 0.11.2",
732
+ "hashbrown 0.12.1",
742 733
 ]
743 734
 
744 735
 [[package]]
@@ -777,7 +768,7 @@ dependencies = [
777 768
 
778 769
 [[package]]
779 770
 name = "hbbs"
780
-version = "1.1.5"
771
+version = "1.1.6"
781 772
 dependencies = [
782 773
  "async-speed-limit",
783 774
  "async-trait",
@@ -791,8 +782,10 @@ dependencies = [
791 782
  "hbb_common",
792 783
  "headers",
793 784
  "http",
785
+ "ipnetwork",
794 786
  "jsonwebtoken",
795 787
  "lazy_static",
788
+ "local-ip-address",
796 789
  "mac_address",
797 790
  "machine-uid",
798 791
  "minreq",
@@ -805,7 +798,7 @@ dependencies = [
805 798
  "sodiumoxide",
806 799
  "sqlx",
807 800
  "tokio-tungstenite",
808
- "tower-http 0.2.5",
801
+ "tower-http",
809 802
  "tungstenite",
810 803
  "uuid",
811 804
  "whoami",
@@ -838,9 +831,9 @@ dependencies = [
838 831
 
839 832
 [[package]]
840 833
 name = "heck"
841
-version = "0.3.3"
834
+version = "0.4.0"
842 835
 source = "registry+https://github.com/rust-lang/crates.io-index"
843
-checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
836
+checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
844 837
 dependencies = [
845 838
  "unicode-segmentation",
846 839
 ]
@@ -968,6 +961,15 @@ dependencies = [
968 961
  "cfg-if",
969 962
 ]
970 963
 
964
+[[package]]
965
+name = "ipnetwork"
966
+version = "0.20.0"
967
+source = "registry+https://github.com/rust-lang/crates.io-index"
968
+checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e"
969
+dependencies = [
970
+ "serde",
971
+]
972
+
971 973
 [[package]]
972 974
 name = "itertools"
973 975
 version = "0.10.3"
@@ -1054,15 +1056,28 @@ dependencies = [
1054 1056
 
1055 1057
 [[package]]
1056 1058
 name = "libsqlite3-sys"
1057
-version = "0.23.2"
1059
+version = "0.24.2"
1058 1060
 source = "registry+https://github.com/rust-lang/crates.io-index"
1059
-checksum = "d2cafc7c74096c336d9d27145f7ebd4f4b6f95ba16aa5a282387267e6925cb58"
1061
+checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14"
1060 1062
 dependencies = [
1061 1063
  "cc",
1062 1064
  "pkg-config",
1063 1065
  "vcpkg",
1064 1066
 ]
1065 1067
 
1068
+[[package]]
1069
+name = "local-ip-address"
1070
+version = "0.4.4"
1071
+source = "registry+https://github.com/rust-lang/crates.io-index"
1072
+checksum = "8b143c6ef86e36328caa40a7578e95d1544aca8a1740235fd2b416a69441a5c7"
1073
+dependencies = [
1074
+ "libc",
1075
+ "memalloc",
1076
+ "neli",
1077
+ "thiserror",
1078
+ "windows",
1079
+]
1080
+
1066 1081
 [[package]]
1067 1082
 name = "lock_api"
1068 1083
 version = "0.4.7"
@@ -1113,6 +1128,12 @@ version = "0.5.0"
1113 1128
 source = "registry+https://github.com/rust-lang/crates.io-index"
1114 1129
 checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb"
1115 1130
 
1131
+[[package]]
1132
+name = "memalloc"
1133
+version = "0.1.0"
1134
+source = "registry+https://github.com/rust-lang/crates.io-index"
1135
+checksum = "df39d232f5c40b0891c10216992c2f250c054105cb1e56f0fc9032db6203ecc1"
1136
+
1116 1137
 [[package]]
1117 1138
 name = "memchr"
1118 1139
 version = "2.5.0"
@@ -1194,6 +1215,16 @@ dependencies = [
1194 1215
  "winapi",
1195 1216
 ]
1196 1217
 
1218
+[[package]]
1219
+name = "neli"
1220
+version = "0.5.3"
1221
+source = "registry+https://github.com/rust-lang/crates.io-index"
1222
+checksum = "9053554eb5dcb7e10d9cdab1206965bde870eed5d0d341532ca035e3ba221508"
1223
+dependencies = [
1224
+ "byteorder",
1225
+ "libc",
1226
+]
1227
+
1197 1228
 [[package]]
1198 1229
 name = "nix"
1199 1230
 version = "0.23.1"
@@ -1292,12 +1323,6 @@ version = "1.10.0"
1292 1323
 source = "registry+https://github.com/rust-lang/crates.io-index"
1293 1324
 checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
1294 1325
 
1295
-[[package]]
1296
-name = "opaque-debug"
1297
-version = "0.3.0"
1298
-source = "registry+https://github.com/rust-lang/crates.io-index"
1299
-checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
1300
-
1301 1326
 [[package]]
1302 1327
 name = "openssl-probe"
1303 1328
 version = "0.1.5"
@@ -1519,11 +1544,11 @@ dependencies = [
1519 1544
  "fxhash",
1520 1545
  "quinn-proto",
1521 1546
  "quinn-udp",
1522
- "rustls 0.20.4",
1547
+ "rustls",
1523 1548
  "thiserror",
1524 1549
  "tokio",
1525 1550
  "tracing",
1526
- "webpki 0.22.0",
1551
+ "webpki",
1527 1552
 ]
1528 1553
 
1529 1554
 [[package]]
@@ -1536,14 +1561,14 @@ dependencies = [
1536 1561
  "fxhash",
1537 1562
  "rand",
1538 1563
  "ring",
1539
- "rustls 0.20.4",
1564
+ "rustls",
1540 1565
  "rustls-native-certs",
1541 1566
  "rustls-pemfile 0.2.1",
1542 1567
  "slab",
1543 1568
  "thiserror",
1544 1569
  "tinyvec",
1545 1570
  "tracing",
1546
- "webpki 0.22.0",
1571
+ "webpki",
1547 1572
 ]
1548 1573
 
1549 1574
 [[package]]
@@ -1671,28 +1696,16 @@ dependencies = [
1671 1696
  "ordered-multimap",
1672 1697
 ]
1673 1698
 
1674
-[[package]]
1675
-name = "rustls"
1676
-version = "0.19.1"
1677
-source = "registry+https://github.com/rust-lang/crates.io-index"
1678
-checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7"
1679
-dependencies = [
1680
- "base64",
1681
- "log",
1682
- "ring",
1683
- "sct 0.6.1",
1684
- "webpki 0.21.4",
1685
-]
1686
-
1687 1699
 [[package]]
1688 1700
 name = "rustls"
1689 1701
 version = "0.20.4"
1690 1702
 source = "registry+https://github.com/rust-lang/crates.io-index"
1691 1703
 checksum = "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921"
1692 1704
 dependencies = [
1705
+ "log",
1693 1706
  "ring",
1694
- "sct 0.7.0",
1695
- "webpki 0.22.0",
1707
+ "sct",
1708
+ "webpki",
1696 1709
 ]
1697 1710
 
1698 1711
 [[package]]
@@ -1762,16 +1775,6 @@ version = "1.1.0"
1762 1775
 source = "registry+https://github.com/rust-lang/crates.io-index"
1763 1776
 checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
1764 1777
 
1765
-[[package]]
1766
-name = "sct"
1767
-version = "0.6.1"
1768
-source = "registry+https://github.com/rust-lang/crates.io-index"
1769
-checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce"
1770
-dependencies = [
1771
- "ring",
1772
- "untrusted",
1773
-]
1774
-
1775 1778
 [[package]]
1776 1779
 name = "sct"
1777 1780
 version = "0.7.0"
@@ -1856,20 +1859,18 @@ checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f"
1856 1859
 dependencies = [
1857 1860
  "cfg-if",
1858 1861
  "cpufeatures",
1859
- "digest 0.10.3",
1862
+ "digest",
1860 1863
 ]
1861 1864
 
1862 1865
 [[package]]
1863 1866
 name = "sha2"
1864
-version = "0.9.9"
1867
+version = "0.10.2"
1865 1868
 source = "registry+https://github.com/rust-lang/crates.io-index"
1866
-checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
1869
+checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676"
1867 1870
 dependencies = [
1868
- "block-buffer 0.9.0",
1869 1871
  "cfg-if",
1870 1872
  "cpufeatures",
1871
- "digest 0.9.0",
1872
- "opaque-debug",
1873
+ "digest",
1873 1874
 ]
1874 1875
 
1875 1876
 [[package]]
@@ -1972,8 +1973,9 @@ dependencies = [
1972 1973
 
1973 1974
 [[package]]
1974 1975
 name = "sqlx"
1975
-version = "0.5.11"
1976
-source = "git+https://github.com/open-trade/sqlx#81392f03ba36fbd670447517dbc122fddb206de7"
1976
+version = "0.6.0"
1977
+source = "registry+https://github.com/rust-lang/crates.io-index"
1978
+checksum = "1f82cbe94f41641d6c410ded25bbf5097c240cefdf8e3b06d04198d0a96af6a4"
1977 1979
 dependencies = [
1978 1980
  "sqlx-core",
1979 1981
  "sqlx-macros",
@@ -1981,8 +1983,9 @@ dependencies = [
1981 1983
 
1982 1984
 [[package]]
1983 1985
 name = "sqlx-core"
1984
-version = "0.5.11"
1985
-source = "git+https://github.com/open-trade/sqlx#81392f03ba36fbd670447517dbc122fddb206de7"
1986
+version = "0.6.0"
1987
+source = "registry+https://github.com/rust-lang/crates.io-index"
1988
+checksum = "6b69bf218860335ddda60d6ce85ee39f6cf6e5630e300e19757d1de15886a093"
1986 1989
 dependencies = [
1987 1990
  "ahash",
1988 1991
  "atoi",
@@ -1993,6 +1996,7 @@ dependencies = [
1993 1996
  "crc",
1994 1997
  "crossbeam-queue",
1995 1998
  "either",
1999
+ "event-listener",
1996 2000
  "flume",
1997 2001
  "futures-channel",
1998 2002
  "futures-core",
@@ -2010,7 +2014,8 @@ dependencies = [
2010 2014
  "once_cell",
2011 2015
  "paste",
2012 2016
  "percent-encoding",
2013
- "rustls 0.19.1",
2017
+ "rustls",
2018
+ "rustls-pemfile 1.0.0",
2014 2019
  "serde",
2015 2020
  "serde_json",
2016 2021
  "sha2",
@@ -2021,14 +2026,14 @@ dependencies = [
2021 2026
  "thiserror",
2022 2027
  "tokio-stream",
2023 2028
  "url",
2024
- "webpki 0.21.4",
2025 2029
  "webpki-roots",
2026 2030
 ]
2027 2031
 
2028 2032
 [[package]]
2029 2033
 name = "sqlx-macros"
2030
-version = "0.5.11"
2031
-source = "git+https://github.com/open-trade/sqlx#81392f03ba36fbd670447517dbc122fddb206de7"
2034
+version = "0.6.0"
2035
+source = "registry+https://github.com/rust-lang/crates.io-index"
2036
+checksum = "f40c63177cf23d356b159b60acd27c54af7423f1736988502e36bae9a712118f"
2032 2037
 dependencies = [
2033 2038
  "dotenv",
2034 2039
  "either",
@@ -2046,8 +2051,9 @@ dependencies = [
2046 2051
 
2047 2052
 [[package]]
2048 2053
 name = "sqlx-rt"
2049
-version = "0.5.11"
2050
-source = "git+https://github.com/open-trade/sqlx#81392f03ba36fbd670447517dbc122fddb206de7"
2054
+version = "0.6.0"
2055
+source = "registry+https://github.com/rust-lang/crates.io-index"
2056
+checksum = "874e93a365a598dc3dadb197565952cb143ae4aa716f7bcc933a8d836f6bf89f"
2051 2057
 dependencies = [
2052 2058
  "once_cell",
2053 2059
  "tokio",
@@ -2222,13 +2228,13 @@ dependencies = [
2222 2228
 
2223 2229
 [[package]]
2224 2230
 name = "tokio-rustls"
2225
-version = "0.22.0"
2231
+version = "0.23.4"
2226 2232
 source = "registry+https://github.com/rust-lang/crates.io-index"
2227
-checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6"
2233
+checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
2228 2234
 dependencies = [
2229
- "rustls 0.19.1",
2235
+ "rustls",
2230 2236
  "tokio",
2231
- "webpki 0.21.4",
2237
+ "webpki",
2232 2238
 ]
2233 2239
 
2234 2240
 [[package]]
@@ -2327,9 +2333,9 @@ dependencies = [
2327 2333
 
2328 2334
 [[package]]
2329 2335
 name = "tower-http"
2330
-version = "0.2.5"
2336
+version = "0.3.3"
2331 2337
 source = "registry+https://github.com/rust-lang/crates.io-index"
2332
-checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8"
2338
+checksum = "7d342c6d58709c0a6d48d48dabbb62d4ef955cf5f0f3bbfd845838e7ae88dbae"
2333 2339
 dependencies = [
2334 2340
  "bitflags",
2335 2341
  "bytes",
@@ -2345,28 +2351,10 @@ dependencies = [
2345 2351
  "pin-project-lite",
2346 2352
  "tokio",
2347 2353
  "tokio-util 0.7.1",
2348
- "tower-layer",
2349
- "tower-service",
2350
- "tracing",
2351
-]
2352
-
2353
-[[package]]
2354
-name = "tower-http"
2355
-version = "0.3.3"
2356
-source = "registry+https://github.com/rust-lang/crates.io-index"
2357
-checksum = "7d342c6d58709c0a6d48d48dabbb62d4ef955cf5f0f3bbfd845838e7ae88dbae"
2358
-dependencies = [
2359
- "bitflags",
2360
- "bytes",
2361
- "futures-core",
2362
- "futures-util",
2363
- "http",
2364
- "http-body",
2365
- "http-range-header",
2366
- "pin-project-lite",
2367 2354
  "tower",
2368 2355
  "tower-layer",
2369 2356
  "tower-service",
2357
+ "tracing",
2370 2358
 ]
2371 2359
 
2372 2360
 [[package]]
@@ -2519,9 +2507,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
2519 2507
 
2520 2508
 [[package]]
2521 2509
 name = "uuid"
2522
-version = "0.8.2"
2510
+version = "1.1.2"
2523 2511
 source = "registry+https://github.com/rust-lang/crates.io-index"
2524
-checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
2512
+checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f"
2525 2513
 dependencies = [
2526 2514
  "getrandom",
2527 2515
 ]
@@ -2641,16 +2629,6 @@ dependencies = [
2641 2629
  "wasm-bindgen",
2642 2630
 ]
2643 2631
 
2644
-[[package]]
2645
-name = "webpki"
2646
-version = "0.21.4"
2647
-source = "registry+https://github.com/rust-lang/crates.io-index"
2648
-checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea"
2649
-dependencies = [
2650
- "ring",
2651
- "untrusted",
2652
-]
2653
-
2654 2632
 [[package]]
2655 2633
 name = "webpki"
2656 2634
 version = "0.22.0"
@@ -2663,11 +2641,11 @@ dependencies = [
2663 2641
 
2664 2642
 [[package]]
2665 2643
 name = "webpki-roots"
2666
-version = "0.21.1"
2644
+version = "0.22.4"
2667 2645
 source = "registry+https://github.com/rust-lang/crates.io-index"
2668
-checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940"
2646
+checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf"
2669 2647
 dependencies = [
2670
- "webpki 0.21.4",
2648
+ "webpki",
2671 2649
 ]
2672 2650
 
2673 2651
 [[package]]
@@ -2722,6 +2700,17 @@ version = "0.4.0"
2722 2700
 source = "registry+https://github.com/rust-lang/crates.io-index"
2723 2701
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
2724 2702
 
2703
+[[package]]
2704
+name = "windows"
2705
+version = "0.18.0"
2706
+source = "registry+https://github.com/rust-lang/crates.io-index"
2707
+checksum = "68088239696c06152844eadc03d262f088932cce50c67e4ace86e19d95e976fe"
2708
+dependencies = [
2709
+ "const-sha1",
2710
+ "windows_gen",
2711
+ "windows_macros",
2712
+]
2713
+
2725 2714
 [[package]]
2726 2715
 name = "windows-sys"
2727 2716
 version = "0.36.1"
@@ -2741,6 +2730,12 @@ version = "0.36.1"
2741 2730
 source = "registry+https://github.com/rust-lang/crates.io-index"
2742 2731
 checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
2743 2732
 
2733
+[[package]]
2734
+name = "windows_gen"
2735
+version = "0.18.0"
2736
+source = "registry+https://github.com/rust-lang/crates.io-index"
2737
+checksum = "cf583322dc423ee021035b358e535015f7fd163058a31e2d37b99a939141121d"
2738
+
2744 2739
 [[package]]
2745 2740
 name = "windows_i686_gnu"
2746 2741
 version = "0.36.1"
@@ -2753,6 +2748,16 @@ version = "0.36.1"
2753 2748
 source = "registry+https://github.com/rust-lang/crates.io-index"
2754 2749
 checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
2755 2750
 
2751
+[[package]]
2752
+name = "windows_macros"
2753
+version = "0.18.0"
2754
+source = "registry+https://github.com/rust-lang/crates.io-index"
2755
+checksum = "58acfb8832e9f707f8997bd161e537a1c1f603e60a5bd9c3cf53484fdcc998f3"
2756
+dependencies = [
2757
+ "syn",
2758
+ "windows_gen",
2759
+]
2760
+
2756 2761
 [[package]]
2757 2762
 name = "windows_x86_64_gnu"
2758 2763
 version = "0.36.1"

+ 7 - 5
Cargo.toml

@@ -1,6 +1,6 @@
1 1
 [package]
2 2
 name = "hbbs"
3
-version = "1.1.5"
3
+version = "1.1.6"
4 4
 authors = ["open-trade <info@rustdesk.com>"]
5 5
 edition = "2021"
6 6
 build = "build.rs"
@@ -26,12 +26,12 @@ mac_address = "1.1"
26 26
 whoami = "1.2"
27 27
 base64 = "0.13"
28 28
 axum = { version = "0.5", features = ["headers"] }
29
-sqlx = { git = "https://github.com/open-trade/sqlx", features = [ "runtime-tokio-rustls", "sqlite", "macros", "chrono", "json" ] }
29
+sqlx = { version = "0.6", features = [ "runtime-tokio-rustls", "sqlite", "macros", "chrono", "json" ] }
30 30
 deadpool = "0.8"
31 31
 async-trait = "0.1"
32 32
 async-speed-limit = { git = "https://github.com/open-trade/async-speed-limit" }
33
-uuid = { version = "0.8", features = ["v4"] }
34
-bcrypt = "0.12"
33
+uuid = { version = "1.0", features = ["v4"] }
34
+bcrypt = "0.13"
35 35
 chrono = "0.4"
36 36
 jsonwebtoken = "8"
37 37
 headers = "0.3"
@@ -40,9 +40,11 @@ sodiumoxide = "0.2"
40 40
 tokio-tungstenite = "0.17"
41 41
 tungstenite = "0.17"
42 42
 regex = "1.4"
43
-tower-http = { version = "0.2", features = ["fs", "trace", "cors"] }
43
+tower-http = { version = "0.3", features = ["fs", "trace", "cors"] }
44 44
 http = "0.2"
45 45
 flexi_logger = { version = "0.22", features = ["async", "use_chrono_for_offset"] }
46
+ipnetwork = "0.20"
47
+local-ip-address = "0.4"
46 48
 
47 49
 [build-dependencies]
48 50
 hbb_common = { path = "libs/hbb_common" }


+ 5 - 1
libs/hbb_common/protos/message.proto

@@ -23,6 +23,7 @@ message VideoFrame {
23 23
     RGB rgb = 7;
24 24
     YUV yuv = 8;
25 25
   }
26
+  int64 timestamp = 9;
26 27
 }
27 28
 
28 29
 message IdPk {
@@ -441,7 +442,10 @@ message AudioFormat {
441 442
   uint32 channels = 2;
442 443
 }
443 444
 
444
-message AudioFrame { bytes data = 1; }
445
+message AudioFrame { 
446
+  bytes data = 1; 
447
+  int64 timestamp = 2;
448
+}
445 449
 
446 450
 message Misc {
447 451
   oneof union {

+ 12 - 2
libs/hbb_common/src/config.rs

@@ -261,7 +261,7 @@ impl Config {
261 261
 
262 262
     fn file_(suffix: &str) -> PathBuf {
263 263
         let name = format!("{}{}", *APP_NAME.read().unwrap(), suffix);
264
-        Self::path(name).with_extension("toml")
264
+        Config::with_extension(Self::path(name))
265 265
     }
266 266
 
267 267
     pub fn get_home() -> PathBuf {
@@ -677,6 +677,16 @@ impl Config {
677 677
         lock.store();
678 678
         true
679 679
     }
680
+
681
+    fn with_extension(path: PathBuf) -> PathBuf {
682
+        let ext = path.extension();
683
+        if let Some(ext) = ext {
684
+            let ext = format!("{}.toml", ext.to_string_lossy());
685
+            path.with_extension(&ext)
686
+        } else {
687
+            path.with_extension("toml")
688
+        }
689
+    }
680 690
 }
681 691
 
682 692
 const PEERS: &str = "peers";
@@ -706,7 +716,7 @@ impl PeerConfig {
706 716
 
707 717
     fn path(id: &str) -> PathBuf {
708 718
         let path: PathBuf = [PEERS, id].iter().collect();
709
-        Config::path(path).with_extension("toml")
719
+        Config::with_extension(Config::path(path))
710 720
     }
711 721
 
712 722
     pub fn peers() -> Vec<(String, SystemTime, PeerConfig)> {

+ 8 - 0
libs/hbb_common/src/fs.rs

@@ -558,3 +558,11 @@ pub fn create_dir(dir: &str) -> ResultType<()> {
558 558
     std::fs::create_dir_all(get_path(dir))?;
559 559
     Ok(())
560 560
 }
561
+
562
+#[inline]
563
+pub fn transform_windows_path(entries: &mut Vec<FileEntry>) {
564
+    for entry in entries {
565
+        entry.name = entry.name.replace("\\", "/");
566
+    }
567
+}
568
+

+ 0 - 1
libs/hbb_common/src/lib.rs

@@ -35,7 +35,6 @@ pub use sodiumoxide;
35 35
 pub use tokio_socks;
36 36
 pub use tokio_socks::IntoTargetAddr;
37 37
 pub use tokio_socks::TargetAddr;
38
-pub use lazy_static;
39 38
 
40 39
 #[cfg(feature = "quic")]
41 40
 pub type Stream = quic::Connection;

+ 6 - 2
libs/hbb_common/src/socket_client.rs

@@ -11,7 +11,10 @@ use tokio_socks::{IntoTargetAddr, TargetAddr};
11 11
 
12 12
 fn to_socket_addr(host: &str) -> ResultType<SocketAddr> {
13 13
     use std::net::ToSocketAddrs;
14
-    host.to_socket_addrs()?.next().context("Failed to solve")
14
+    host.to_socket_addrs()?
15
+        .filter(|x| x.is_ipv4())
16
+        .next()
17
+        .context("Failed to solve")
15 18
 }
16 19
 
17 20
 pub fn get_target_addr(host: &str) -> ResultType<TargetAddr<'static>> {
@@ -60,8 +63,9 @@ pub async fn connect_tcp<'t, T: IntoTargetAddr<'t>>(
60 63
         .await
61 64
     } else {
62 65
         let addr = std::net::ToSocketAddrs::to_socket_addrs(&target_addr)?
66
+            .filter(|x| x.is_ipv4())
63 67
             .next()
64
-            .context("Invalid target addr")?;
68
+            .context("Invalid target addr, no valid ipv4 address can be resolved.")?;
65 69
         Ok(FramedStream::new(addr, local, ms_timeout).await?)
66 70
     }
67 71
 }

+ 4 - 2
libs/hbb_common/src/udp.rs

@@ -27,6 +27,8 @@ fn new_socket(addr: SocketAddr, reuse: bool, buf_size: usize) -> Result<Socket,
27 27
         socket.set_reuse_port(true)?;
28 28
         socket.set_reuse_address(true)?;
29 29
     }
30
+    // only nonblocking work with tokio, https://stackoverflow.com/questions/64649405/receiver-on-tokiompscchannel-only-receives-messages-when-buffer-is-full
31
+    socket.set_nonblocking(true)?;
30 32
     if buf_size > 0 {
31 33
         socket.set_recv_buffer_size(buf_size).ok();
32 34
     }
@@ -47,7 +49,7 @@ impl FramedSocket {
47 49
 
48 50
     #[allow(clippy::never_loop)]
49 51
     pub async fn new_reuse<T: std::net::ToSocketAddrs>(addr: T) -> ResultType<Self> {
50
-        for addr in addr.to_socket_addrs()? {
52
+        for addr in addr.to_socket_addrs()?.filter(|x| x.is_ipv4()) {
51 53
             let socket = new_socket(addr, true, 0)?.into_udp_socket();
52 54
             return Ok(Self::Direct(UdpFramed::new(
53 55
                 UdpSocket::from_std(socket)?,
@@ -61,7 +63,7 @@ impl FramedSocket {
61 63
         addr: T,
62 64
         buf_size: usize,
63 65
     ) -> ResultType<Self> {
64
-        for addr in addr.to_socket_addrs()? {
66
+        for addr in addr.to_socket_addrs()?.filter(|x| x.is_ipv4()) {
65 67
             return Ok(Self::Direct(UdpFramed::new(
66 68
                 UdpSocket::from_std(new_socket(addr, false, buf_size)?.into_udp_socket())?,
67 69
                 BytesCodec::new(),

+ 18 - 5
src/common.rs

@@ -95,8 +95,11 @@ pub fn now() -> u64 {
95 95
         .unwrap_or_default()
96 96
 }
97 97
 
98
-pub fn gen_sk() -> (String, Option<sign::SecretKey>) {
98
+pub fn gen_sk(wait: u64) -> (String, Option<sign::SecretKey>) {
99 99
     let sk_file = "id_ed25519";
100
+    if wait > 0 && !std::path::Path::new(sk_file).exists() {
101
+        std::thread::sleep(std::time::Duration::from_millis(wait));
102
+    }
100 103
     if let Ok(mut file) = std::fs::File::open(sk_file) {
101 104
         let mut contents = String::new();
102 105
         if file.read_to_string(&mut contents).is_ok() {
@@ -110,16 +113,26 @@ pub fn gen_sk() -> (String, Option<sign::SecretKey>) {
110 113
             }
111 114
         }
112 115
     } else {
113
-        let (pk, sk) = sign::gen_keypair();
116
+        let gen_func = || {
117
+            let (tmp, sk) = sign::gen_keypair();
118
+            (base64::encode(tmp), sk)
119
+        };
120
+        let (mut pk, mut sk) = gen_func();
121
+        for _ in 0..300 {
122
+            if !pk.contains("/") {
123
+                break;
124
+            }
125
+            (pk, sk) = gen_func();
126
+        }
114 127
         let pub_file = format!("{}.pub", sk_file);
115 128
         if let Ok(mut f) = std::fs::File::create(&pub_file) {
116
-            f.write_all(base64::encode(pk).as_bytes()).ok();
129
+            f.write_all(pk.as_bytes()).ok();
117 130
             if let Ok(mut f) = std::fs::File::create(sk_file) {
118 131
                 let s = base64::encode(&sk);
119 132
                 if f.write_all(s.as_bytes()).is_ok() {
120 133
                     log::info!("Private/public key written to {}/{}", sk_file, pub_file);
121
-                    log::debug!("Public key: {:?}", pk);
122
-                    return (base64::encode(pk), Some(sk));
134
+                    log::debug!("Public key: {}", pk);
135
+                    return (pk, Some(sk));
123 136
                 }
124 137
             }
125 138
         }

+ 1 - 0
src/main.rs

@@ -21,6 +21,7 @@ fn main() -> ResultType<()> {
21 21
         -u, --software-url=[URL] 'Sets download url of RustDesk software of newest version'
22 22
         -r, --relay-servers=[HOST] 'Sets the default relay servers, seperated by colon'
23 23
         -M, --rmem=[NUMBER(default={})] '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 25
         -k, --key=[KEY] 'Only allow the client with the same key'",
25 26
         RENDEZVOUS_PORT,
26 27
         RMEM,

+ 1 - 1
src/relay_server.rs

@@ -566,7 +566,7 @@ fn get_server_sk(key: &str) -> String {
566 566
     }
567 567
 
568 568
     if key == "-" || key == "_" {
569
-        let (pk, _) = crate::common::gen_sk();
569
+        let (pk, _) = crate::common::gen_sk(300);
570 570
         key = pk;
571 571
     }
572 572
 

+ 70 - 27
src/rendezvous_server.rs

@@ -28,6 +28,7 @@ use hbb_common::{
28 28
     udp::FramedSocket,
29 29
     AddrMangle, ResultType,
30 30
 };
31
+use ipnetwork::Ipv4Network;
31 32
 use sodiumoxide::crypto::sign;
32 33
 use std::{
33 34
     collections::HashMap,
@@ -58,6 +59,16 @@ type RelayServers = Vec<String>;
58 59
 static CHECK_RELAY_TIMEOUT: u64 = 3_000;
59 60
 static mut ALWAYS_USE_RELAY: bool = false;
60 61
 
62
+#[derive(Clone)]
63
+struct Inner {
64
+    serial: i32,
65
+    version: String,
66
+    software_url: String,
67
+    mask: Option<Ipv4Network>,
68
+    local_ip: String,
69
+    sk: Option<sign::SecretKey>,
70
+}
71
+
61 72
 #[derive(Clone)]
62 73
 pub struct RendezvousServer {
63 74
     tcp_punch: Arc<Mutex<HashMap<SocketAddr, Sink>>>,
@@ -65,11 +76,8 @@ pub struct RendezvousServer {
65 76
     tx: Sender,
66 77
     relay_servers: Arc<RelayServers>,
67 78
     relay_servers0: Arc<RelayServers>,
68
-    serial: i32,
69 79
     rendezvous_servers: Arc<Vec<String>>,
70
-    version: String,
71
-    software_url: String,
72
-    sk: Option<sign::SecretKey>,
80
+    inner: Arc<Inner>,
73 81
 }
74 82
 
75 83
 enum LoopFailure {
@@ -87,6 +95,7 @@ impl RendezvousServer {
87 95
         key: &str,
88 96
         rmem: usize,
89 97
     ) -> ResultType<()> {
98
+        let (key, sk) = Self::get_server_sk(key);
90 99
         let addr = format!("0.0.0.0:{}", port);
91 100
         let addr2 = format!("0.0.0.0:{}", port - 1);
92 101
         let addr3 = format!("0.0.0.0:{}", port + 2);
@@ -109,13 +118,23 @@ impl RendezvousServer {
109 118
             tx: tx.clone(),
110 119
             relay_servers: Default::default(),
111 120
             relay_servers0: Default::default(),
112
-            serial,
113 121
             rendezvous_servers: Arc::new(rendezvous_servers),
114
-            version,
115
-            software_url,
116
-            sk: None,
122
+            inner: Arc::new(Inner {
123
+                serial,
124
+                version,
125
+                software_url,
126
+                sk,
127
+                mask: get_arg("mask").parse().ok(),
128
+                local_ip: get_arg_or(
129
+                    "local-ip",
130
+                    local_ip_address::local_ip()
131
+                        .map(|x| x.to_string())
132
+                        .unwrap_or_default(),
133
+                ),
134
+            }),
117 135
         };
118
-        let key = rs.get_server_sk(key);
136
+        log::info!("mask: {:?}", rs.inner.mask);
137
+        log::info!("local-ip: {:?}", rs.inner.local_ip);
119 138
         std::env::set_var("PORT_FOR_API", port.to_string());
120 139
         rs.parse_relay_servers(&get_arg("relay-servers"));
121 140
         let pm = rs.pm.clone();
@@ -284,10 +303,10 @@ impl RendezvousServer {
284 303
                     if rp.id.len() > 0 {
285 304
                         log::trace!("New peer registered: {:?} {:?}", &rp.id, &addr);
286 305
                         self.update_addr(rp.id, addr, socket).await?;
287
-                        if self.serial > rp.serial {
306
+                        if self.inner.serial > rp.serial {
288 307
                             let mut msg_out = RendezvousMessage::new();
289 308
                             msg_out.set_configure_update(ConfigUpdate {
290
-                                serial: self.serial,
309
+                                serial: self.inner.serial,
291 310
                                 rendezvous_servers: (*self.rendezvous_servers).clone(),
292 311
                                 ..Default::default()
293 312
                             });
@@ -401,8 +420,10 @@ impl RendezvousServer {
401 420
                     self.handle_local_addr(la, addr, Some(socket)).await?;
402 421
                 }
403 422
                 Some(rendezvous_message::Union::configure_update(mut cu)) => {
404
-                    if addr.ip() == ADDR_127 && cu.serial > self.serial {
405
-                        self.serial = cu.serial;
423
+                    if addr.ip() == ADDR_127 && cu.serial > self.inner.serial {
424
+                        let mut inner: Inner = (*self.inner).clone();
425
+                        inner.serial = cu.serial;
426
+                        self.inner = Arc::new(inner);
406 427
                         self.rendezvous_servers = Arc::new(
407 428
                             cu.rendezvous_servers
408 429
                                 .drain(..)
@@ -414,16 +435,16 @@ impl RendezvousServer {
414 435
                         );
415 436
                         log::info!(
416 437
                             "configure updated: serial={} rendezvous-servers={:?}",
417
-                            self.serial,
438
+                            self.inner.serial,
418 439
                             self.rendezvous_servers
419 440
                         );
420 441
                     }
421 442
                 }
422 443
                 Some(rendezvous_message::Union::software_update(su)) => {
423
-                    if !self.version.is_empty() && su.url != self.version {
444
+                    if !self.inner.version.is_empty() && su.url != self.inner.version {
424 445
                         let mut msg_out = RendezvousMessage::new();
425 446
                         msg_out.set_software_update(SoftwareUpdate {
426
-                            url: self.software_url.clone(),
447
+                            url: self.inner.software_url.clone(),
427 448
                             ..Default::default()
428 449
                         });
429 450
                         socket.send(&msg_out, addr).await?;
@@ -477,6 +498,10 @@ impl RendezvousServer {
477 498
                         rr.set_pk(pk);
478 499
                     }
479 500
                     let mut msg_out = RendezvousMessage::new();
501
+                    if self.is_lan(addr_b) {
502
+                        // https://github.com/rustdesk/rustdesk-server/issues/24
503
+                        rr.relay_server = self.inner.local_ip.clone();
504
+                    }
480 505
                     msg_out.set_relay_response(rr);
481 506
                     allow_err!(self.send_to_tcp_sync(msg_out, addr_b).await);
482 507
                 }
@@ -492,9 +517,9 @@ impl RendezvousServer {
492 517
                         port: addr.port() as _,
493 518
                         ..Default::default()
494 519
                     };
495
-                    if self.serial > tar.serial {
520
+                    if self.inner.serial > tar.serial {
496 521
                         let mut cu = ConfigUpdate::new();
497
-                        cu.serial = self.serial;
522
+                        cu.serial = self.inner.serial;
498 523
                         cu.rendezvous_servers = (*self.rendezvous_servers).clone();
499 524
                         res.cu = MessageField::from_option(Some(cu));
500 525
                     }
@@ -662,8 +687,15 @@ impl RendezvousServer {
662 687
                 return Ok((msg_out, None));
663 688
             }
664 689
             let mut msg_out = RendezvousMessage::new();
665
-            if unsafe { ALWAYS_USE_RELAY } {
666
-                let relay_server = self.get_relay_server(addr.ip(), peer_addr.ip());
690
+            let peer_is_lan = self.is_lan(peer_addr);
691
+            let is_lan = self.is_lan(addr);
692
+            if unsafe { ALWAYS_USE_RELAY } || (peer_is_lan ^ is_lan) {
693
+                let relay_server = if peer_is_lan {
694
+                    // https://github.com/rustdesk/rustdesk-server/issues/24
695
+                    self.inner.local_ip.clone()
696
+                } else {
697
+                    self.get_relay_server(addr.ip(), peer_addr.ip())
698
+                };
667 699
                 if !relay_server.is_empty() {
668 700
                     msg_out.set_request_relay(RequestRelay {
669 701
                         relay_server,
@@ -1077,7 +1109,7 @@ impl RendezvousServer {
1077 1109
 
1078 1110
     #[inline]
1079 1111
     async fn get_pk(&mut self, version: &str, id: String) -> Vec<u8> {
1080
-        if version.is_empty() || self.sk.is_none() {
1112
+        if version.is_empty() || self.inner.sk.is_none() {
1081 1113
             Vec::new()
1082 1114
         } else {
1083 1115
             match self.pm.get(&id).await {
@@ -1091,7 +1123,7 @@ impl RendezvousServer {
1091 1123
                         }
1092 1124
                         .write_to_bytes()
1093 1125
                         .unwrap_or_default(),
1094
-                        &self.sk.as_ref().unwrap(),
1126
+                        &self.inner.sk.as_ref().unwrap(),
1095 1127
                     )
1096 1128
                 }
1097 1129
                 _ => Vec::new(),
@@ -1100,7 +1132,8 @@ impl RendezvousServer {
1100 1132
     }
1101 1133
 
1102 1134
     #[inline]
1103
-    fn get_server_sk(&mut self, key: &str) -> String {
1135
+    fn get_server_sk(key: &str) -> (String, Option<sign::SecretKey>) {
1136
+        let mut out_sk = None;
1104 1137
         let mut key = key.to_owned();
1105 1138
         if let Ok(sk) = base64::decode(&key) {
1106 1139
             if sk.len() == sign::SECRETKEYBYTES {
@@ -1108,13 +1141,13 @@ impl RendezvousServer {
1108 1141
                 key = base64::encode(&sk[(sign::SECRETKEYBYTES / 2)..]);
1109 1142
                 let mut tmp = [0u8; sign::SECRETKEYBYTES];
1110 1143
                 tmp[..].copy_from_slice(&sk);
1111
-                self.sk = Some(sign::SecretKey(tmp));
1144
+                out_sk = Some(sign::SecretKey(tmp));
1112 1145
             }
1113 1146
         }
1114 1147
 
1115 1148
         if key.is_empty() || key == "-" || key == "_" {
1116
-            let (pk, sk) = crate::common::gen_sk();
1117
-            self.sk = sk;
1149
+            let (pk, sk) = crate::common::gen_sk(0);
1150
+            out_sk = sk;
1118 1151
             if !key.is_empty() {
1119 1152
                 key = pk;
1120 1153
             } else {
@@ -1126,7 +1159,17 @@ impl RendezvousServer {
1126 1159
             log::info!("Key: {}", key);
1127 1160
             std::env::set_var("KEY_FOR_API", key.clone());
1128 1161
         }
1129
-        key
1162
+        (key, out_sk)
1163
+    }
1164
+
1165
+    #[inline]
1166
+    fn is_lan(&self, addr: SocketAddr) -> bool {
1167
+        if let Some(network) = &self.inner.mask {
1168
+            if let SocketAddr::V4(addr) = addr {
1169
+                return network.contains(*addr.ip());
1170
+            }
1171
+        }
1172
+        false
1130 1173
     }
1131 1174
 }
1132 1175
 

+ 1 - 1
src/version.rs

@@ -1 +1 @@
1
-pub const VERSION: &str = "1.1.5";
1
+pub const VERSION: &str = "1.1.6";