From faf1855311722bee58cad9d27e67e0bc9915dfd6 Mon Sep 17 00:00:00 2001 From: alterdekim Date: Wed, 28 Aug 2024 02:40:40 +0300 Subject: [PATCH] Changes to be committed: modified: Cargo.lock modified: Cargo.toml modified: src/client.rs modified: src/main.rs modified: src/server.rs --- Cargo.lock | 678 +++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 10 +- src/client.rs | 14 +- src/main.rs | 1 + src/server.rs | 158 ++++++------ 5 files changed, 771 insertions(+), 90 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 18920dd..e7db270 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "aead" version = "0.5.2" @@ -85,6 +91,51 @@ dependencies = [ "winapi", ] +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "async-trait" +version = "0.1.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atty" version = "0.2.14" @@ -102,6 +153,53 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "axum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper 1.0.1", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper 0.1.2", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.73" @@ -112,11 +210,17 @@ dependencies = [ "cc", "cfg-if", "libc", - "miniz_oxide", + "miniz_oxide 0.7.4", "object", "rustc-demangle", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" @@ -255,6 +359,45 @@ dependencies = [ "vec_map", ] +[[package]] +name = "console-api" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ed14aa9c9f927213c6e4f3ef75faaad3406134efe84ba2cb7983431d5f0931" +dependencies = [ + "futures-core", + "prost", + "prost-types", + "tonic", + "tracing-core", +] + +[[package]] +name = "console-subscriber" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e3a111a37f3333946ebf9da370ba5c5577b18eb342ec683eb488dd21980302" +dependencies = [ + "console-api", + "crossbeam-channel", + "crossbeam-utils", + "futures-task", + "hdrhistogram", + "humantime", + "hyper-util", + "prost", + "prost-types", + "serde", + "serde_json", + "thread_local", + "tokio", + "tokio-stream", + "tonic", + "tracing", + "tracing-core", + "tracing-subscriber", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -270,6 +413,15 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-channel" version = "0.5.13" @@ -331,6 +483,12 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "env_logger" version = "0.9.3" @@ -356,6 +514,22 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "flate2" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.0", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + [[package]] name = "futures" version = "0.3.30" @@ -482,12 +656,50 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.4.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hdrhistogram" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d" +dependencies = [ + "base64 0.21.7", + "byteorder", + "flate2", + "nom", + "num-traits", +] + [[package]] name = "hermit-abi" version = "0.1.19" @@ -509,6 +721,52 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "http" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + [[package]] name = "humantime" version = "2.1.0" @@ -524,6 +782,60 @@ dependencies = [ "phf", ] +[[package]] +name = "hyper" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2 0.5.7", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "iana-time-zone" version = "0.1.60" @@ -547,6 +859,16 @@ dependencies = [ "cc", ] +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + [[package]] name = "indexmap" version = "2.4.0" @@ -554,7 +876,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.5", ] [[package]] @@ -572,6 +894,15 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -587,6 +918,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + [[package]] name = "libc" version = "0.2.155" @@ -619,12 +956,39 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "memchr" version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.4" @@ -634,6 +998,15 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + [[package]] name = "mio" version = "1.0.1" @@ -658,6 +1031,16 @@ dependencies = [ "libc", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -723,6 +1106,12 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "phf" version = "0.8.0" @@ -741,6 +1130,26 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "pin-project-lite" version = "0.2.14" @@ -783,6 +1192,38 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prost" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13db3d3fde688c61e2446b4d843bc27a7e8af269a69440c0308021dc92333cc" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18bec9b0adc4eba778b33684b7ba3e7137789434769ee3ce3930463ef904cfca" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "prost-types" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee5168b05f49d4b0ca581206eb14a7b22fafd963efe729ac48eb03266e25cc2" +dependencies = [ + "prost", +] + [[package]] name = "quote" version = "1.0.36" @@ -839,8 +1280,17 @@ checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", ] [[package]] @@ -851,9 +1301,15 @@ checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.4", ] +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.4" @@ -875,16 +1331,23 @@ dependencies = [ "semver", ] +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + [[package]] name = "rustvpn" version = "0.1.2" dependencies = [ "aes-gcm", - "base64", + "base64 0.22.1", "block-modes", "block-padding", "chrono", "clap", + "console-subscriber", "crossbeam-channel", "env_logger", "futures", @@ -940,19 +1403,40 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "serde_json" +version = "1.0.127" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap", + "indexmap 2.4.0", "itoa", "ryu", "serde", "unsafe-libyaml", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -1037,6 +1521,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" + [[package]] name = "termcolor" version = "1.4.1" @@ -1075,6 +1571,16 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tokio" version = "1.39.2" @@ -1090,6 +1596,7 @@ dependencies = [ "signal-hook-registry", "socket2 0.5.7", "tokio-macros", + "tracing", "windows-sys 0.52.0", ] @@ -1104,6 +1611,145 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tonic" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f6ba989e4b2c58ae83d862d3a3e27690b6e3ae630d0deb59f3697f32aa88ad" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost", + "socket2 0.5.7", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "once_cell", + "regex", + "sharded-slab", + "thread_local", + "tracing", + "tracing-core", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "tun2" version = "2.0.5" @@ -1112,12 +1758,15 @@ checksum = "50ff242bea1c5ceb9b6aa4918cf340a6c157e1328a2389c5353cf91049d8cf17" dependencies = [ "bytes", "cfg-if", + "futures-core", "ipnet", "libc", "libloading", "log", "nix", "thiserror", + "tokio", + "tokio-util", "windows-sys 0.52.0", "wintun", ] @@ -1156,6 +1805,12 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "vec_map" version = "0.8.2" @@ -1168,6 +1823,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" diff --git a/Cargo.toml b/Cargo.toml index ba7ee2c..99032df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,12 +3,15 @@ name = "rustvpn" version = "0.1.2" edition = "2021" +[build] +rustflags = ["--cfg", "tokio_unstable"] + # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] clap = "2.33" aes-gcm = "0.10.3" -tokio = { version = "1", features = ["full", "signal"] } +tokio = { version = "1", features = ["full", "signal", "tracing"] } serde = "1.0" serde_derive = "1.0.190" rand = { version = "0.8.5", features = ["small_rng", "getrandom", "std_rng"] } @@ -19,11 +22,12 @@ socket2 = "0.4" env_logger = "0.9" log = "0.4.20" futures = "0.3.30" -tun2 = "2.0.5" +tun2 = { version = "2", features = ["async"] } packet = "0.1.4" crossbeam-channel = "0.5.13" hex = "0.4" serde_yaml = "0.9.34" x25519-dalek = { version = "2.0.1", features = ["getrandom", "static_secrets"] } base64 = "0.22.1" -chrono = "0.4.38" \ No newline at end of file +chrono = "0.4.38" +console-subscriber = "0.4.0" \ No newline at end of file diff --git a/src/client.rs b/src/client.rs index 027be96..f9e2a4f 100644 --- a/src/client.rs +++ b/src/client.rs @@ -65,6 +65,12 @@ fn configure_routes() { pub async fn client_mode(client_config: ClientConfiguration) { info!("Starting client..."); + + + // 59611 + let sock = UdpSocket::bind("0.0.0.0:25565").await.unwrap(); + sock.connect(&client_config.server.endpoint).await.unwrap(); + let mut config = tun2::Configuration::default(); config.address(&client_config.client.address) .netmask("128.0.0.0") @@ -75,12 +81,8 @@ pub async fn client_mode(client_config: ClientConfiguration) { let dev = tun2::create(&config).unwrap(); let (mut dev_reader, mut dev_writer) = dev.split(); - #[cfg(target_os = "linux")] - configure_routes(); - - // 59611 - let sock = UdpSocket::bind("0.0.0.0:25565").await.unwrap(); - sock.connect(&client_config.server.endpoint).await.unwrap(); + //#[cfg(target_os = "linux")] + //configure_routes(); let sock_rec = Arc::new(sock); let sock_snd = sock_rec.clone(); diff --git a/src/main.rs b/src/main.rs index 02aa080..8559ae1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -78,6 +78,7 @@ async fn init_client(cfg_raw: &str) { #[tokio::main] async fn main() { + //console_subscriber::init(); // Initialize the logger with 'info' as the default level Builder::new() diff --git a/src/server.rs b/src/server.rs index 2f329a1..6e5521b 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,4 +1,7 @@ -use crossbeam_channel::unbounded; +//use crossbeam_channel::unbounded; +use futures::{SinkExt, StreamExt}; +use tokio::sync::mpsc; +use tokio::task::JoinSet; use tokio::{net::UdpSocket, sync::Mutex, time}; use x25519_dalek::{PublicKey, StaticSecret}; use std::io::{Read, Write}; @@ -22,24 +25,24 @@ pub async fn server_mode(server_config: ServerConfiguration) { .tun_name("tun0") .up(); - let dev = tun2::create(&config).unwrap(); - let (mut dev_reader, mut dev_writer) = dev.split(); + let dev = tun2::create_as_async(&config).unwrap(); + let (mut dev_writer, mut dev_reader) = dev.into_framed().split(); let sock = UdpSocket::bind(&server_config.interface.bind_address).await.unwrap(); let sock_rec = Arc::new(sock); - let sock_snd = sock_rec.clone(); - let sock_hnd = sock_snd.clone(); + let sock_hnd = sock_rec.clone(); let addresses = Arc::new(Mutex::new(HashMap::::new())); let peers = Arc::new(Mutex::new(Vec::::new())); - let (send2tun, recv2tun) = unbounded::>(); + let (send2tun, mut recv2tun) = mpsc::unbounded_channel::>(); // unbounded::>(); - let (send2hnd, recv2hnd) = unbounded::<(Vec, SocketAddr)>(); + let (send2hnd, mut recv2hnd) = mpsc::unbounded_channel::<(Vec, SocketAddr)>(); // unbounded::<(Vec, SocketAddr)>(); - tokio::spawn(async move { + let tun_writer_task = tokio::spawn(async move { loop { - if let Ok(bytes) = recv2tun.recv() { - dev_writer.write_all(&bytes).unwrap(); + if let Some(bytes) = recv2tun.recv().await { + info!("Sent to tun!"); + let _ = dev_writer.send(bytes).await; } } }); @@ -47,8 +50,8 @@ pub async fn server_mode(server_config: ServerConfiguration) { let keepalive_sec = server_config.interface.keepalive.clone(); let send2hnd_cl = send2hnd.clone(); let addrs_lcl = addresses.clone(); - if keepalive_sec > 0 { - tokio::spawn(async move { + /* if keepalive_sec > 0 { + set.spawn(async move { let kp_sc = keepalive_sec.clone(); loop { time::sleep(time::Duration::from_secs(kp_sc.into())).await; @@ -59,21 +62,22 @@ pub async fn server_mode(server_config: ServerConfiguration) { drop(mmp); } }); - } + }*/ - tokio::spawn(async move { + let sock_writer_task = tokio::spawn(async move { loop { - if let Ok((handshake, addr)) = recv2hnd.recv() { + if let Some((handshake, addr)) = recv2hnd.recv().await { + info!("I SENT THAT STUFF"); let _ = sock_hnd.send_to(&handshake, addr).await; } } }); let addrs_cl = addresses.clone(); - tokio::spawn(async move { - let mut buf = vec![0; 4096]; - while let Ok(n) = dev_reader.read(&mut buf) { - if n <= 19 { continue; } + let send2hnd_sr = send2hnd.clone(); + let tun_reader_task = tokio::spawn(async move { + while let Some(Ok(buf)) = dev_reader.next().await { + if buf.len() <= 19 { continue; } let ip = IpAddr::V4(Ipv4Addr::new(buf[16], buf[17], buf[18], buf[19])); let mp = addrs_cl.lock().await; @@ -82,11 +86,11 @@ pub async fn server_mode(server_config: ServerConfiguration) { let aes = Aes256Gcm::new(&peer.shared_secret.into()); let nonce = Aes256Gcm::generate_nonce(&mut OsRng); - let ciphered_data = aes.encrypt(&nonce, &buf[..n]); + let ciphered_data = aes.encrypt(&nonce, &buf[..]); if let Ok(ciphered_d) = ciphered_data { let vpn_packet = UDPVpnPacket{ data: ciphered_d, nonce: nonce.to_vec()}; - let _ = sock_snd.send_to(&vpn_packet.serialize(), peer.addr).await; + send2hnd_sr.send((vpn_packet.serialize(), peer.addr)); } else { error!("Traffic encryption failed."); } @@ -98,7 +102,6 @@ pub async fn server_mode(server_config: ServerConfiguration) { } }); - let mut buf = vec![0; 2048]; let addrs_lp = addresses.clone(); let peers_lp = peers.clone(); @@ -106,62 +109,69 @@ pub async fn server_mode(server_config: ServerConfiguration) { server_config.peers.iter().for_each(|c| f_plp.push(c.clone())); drop(f_plp); - loop { - if let Ok((len, addr)) = sock_rec.recv_from(&mut buf).await { - info!("There is packet!"); - let mut mp = addrs_lp.lock().await; - let plp = peers_lp.lock().await; - match buf.first() { - Some(h) => { - match h { - 0 => { - let handshake = UDPVpnHandshake::deserialize(&buf); - info!("Got handshake from {:?}", handshake.request_ip); - let skey = BASE64_STANDARD.encode(&handshake.public_key); - if plp.iter().any(|c| c.ip == handshake.request_ip && c.public_key == skey) { - let internal_ip = IpAddr::V4(handshake.request_ip); - info!("Accepted client"); - let mut k = [0u8; 32]; - for (&x, p) in handshake.public_key.iter().zip(k.iter_mut()) { - *p = x; - } - let static_secret = BASE64_STANDARD.decode(&server_config.interface.private_key).unwrap(); - let mut k1 = [0u8; 32]; - for (&x, p) in static_secret.iter().zip(k1.iter_mut()) { - *p = x; - } - let shared_secret = StaticSecret::from(k1) - .diffie_hellman(&PublicKey::from(k)); - mp.insert(internal_ip, UDPeer { addr, shared_secret: *shared_secret.as_bytes() }); - - let handshake_response = UDPVpnHandshake{ public_key: BASE64_STANDARD.decode(&server_config.interface.public_key).unwrap(), request_ip: handshake.request_ip }; + let send2hnd_ssr = send2hnd.clone(); - let _ = send2hnd.send((handshake_response.serialize(), addr)); - } else { - info!("Bad handshake"); - //plp.iter().for_each(|c| info!("ip: {:?}; pkey: {:?}", c.ip, c.public_key)); - } - }, // handshake - 1 => { - let packet = UDPVpnPacket::deserialize(&(buf[..len].to_vec())); - mp.values().filter(| p | p.addr == addr).for_each(|p| { - let aes = Aes256Gcm::new(&p.shared_secret.into()); - let nonce = Nonce::clone_from_slice(&packet.nonce[..]); - match aes.decrypt(&nonce, &packet.data[..]) { - Ok(decrypted) => { let _ = send2tun.send(decrypted); }, - Err(error) => error!("Decryption error! {:?}", error) + let sock_reader_task = tokio::spawn(async move { + let mut buf = vec![0; 2048]; + loop { + if let Ok((len, addr)) = sock_rec.recv_from(&mut buf).await { + info!("There is packet!"); + let mut mp = addrs_lp.lock().await; + let plp = peers_lp.lock().await; + match buf.first() { + Some(h) => { + match h { + 0 => { + let handshake = UDPVpnHandshake::deserialize(&buf); + info!("Got handshake from {:?}", handshake.request_ip); + let skey = BASE64_STANDARD.encode(&handshake.public_key); + if plp.iter().any(|c| c.ip == handshake.request_ip && c.public_key == skey) { + let internal_ip = IpAddr::V4(handshake.request_ip); + info!("Accepted client"); + let mut k = [0u8; 32]; + for (&x, p) in handshake.public_key.iter().zip(k.iter_mut()) { + *p = x; + } + let static_secret = BASE64_STANDARD.decode(&server_config.interface.private_key).unwrap(); + let mut k1 = [0u8; 32]; + for (&x, p) in static_secret.iter().zip(k1.iter_mut()) { + *p = x; + } + let shared_secret = StaticSecret::from(k1) + .diffie_hellman(&PublicKey::from(k)); + mp.insert(internal_ip, UDPeer { addr, shared_secret: *shared_secret.as_bytes() }); + + let handshake_response = UDPVpnHandshake{ public_key: BASE64_STANDARD.decode(&server_config.interface.public_key).unwrap(), request_ip: handshake.request_ip }; + + let _ = send2hnd_ssr.send((handshake_response.serialize(), addr)); + } else { + info!("Bad handshake"); + //plp.iter().for_each(|c| info!("ip: {:?}; pkey: {:?}", c.ip, c.public_key)); } - }); - }, // payload - _ => error!("Unexpected header value.") - } - }, - None => error!("There is no header") + }, // handshake + 1 => { + let packet = UDPVpnPacket::deserialize(&(buf[..len].to_vec())); + mp.values().filter(| p | p.addr == addr).for_each(|p| { + let aes = Aes256Gcm::new(&p.shared_secret.into()); + let nonce = Nonce::clone_from_slice(&packet.nonce[..]); + match aes.decrypt(&nonce, &packet.data[..]) { + Ok(decrypted) => { let _ = send2tun.send(decrypted); }, + Err(error) => error!("Decryption error! {:?}", error) + } + }); + }, // payload + _ => error!("Unexpected header value.") + } + }, + None => error!("There is no header") + } + drop(plp); + drop(mp); } - drop(plp); - drop(mp); } - } + }); + + tokio::join!(tun_reader_task, sock_reader_task, sock_writer_task, tun_writer_task); } struct UDPeer {