diff --git a/Cargo.lock b/Cargo.lock index 77d0b807f..41972d00e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -116,8 +116,8 @@ dependencies = [ "log", "native-tls", "pin-project-lite 0.2.6", - "tokio 1.4.0", - "tokio-native-tls 0.3.0", + "tokio 1.5.0", + "tokio-native-tls", "tokio-rustls 0.22.0", "tungstenite 0.12.0", "webpki-roots", @@ -316,12 +316,6 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" -[[package]] -name = "bytes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0dcbc35f504eb6fc275a6d20e4ebcda18cf50d40ba6fabff8c711fa16cb3b16" - [[package]] name = "bytes" version = "1.0.1" @@ -433,9 +427,9 @@ checksum = "370f715b81112975b1b69db93e0b56ea4cd4e5002ac43b2da8474106a54096a1" dependencies = [ "heck", "proc-macro-error", - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", ] [[package]] @@ -558,9 +552,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca26ee1f8d361640700bde38b2c37d8c22b3ce2d360e1fc1c74ea4b0aa7d775" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils 0.8.3", @@ -637,9 +631,9 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.1.8" +version = "3.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c15b8ec3b5755a188c141c1f6a98e76de31b936209bf066b647979e2a84764a9" +checksum = "232295399409a8b7ae41276757b5a1cc21032848d42bff2352261f958b3ca29a" dependencies = [ "nix 0.20.0", "winapi 0.3.9", @@ -662,7 +656,7 @@ version = "2021.1.2" dependencies = [ "base64 0.9.3", "byteorder", - "bytes 0.5.6", + "bytes 1.0.1", "ceviche", "cfg-if 0.1.10", "chrono", @@ -673,7 +667,7 @@ dependencies = [ "embed-resource", "exitcode", "failure", - "futures 0.3.13", + "futures 0.3.14", "hostname", "hyper 0.13.10", "indexmap", @@ -703,11 +697,11 @@ dependencies = [ "sspi", "tempfile", "tokio 0.2.25", - "tokio 0.3.7", + "tokio 1.5.0", "tokio-compat-02", - "tokio-rustls 0.20.0", + "tokio-rustls 0.22.0", "tokio-tungstenite", - "tokio-util 0.4.0", + "tokio-util 0.6.6", "url 1.7.2", "url_serde", "uuid 0.8.2", @@ -780,9 +774,9 @@ dependencies = [ [[package]] name = "dtoa" -version = "0.4.7" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d7ed2934d741c6b37e33e3832298e8850b53fd2d2bea03873375596c7cea4e" +checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" [[package]] name = "either" @@ -851,9 +845,9 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", "synstructure", ] @@ -936,9 +930,9 @@ checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" [[package]] name = "futures" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f55667319111d593ba876406af7c409c0ebb44dc4be6132a783ccf163ea14c1" +checksum = "a9d5813545e459ad3ca1bff9915e9ad7f1a47dc6a91b627ce321d5863b7dd253" dependencies = [ "futures-channel", "futures-core", @@ -951,9 +945,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2dd2df839b57db9ab69c2c9d8f3e8c81984781937fe2807dc6dcf3b2ad2939" +checksum = "ce79c6a52a299137a6013061e0cf0e688fce5d7f1bc60125f520912fdb29ec25" dependencies = [ "futures-core", "futures-sink", @@ -961,9 +955,9 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15496a72fabf0e62bdc3df11a59a3787429221dd0710ba8ef163d6f7a9112c94" +checksum = "098cd1c6dda6ca01650f1a37a794245eb73181d0d4d4e955e2f3c37db7af1815" [[package]] name = "futures-cpupool" @@ -977,9 +971,9 @@ dependencies = [ [[package]] name = "futures-executor" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891a4b7b96d84d5940084b2a37632dd65deeae662c114ceaa2c879629c9c0ad1" +checksum = "10f6cb7042eda00f0049b1d2080aa4b93442997ee507eb3828e8bd7577f94c9d" dependencies = [ "futures-core", "futures-task", @@ -988,39 +982,39 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71c2c65c57704c32f5241c1223167c2c3294fd34ac020c807ddbe6db287ba59" +checksum = "365a1a1fb30ea1c03a830fdb2158f5236833ac81fa0ad12fe35b29cddc35cb04" [[package]] name = "futures-macro" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea405816a5139fb39af82c2beb921d52143f556038378d6db21183a5c37fbfb7" +checksum = "668c6733a182cd7deb4f1de7ba3bf2120823835b3bcfbeacf7d2c4a773c1bb8b" dependencies = [ "proc-macro-hack", - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", ] [[package]] name = "futures-sink" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85754d98985841b7d4f5e8e6fbfa4a4ac847916893ec511a2917ccd8525b8bb3" +checksum = "5c5629433c555de3d82861a7a4e3794a4c40040390907cfbfd7143a92a426c23" [[package]] name = "futures-task" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa189ef211c15ee602667a6fcfe1c1fd9e07d42250d2156382820fba33c9df80" +checksum = "ba7aa51095076f3ba6d9a1f702f74bd05ec65f555d70d2033d55ba8d69f581bc" [[package]] name = "futures-util" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1812c7ab8aedf8d6f2701a43e1243acdbcc2b36ab26e2ad421eb99ac963d96d1" +checksum = "3c144ad54d60f23927f0a6b6d816e4271278b64f005ad65e4e35291d2de9c025" dependencies = [ "futures-channel", "futures-core", @@ -1122,7 +1116,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http 0.2.3", + "http 0.2.4", "indexmap", "slab", "tokio 0.2.25", @@ -1208,9 +1202,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747" +checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" dependencies = [ "bytes 1.0.1", "fnv", @@ -1236,14 +1230,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" dependencies = [ "bytes 0.5.6", - "http 0.2.3", + "http 0.2.4", ] [[package]] name = "httparse" -version = "1.3.5" +version = "1.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691" +checksum = "bc35c995b9d93ec174cf9a27d425c7892722101e14993cd227fdb51d70cf9589" [[package]] name = "httpdate" @@ -1307,7 +1301,7 @@ dependencies = [ "futures-core", "futures-util", "h2 0.2.7", - "http 0.2.3", + "http 0.2.4", "http-body 0.3.1", "httparse", "httpdate", @@ -1365,15 +1359,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "input_buffer" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a8a95243d5a0398cae618ec29477c6e3cb631152be5c19481f80bc71559754" -dependencies = [ - "bytes 0.5.6", -] - [[package]] name = "input_buffer" version = "0.4.0" @@ -1476,7 +1461,7 @@ dependencies = [ "slog", "slog-async", "slog-term", - "tokio 1.4.0", + "tokio 1.5.0", "uuid 0.8.2", ] @@ -1484,14 +1469,14 @@ dependencies = [ name = "jetsocat-proxy" version = "0.1.0" dependencies = [ - "tokio 1.4.0", + "tokio 1.5.0", ] [[package]] name = "js-sys" -version = "0.3.49" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc15e39392125075f60c95ba416f5381ff6c3a948ff02ab12464715adf56c821" +checksum = "2d99f9e3e84b8f67f846ef5b4cbbc3b1c29f6c759fcbce6f01aa0e73d932a24c" dependencies = [ "wasm-bindgen", ] @@ -1536,9 +1521,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.91" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8916b1f6ca17130ec6568feccee27c156ad12037880833a3b842a823236502e7" +checksum = "9385f66bf6105b241aa65a61cb923ef20efc665cb9f9bb50ac2f0c4b7f378d41" [[package]] name = "libm" @@ -1557,9 +1542,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" +checksum = "5a3c91c24eae6777794bb1997ad98bbb87daf92890acab859f7eaa4320333176" dependencies = [ "scopeguard", ] @@ -1861,9 +1846,9 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", ] [[package]] @@ -2016,7 +2001,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" dependencies = [ "instant", - "lock_api 0.4.2", + "lock_api 0.4.3", "parking_lot_core 0.8.3", ] @@ -2175,9 +2160,9 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a490329918e856ed1b083f244e3bfe2d8c4f336407e4ea9e1a9f479ff09049e5" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", ] [[package]] @@ -2228,9 +2213,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", "version_check", ] @@ -2240,7 +2225,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", "version_check", ] @@ -2268,9 +2253,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" dependencies = [ "unicode-xid 0.2.1", ] @@ -2313,7 +2298,7 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", ] [[package]] @@ -2714,9 +2699,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e2dd7c860fa4b3c61763e2b3408a809deae1d607a91082a87d0009b7e7f5afa" dependencies = [ "base64 0.13.0", - "futures 0.3.13", + "futures 0.3.14", "futures-util", - "http 0.2.3", + "http 0.2.4", "http-body 0.3.1", "hyper 0.13.10", "log", @@ -2749,10 +2734,10 @@ version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd78fb0515ec7e4daef1255e9dbb18d3cd209029bceab9fd06554cd2a4c33fc9" dependencies = [ - "http 0.2.3", - "proc-macro2 1.0.24", + "http 0.2.4", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", ] [[package]] @@ -2773,9 +2758,9 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "sct" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3042af939fca8c3453b7af0f1c66e533a15a86169e39de2657310ade8f98d3c" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" dependencies = [ "ring", "untrusted", @@ -2783,15 +2768,15 @@ dependencies = [ [[package]] name = "seahorse" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce7d9440e2865cce0db733bdc530591b37d37a2d32badace34a1fc9ba5686d58" +checksum = "8bee1fe454786f1d236a07cb3d3adcbaca96e9ba42d23bc58de059937bb059bd" [[package]] name = "security-framework" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d493c5f39e02dfb062cd8f33301f90f9b13b650e8c1b1d0fd75c19dd64bff69d" +checksum = "3670b1d2fdf6084d192bc71ead7aabe6c06aa2ea3fbd9cc3ac111fa5c2b1bd84" dependencies = [ "bitflags", "core-foundation 0.9.1", @@ -2802,9 +2787,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee48cdde5ed250b0d3252818f646e174ab414036edb884dde62d80a3ac6082d" +checksum = "3676258fd3cfe2c9a0ec99ce3038798d847ce3e4bb17746373eb9f0f1ac16339" dependencies = [ "core-foundation-sys 0.8.2", "libc", @@ -2849,9 +2834,9 @@ version = "1.0.125" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", ] [[package]] @@ -3165,9 +3150,9 @@ checksum = "5ba9cdfda491b814720b6b06e0cac513d922fc407582032e8706e9f137976f90" dependencies = [ "heck", "proc-macro-error", - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", ] [[package]] @@ -3195,11 +3180,11 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.65" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a1d708c221c5a612956ef9f75b37e454e88d1f7b899fbd3a18d4252012d663" +checksum = "48fe99c6bd8b1cc636890bcc071842de909d902c81ac7dab53ba33c421ab8ffb" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", "unicode-xid 0.2.1", ] @@ -3210,9 +3195,9 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b834f2d66f734cb897113e34aaff2f1ab4719ca946f9a7358dba8f8064148701" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", "unicode-xid 0.2.1", ] @@ -3332,9 +3317,9 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", ] [[package]] @@ -3367,9 +3352,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" +checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" dependencies = [ "tinyvec_macros", ] @@ -3441,25 +3426,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46409491c9375a693ce7032101970a54f8a2010efb77e13f70788f0d84489e39" dependencies = [ "autocfg 1.0.1", - "bytes 0.6.0", - "futures-core", - "libc", - "memchr", - "mio 0.7.11", - "num_cpus", - "once_cell", "pin-project-lite 0.2.6", - "signal-hook-registry", - "slab", - "tokio-macros 0.3.2", - "winapi 0.3.9", ] [[package]] name = "tokio" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134af885d758d645f0f0505c9a8b3f9bf8a348fd822e112ab5248138348f1722" +checksum = "83f0c8e7c0addab50b663055baf787d0af7f413a46e6e7fb9559a4e4db7137a5" dependencies = [ "autocfg 1.0.1", "bytes 1.0.1", @@ -3487,15 +3461,16 @@ dependencies = [ [[package]] name = "tokio-compat-02" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4cec419b8b6f06c32e74aae6d8c5e79646d038a38e5ea2b36045f2c3296e22" +checksum = "e7d4237822b7be8fff0a7a27927462fad435dcb6650f95cea9e946bf6bdc7e07" dependencies = [ "bytes 0.5.6", "once_cell", - "pin-project-lite 0.1.12", + "pin-project-lite 0.2.6", "tokio 0.2.25", - "tokio 0.3.7", + "tokio 1.5.0", + "tokio-stream", ] [[package]] @@ -3535,20 +3510,9 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e44da00bfc73a25f814cd8d7e57a68a5c31b74b3152a0a1d1f590c97ed06265a" dependencies = [ - "proc-macro2 1.0.24", - "quote 1.0.9", - "syn 1.0.65", -] - -[[package]] -name = "tokio-macros" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46dfffa59fc3c8aad216ed61bdc2c263d2b9d87a9c8ac9de0c11a813e51b6db7" -dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", ] [[package]] @@ -3557,19 +3521,9 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", -] - -[[package]] -name = "tokio-native-tls" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501c8252b73bd01379aaae1521523c2629ff1bc6ea46c29e0baff515cee60f1b" -dependencies = [ - "native-tls", - "tokio 0.3.7", + "syn 1.0.69", ] [[package]] @@ -3579,7 +3533,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" dependencies = [ "native-tls", - "tokio 1.4.0", + "tokio 1.5.0", ] [[package]] @@ -3630,10 +3584,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" dependencies = [ "rustls 0.19.0", - "tokio 1.4.0", + "tokio 1.5.0", "webpki", ] +[[package]] +name = "tokio-stream" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e177a5d8c3bf36de9ebe6d58537d8879e964332f93fb3339e43f618c81361af0" +dependencies = [ + "futures-core", + "pin-project-lite 0.2.6", + "tokio 1.5.0", +] + [[package]] name = "tokio-sync" version = "0.1.8" @@ -3689,16 +3654,15 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.11.0" -source = "git+https://github.com/snapview/tokio-tungstenite?rev=3c6d4280d77fdff3e25f68ad703d94e89f38dae2#3c6d4280d77fdff3e25f68ad703d94e89f38dae2" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e96bb520beab540ab664bd5a9cfeaa1fcd846fa68c830b42e2c8963071251d2" dependencies = [ "futures-util", "log", - "native-tls", "pin-project", - "tokio 0.3.7", - "tokio-native-tls 0.2.0", - "tungstenite 0.11.1", + "tokio 1.5.0", + "tungstenite 0.13.0", ] [[package]] @@ -3717,16 +3681,16 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.4.0" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24793699f4665ba0416ed287dc794fe6b11a4aa5e4e95b58624f45f6c46b97d4" +checksum = "940a12c99365c31ea8dd9ba04ec1be183ffe4920102bb7122c2f515437601e8e" dependencies = [ - "bytes 0.5.6", + "bytes 1.0.1", "futures-core", "futures-sink", "log", - "pin-project-lite 0.1.12", - "tokio 0.3.7", + "pin-project-lite 0.2.6", + "tokio 1.5.0", ] [[package]] @@ -3783,19 +3747,19 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.11.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0308d80d86700c5878b9ef6321f020f29b1bb9d5ff3cab25e75e23f3a492a23" +checksum = "8ada8297e8d70872fa9a551d93250a9f407beb9f37ef86494eb20012a2ff7c24" dependencies = [ - "base64 0.12.3", + "base64 0.13.0", "byteorder", - "bytes 0.5.6", - "http 0.2.3", + "bytes 1.0.1", + "http 0.2.4", "httparse", - "input_buffer 0.3.1", + "input_buffer", "log", "native-tls", - "rand 0.7.3", + "rand 0.8.3", "sha-1", "url 2.2.1", "utf-8", @@ -3803,20 +3767,20 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ada8297e8d70872fa9a551d93250a9f407beb9f37ef86494eb20012a2ff7c24" +checksum = "5fe8dada8c1a3aeca77d6b51a4f1314e0f4b8e438b7b1b71e3ddaca8080e4093" dependencies = [ "base64 0.13.0", "byteorder", "bytes 1.0.1", - "http 0.2.3", + "http 0.2.4", "httparse", - "input_buffer 0.4.0", + "input_buffer", "log", - "native-tls", "rand 0.8.3", "sha-1", + "thiserror", "url 2.2.1", "utf-8", ] @@ -3838,9 +3802,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" dependencies = [ "matches", ] @@ -4031,9 +3995,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.72" +version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fe8f61dba8e5d645a4d8132dc7a0a66861ed5e1045d2c0ed940fab33bac0fbe" +checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -4041,24 +4005,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.72" +version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046ceba58ff062da072c7cb4ba5b22a37f00a302483f7e2a6cdc18fedbdc1fd3" +checksum = "ae70622411ca953215ca6d06d3ebeb1e915f0f6613e3b495122878d7ebec7dae" dependencies = [ "bumpalo", "lazy_static", "log", - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.72" +version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef9aa01d36cda046f797c57959ff5f3c615c9cc63997a8d545831ec7976819b" +checksum = "3e734d91443f177bfdb41969de821e15c516931c3c3db3d318fa1b68975d0f6f" dependencies = [ "quote 1.0.9", "wasm-bindgen-macro-support", @@ -4066,28 +4030,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.72" +version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96eb45c1b2ee33545a813a92dbb53856418bf7eb54ab34f7f7ff1448a5b3735d" +checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.72" +version = "0.2.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7148f4696fb4960a346eaa60bbfb42a1ac4ebba21f750f75fc1375b098d5ffa" +checksum = "d9a543ae66aa233d14bb765ed9af4a33e81b8b58d1584cf1b47ff8cd0b9e4489" [[package]] name = "web-sys" -version = "0.3.49" +version = "0.3.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fe19d70f5dacc03f6e46777213facae5ac3801575d56ca6cbd4c93dcd12310" +checksum = "a905d57e488fec8861446d3393670fb50d27a262344013181c2cdf9fff5481be" dependencies = [ "js-sys", "wasm-bindgen", @@ -4105,9 +4069,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.21.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82015b7e0b8bad8185994674a13a93306bea76cf5a16c5a181382fd3a5ec2376" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" dependencies = [ "webpki", ] @@ -4227,8 +4191,8 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f369ddb18862aba61aa49bf31e74d29f0f162dec753063200e1dc084345d16" dependencies = [ - "proc-macro2 1.0.24", + "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.65", + "syn 1.0.69", "synstructure", ] diff --git a/devolutions-gateway/Cargo.toml b/devolutions-gateway/Cargo.toml index 48e325306..98bddbe95 100644 --- a/devolutions-gateway/Cargo.toml +++ b/devolutions-gateway/Cargo.toml @@ -19,16 +19,17 @@ url = "1.7.1" url_serde = "0.2.0" hostname = "^0.3" lazy_static = "1.2.0" -tokio = { version = "0.3.4", features = ["signal", "net", "io-util", "time", "rt", "rt-multi-thread", "sync", "macros"]} +tokio = { version = "1", features = ["signal", "net", "io-util", "time", "rt", "rt-multi-thread", "sync", "macros"]} tokio_02 = {version = "0.2", package = "tokio", features = ["rt-core", "time"]} -tokio-util = { version = "0.4", features = ["codec"] } -tokio-tungstenite = { git = "https://github.com/snapview/tokio-tungstenite", rev = "3c6d4280d77fdff3e25f68ad703d94e89f38dae2", features = [ "tls" ] } -tokio-compat-02 = "0.1" +tokio-util = { version = "0.6", features = ["codec"] } +tokio-tungstenite = "0.14" +tokio-compat-02 = "0.2" +tokio-rustls = { version = "0.22", features = ["dangerous_configuration"] } futures = "0.3" webpki = "0.21.0" native-tls = "0.2" byteorder = "1.2.7" -bytes = "0.5" +bytes = "1" uuid = { version = "0.8", features = ["v4", "serde"] } pcap-file = "0.10.0" packet = { git = "https://github.com/fdubois1/rust-packet.git" } @@ -62,11 +63,6 @@ version = "2.8" default-features = false features = ["https", "json", "macro", "form"] -[dependencies.tokio-rustls] -git = "https://github.com/tokio-rs/tls.git" -rev = "a517e1d0a636359c4e54b0735d7f4e73b786d2c0" -features = ["dangerous_configuration"] - [target.'cfg(windows)'.dependencies] winapi = { version = "0.3", features = ["winbase", "winuser", "winsvc", "libloaderapi", "errhandlingapi", "winerror"] } diff --git a/devolutions-gateway/src/config.rs b/devolutions-gateway/src/config.rs index cf5d32aca..36e30d8bf 100644 --- a/devolutions-gateway/src/config.rs +++ b/devolutions-gateway/src/config.rs @@ -56,9 +56,9 @@ cfg_if! { #[derive(Debug, Clone, Copy)] pub enum Protocol { - WAYK, - RDP, - UNKNOWN, + Wayk, + Rdp, + Unknown, } #[derive(Debug, Clone)] @@ -116,7 +116,7 @@ impl Default for Config { hostname: default_hostname, routing_url: None, capture_path: None, - protocol: Protocol::UNKNOWN, + protocol: Protocol::Unknown, log_file: None, application_protocols: Vec::new(), certificate: CertificateConfig { @@ -567,9 +567,9 @@ impl Config { if let Some(protocol) = matches.value_of(ARG_PROTOCOL) { match protocol { - "wayk" => config.protocol = Protocol::WAYK, - "rdp" => config.protocol = Protocol::RDP, - _ => config.protocol = Protocol::UNKNOWN, + "wayk" => config.protocol = Protocol::Wayk, + "rdp" => config.protocol = Protocol::Rdp, + _ => config.protocol = Protocol::Unknown, } }; diff --git a/devolutions-gateway/src/interceptor/mod.rs b/devolutions-gateway/src/interceptor/mod.rs index fd1f5581d..af1794ce2 100644 --- a/devolutions-gateway/src/interceptor/mod.rs +++ b/devolutions-gateway/src/interceptor/mod.rs @@ -39,10 +39,9 @@ impl PeerInfo { pub struct UnknownMessageReader; impl MessageReader for UnknownMessageReader { fn get_messages(&mut self, data: &mut Vec, _source: PduSource) -> Vec> { - let mut result = Vec::new(); - result.push(data.clone()); - data.clear(); - result + let mut destination = Vec::new(); + std::mem::swap(data, &mut destination); + vec![destination] } } diff --git a/devolutions-gateway/src/interceptor/pcap_recording.rs b/devolutions-gateway/src/interceptor/pcap_recording.rs index 0bf4f89d0..bf9c292b9 100644 --- a/devolutions-gateway/src/interceptor/pcap_recording.rs +++ b/devolutions-gateway/src/interceptor/pcap_recording.rs @@ -1,12 +1,10 @@ use crate::interceptor::{PacketInterceptor, PeerInfo}; use crate::plugin_manager::{PacketsParser, Recorder, PLUGIN_MANAGER}; use slog_scope::{debug, error}; -use std::{ - net::SocketAddr, - sync::{Arc, Condvar, Mutex}, - thread, - time::Duration, -}; +use std::net::SocketAddr; +use std::sync::{Arc, Condvar, Mutex}; +use std::thread; +use std::time::Duration; #[derive(Debug)] enum RecordingState { diff --git a/devolutions-gateway/src/jet_client.rs b/devolutions-gateway/src/jet_client.rs index a8520f121..1f7334bef 100644 --- a/devolutions-gateway/src/jet_client.rs +++ b/devolutions-gateway/src/jet_client.rs @@ -5,33 +5,26 @@ use std::pin::Pin; use std::sync::Arc; use byteorder::{BigEndian, LittleEndian, ReadBytesExt}; -use jet_proto::{ - accept::{JetAcceptReq, JetAcceptRsp}, - connect::{JetConnectReq, JetConnectRsp}, - test::{JetTestReq, JetTestRsp}, - JetMessage, StatusCode, JET_VERSION_V1, JET_VERSION_V2, -}; +use jet_proto::accept::{JetAcceptReq, JetAcceptRsp}; +use jet_proto::connect::{JetConnectReq, JetConnectRsp}; +use jet_proto::test::{JetTestReq, JetTestRsp}; +use jet_proto::{JetMessage, StatusCode, JET_VERSION_V1, JET_VERSION_V2}; use slog_scope::{debug, error}; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use tokio::sync::Mutex; use uuid::Uuid; -use crate::{ - config::Config, - http::controllers::jet::{remove_association, JetTpType}, - interceptor::pcap_recording::PcapRecordingInterceptor, - jet::{ - association::Association, - candidate::{Candidate, CandidateState}, - TransportType, - }, - transport::{tcp::TcpTransport, JetTransport, Transport}, - utils::{ - association::{remove_jet_association, ACCEPT_REQUEST_TIMEOUT}, - create_tls_connector, into_other_io_error as error_other, - }, - Proxy, -}; +use crate::config::Config; +use crate::http::controllers::jet::{remove_association, JetTpType}; +use crate::interceptor::pcap_recording::PcapRecordingInterceptor; +use crate::jet::association::Association; +use crate::jet::candidate::{Candidate, CandidateState}; +use crate::jet::TransportType; +use crate::transport::tcp::TcpTransport; +use crate::transport::{JetTransport, Transport}; +use crate::utils::association::{remove_jet_association, ACCEPT_REQUEST_TIMEOUT}; +use crate::utils::{create_tls_connector, into_other_io_error as error_other}; +use crate::Proxy; use tokio_rustls::{TlsAcceptor, TlsStream}; diff --git a/devolutions-gateway/src/plugin_manager.rs b/devolutions-gateway/src/plugin_manager.rs index 80c93d87d..8d593197f 100644 --- a/devolutions-gateway/src/plugin_manager.rs +++ b/devolutions-gateway/src/plugin_manager.rs @@ -1,4 +1,5 @@ -use dlopen::{symbor::Library, Error}; +use dlopen::symbor::Library; +use dlopen::Error; use lazy_static::lazy_static; use slog_scope::debug; use std::sync::{Arc, Mutex}; diff --git a/devolutions-gateway/src/plugin_manager/packets_parsing.rs b/devolutions-gateway/src/plugin_manager/packets_parsing.rs index 58f2a7f41..6c6edef07 100644 --- a/devolutions-gateway/src/plugin_manager/packets_parsing.rs +++ b/devolutions-gateway/src/plugin_manager/packets_parsing.rs @@ -1,7 +1,10 @@ use crate::utils::into_other_io_error; use dlopen::symbor::{Library, SymBorApi, Symbol}; use dlopen_derive::SymBorApi; -use std::{io::Error, mem::transmute, slice::from_raw_parts, sync::Arc}; +use std::io::Error; +use std::mem::transmute; +use std::slice::from_raw_parts; +use std::sync::Arc; pub type NowPacketParser = usize; diff --git a/devolutions-gateway/src/plugin_manager/plugin_info.rs b/devolutions-gateway/src/plugin_manager/plugin_info.rs index 8f4abcf42..c294d3521 100644 --- a/devolutions-gateway/src/plugin_manager/plugin_info.rs +++ b/devolutions-gateway/src/plugin_manager/plugin_info.rs @@ -2,7 +2,13 @@ use crate::utils::into_other_io_error; use dlopen::symbor::{Library, SymBorApi, Symbol}; use dlopen_derive::SymBorApi; use slog_scope::{debug, error}; -use std::{convert::TryFrom, ffi::CStr, io::Error, mem::transmute, os::raw::c_char, slice::from_raw_parts, sync::Arc}; +use std::convert::TryFrom; +use std::ffi::CStr; +use std::io::Error; +use std::mem::transmute; +use std::os::raw::c_char; +use std::slice::from_raw_parts; +use std::sync::Arc; #[derive(Debug, PartialEq)] pub enum PluginCapabilities { diff --git a/devolutions-gateway/src/plugin_manager/recording.rs b/devolutions-gateway/src/plugin_manager/recording.rs index 9dd3080ce..c7f44b75b 100644 --- a/devolutions-gateway/src/plugin_manager/recording.rs +++ b/devolutions-gateway/src/plugin_manager/recording.rs @@ -2,15 +2,13 @@ use crate::plugin_manager::packets_parsing::ImageUpdate; use crate::utils::into_other_io_error; use dlopen::symbor::{Library, SymBorApi, Symbol}; use dlopen_derive::SymBorApi; +use std::ffi::CString; +use std::io::Error; +use std::mem::transmute; +use std::os::raw::c_char; +use std::path::{Path, PathBuf}; use std::string::FromUtf8Error; -use std::{ - ffi::CString, - io::Error, - mem::transmute, - os::raw::c_char, - path::{Path, PathBuf}, - sync::Arc, -}; +use std::sync::Arc; pub type RecordingContext = usize; const MAX_PATH_LEN: usize = 512; diff --git a/devolutions-gateway/src/proxy.rs b/devolutions-gateway/src/proxy.rs index 6a32972fc..3599c4a7d 100644 --- a/devolutions-gateway/src/proxy.rs +++ b/devolutions-gateway/src/proxy.rs @@ -1,20 +1,18 @@ use crate::config::{Config, Protocol}; use crate::interceptor::pcap::PcapInterceptor; use crate::interceptor::rdp::RdpMessageReader; -use crate::interceptor::PacketInterceptor; -use crate::interceptor::{MessageReader, UnknownMessageReader, WaykMessageReader}; +use crate::interceptor::{MessageReader, PacketInterceptor, UnknownMessageReader, WaykMessageReader}; use crate::rdp::{DvcManager, RDP8_GRAPHICS_PIPELINE_NAME}; use crate::transport::{Transport, BIP_BUFFER_LEN}; use crate::SESSION_IN_PROGRESS_COUNT; use futures::{select, FutureExt, StreamExt}; use slog_scope::{info, warn}; use spsc_bip_buffer::bip_buffer_with_len; -use std::{ - collections::HashMap, - io, - path::PathBuf, - sync::{atomic::Ordering, Arc}, -}; +use std::collections::HashMap; +use std::io; +use std::path::PathBuf; +use std::sync::atomic::Ordering; +use std::sync::Arc; pub struct Proxy { config: Arc, @@ -31,12 +29,12 @@ impl Proxy { client_transport: U, ) -> Result<(), io::Error> { match self.config.protocol { - Protocol::WAYK => { + Protocol::Wayk => { info!("WaykMessageReader will be used to interpret application protocol."); self.build_with_message_reader(server_transport, client_transport, Some(Box::new(WaykMessageReader))) .await } - Protocol::RDP => { + Protocol::Rdp => { info!("RdpMessageReader will be used to interpret application protocol"); self.build_with_message_reader( server_transport, @@ -50,7 +48,7 @@ impl Proxy { ) .await } - Protocol::UNKNOWN => { + Protocol::Unknown => { warn!("Protocol is unknown. Data received will not be split to get application message."); self.build_with_message_reader(server_transport, client_transport, Some(Box::new(UnknownMessageReader))) .await diff --git a/devolutions-gateway/src/rdp.rs b/devolutions-gateway/src/rdp.rs index 6eba2b6fc..647413db6 100644 --- a/devolutions-gateway/src/rdp.rs +++ b/devolutions-gateway/src/rdp.rs @@ -7,13 +7,20 @@ mod preconnection_pdu; mod sequence_future; +use self::accept_connection_future::AcceptConnectionFuture; +use self::connection_sequence_future::ConnectionSequenceFuture; +use self::sequence_future::create_downgrade_dvc_capabilities_future; +use crate::config::Config; +use crate::interceptor::rdp::RdpMessageReader; +use crate::jet_client::JetAssociationsMap; +use crate::jet_rendezvous_tcp_proxy::JetRendezvousTcpProxy; +use crate::transport::tcp::TcpTransport; +use crate::transport::{JetTransport, Transport}; +use crate::{utils, Proxy}; use accept_connection_future::AcceptConnectionMode; use slog_scope::{error, info}; - use sspi::internal::credssp; use sspi::AuthIdentity; - -use bytes::Buf; use std::io; use std::sync::Arc; use tokio::io::AsyncWriteExt; @@ -23,18 +30,6 @@ use url::Url; pub use self::dvc_manager::{DvcManager, RDP8_GRAPHICS_PIPELINE_NAME}; -use self::accept_connection_future::AcceptConnectionFuture; -use self::connection_sequence_future::ConnectionSequenceFuture; -use self::sequence_future::create_downgrade_dvc_capabilities_future; - -use crate::config::Config; -use crate::interceptor::rdp::RdpMessageReader; -use crate::jet_client::JetAssociationsMap; -use crate::jet_rendezvous_tcp_proxy::JetRendezvousTcpProxy; -use crate::transport::tcp::TcpTransport; -use crate::transport::{JetTransport, Transport}; -use crate::{utils, Proxy}; - pub const GLOBAL_CHANNEL_NAME: &str = "GLOBAL"; pub const USER_CHANNEL_NAME: &str = "USER"; pub const DR_DYN_VC_CHANNEL_NAME: &str = "drdynvc"; @@ -102,13 +97,15 @@ impl RdpClient { })?; match mode { - AcceptConnectionMode::RdpTcp { url, leftover_request } => { + AcceptConnectionMode::RdpTcp { + url, + mut leftover_request, + } => { info!("Starting RDP-TCP redirection"); let mut server_conn = TcpTransport::connect(&url).await?; let client_transport = TcpTransport::new(client); - let mut leftover_request = leftover_request.bytes(); server_conn.write_buf(&mut leftover_request).await.map_err(|e| { error!("Failed to write leftover request: {}", e); e @@ -127,10 +124,8 @@ impl RdpClient { } => { info!("Starting RdpTcpRendezvous redirection"); - let leftover_request = leftover_request.bytes(); - JetRendezvousTcpProxy::new(jet_associations, JetTransport::new_tcp(client), association_id) - .proxy(config, leftover_request) + .proxy(config, &*leftover_request) .await } AcceptConnectionMode::RdpTls { identity, request } => { diff --git a/devolutions-gateway/src/service.rs b/devolutions-gateway/src/service.rs index 4005c19f2..5829d918c 100644 --- a/devolutions-gateway/src/service.rs +++ b/devolutions-gateway/src/service.rs @@ -1,26 +1,3 @@ -use std::collections::HashMap; -use std::future::Future; -use std::io; -use std::net::{SocketAddr, ToSocketAddrs}; -use std::pin::Pin; -use std::sync::Arc; - -use futures::stream::StreamExt; -use tokio::net::{TcpListener, TcpStream}; -use tokio::runtime::Runtime; -use tokio::sync::Mutex; -use tokio_compat_02::FutureExt as _; - -use tokio_compat_02::IoCompat; -use tokio_rustls::{rustls, TlsAcceptor, TlsStream}; - -use hyper::service::service_fn; -use url::Url; - -use slog::{o, Logger}; -use slog_scope::{error, info, slog_error, warn}; -use slog_scope_futures::future03::FutureExt; - use crate::config::Config; use crate::http::http_server::configure_http_server; use crate::jet_client::{JetAssociationsMap, JetClient}; @@ -31,9 +8,25 @@ use crate::transport::tcp::TcpTransport; use crate::transport::ws::WsTransport; use crate::transport::JetTransport; use crate::utils::{ - get_default_port_from_server_url, get_pub_key_from_der, load_certs, load_private_key, AsyncReadWrite, Incoming, + get_default_port_from_server_url, get_pub_key_from_der, load_certs, load_private_key, AsyncReadWrite, }; use crate::websocket_client::{WebsocketService, WsClient}; +use hyper::service::service_fn; +use slog::{o, Logger}; +use slog_scope::{error, info, slog_error, warn}; +use slog_scope_futures::future03::FutureExt; +use std::collections::HashMap; +use std::future::Future; +use std::io; +use std::net::{SocketAddr, ToSocketAddrs}; +use std::pin::Pin; +use std::sync::Arc; +use tokio::net::{TcpSocket, TcpStream}; +use tokio::runtime::Runtime; +use tokio::sync::Mutex; +use tokio_compat_02::{FutureExt as _, IoCompat}; +use tokio_rustls::{rustls, TlsAcceptor, TlsStream}; +use url::Url; type VecOfFuturesType = Vec> + Send + 'static>>>; @@ -195,32 +188,28 @@ pub fn create_context(config: Arc, logger: slog::Logger) -> Result, logger: Logger, ) -> Result<(), String> { + use futures::FutureExt as _; + info!("Starting TCP jet server ({})...", url); let socket_addr = url @@ -241,107 +232,114 @@ async fn start_tcp_server( .next() .unwrap(); - let listener = TcpListener::bind(&socket_addr).await.unwrap(); - let mut incoming = Incoming { - listener: &listener, - accept: None, - }; - while let Some(Ok(conn)) = incoming.next().await { - // Configure logger - let mut logger = logger.clone(); - if let Ok(peer_addr) = conn.peer_addr() { - logger = logger.new(o!("client" => peer_addr.to_string())); - } - if let Ok(local_addr) = conn.local_addr() { - logger = logger.new(o!("listener" => local_addr.to_string())); - } - if let Some(url) = &config.routing_url { - logger = logger.new(o!("scheme" => url.scheme().to_string())); - } - - set_socket_option(&conn, &logger); + let socket = TcpSocket::new_v4().unwrap(); + socket.bind(socket_addr).unwrap(); + set_socket_option(&socket, &logger); + let listener = socket.listen(1024).unwrap(); - let client_fut: Pin> + Send + 'static>> = - if let Some(routing_url) = &config.routing_url { - match routing_url.scheme() { - "tcp" => { - let transport = TcpTransport::new(conn); - Box::pin(Client::new(routing_url.clone(), config.clone()).serve(transport)) - } - "tls" => { - let tls_stream = tls_acceptor - .accept(conn) - .await - .map_err(|err| format!("TlsAcceptor handshake error - {:?}", err))?; - let transport = TcpTransport::new_tls(TlsStream::Server(tls_stream)); - Box::pin(Client::new(routing_url.clone(), config.clone()).serve(transport)) - } - "ws" => { - let peer_addr = conn.peer_addr().ok(); - - let stream = tokio_tungstenite::accept_async(conn) - .await - .map_err(|err| format!("Tokio-tungstenite handshake error - {:?}", err))?; + info!("TCP jet server started successfully. Now listening on {}", socket_addr); - let transport = WsTransport::new_tcp(stream, peer_addr); - Box::pin(WsClient::new(routing_url.clone(), config.clone()).serve(transport)) - } - "wss" => { - let tls_stream = tls_acceptor - .accept(conn) - .await - .map_err(|err| format!("TlsAcceptor handshake error - {:?}", err))?; - - let peer_addr = tls_stream.get_ref().0.peer_addr().ok(); - let stream = tokio_tungstenite::accept_async(TlsStream::Server(tls_stream)) - .await - .map_err(|err| format!("Tokio-tungstenite handshake error - {:?}", err))?; - - let transport = WsTransport::new_tls(stream, peer_addr); - Box::pin(WsClient::new(routing_url.clone(), config.clone()).serve(transport)) - } - "rdp" => Box::pin( - RdpClient::new( - config.clone(), - tls_public_key.clone(), - tls_acceptor.clone(), - jet_associations.clone(), - ) - .serve(conn), - ), - scheme => panic!("Unsupported routing URL scheme {}", scheme), + loop { + match listener.accept().await { + Ok((conn, peer_addr)) => { + // Configure logger + let mut logger = logger.new(o!("client" => peer_addr.to_string())); + if let Ok(local_addr) = conn.local_addr() { + logger = logger.new(o!("listener" => local_addr.to_string())); } - } else { - let mut peeked = [0; 4]; - let _ = conn.peek(&mut peeked).await; - - if peeked == [74, 69, 84, 0] { - // four first bytes matching JET protocol - let jet_client = JetClient::new(config.clone(), jet_associations.clone()); - Box::pin(jet_client.serve(JetTransport::new_tcp(conn), tls_acceptor.clone())) - } else { - let rdp_client = RdpClient::new( - config.clone(), - tls_public_key.clone(), - tls_acceptor.clone(), - jet_associations.clone(), - ); - Box::pin(rdp_client.serve(conn)) + if let Some(url) = &config.routing_url { + logger = logger.new(o!("scheme" => url.scheme().to_string())); } - }; - let client_fut = client_fut.with_logger(logger); - tokio::spawn(async move { - match client_fut.await { - Ok(_) => {} - Err(e) => error!("Error with client: {}", e), - } - }); - } + set_stream_option(&conn, &logger); - info!("TCP jet server started successfully. Now listening on {}", socket_addr); + let client_fut: Pin> + Send + 'static>> = + if let Some(routing_url) = &config.routing_url { + match routing_url.scheme() { + "tcp" => { + let transport = TcpTransport::new(conn); + Box::pin(Client::new(routing_url.clone(), config.clone()).serve(transport)) + } + "tls" => { + let tls_stream = tls_acceptor + .accept(conn) + .await + .map_err(|err| format!("TlsAcceptor handshake error - {:?}", err))?; + let transport = TcpTransport::new_tls(TlsStream::Server(tls_stream)); + Box::pin(Client::new(routing_url.clone(), config.clone()).serve(transport)) + } + "ws" => { + let peer_addr = conn.peer_addr().ok(); - Ok(()) + let stream = tokio_tungstenite::accept_async(conn) + .await + .map_err(|err| format!("Tokio-tungstenite handshake error - {:?}", err))?; + + let transport = WsTransport::new_tcp(stream, peer_addr); + Box::pin(WsClient::new(routing_url.clone(), config.clone()).serve(transport)) + } + "wss" => { + let tls_stream = tls_acceptor + .accept(conn) + .await + .map_err(|err| format!("TlsAcceptor handshake error - {:?}", err))?; + + let peer_addr = tls_stream.get_ref().0.peer_addr().ok(); + let stream = tokio_tungstenite::accept_async(TlsStream::Server(tls_stream)) + .await + .map_err(|err| format!("Tokio-tungstenite handshake error - {:?}", err))?; + + let transport = WsTransport::new_tls(stream, peer_addr); + Box::pin(WsClient::new(routing_url.clone(), config.clone()).serve(transport)) + } + "rdp" => Box::pin( + RdpClient::new( + config.clone(), + tls_public_key.clone(), + tls_acceptor.clone(), + jet_associations.clone(), + ) + .serve(conn), + ), + scheme => panic!("Unsupported routing URL scheme {}", scheme), + } + } else { + let tls_public_key = tls_public_key.clone(); + let jet_associations = jet_associations.clone(); + let config = config.clone(); + let tls_acceptor = tls_acceptor.clone(); + async { + let mut peeked = [0; 4]; + let _ = conn.peek(&mut peeked).await; + + if peeked == [74, 69, 84, 0] { + // four first bytes matching JET protocol + let jet_client = JetClient::new(config, jet_associations); + jet_client.serve(JetTransport::new_tcp(conn), tls_acceptor).await + } else { + let rdp_client = RdpClient::new( + config.clone(), + tls_public_key, + tls_acceptor.clone(), + jet_associations.clone(), + ); + rdp_client.serve(conn).await + } + } + .boxed() + }; + + let client_fut = client_fut.with_logger(logger); + tokio::spawn(async move { + match client_fut.await { + Ok(_) => {} + Err(e) => error!("Error with client: {}", e), + } + }); + } + Err(e) => warn!("{}", format!("Tcp listener failed to accept connection - {:?}", e)), + } + } } async fn start_websocket_server( @@ -372,9 +370,10 @@ async fn start_websocket_server( .parse::() .expect("Websocket addr can't be parsed."); - let websocket_listener = TcpListener::bind(websocket_addr) - .await - .map_err(|err| format!("{}", err))?; + let socket = TcpSocket::new_v4().unwrap(); + socket.bind(websocket_addr).unwrap(); + set_socket_option(&socket, &logger); + let websocket_listener = socket.listen(1024).unwrap(); let websocket_service = WebsocketService { jet_associations, @@ -389,7 +388,7 @@ async fn start_websocket_server( type ConnectionType = Box; let connection_process = - |connection: ConnectionType, remote_addr: Option, websocket_service: WebsocketService| { + |connection: ConnectionType, remote_addr: SocketAddr, websocket_service: WebsocketService| { let http = hyper::server::conn::Http::new(); let listener_logger = listener_logger.clone(); @@ -410,55 +409,41 @@ async fn start_websocket_server( }); }; - let mut incoming = Incoming { - listener: &websocket_listener, - accept: None, - }; + info!("WebSocket server started successfully. Listening on {}", websocket_addr); match websocket_url.scheme() { - "ws" => { - while let Some(tcp) = incoming.next().await { - match tcp { - Ok(tcp) => { - set_socket_option(&tcp, &logger); - - let remote_addr = tcp.peer_addr().ok(); - let conn = Box::new(tcp) as ConnectionType; - - connection_process(conn, remote_addr, websocket_service.clone()); - } - Err(err) => warn!( - "{}", - format!("WebSocket listener failed to accept connection - {:?}", err) - ), + "ws" => loop { + match websocket_listener.accept().await { + Ok((tcp, remote_addr)) => { + set_stream_option(&tcp, &logger); + let conn = Box::new(tcp) as ConnectionType; + connection_process(conn, remote_addr, websocket_service.clone()); } + Err(err) => warn!( + "{}", + format!("WebSocket listener failed to accept connection - {:?}", err) + ), } - } - "wss" => { - while let Some(tcp) = incoming.next().await { - match tcp { - Ok(tcp) => { - set_socket_option(&tcp, &logger); - - match tls_acceptor.accept(tcp).await { - Ok(tls) => { - let remote_addr = tls.get_ref().0.peer_addr().ok(); - let conn = Box::new(tls) as ConnectionType; - connection_process(conn, remote_addr, websocket_service.clone()); - } - Err(err) => warn!("{}", format!("TlsAcceptor failed to accept handshake - {:?}", err)), + }, + "wss" => loop { + match websocket_listener.accept().await { + Ok((tcp, remote_addr)) => { + set_stream_option(&tcp, &logger); + + match tls_acceptor.accept(tcp).await { + Ok(tls) => { + let conn = Box::new(tls) as ConnectionType; + connection_process(conn, remote_addr, websocket_service.clone()); } + Err(err) => warn!("{}", format!("TlsAcceptor failed to accept handshake - {:?}", err)), } - Err(err) => warn!( - "{}", - format!("WebSocket listener failed to accept connection - {:?}", err) - ), } + Err(err) => warn!( + "{}", + format!("WebSocket listener failed to accept connection - {:?}", err) + ), } - } + }, scheme => panic!("Not a websocket scheme {}", scheme), - }; - - info!("WebSocket server started successfully. Listening on {}", websocket_addr); - Ok(()) + } } diff --git a/devolutions-gateway/src/transport/tcp.rs b/devolutions-gateway/src/transport/tcp.rs index 78dc872cf..acc8b0981 100644 --- a/devolutions-gateway/src/transport/tcp.rs +++ b/devolutions-gateway/src/transport/tcp.rs @@ -10,10 +10,8 @@ use tokio::net::TcpStream; use tokio_rustls::TlsStream; use url::Url; -use crate::{ - transport::{JetFuture, JetSinkImpl, JetSinkType, JetStreamImpl, JetStreamType, Transport}, - utils::{create_tls_connector, resolve_url_to_socket_arr}, -}; +use crate::transport::{JetFuture, JetSinkImpl, JetSinkType, JetStreamImpl, JetStreamType, Transport}; +use crate::utils::{create_tls_connector, resolve_url_to_socket_arr}; #[allow(clippy::large_enum_variant)] pub enum TcpStreamWrapper { diff --git a/devolutions-gateway/src/transport/ws.rs b/devolutions-gateway/src/transport/ws.rs index f2c83c2b9..f336ce341 100644 --- a/devolutions-gateway/src/transport/ws.rs +++ b/devolutions-gateway/src/transport/ws.rs @@ -13,10 +13,9 @@ use tokio::io::{self, AsyncRead, AsyncWrite, ReadBuf}; use tokio::net::TcpStream; use tokio_compat_02::IoCompat; use tokio_rustls::{rustls, TlsConnector, TlsStream}; -use tokio_tungstenite::tungstenite; use tokio_tungstenite::tungstenite::handshake::client::Request; use tokio_tungstenite::tungstenite::protocol::Role; -use tokio_tungstenite::WebSocketStream; +use tokio_tungstenite::{tungstenite, WebSocketStream}; use url::Url; enum WsStreamSendState { diff --git a/devolutions-gateway/src/utils.rs b/devolutions-gateway/src/utils.rs index 403dde515..7bf430058 100644 --- a/devolutions-gateway/src/utils.rs +++ b/devolutions-gateway/src/utils.rs @@ -1,29 +1,19 @@ pub mod association; -use std::{ - collections::HashMap, - fs, - future::Future, - hash::Hash, - io::{self, BufReader}, - net::SocketAddr, - pin::Pin, - sync::Arc, - task::{Context, Poll}, -}; - -use futures::{ready, stream::Stream}; -use tokio::{ - io::{AsyncRead, AsyncWrite}, - net::{lookup_host, TcpListener, TcpStream}, -}; +use crate::config::CertificateConfig; +use std::collections::HashMap; +use std::fs; +use std::hash::Hash; +use std::io::{self, BufReader}; +use std::net::SocketAddr; +use std::sync::Arc; +use tokio::io::{AsyncRead, AsyncWrite}; +use tokio::net::{lookup_host, TcpStream}; use tokio_rustls::{rustls, Connect, TlsConnector}; use tokio_util::codec::{Decoder, Encoder, Framed, FramedParts}; use url::Url; use x509_parser::parse_x509_der; -use crate::config::CertificateConfig; - pub mod danger_transport { use tokio_rustls::rustls; @@ -246,36 +236,8 @@ where } pub trait AsyncReadWrite: AsyncRead + AsyncWrite {} -impl AsyncReadWrite for T where T: AsyncRead + AsyncWrite + Send + Sync + 'static {} - -// Now in tokio 0.3.3 TcpListener::incoming() is temporary removed and will be returned in one of the next patches. -// The next struct is created in purpose to fill the gap. -// When incoming() will be returned, the Incoming struct should be replaced with the same from tokio - -type AcceptType<'a> = Option> + Send + Sync + 'a>>>; - -pub struct Incoming<'a> { - pub listener: &'a TcpListener, - pub accept: AcceptType<'a>, -} -impl Stream for Incoming<'_> { - type Item = io::Result; - - fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - loop { - if self.accept.is_none() { - self.accept = Some(Box::pin(self.listener.accept())); - } - - if let Some(f) = &mut self.accept { - let res = ready!(f.as_mut().poll(cx)); - self.accept = None; - return Poll::Ready(Some(res.map(|(stream, _)| stream))); - } - } - } -} +impl AsyncReadWrite for T where T: AsyncRead + AsyncWrite + Send + Sync + 'static {} pub fn get_default_port_from_server_url(url: &Url) -> io::Result { match url.scheme() { diff --git a/devolutions-gateway/src/websocket_client.rs b/devolutions-gateway/src/websocket_client.rs index f0066af57..ce1203d0f 100644 --- a/devolutions-gateway/src/websocket_client.rs +++ b/devolutions-gateway/src/websocket_client.rs @@ -25,11 +25,7 @@ pub struct WebsocketService { } impl WebsocketService { - pub async fn handle( - &mut self, - req: Request, - client_addr: Option, - ) -> Result, io::Error> { + pub async fn handle(&mut self, req: Request, client_addr: SocketAddr) -> Result, io::Error> { if req.method() == Method::GET && req.uri().path().starts_with("/jet/accept") { info!("{} {}", req.method(), req.uri().path()); handle_jet_accept(req, client_addr, self.jet_associations.clone()) @@ -92,7 +88,7 @@ async fn handle_jet_test_impl( async fn handle_jet_accept( req: Request, - client_addr: Option, + client_addr: SocketAddr, jet_associations: JetAssociationsMap, ) -> Result, saphir::error::InternalError> { match handle_jet_accept_impl(req, client_addr, jet_associations).await { @@ -107,7 +103,7 @@ async fn handle_jet_accept( async fn handle_jet_accept_impl( req: Request, - client_addr: Option, + client_addr: SocketAddr, jet_associations: JetAssociationsMap, ) -> Result, ()> { let header = req.headers().get("upgrade").ok_or(())?; @@ -140,7 +136,7 @@ async fn handle_jet_accept_impl( if let Some(assc) = jet_assc.get_mut(&association_id) { if let Some(candidate) = assc.get_candidate_mut(candidate_id) { candidate.set_state(CandidateState::Accepted); - let ws_transport = WsTransport::new_http(upgrade, client_addr).await; + let ws_transport = WsTransport::new_http(upgrade, Some(client_addr)).await; candidate.set_transport(JetTransport::Ws(ws_transport)); } } @@ -154,7 +150,7 @@ async fn handle_jet_accept_impl( async fn handle_jet_connect( req: Request, - client_addr: Option, + client_addr: SocketAddr, jet_associations: JetAssociationsMap, config: Arc, ) -> Result, saphir::error::InternalError> { @@ -170,7 +166,7 @@ async fn handle_jet_connect( async fn handle_jet_connect_impl( req: Request, - client_addr: Option, + client_addr: SocketAddr, jet_associations: JetAssociationsMap, config: Arc, ) -> Result, ()> { @@ -220,7 +216,7 @@ async fn handle_jet_connect_impl( let server_transport = candidate .take_transport() .expect("Candidate cannot be created without a transport"); - let ws_transport = WsTransport::new_http(upgrade, client_addr).await; + let ws_transport = WsTransport::new_http(upgrade, Some(client_addr)).await; let client_transport = JetTransport::Ws(ws_transport); candidate.set_state(CandidateState::Connected); candidate.set_client_nb_bytes_read(client_transport.clone_nb_bytes_read());