From 39153ce1472417be101051baecb452da467f2652 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Wed, 13 Jul 2022 00:22:45 +0800 Subject: [PATCH] fix slow connection, '/' in pub key, and hbbr wait for key, and possible solution for https://github.com/rustdesk/rustdesk-server/issues/24 --- Cargo.lock | 267 ++++++++++++++------------- Cargo.toml | 12 +- db_v2.sqlite3 | Bin 24576 -> 24576 bytes libs/hbb_common/protos/message.proto | 6 +- libs/hbb_common/src/config.rs | 14 +- libs/hbb_common/src/fs.rs | 8 + libs/hbb_common/src/lib.rs | 1 - libs/hbb_common/src/socket_client.rs | 8 +- libs/hbb_common/src/udp.rs | 6 +- src/common.rs | 23 ++- src/main.rs | 1 + src/relay_server.rs | 2 +- src/rendezvous_server.rs | 97 +++++++--- src/version.rs | 2 +- 14 files changed, 269 insertions(+), 178 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8cdcc6b..56d59da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -67,9 +67,9 @@ dependencies = [ [[package]] name = "atoi" -version = "0.4.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" +checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" dependencies = [ "num-traits", ] @@ -118,7 +118,7 @@ dependencies = [ "sync_wrapper", "tokio", "tower", - "tower-http 0.3.3", + "tower-http", "tower-layer", "tower-service", ] @@ -145,9 +145,9 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bcrypt" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe4fef31efb0f76133ae8e3576a88e58edb7cfc5584c81c758c349ba46b43fc" +checksum = "a7e7c93a3fb23b2fdde989b2c9ec4dd153063ec81f408507f84c090cd91c6641" dependencies = [ "base64", "blowfish", @@ -161,15 +161,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - [[package]] name = "block-buffer" version = "0.10.2" @@ -282,6 +273,12 @@ dependencies = [ "toml", ] +[[package]] +name = "const-sha1" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb58b6451e8c2a812ad979ed1d83378caa5e927eef2622017a45f251457c2c9d" + [[package]] name = "core-foundation" version = "0.9.3" @@ -309,18 +306,18 @@ dependencies = [ [[package]] name = "crc" -version = "2.1.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" +checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "1.1.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" +checksum = "2d0165d2900ae6778e36e80bbc4da3b5eefccee9ba939761f9c2882a5d9af3ff" [[package]] name = "crossbeam" @@ -414,22 +411,13 @@ dependencies = [ "tokio", ] -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - [[package]] name = "digest" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" dependencies = [ - "block-buffer 0.10.2", + "block-buffer", "crypto-common", ] @@ -504,6 +492,12 @@ dependencies = [ "termcolor", ] +[[package]] +name = "event-listener" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71" + [[package]] name = "fastrand" version = "1.7.0" @@ -719,9 +713,6 @@ name = "hashbrown" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash", -] [[package]] name = "hashbrown" @@ -734,11 +725,11 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +checksum = "d452c155cb93fecdfb02a73dd57b5d8e442c2063bd7aac72f1bc5e4263a43086" dependencies = [ - "hashbrown 0.11.2", + "hashbrown 0.12.1", ] [[package]] @@ -777,7 +768,7 @@ dependencies = [ [[package]] name = "hbbs" -version = "1.1.5" +version = "1.1.6" dependencies = [ "async-speed-limit", "async-trait", @@ -791,8 +782,10 @@ dependencies = [ "hbb_common", "headers", "http", + "ipnetwork", "jsonwebtoken", "lazy_static", + "local-ip-address", "mac_address", "machine-uid", "minreq", @@ -805,7 +798,7 @@ dependencies = [ "sodiumoxide", "sqlx", "tokio-tungstenite", - "tower-http 0.2.5", + "tower-http", "tungstenite", "uuid", "whoami", @@ -838,9 +831,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" dependencies = [ "unicode-segmentation", ] @@ -968,6 +961,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "ipnetwork" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e" +dependencies = [ + "serde", +] + [[package]] name = "itertools" version = "0.10.3" @@ -1054,15 +1056,28 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.23.2" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cafc7c74096c336d9d27145f7ebd4f4b6f95ba16aa5a282387267e6925cb58" +checksum = "898745e570c7d0453cc1fbc4a701eb6c662ed54e8fec8b7d14be137ebeeb9d14" dependencies = [ "cc", "pkg-config", "vcpkg", ] +[[package]] +name = "local-ip-address" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b143c6ef86e36328caa40a7578e95d1544aca8a1740235fd2b416a69441a5c7" +dependencies = [ + "libc", + "memalloc", + "neli", + "thiserror", + "windows", +] + [[package]] name = "lock_api" version = "0.4.7" @@ -1113,6 +1128,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb" +[[package]] +name = "memalloc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df39d232f5c40b0891c10216992c2f250c054105cb1e56f0fc9032db6203ecc1" + [[package]] name = "memchr" version = "2.5.0" @@ -1194,6 +1215,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "neli" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9053554eb5dcb7e10d9cdab1206965bde870eed5d0d341532ca035e3ba221508" +dependencies = [ + "byteorder", + "libc", +] + [[package]] name = "nix" version = "0.23.1" @@ -1292,12 +1323,6 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - [[package]] name = "openssl-probe" version = "0.1.5" @@ -1519,11 +1544,11 @@ dependencies = [ "fxhash", "quinn-proto", "quinn-udp", - "rustls 0.20.4", + "rustls", "thiserror", "tokio", "tracing", - "webpki 0.22.0", + "webpki", ] [[package]] @@ -1536,14 +1561,14 @@ dependencies = [ "fxhash", "rand", "ring", - "rustls 0.20.4", + "rustls", "rustls-native-certs", "rustls-pemfile 0.2.1", "slab", "thiserror", "tinyvec", "tracing", - "webpki 0.22.0", + "webpki", ] [[package]] @@ -1671,28 +1696,16 @@ dependencies = [ "ordered-multimap", ] -[[package]] -name = "rustls" -version = "0.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" -dependencies = [ - "base64", - "log", - "ring", - "sct 0.6.1", - "webpki 0.21.4", -] - [[package]] name = "rustls" version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fbfeb8d0ddb84706bc597a5574ab8912817c52a397f819e5b614e2265206921" dependencies = [ + "log", "ring", - "sct 0.7.0", - "webpki 0.22.0", + "sct", + "webpki", ] [[package]] @@ -1762,16 +1775,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "sct" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "sct" version = "0.7.0" @@ -1856,20 +1859,18 @@ checksum = "028f48d513f9678cda28f6e4064755b3fbb2af6acd672f2c209b62323f7aea0f" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.3", + "digest", ] [[package]] name = "sha2" -version = "0.9.9" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676" dependencies = [ - "block-buffer 0.9.0", "cfg-if", "cpufeatures", - "digest 0.9.0", - "opaque-debug", + "digest", ] [[package]] @@ -1972,8 +1973,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.5.11" -source = "git+https://github.com/open-trade/sqlx#81392f03ba36fbd670447517dbc122fddb206de7" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f82cbe94f41641d6c410ded25bbf5097c240cefdf8e3b06d04198d0a96af6a4" dependencies = [ "sqlx-core", "sqlx-macros", @@ -1981,8 +1983,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.5.11" -source = "git+https://github.com/open-trade/sqlx#81392f03ba36fbd670447517dbc122fddb206de7" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b69bf218860335ddda60d6ce85ee39f6cf6e5630e300e19757d1de15886a093" dependencies = [ "ahash", "atoi", @@ -1993,6 +1996,7 @@ dependencies = [ "crc", "crossbeam-queue", "either", + "event-listener", "flume", "futures-channel", "futures-core", @@ -2010,7 +2014,8 @@ dependencies = [ "once_cell", "paste", "percent-encoding", - "rustls 0.19.1", + "rustls", + "rustls-pemfile 1.0.0", "serde", "serde_json", "sha2", @@ -2021,14 +2026,14 @@ dependencies = [ "thiserror", "tokio-stream", "url", - "webpki 0.21.4", "webpki-roots", ] [[package]] name = "sqlx-macros" -version = "0.5.11" -source = "git+https://github.com/open-trade/sqlx#81392f03ba36fbd670447517dbc122fddb206de7" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40c63177cf23d356b159b60acd27c54af7423f1736988502e36bae9a712118f" dependencies = [ "dotenv", "either", @@ -2046,8 +2051,9 @@ dependencies = [ [[package]] name = "sqlx-rt" -version = "0.5.11" -source = "git+https://github.com/open-trade/sqlx#81392f03ba36fbd670447517dbc122fddb206de7" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874e93a365a598dc3dadb197565952cb143ae4aa716f7bcc933a8d836f6bf89f" dependencies = [ "once_cell", "tokio", @@ -2222,13 +2228,13 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.22.0" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls 0.19.1", + "rustls", "tokio", - "webpki 0.21.4", + "webpki", ] [[package]] @@ -2327,9 +2333,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.2.5" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8" +checksum = "7d342c6d58709c0a6d48d48dabbb62d4ef955cf5f0f3bbfd845838e7ae88dbae" dependencies = [ "bitflags", "bytes", @@ -2345,28 +2351,10 @@ dependencies = [ "pin-project-lite", "tokio", "tokio-util 0.7.1", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d342c6d58709c0a6d48d48dabbb62d4ef955cf5f0f3bbfd845838e7ae88dbae" -dependencies = [ - "bitflags", - "bytes", - "futures-core", - "futures-util", - "http", - "http-body", - "http-range-header", - "pin-project-lite", "tower", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -2519,9 +2507,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "uuid" -version = "0.8.2" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" dependencies = [ "getrandom", ] @@ -2641,16 +2629,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "webpki" version = "0.22.0" @@ -2663,11 +2641,11 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.21.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf" dependencies = [ - "webpki 0.21.4", + "webpki", ] [[package]] @@ -2722,6 +2700,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68088239696c06152844eadc03d262f088932cce50c67e4ace86e19d95e976fe" +dependencies = [ + "const-sha1", + "windows_gen", + "windows_macros", +] + [[package]] name = "windows-sys" version = "0.36.1" @@ -2741,6 +2730,12 @@ version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +[[package]] +name = "windows_gen" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf583322dc423ee021035b358e535015f7fd163058a31e2d37b99a939141121d" + [[package]] name = "windows_i686_gnu" version = "0.36.1" @@ -2753,6 +2748,16 @@ version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +[[package]] +name = "windows_macros" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58acfb8832e9f707f8997bd161e537a1c1f603e60a5bd9c3cf53484fdcc998f3" +dependencies = [ + "syn", + "windows_gen", +] + [[package]] name = "windows_x86_64_gnu" version = "0.36.1" diff --git a/Cargo.toml b/Cargo.toml index df71b29..5ace1a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hbbs" -version = "1.1.5" +version = "1.1.6" authors = ["open-trade "] edition = "2021" build = "build.rs" @@ -26,12 +26,12 @@ mac_address = "1.1" whoami = "1.2" base64 = "0.13" axum = { version = "0.5", features = ["headers"] } -sqlx = { git = "https://github.com/open-trade/sqlx", features = [ "runtime-tokio-rustls", "sqlite", "macros", "chrono", "json" ] } +sqlx = { version = "0.6", features = [ "runtime-tokio-rustls", "sqlite", "macros", "chrono", "json" ] } deadpool = "0.8" async-trait = "0.1" async-speed-limit = { git = "https://github.com/open-trade/async-speed-limit" } -uuid = { version = "0.8", features = ["v4"] } -bcrypt = "0.12" +uuid = { version = "1.0", features = ["v4"] } +bcrypt = "0.13" chrono = "0.4" jsonwebtoken = "8" headers = "0.3" @@ -40,9 +40,11 @@ sodiumoxide = "0.2" tokio-tungstenite = "0.17" tungstenite = "0.17" regex = "1.4" -tower-http = { version = "0.2", features = ["fs", "trace", "cors"] } +tower-http = { version = "0.3", features = ["fs", "trace", "cors"] } http = "0.2" flexi_logger = { version = "0.22", features = ["async", "use_chrono_for_offset"] } +ipnetwork = "0.20" +local-ip-address = "0.4" [build-dependencies] hbb_common = { path = "libs/hbb_common" } diff --git a/db_v2.sqlite3 b/db_v2.sqlite3 index 198592249cc4e17b08d12e1b01f55c8a2366daf7..245eb7ebedf05c5a2033f3c9967ebd25650dc485 100644 GIT binary patch delta 620 zcmZoTz}Rqrae_1>+e8^>RyGE`XrqlO3-~#h`0g<9-QmyQEGTe+uf9=`OGh!p$C!bE z!SajsFFCH`&YBBS*2x4eee=iA*wVnv)Y#C{(lpV?FfGO0T-Vsdz*N`7#N1LhDb37K zH__B0${)YLS|g!h?!o5GdtY7HOm-C5|jV-81G&(>$>w72g*ZSAd>|KWj=fsv7} zfw``sk%FPAm9d$Xfl;+meP)4@m6D;Qk)ENMg`T0Fp^=eNZ6iOIjx5woKUk_?UJmf7 z+#PrPLAYtht4!a-kVlOJiq4T~jj`6Ehc6OA7-t zgRdVS_gC3Sec88xp<2o5evi+;S9c9sHaJhoNt-sEyTcCTB4j6-TA2Wygzh2}W2IUy zVDK>UA7kJ@#{UEuZoBy1WSJFp5aEL!a?;GQIxv@_`v79r4F>)j{BM9}o#8hTW@gYq rHvuGuUFRkS{+s-pfI64)N2xIz>tG32bi=SH1NjxZ`A9C)Al797dB4&8 delta 94 xcmZoTz}Rqrae_1>(?l6(Rwf3$aF2~C3;3BB1U3sA9Os`n!I+JU0SL(B0sv%Z7U2K@ diff --git a/libs/hbb_common/protos/message.proto b/libs/hbb_common/protos/message.proto index f95007d..15ee971 100644 --- a/libs/hbb_common/protos/message.proto +++ b/libs/hbb_common/protos/message.proto @@ -23,6 +23,7 @@ message VideoFrame { RGB rgb = 7; YUV yuv = 8; } + int64 timestamp = 9; } message IdPk { @@ -441,7 +442,10 @@ message AudioFormat { uint32 channels = 2; } -message AudioFrame { bytes data = 1; } +message AudioFrame { + bytes data = 1; + int64 timestamp = 2; +} message Misc { oneof union { diff --git a/libs/hbb_common/src/config.rs b/libs/hbb_common/src/config.rs index a7c1bc6..ea7dd6d 100644 --- a/libs/hbb_common/src/config.rs +++ b/libs/hbb_common/src/config.rs @@ -261,7 +261,7 @@ impl Config { fn file_(suffix: &str) -> PathBuf { let name = format!("{}{}", *APP_NAME.read().unwrap(), suffix); - Self::path(name).with_extension("toml") + Config::with_extension(Self::path(name)) } pub fn get_home() -> PathBuf { @@ -677,6 +677,16 @@ impl Config { lock.store(); true } + + fn with_extension(path: PathBuf) -> PathBuf { + let ext = path.extension(); + if let Some(ext) = ext { + let ext = format!("{}.toml", ext.to_string_lossy()); + path.with_extension(&ext) + } else { + path.with_extension("toml") + } + } } const PEERS: &str = "peers"; @@ -706,7 +716,7 @@ impl PeerConfig { fn path(id: &str) -> PathBuf { let path: PathBuf = [PEERS, id].iter().collect(); - Config::path(path).with_extension("toml") + Config::with_extension(Config::path(path)) } pub fn peers() -> Vec<(String, SystemTime, PeerConfig)> { diff --git a/libs/hbb_common/src/fs.rs b/libs/hbb_common/src/fs.rs index 475f4df..69cd348 100644 --- a/libs/hbb_common/src/fs.rs +++ b/libs/hbb_common/src/fs.rs @@ -558,3 +558,11 @@ pub fn create_dir(dir: &str) -> ResultType<()> { std::fs::create_dir_all(get_path(dir))?; Ok(()) } + +#[inline] +pub fn transform_windows_path(entries: &mut Vec) { + for entry in entries { + entry.name = entry.name.replace("\\", "/"); + } +} + diff --git a/libs/hbb_common/src/lib.rs b/libs/hbb_common/src/lib.rs index 0a9dace..5f23e46 100644 --- a/libs/hbb_common/src/lib.rs +++ b/libs/hbb_common/src/lib.rs @@ -35,7 +35,6 @@ pub use sodiumoxide; pub use tokio_socks; pub use tokio_socks::IntoTargetAddr; pub use tokio_socks::TargetAddr; -pub use lazy_static; #[cfg(feature = "quic")] pub type Stream = quic::Connection; diff --git a/libs/hbb_common/src/socket_client.rs b/libs/hbb_common/src/socket_client.rs index 0375b71..72ab73f 100644 --- a/libs/hbb_common/src/socket_client.rs +++ b/libs/hbb_common/src/socket_client.rs @@ -11,7 +11,10 @@ use tokio_socks::{IntoTargetAddr, TargetAddr}; fn to_socket_addr(host: &str) -> ResultType { use std::net::ToSocketAddrs; - host.to_socket_addrs()?.next().context("Failed to solve") + host.to_socket_addrs()? + .filter(|x| x.is_ipv4()) + .next() + .context("Failed to solve") } pub fn get_target_addr(host: &str) -> ResultType> { @@ -60,8 +63,9 @@ pub async fn connect_tcp<'t, T: IntoTargetAddr<'t>>( .await } else { let addr = std::net::ToSocketAddrs::to_socket_addrs(&target_addr)? + .filter(|x| x.is_ipv4()) .next() - .context("Invalid target addr")?; + .context("Invalid target addr, no valid ipv4 address can be resolved.")?; Ok(FramedStream::new(addr, local, ms_timeout).await?) } } diff --git a/libs/hbb_common/src/udp.rs b/libs/hbb_common/src/udp.rs index 0338618..3532dd1 100644 --- a/libs/hbb_common/src/udp.rs +++ b/libs/hbb_common/src/udp.rs @@ -27,6 +27,8 @@ fn new_socket(addr: SocketAddr, reuse: bool, buf_size: usize) -> Result 0 { socket.set_recv_buffer_size(buf_size).ok(); } @@ -47,7 +49,7 @@ impl FramedSocket { #[allow(clippy::never_loop)] pub async fn new_reuse(addr: T) -> ResultType { - for addr in addr.to_socket_addrs()? { + for addr in addr.to_socket_addrs()?.filter(|x| x.is_ipv4()) { let socket = new_socket(addr, true, 0)?.into_udp_socket(); return Ok(Self::Direct(UdpFramed::new( UdpSocket::from_std(socket)?, @@ -61,7 +63,7 @@ impl FramedSocket { addr: T, buf_size: usize, ) -> ResultType { - for addr in addr.to_socket_addrs()? { + for addr in addr.to_socket_addrs()?.filter(|x| x.is_ipv4()) { return Ok(Self::Direct(UdpFramed::new( UdpSocket::from_std(new_socket(addr, false, buf_size)?.into_udp_socket())?, BytesCodec::new(), diff --git a/src/common.rs b/src/common.rs index 473d730..74b9e78 100644 --- a/src/common.rs +++ b/src/common.rs @@ -95,8 +95,11 @@ pub fn now() -> u64 { .unwrap_or_default() } -pub fn gen_sk() -> (String, Option) { +pub fn gen_sk(wait: u64) -> (String, Option) { let sk_file = "id_ed25519"; + if wait > 0 && !std::path::Path::new(sk_file).exists() { + std::thread::sleep(std::time::Duration::from_millis(wait)); + } if let Ok(mut file) = std::fs::File::open(sk_file) { let mut contents = String::new(); if file.read_to_string(&mut contents).is_ok() { @@ -110,16 +113,26 @@ pub fn gen_sk() -> (String, Option) { } } } else { - let (pk, sk) = sign::gen_keypair(); + let gen_func = || { + let (tmp, sk) = sign::gen_keypair(); + (base64::encode(tmp), sk) + }; + let (mut pk, mut sk) = gen_func(); + for _ in 0..300 { + if !pk.contains("/") { + break; + } + (pk, sk) = gen_func(); + } let pub_file = format!("{}.pub", sk_file); if let Ok(mut f) = std::fs::File::create(&pub_file) { - f.write_all(base64::encode(pk).as_bytes()).ok(); + f.write_all(pk.as_bytes()).ok(); if let Ok(mut f) = std::fs::File::create(sk_file) { let s = base64::encode(&sk); if f.write_all(s.as_bytes()).is_ok() { log::info!("Private/public key written to {}/{}", sk_file, pub_file); - log::debug!("Public key: {:?}", pk); - return (base64::encode(pk), Some(sk)); + log::debug!("Public key: {}", pk); + return (pk, Some(sk)); } } } diff --git a/src/main.rs b/src/main.rs index d715bd3..09119c7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,6 +21,7 @@ fn main() -> ResultType<()> { -u, --software-url=[URL] 'Sets download url of RustDesk software of newest version' -r, --relay-servers=[HOST] 'Sets the default relay servers, seperated by colon' -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' + , --mask=[MASK] 'Determine if the connection comes from LAN, e.g. 192.168.0.0/16' -k, --key=[KEY] 'Only allow the client with the same key'", RENDEZVOUS_PORT, RMEM, diff --git a/src/relay_server.rs b/src/relay_server.rs index 9eccfe1..b6c677c 100644 --- a/src/relay_server.rs +++ b/src/relay_server.rs @@ -566,7 +566,7 @@ fn get_server_sk(key: &str) -> String { } if key == "-" || key == "_" { - let (pk, _) = crate::common::gen_sk(); + let (pk, _) = crate::common::gen_sk(300); key = pk; } diff --git a/src/rendezvous_server.rs b/src/rendezvous_server.rs index 37a4eb4..835933f 100644 --- a/src/rendezvous_server.rs +++ b/src/rendezvous_server.rs @@ -28,6 +28,7 @@ use hbb_common::{ udp::FramedSocket, AddrMangle, ResultType, }; +use ipnetwork::Ipv4Network; use sodiumoxide::crypto::sign; use std::{ collections::HashMap, @@ -58,6 +59,16 @@ type RelayServers = Vec; static CHECK_RELAY_TIMEOUT: u64 = 3_000; static mut ALWAYS_USE_RELAY: bool = false; +#[derive(Clone)] +struct Inner { + serial: i32, + version: String, + software_url: String, + mask: Option, + local_ip: String, + sk: Option, +} + #[derive(Clone)] pub struct RendezvousServer { tcp_punch: Arc>>, @@ -65,11 +76,8 @@ pub struct RendezvousServer { tx: Sender, relay_servers: Arc, relay_servers0: Arc, - serial: i32, rendezvous_servers: Arc>, - version: String, - software_url: String, - sk: Option, + inner: Arc, } enum LoopFailure { @@ -87,6 +95,7 @@ impl RendezvousServer { key: &str, rmem: usize, ) -> ResultType<()> { + let (key, sk) = Self::get_server_sk(key); let addr = format!("0.0.0.0:{}", port); let addr2 = format!("0.0.0.0:{}", port - 1); let addr3 = format!("0.0.0.0:{}", port + 2); @@ -109,13 +118,23 @@ impl RendezvousServer { tx: tx.clone(), relay_servers: Default::default(), relay_servers0: Default::default(), - serial, rendezvous_servers: Arc::new(rendezvous_servers), - version, - software_url, - sk: None, + inner: Arc::new(Inner { + serial, + version, + software_url, + sk, + mask: get_arg("mask").parse().ok(), + local_ip: get_arg_or( + "local-ip", + local_ip_address::local_ip() + .map(|x| x.to_string()) + .unwrap_or_default(), + ), + }), }; - let key = rs.get_server_sk(key); + log::info!("mask: {:?}", rs.inner.mask); + log::info!("local-ip: {:?}", rs.inner.local_ip); std::env::set_var("PORT_FOR_API", port.to_string()); rs.parse_relay_servers(&get_arg("relay-servers")); let pm = rs.pm.clone(); @@ -284,10 +303,10 @@ impl RendezvousServer { if rp.id.len() > 0 { log::trace!("New peer registered: {:?} {:?}", &rp.id, &addr); self.update_addr(rp.id, addr, socket).await?; - if self.serial > rp.serial { + if self.inner.serial > rp.serial { let mut msg_out = RendezvousMessage::new(); msg_out.set_configure_update(ConfigUpdate { - serial: self.serial, + serial: self.inner.serial, rendezvous_servers: (*self.rendezvous_servers).clone(), ..Default::default() }); @@ -401,8 +420,10 @@ impl RendezvousServer { self.handle_local_addr(la, addr, Some(socket)).await?; } Some(rendezvous_message::Union::configure_update(mut cu)) => { - if addr.ip() == ADDR_127 && cu.serial > self.serial { - self.serial = cu.serial; + if addr.ip() == ADDR_127 && cu.serial > self.inner.serial { + let mut inner: Inner = (*self.inner).clone(); + inner.serial = cu.serial; + self.inner = Arc::new(inner); self.rendezvous_servers = Arc::new( cu.rendezvous_servers .drain(..) @@ -414,16 +435,16 @@ impl RendezvousServer { ); log::info!( "configure updated: serial={} rendezvous-servers={:?}", - self.serial, + self.inner.serial, self.rendezvous_servers ); } } Some(rendezvous_message::Union::software_update(su)) => { - if !self.version.is_empty() && su.url != self.version { + if !self.inner.version.is_empty() && su.url != self.inner.version { let mut msg_out = RendezvousMessage::new(); msg_out.set_software_update(SoftwareUpdate { - url: self.software_url.clone(), + url: self.inner.software_url.clone(), ..Default::default() }); socket.send(&msg_out, addr).await?; @@ -477,6 +498,10 @@ impl RendezvousServer { rr.set_pk(pk); } let mut msg_out = RendezvousMessage::new(); + if self.is_lan(addr_b) { + // https://github.com/rustdesk/rustdesk-server/issues/24 + rr.relay_server = self.inner.local_ip.clone(); + } msg_out.set_relay_response(rr); allow_err!(self.send_to_tcp_sync(msg_out, addr_b).await); } @@ -492,9 +517,9 @@ impl RendezvousServer { port: addr.port() as _, ..Default::default() }; - if self.serial > tar.serial { + if self.inner.serial > tar.serial { let mut cu = ConfigUpdate::new(); - cu.serial = self.serial; + cu.serial = self.inner.serial; cu.rendezvous_servers = (*self.rendezvous_servers).clone(); res.cu = MessageField::from_option(Some(cu)); } @@ -662,8 +687,15 @@ impl RendezvousServer { return Ok((msg_out, None)); } let mut msg_out = RendezvousMessage::new(); - if unsafe { ALWAYS_USE_RELAY } { - let relay_server = self.get_relay_server(addr.ip(), peer_addr.ip()); + let peer_is_lan = self.is_lan(peer_addr); + let is_lan = self.is_lan(addr); + if unsafe { ALWAYS_USE_RELAY } || (peer_is_lan ^ is_lan) { + let relay_server = if peer_is_lan { + // https://github.com/rustdesk/rustdesk-server/issues/24 + self.inner.local_ip.clone() + } else { + self.get_relay_server(addr.ip(), peer_addr.ip()) + }; if !relay_server.is_empty() { msg_out.set_request_relay(RequestRelay { relay_server, @@ -1077,7 +1109,7 @@ impl RendezvousServer { #[inline] async fn get_pk(&mut self, version: &str, id: String) -> Vec { - if version.is_empty() || self.sk.is_none() { + if version.is_empty() || self.inner.sk.is_none() { Vec::new() } else { match self.pm.get(&id).await { @@ -1091,7 +1123,7 @@ impl RendezvousServer { } .write_to_bytes() .unwrap_or_default(), - &self.sk.as_ref().unwrap(), + &self.inner.sk.as_ref().unwrap(), ) } _ => Vec::new(), @@ -1100,7 +1132,8 @@ impl RendezvousServer { } #[inline] - fn get_server_sk(&mut self, key: &str) -> String { + fn get_server_sk(key: &str) -> (String, Option) { + let mut out_sk = None; let mut key = key.to_owned(); if let Ok(sk) = base64::decode(&key) { if sk.len() == sign::SECRETKEYBYTES { @@ -1108,13 +1141,13 @@ impl RendezvousServer { key = base64::encode(&sk[(sign::SECRETKEYBYTES / 2)..]); let mut tmp = [0u8; sign::SECRETKEYBYTES]; tmp[..].copy_from_slice(&sk); - self.sk = Some(sign::SecretKey(tmp)); + out_sk = Some(sign::SecretKey(tmp)); } } if key.is_empty() || key == "-" || key == "_" { - let (pk, sk) = crate::common::gen_sk(); - self.sk = sk; + let (pk, sk) = crate::common::gen_sk(0); + out_sk = sk; if !key.is_empty() { key = pk; } else { @@ -1126,7 +1159,17 @@ impl RendezvousServer { log::info!("Key: {}", key); std::env::set_var("KEY_FOR_API", key.clone()); } - key + (key, out_sk) + } + + #[inline] + fn is_lan(&self, addr: SocketAddr) -> bool { + if let Some(network) = &self.inner.mask { + if let SocketAddr::V4(addr) = addr { + return network.contains(*addr.ip()); + } + } + false } } diff --git a/src/version.rs b/src/version.rs index 75f232c..a68926b 100644 --- a/src/version.rs +++ b/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "1.1.5"; \ No newline at end of file +pub const VERSION: &str = "1.1.6"; \ No newline at end of file