diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 08f5b83..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,1404 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "actix" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb72882332b6d6282f428b77ba0358cb2687e61a6f6df6a6d3871e8a177c2d4f" -dependencies = [ - "actix-macros", - "actix-rt", - "actix_derive", - "bitflags 2.4.2", - "bytes", - "crossbeam-channel", - "futures-core", - "futures-sink", - "futures-task", - "futures-util", - "log", - "once_cell", - "parking_lot", - "pin-project-lite", - "smallvec", - "tokio", - "tokio-util", -] - -[[package]] -name = "actix-macros" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" -dependencies = [ - "quote", - "syn 2.0.48", -] - -[[package]] -name = "actix-rt" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" -dependencies = [ - "actix-macros", - "futures-core", - "tokio", -] - -[[package]] -name = "actix-server" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" -dependencies = [ - "actix-rt", - "actix-service", - "actix-utils", - "futures-core", - "futures-util", - "mio", - "socket2", - "tokio", - "tracing", -] - -[[package]] -name = "actix-service" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" -dependencies = [ - "futures-core", - "paste", - "pin-project-lite", -] - -[[package]] -name = "actix-tls" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4cce60a2f2b477bc72e5cde0af1812a6e82d8fd85b5570a5dcf2a5bf2c5be5f" -dependencies = [ - "actix-rt", - "actix-service", - "actix-utils", - "futures-core", - "impl-more", - "pin-project-lite", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tokio-util", - "tracing", -] - -[[package]] -name = "actix-utils" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" -dependencies = [ - "local-waker", - "pin-project-lite", -] - -[[package]] -name = "actix_derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c7db3d5a9718568e4cf4a537cfd7070e6e6ff7481510d0237fb529ac850f6d3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "asn1-rs" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" -dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror", - "time", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" - -[[package]] -name = "bonknet_broker" -version = "0.1.0" -dependencies = [ - "actix", - "actix-rt", - "actix-server", - "actix-service", - "actix-tls", - "futures", - "libbonknet", - "rand", - "rcgen", - "rmp-serde", - "rustls", - "serde", - "thiserror", - "tokio", - "tokio-util", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "bonknet_client" -version = "0.1.0" -dependencies = [ - "futures", - "libbonknet", - "rmp-serde", - "rustls-pemfile", - "serde", - "tokio", - "tokio-rustls", - "tokio-util", -] - -[[package]] -name = "bonknet_server" -version = "0.1.0" -dependencies = [ - "futures", - "libbonknet", - "rcgen", - "rmp-serde", - "rustls-pemfile", - "tokio", - "tokio-rustls", - "tokio-util", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "bumpalo" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "crossbeam-channel" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" - -[[package]] -name = "data-encoding" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" - -[[package]] -name = "der-parser" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "displaydoc" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "getrandom" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "hermit-abi" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" - -[[package]] -name = "impl-more" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" - -[[package]] -name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" - -[[package]] -name = "js-sys" -version = "0.3.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a1d36f1235bc969acba30b7f5990b864423a6068a10f7c90ae8f0112e3a59d1" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "libbonknet" -version = "0.1.0" -dependencies = [ - "rustls-pemfile", - "serde", - "tokio-rustls", -] - -[[package]] -name = "libc" -version = "0.2.152" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" - -[[package]] -name = "local-waker" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" - -[[package]] -name = "lock_api" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "memchr" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys", -] - -[[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 = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "oid-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" -dependencies = [ - "asn1-rs", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets", -] - -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "pem" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8fcc794035347fb64beda2d3b462595dd2753e3f268d89c5aae77e8cf2c310" -dependencies = [ - "base64", - "serde", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro2" -version = "1.0.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rcgen" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48406db8ac1f3cbc7dcdb56ec355343817958a356ff430259bb07baf7607e1e1" -dependencies = [ - "pem", - "ring 0.17.7", - "time", - "x509-parser", - "yasna", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" -dependencies = [ - "cc", - "getrandom", - "libc", - "spin 0.9.8", - "untrusted 0.9.0", - "windows-sys", -] - -[[package]] -name = "rmp" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" -dependencies = [ - "byteorder", - "num-traits", - "paste", -] - -[[package]] -name = "rmp-serde" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" -dependencies = [ - "byteorder", - "rmp", - "serde", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustls" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" -dependencies = [ - "log", - "ring 0.17.7", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pemfile" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e4980fa29e4c4b212ffb3db068a564cbf560e51d3944b7c88bd8bf5bec64f4" -dependencies = [ - "base64", - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a716eb65e3158e90e17cd93d855216e27bde02745ab842f2cab4a39dba1bacf" - -[[package]] -name = "rustls-webpki" -version = "0.102.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" -dependencies = [ - "ring 0.17.7", - "rustls-pki-types", - "untrusted 0.9.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "serde" -version = "1.0.195" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.195" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" - -[[package]] -name = "socket2" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" -dependencies = [ - "libc", - "windows-sys", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "subtle" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - -[[package]] -name = "thiserror" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "thread_local" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "time" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" -dependencies = [ - "deranged", - "itoa", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" -dependencies = [ - "time-core", -] - -[[package]] -name = "tokio" -version = "1.35.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "tracing", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "log", - "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.48", -] - -[[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-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "nu-ansi-term", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1223296a201415c7fad14792dbefaace9bd52b62d33453ade1c5b5f07555406" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcdc935b63408d58a32f8cc9738a0bffd8f05cc7c002086c6ef20b7312ad9dcd" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.48", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c238561b2d428924c49815533a8b9121c664599558a5d9ec51f8a1740a999" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bae1abb6806dc1ad9e560ed242107c0f6c84335f1749dd4e8ddb012ebd5e25a7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.48", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b" - -[[package]] -name = "web-sys" -version = "0.3.67" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58cd2333b6e0be7a39605f0e255892fd7418a682d8da8fe042fe25128794d2ed" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "x509-parser" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da" -dependencies = [ - "asn1-rs", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "ring 0.16.20", - "rusticata-macros", - "thiserror", - "time", -] - -[[package]] -name = "yasna" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" -dependencies = [ - "time", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/bonknet_broker/Cargo.toml b/bonknet_broker/Cargo.toml index 9ac6de5..09a5e66 100644 --- a/bonknet_broker/Cargo.toml +++ b/bonknet_broker/Cargo.toml @@ -24,6 +24,7 @@ serde = "1" rmp-serde = "1.1.2" rcgen = { version = "0.12.1", features = ["x509-parser"] } rand = "0.8.5" +uuid = { version = "1.7.0", features = ["v4", "serde"] } [[bin]] name = "init_certs" diff --git a/bonknet_broker/src/main.rs b/bonknet_broker/src/main.rs index 01e091c..7b983be 100644 --- a/bonknet_broker/src/main.rs +++ b/bonknet_broker/src/main.rs @@ -1,11 +1,14 @@ mod servercertdb; +mod pendingdataconndb; +mod servermanager; use servercertdb::*; +use pendingdataconndb::*; +use servermanager::*; use actix::prelude::*; use std::collections::HashMap; use std::sync::{Arc}; use std::time::{Instant, Duration}; -use actix::fut::wrap_future; use libbonknet::*; use rustls::{RootCertStore, ServerConfig}; use rustls::server::WebPkiClientVerifier; @@ -16,12 +19,14 @@ use actix_service::{ServiceFactoryExt as _}; use futures::{StreamExt, SinkExt}; use rand::random; use tokio_util::codec::{Framed, FramedRead, FramedWrite, LengthDelimitedCodec}; -use tracing::{info, error}; +use tracing::{info, error, warn}; use rcgen::{Certificate, CertificateParams, DnType, KeyPair}; +use thiserror::Error; use tokio::io::{ReadHalf, WriteHalf}; use tokio_util::bytes::{Bytes, BytesMut}; use tokio::io::Error; use tokio::sync::{oneshot, Mutex}; +use uuid::Uuid; type TransportStream = Framed, LengthDelimitedCodec>; type TransportStreamTx = FramedWrite>, LengthDelimitedCodec>; @@ -47,131 +52,6 @@ fn generate_server_cert(root_cert: &Certificate, name: &str) -> ServerCert { } -#[derive(MessageResponse)] -enum SendMsgResult { - Accepted, - Rejected, -} - -#[derive(Message)] -#[rtype(result = "SendMsgResult")] -struct SendMsg { - msg: ToServerMessageBody, - reply_channel: oneshot::Sender -} - -#[derive(Message)] -#[rtype(result = "()")] -struct SendPing; - -struct ServerTransporter { - rx: Option, - tx: Arc>, - last_transmission: Instant, - reply_channels: HashMap>, -} - -impl ServerTransporter { - fn new(transport: TransportStream) -> Self { - let internal = transport.into_inner(); - let (srx, stx) = tokio::io::split(internal); - let codec = LengthDelimitedCodec::new(); - let rx = FramedRead::new(srx, codec.clone()); - let tx = FramedWrite::new(stx, codec.clone()); - ServerTransporter { - rx: Some(rx), - tx: Arc::new(Mutex::new(tx)), - last_transmission: Instant::now(), - reply_channels: HashMap::new(), - } - } -} - -impl Actor for ServerTransporter { - type Context = Context; - - fn started(&mut self, ctx: &mut Self::Context) { - let rx = self.rx.take().expect("Rx Stream not found"); - ctx.add_stream(rx); - ctx.run_interval(Duration::from_secs(60), |_s, c| { - c.notify(SendPing); - }); - } -} - -impl Handler for ServerTransporter { - type Result = (); - - fn handle(&mut self, _msg: SendPing, ctx: &mut Self::Context) -> Self::Result { - let msg = ToServerMessage::Ping; - let payload: Bytes = rmp_serde::to_vec(&msg).unwrap().into(); - let arc_tx = self.tx.clone(); - ctx.spawn(wrap_future::<_, Self>(async move { - arc_tx.lock().await.send(payload).await - }).map(|res, _a, _ctx| { - info!("Ping sent result: {:?}", res); - })); - } -} - -impl Handler for ServerTransporter { - type Result = SendMsgResult; - - fn handle(&mut self, msg: SendMsg, ctx: &mut Self::Context) -> Self::Result { - let mut reply_id: u64; - if self.reply_channels.len() == u64::MAX as usize { - return SendMsgResult::Rejected; - } - loop { - reply_id = random(); - if !self.reply_channels.contains_key(&reply_id) { - break; - } - } - self.reply_channels.insert(reply_id, msg.reply_channel); - let msg = ToServerMessage::Msg { - reply_id, - body: msg.msg, - }; - let payload: Bytes = rmp_serde::to_vec(&msg).unwrap().into(); - let arc_tx = self.tx.clone(); - ctx.spawn(async move { - arc_tx.lock().await.send(payload).await - }.into_actor(self).map(|res, _a, _ctx| { - info!("ToServerMsg sent result: {:?}", res); - })); - SendMsgResult::Accepted - } -} - -impl StreamHandler> for ServerTransporter { - fn handle(&mut self, item: Result, _ctx: &mut Self::Context) { - match item { - Ok(buf) => { - use FromServerReply::*; - let msg: FromServerReply = rmp_serde::from_slice(&buf).unwrap(); - match msg { - Pong => { - self.last_transmission = Instant::now(); - } - Msg { reply_id, body } => match self.reply_channels.remove(&reply_id) { - None => {} - Some(reply_tx) => { - if let Err(_e) = reply_tx.send(body) { - error!("Oneshot channel {} got invalidated! No reply sent.", reply_id); - } - } - } - } - } - Err(e) => { - error!("ERROR {:?}", e); - } - } - } -} - - #[actix_rt::main] async fn main() { // Tracing Subscriber @@ -211,9 +91,9 @@ async fn main() { server_root_prkey ).unwrap()).unwrap()); - let server_db_addr = ServerCertDB { - db: HashMap::new(), - }.start(); + let scdb_addr = ServerCertDB::new().start(); + let pdcm_addr = PendingDataConnManager::new().start(); + let sm_addr = ServerManager::new(pdcm_addr.clone()).start(); Server::build() .bind("server-command", ("localhost", 2541), move || { @@ -221,7 +101,8 @@ async fn main() { let client_root_cert_der = Arc::clone(&client_root_cert_der); let guestserver_root_cert_der = Arc::clone(&guestserver_root_cert_der); let server_root_cert = Arc::clone(&server_root_cert); - let server_db_addr = server_db_addr.clone(); + let scdb_addr = scdb_addr.clone(); + let sm_addr = sm_addr.clone(); // Set up TLS service factory server_acceptor @@ -232,11 +113,14 @@ async fn main() { let client_root_cert_der = Arc::clone(&client_root_cert_der); let guestserver_root_cert_der = Arc::clone(&guestserver_root_cert_der); let server_root_cert = Arc::clone(&server_root_cert); - let server_db_addr = server_db_addr.clone(); + let scdb_addr = scdb_addr.clone(); + let sm_addr = sm_addr.clone(); async move { let peer_certs = stream.get_ref().1.peer_certificates().unwrap(); let peer_cert_bytes = peer_certs.first().unwrap().to_vec(); let peer_root_cert_der = peer_certs.last().unwrap().clone(); + let scdb_addr = scdb_addr.clone(); + let sm_addr = sm_addr.clone(); if peer_root_cert_der == *server_root_cert_der { info!("Server connection"); let mut transport = Framed::new(stream, LengthDelimitedCodec::new()); @@ -254,15 +138,22 @@ async fn main() { info!("SendCommand Stream"); let reply = ToServerConnTypeReply::OkSendCommand; transport.send(rmp_serde::to_vec(&reply).unwrap().into()).await.unwrap(); - server_command_handler(transport, peer_cert_bytes, &server_db_addr).await; + server_command_handler(transport, peer_cert_bytes, scdb_addr).await; } Subscribe => { info!("Subscribe Stream"); + let name = match scdb_addr.send(FetchName { cert: peer_cert_bytes }).await.unwrap() { + None => { + error!("Cert has no name assigned!"); + let reply = ToServerConnTypeReply::GenericFailure; + transport.send(rmp_serde::to_vec(&reply).unwrap().into()).await.unwrap(); + return Ok(()); + } + Some(name) => name, + }; let reply = ToServerConnTypeReply::OkSubscribe; transport.send(rmp_serde::to_vec(&reply).unwrap().into()).await.unwrap(); - // TODO: If I pass transport away and the service returns, what happen to the connection? - // in theory it will remain open but better check - server_subscribe_handler(transport).await; + server_subscribe_handler(transport, name, sm_addr).await; } } } @@ -277,9 +168,13 @@ async fn main() { let server_root_cert = Arc::clone(&server_root_cert); let codec = LengthDelimitedCodec::new(); let transport = Framed::new(stream, codec); - guestserver_handler(transport, &server_db_addr, &server_root_cert).await; + guestserver_handler(transport, scdb_addr, &server_root_cert).await; } else if peer_root_cert_der == *client_root_cert_der { info!("Client connection"); + //pdcm_addr + let codec = LengthDelimitedCodec::new(); + let transport = Framed::new(stream, codec); + client_handler(transport, sm_addr).await; } else { error!("Unknown Root Certificate"); } @@ -293,22 +188,18 @@ async fn main() { .unwrap(); } -async fn server_subscribe_handler(transport: TransportStream) { - let h = ServerTransporter::new(transport).start(); - info!("Actor spawned"); - tokio::time::sleep(Duration::from_secs(5)).await; - info!("5 seconds elapsed, sending msg"); - let (tx, rx) = oneshot::channel(); - h.send(SendMsg { - msg: ToServerMessageBody::Required { id: "session_id".to_string() }, - reply_channel: tx, - }).await.unwrap(); - if let Ok(item) = rx.await { - info!("Response: {:?}", item); +async fn server_subscribe_handler(transport: TransportStream, name: String, sm_addr: Addr) { + match sm_addr.send(StartTransporter { name, transport }).await.unwrap() { + Ok(_) => { + info!("Stream sent to the manager"); + } + Err(e) => { + error!("Error from manager: {:?}", e); + } } } -async fn server_command_handler(mut transport: TransportStream, peer_cert_bytes: Vec, server_db_addr: &Addr) { +async fn server_command_handler(mut transport: TransportStream, peer_cert_bytes: Vec, server_db_addr: Addr) { loop { match transport.next().await { None => { @@ -323,7 +214,25 @@ async fn server_command_handler(mut transport: TransportStream, peer_cert_bytes: match msg { ChangeName { name } => { info!("Changing name to {}", name); - // TODO + match server_db_addr.send(UnregisterServer { cert: peer_cert_bytes.clone() }).await.unwrap() { + None => { + info!("Nothing to unregister"); + } + Some(old_name) => { + warn!("Unregistered from old name {}", old_name); + } + } + let reply = match server_db_addr.send(RegisterServer { cert: peer_cert_bytes.clone(), name }).await.unwrap() { + Ok(_) => { + info!("Registered!"); + ToServerCommandReply::NameChanged + } + Err(e) => { + error!("Error registering: {:?}", e); + ToServerCommandReply::GenericFailure + } + }; + transport.send(rmp_serde::to_vec(&reply).unwrap().into()).await.unwrap(); } WhoAmI => { info!("Asked who I am"); @@ -351,7 +260,7 @@ async fn server_command_handler(mut transport: TransportStream, peer_cert_bytes: } // TODO: Considera creare un context dove vengono contenute tutte le chiavi e gli address da dare a tutti gli handler -async fn guestserver_handler(mut transport: TransportStream, server_db_addr: &Addr, server_root_cert: &Arc) { +async fn guestserver_handler(mut transport: TransportStream, server_db_addr: Addr, server_root_cert: &Arc) { loop { match transport.next().await { None => { @@ -396,3 +305,48 @@ async fn guestserver_handler(mut transport: TransportStream, server_db_addr: &Ad } } } + +async fn client_handler(mut transport: TransportStream, sm_addr: Addr) { + loop { + match transport.next().await { + None => { + info!("Transport returned None"); + break; + } + Some(item) => { + match item { + Ok(buf) => { + let msg: FromClientCommand = rmp_serde::from_slice(&buf).unwrap(); + info!("{:?}", msg); + match msg { + FromClientCommand::RequestServer { name } => { + info!("REQUESTED SERVER {}", name); + let data = sm_addr.send(RequestServer { name }).await.unwrap(); + match data { + Ok(client_conn_id) => { + let reply = ToClientResponse::OkRequest { conn_id: client_conn_id }; + transport.send(rmp_serde::to_vec(&reply).unwrap().into()).await.unwrap(); + info!("Sent OkRequest"); + } + Err(e) => { + error!("Error! {:?}", e); + } + } + } + FromClientCommand::ServerList => { + info!("Requested ServerList"); + let data = sm_addr.send(GetServerList {}).await.unwrap(); + let reply = ToClientResponse::OkServerList { data }; + transport.send(rmp_serde::to_vec(&reply).unwrap().into()).await.unwrap(); + } + } + } + Err(e) => { + info!("Disconnection: {:?}", e); + break; + } + } + } + } + } +} diff --git a/bonknet_broker/src/pendingdataconndb.rs b/bonknet_broker/src/pendingdataconndb.rs new file mode 100644 index 0000000..592844a --- /dev/null +++ b/bonknet_broker/src/pendingdataconndb.rs @@ -0,0 +1,149 @@ +use actix::prelude::*; +use actix_tls::accept::rustls_0_22::TlsStream; +use thiserror::Error; +use tokio::io::{ReadHalf, WriteHalf}; +use tokio::net::TcpStream; +use tokio_util::codec::{Framed, FramedRead, FramedWrite, LengthDelimitedCodec}; +use tracing::{error, info}; +use uuid::Uuid; + +type TransportStream = Framed, LengthDelimitedCodec>; + +/* +L'idea e' che il database deve avere una riga per ogni connessione dati in nascita. +In ogni "riga" deve essere presente: +- Il ServerConnID che il server dovra usare (pkey) +- Il ClientConnID che il client dovra usare (pkey) +- Se gia connesso, il Socket del Server +- Se gia connesso il Socket del Client + +Quando in una riga sono presenti sia ServerSocket che ClientSocket allora poppa la riga +e usa i socket per lanciare un thread/actor che faccia il piping dei dati + +Ricerca riga deve avvenire sia tramite ServerConnID che ClientConnID se essi sono diversi come pianifico +Quindi l'ideale e' non usare una collection ma andare direttamente di Vector! + */ + +#[derive(Error, Debug)] +pub enum PendingDataConnError { + #[error("Generic Failure")] + GenericFailure, +} + +#[derive(Message)] +#[rtype(result = "Result<(),PendingDataConnError>")] +pub struct NewPendingConn { + pub server_conn_id: Uuid, + pub client_conn_id: Uuid, +} + +#[derive(Debug)] +enum RegisterKind { + Server, + Client +} + +#[derive(Message)] +#[rtype(result = "Result<(),PendingDataConnError>")] +pub struct RegisterStream { + kind: RegisterKind, + conn_id: Uuid, + transport: TransportStream, +} + +impl RegisterStream { + pub fn server(conn_id: Uuid, transport: TransportStream) -> Self { + RegisterStream { kind: RegisterKind::Server, conn_id, transport } + } + + pub fn client(conn_id: Uuid, transport: TransportStream) -> Self { + RegisterStream { kind: RegisterKind::Client, conn_id, transport } + } +} + +struct SideRecord { + conn_id: Uuid, + transport: Option, +} + +struct Record { + server: SideRecord, + client: SideRecord, +} + +impl Record { + fn new(server_conn_id: Uuid, client_conn_id: Uuid) -> Self { + let server = SideRecord { conn_id: client_conn_id, transport: None }; + let client = SideRecord { conn_id: server_conn_id, transport: None }; + Record { server, client } + } +} + +// TODO: every 2 minutes verify the Records that have at least one stream invalidated and drop them +pub struct PendingDataConnManager { + db: Vec, +} + +impl PendingDataConnManager { + pub fn new() -> Self { + PendingDataConnManager { db: Vec::new() } + } +} + +impl Actor for PendingDataConnManager { + type Context = Context; +} + +impl Handler for PendingDataConnManager { + type Result = Result<(), PendingDataConnError>; + + fn handle(&mut self, msg: NewPendingConn, _ctx: &mut Self::Context) -> Self::Result { + let server_conn_id = msg.server_conn_id; + let client_conn_id = msg.client_conn_id; + let new_record = Record::new(server_conn_id, client_conn_id); + if self.db.iter().any(|x| { + x.server.conn_id == new_record.server.conn_id || x.client.conn_id == new_record.client.conn_id + }) { + error!("Conflicting UUIDs: server {} - client {}", server_conn_id, client_conn_id); + Err(PendingDataConnError::GenericFailure) + } else { + self.db.push(new_record); + Ok(()) + } + } +} + +impl Handler for PendingDataConnManager { + type Result = Result<(), PendingDataConnError>; + + fn handle(&mut self, msg: RegisterStream, _ctx: &mut Self::Context) -> Self::Result { + use RegisterKind::*; + let conn_id = msg.conn_id; + let record = match match msg.kind { + Server => self.db.iter_mut().find(|x| x.server.conn_id == conn_id), + Client => self.db.iter_mut().find(|x| x.client.conn_id == conn_id), + } { + None => { + error!("Found no connection with {:?} conn_id {:?}", msg.kind, conn_id); + return Err(PendingDataConnError::GenericFailure); + }, + Some(item) => item, + }; + let side_record = match msg.kind { + Server => &mut record.server, + Client => &mut record.client, + }; + if side_record.transport.is_some() { + // TODO: It can be good to check if the connection is still open, if not, drop and use the new one. + error!("Connection already with a socket!"); + return Err(PendingDataConnError::GenericFailure); + } else { + side_record.transport = Some(msg.transport); + } + if record.client.transport.is_some() && record.server.transport.is_some() { + // TODO: Launch the "thing" that will manage the data mirroring + info!("LAUNCHING DATA MIRRORING"); + } + Ok(()) + } +} diff --git a/bonknet_broker/src/servercertdb.rs b/bonknet_broker/src/servercertdb.rs index 7951ad1..c586bd7 100644 --- a/bonknet_broker/src/servercertdb.rs +++ b/bonknet_broker/src/servercertdb.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use actix::{Actor, Context, Handler, Message}; +use actix::prelude::*; use thiserror::Error; // TODO: Probably it's better to remove the pub from inside the structs and impl a new() funct @@ -25,6 +25,12 @@ pub struct RegisterServer { pub name: String, } +#[derive(Message)] +#[rtype(result = "Option")] // None if nothing to unregister, Some if unregistered +pub struct UnregisterServer { + pub cert: Vec, +} + #[derive(Message)] #[rtype(result = "Option")] pub struct FetchName { @@ -33,7 +39,13 @@ pub struct FetchName { // TODO: Move into Sqlite DB with unique check on col1 and col2!!!! Right now name is not unique pub struct ServerCertDB { - pub db: HashMap, String>, // Cert to Name + db: HashMap, String>, // Cert to Name +} + +impl ServerCertDB { + pub fn new() -> Self { + ServerCertDB { db: HashMap::new() } + } } impl Actor for ServerCertDB { @@ -70,4 +82,12 @@ impl Handler for ServerCertDB { fn handle(&mut self, msg: FetchName, _ctx: &mut Self::Context) -> Self::Result { self.db.get(&msg.cert).map(|s| s.to_owned()) } +} + +impl Handler for ServerCertDB { + type Result = Option; + + fn handle(&mut self, msg: UnregisterServer, _ctx: &mut Self::Context) -> Self::Result { + self.db.remove(&msg.cert) + } } \ No newline at end of file diff --git a/bonknet_broker/src/servermanager.rs b/bonknet_broker/src/servermanager.rs new file mode 100644 index 0000000..ac79b48 --- /dev/null +++ b/bonknet_broker/src/servermanager.rs @@ -0,0 +1,334 @@ +use std::collections::HashMap; +use std::io::Error; +use std::sync::{Arc}; +use std::time::{Duration, Instant}; +use actix::prelude::*; +use actix_server::Server; +use rand::random; +use thiserror::Error; +use futures::{StreamExt, SinkExt}; +use tokio::sync::{Mutex, oneshot}; +use tokio_util::bytes::{Bytes, BytesMut}; +use tokio_util::codec::{FramedRead, FramedWrite, LengthDelimitedCodec}; +use tracing::{debug, error, info}; +use libbonknet::*; +use crate::{TransportStream, TransportStreamRx, TransportStreamTx}; +use uuid::Uuid; +use crate::pendingdataconndb::*; + +#[derive(MessageResponse)] +enum SendMsgResult { + Accepted, + Rejected, +} + +#[derive(Message)] +#[rtype(result = "SendMsgResult")] +struct SendMsg { + msg: ToServerMessageBody, + reply_channel: oneshot::Sender +} + +#[derive(Error, Debug)] +pub enum AsyncSendMsgError { + #[error("Generic Failure")] + GenericFailure, +} + +#[derive(Message)] +#[rtype(result = "Result")] +struct AsyncSendMsg { + msg: ToServerMessageBody, +} + +struct ServerTransporter { + rx: Option, + tx: Arc>, + timeout: Option, + reply_channels: HashMap>, +} + +impl Handler for ServerTransporter { + type Result = ResponseFuture>; + + fn handle(&mut self, msg: AsyncSendMsg, _ctx: &mut Self::Context) -> Self::Result { + let (reply_channel_tx, reply_channel_rx) = oneshot::channel(); + let mut reply_id: u64; + if self.reply_channels.len() == u64::MAX as usize { + return Box::pin(fut::ready(Err(AsyncSendMsgError::GenericFailure))); + } + loop { + reply_id = random(); + if !self.reply_channels.contains_key(&reply_id) { + break; + } + } + self.reply_channels.insert(reply_id, reply_channel_tx); + let msg = ToServerMessage::Msg { + reply_id, + body: msg.msg, + }; + let payload: Bytes = rmp_serde::to_vec(&msg).unwrap().into(); + let arc_tx = self.tx.clone(); + Box::pin(async move { + arc_tx.lock().await.send(payload).await.map_err(|e| AsyncSendMsgError::GenericFailure)?; + info!("msg sent"); + let r = reply_channel_rx.await.unwrap(); + info!("reply received"); + Ok(r) + }) + } +} + +impl ServerTransporter { + fn new(transport: TransportStream) -> Self { + let internal = transport.into_inner(); + let (srx, stx) = tokio::io::split(internal); + let codec = LengthDelimitedCodec::new(); + let rx = FramedRead::new(srx, codec.clone()); + let tx = FramedWrite::new(stx, codec.clone()); + ServerTransporter { + rx: Some(rx), + tx: Arc::new(tokio::sync::Mutex::new(tx)), + timeout: None, + reply_channels: HashMap::new(), + } + } + + fn actor_close(&mut self, ctx: &mut Context) { + ctx.stop(); + } +} + +impl Actor for ServerTransporter { + type Context = Context; + + fn started(&mut self, ctx: &mut Self::Context) { + // Register Read Stream + let rx = self.rx.take().expect("Rx Stream not found"); + ctx.add_stream(rx); + // Register Timeout task + self.timeout = Some(ctx.run_interval(Duration::from_secs(120), |s, c| { + s.actor_close(c) + })); + // Register Send Ping Task + ctx.run_interval(Duration::from_secs(60), |s, c| { + let msg = ToServerMessage::Ping; + let payload: Bytes = rmp_serde::to_vec(&msg).unwrap().into(); + let arc_tx = Arc::clone(&s.tx); + c.spawn(async move { + arc_tx.lock().await.send(payload).await + }.into_actor(s).map(|res, a, ctx| { + match res { + Ok(_) => { + info!("Ping sent!"); + } + Err(_) => { + ctx.stop(); + } + } + })); + }); + } +} + +impl Handler for ServerTransporter { + type Result = SendMsgResult; + + fn handle(&mut self, msg: SendMsg, ctx: &mut Self::Context) -> Self::Result { + let mut reply_id: u64; + if self.reply_channels.len() == u64::MAX as usize { + return SendMsgResult::Rejected; + } + loop { + reply_id = random(); + if !self.reply_channels.contains_key(&reply_id) { + break; + } + } + self.reply_channels.insert(reply_id, msg.reply_channel); + let msg = ToServerMessage::Msg { + reply_id, + body: msg.msg, + }; + let payload: Bytes = rmp_serde::to_vec(&msg).unwrap().into(); + let arc_tx = self.tx.clone(); + ctx.spawn(async move { + arc_tx.lock().await.send(payload).await + }.into_actor(self).map(|res, _a, _ctx| { + info!("ToServerMsg sent result: {:?}", res); + })); + SendMsgResult::Accepted + } +} + +impl StreamHandler> for ServerTransporter { + fn handle(&mut self, item: Result, ctx: &mut Self::Context) { + match item { + Ok(buf) => { + use FromServerReply::*; + let msg: FromServerReply = rmp_serde::from_slice(&buf).unwrap(); + match msg { + Pong => { + info!("Pong received"); + if let Some(spawn_handle) = self.timeout { + ctx.cancel_future(spawn_handle); + } else { + error!("There were no spawn handle configured!"); + } + self.timeout = Some(ctx.run_interval(Duration::from_secs(120), |s, c| { + s.actor_close(c) + })); + } + Msg { reply_id, body } => match self.reply_channels.remove(&reply_id) { + None => {} + Some(reply_tx) => { + if let Err(_e) = reply_tx.send(body) { + error!("Oneshot channel {} got invalidated! No reply sent.", reply_id); + } + } + } + } + } + Err(e) => { + error!("ERROR {:?}", e); + } + } + } +} + +#[derive(Error, Debug)] +pub enum ServerManagerError { + #[error("Generic Failure")] + GenericFailure, +} + +#[derive(Message)] +#[rtype(result = "Result<(),ServerManagerError>")] +pub struct StartTransporter { + pub name: String, + pub transport: TransportStream, +} + +#[derive(Message)] +#[rtype(result = "Vec")] +pub struct GetServerList {} + +#[derive(Message)] +#[rtype(result = "Result")] // TODO: Return Client ID with struct to give it a name +pub struct RequestServer { + pub name: String +} + +pub struct ServerManager { + entries: Arc>>>, + // Name -> Addr to Actor + pdcdb_addr: Addr, +} + +impl ServerManager { + pub fn new(pdcdb_addr: Addr) -> Self { + ServerManager { entries: Arc::new(Mutex::new(HashMap::new())), pdcdb_addr } + } +} + +impl Actor for ServerManager { + type Context = Context; + + fn started(&mut self, ctx: &mut Self::Context) { + // Remove all the ServerTransporters that are not running + // TODO: This is a "Pull" from entries, but we can have the entries that when killed tell + // the Manager making it more reactive! + ctx.run_interval(Duration::from_secs(10), |s, c| { + let start = Instant::now(); + let entries = Arc::clone(&s.entries); + c.spawn(async move { + let mut entries_mg = entries.lock().await; + let mut keys_to_delete = vec![]; + for (name, st_addr) in entries_mg.iter() { + if !st_addr.connected() { + keys_to_delete.push(name.clone()) + } + } + for name in keys_to_delete { + entries_mg.remove(&name); + info!("Closed ServerTransporter {} for actor death", name); + } + debug!("Cleaned ServerManager in {:?}", Instant::now() - start); + }.into_actor(s)); + }); + } +} + +impl Handler for ServerManager { + type Result = ResponseFuture>; + + fn handle(&mut self, msg: StartTransporter, _ctx: &mut Self::Context) -> Self::Result { + let mut entries = Arc::clone(&self.entries); + Box::pin(async move { + let mut entries_mg = entries.lock().await; + if entries_mg.contains_key(&msg.name) { + error!("A server called {} is already connected!", msg.name); + return Err(ServerManagerError::GenericFailure); + } + let st_addr = ServerTransporter::new(msg.transport).start(); + entries_mg.insert(msg.name, st_addr); + Ok(()) + }) + } +} + +impl Handler for ServerManager { + type Result = ResponseFuture>; + + fn handle(&mut self, _msg: GetServerList, _ctx: &mut Self::Context) -> Self::Result { + let entries = Arc::clone(&self.entries); + Box::pin(async move { + let entries_mg = entries.lock().await; + entries_mg.keys().cloned().collect() + }) + } +} + +impl Handler for ServerManager { + type Result = ResponseFuture>; + + fn handle(&mut self, msg: RequestServer, _ctx: &mut Self::Context) -> Self::Result { + let name = msg.name.clone(); + let entries = Arc::clone(&self.entries); + let pdcdb_addr = self.pdcdb_addr.clone(); + Box::pin(async move { + let lock = entries.lock().await; + let sh_addr = match lock.get(&name) { + None => { + error!("Requested server {} that isn't registered", name); + return Err(ServerManagerError::GenericFailure); + } + Some(item) => item, + }; + let server_conn_id = Uuid::new_v4(); + let client_conn_id = Uuid::new_v4(); + match pdcdb_addr.send(NewPendingConn { server_conn_id, client_conn_id }).await.unwrap() { + Ok(_) => { + let msg = ToServerMessageBody::Request { conn_id: server_conn_id }; + match sh_addr.send(AsyncSendMsg { msg }).await.unwrap() { + Ok(reply) => match reply { + FromServerReplyBody::RequestAccepted => { + Ok(client_conn_id) + } + FromServerReplyBody::RequestFailed => { + error!("Request Failed!"); + Err(ServerManagerError::GenericFailure) + } + FromServerReplyBody::Pong => unreachable!(), + } + Err(e) => { + panic!("ERROR: {:?}", e); + } + } + } + Err(_e) => Err(ServerManagerError::GenericFailure), + } + }) + } +} diff --git a/bonknet_client/Cargo.toml b/bonknet_client/Cargo.toml index ed04f1f..a67572b 100644 --- a/bonknet_client/Cargo.toml +++ b/bonknet_client/Cargo.toml @@ -7,10 +7,12 @@ edition = "2021" [dependencies] libbonknet = { path = "../libbonknet" } -tokio = { version = "1", features = ["full"] } -tokio-rustls = "0.25.0" +tokio = { version = "1", features = ["full", "tracing"] } tokio-util = { version = "0.7.10", features = ["codec"] } futures = "0.3" +rcgen = "0.12.0" +tokio-rustls = "0.25.0" rustls-pemfile = "2.0.0" -serde = { version = "1.0", features = ["derive"] } rmp-serde = "1.1.2" +tracing = "0.1" +tracing-subscriber = "0.3" diff --git a/bonknet_client/src/bin/client.rs b/bonknet_client/src/bin/client.rs index d3df96b..ec892a4 100644 --- a/bonknet_client/src/bin/client.rs +++ b/bonknet_client/src/bin/client.rs @@ -1,38 +1,35 @@ +use std::io::Error; use std::sync::Arc; -use futures::SinkExt; +use std::time::Duration; +use futures::{StreamExt, SinkExt}; use tokio::net::TcpStream; use tokio_rustls::rustls::{ClientConfig, RootCertStore}; -use tokio_rustls::rustls::pki_types::{ServerName}; +use tokio_rustls::rustls::pki_types::{ServerName, CertificateDer, PrivatePkcs8KeyDer}; use tokio_rustls::TlsConnector; +use tokio_util::bytes::BytesMut; use tokio_util::codec::{Framed, LengthDelimitedCodec}; -use serde::{Serialize, Deserialize}; -use libbonknet::{load_cert, load_prkey}; +use libbonknet::*; +use tracing::{info, error}; -#[derive(Debug, Serialize, Deserialize)] -enum ClientMessage { - Response { status_code: u32, msg: Option }, - Announce { name: String }, - Required { id: String }, - NotRequired { id: String }, -} -// TODO: This is an old examples #[tokio::main] async fn main() -> std::io::Result<()> { - let client_name = "Polnareffland1"; + // Tracing Subscriber + let subscriber = tracing_subscriber::FmtSubscriber::new(); + tracing::subscriber::set_global_default(subscriber).unwrap(); // Root certs to verify the server is the right one - let mut server_root_cert_store = RootCertStore::empty(); - let server_root_cert_der = load_cert("server_root_cert.pem").unwrap(); - server_root_cert_store.add(server_root_cert_der).unwrap(); - // Auth Cert to send the server who am I - let root_client_cert = load_cert("client_root_cert.pem").unwrap(); - let client_cert = load_cert("client_cert.pem").unwrap(); - let client_prkey = load_prkey("client_key.pem").unwrap(); + let mut broker_root_cert_store = RootCertStore::empty(); + let broker_root_cert_der = load_cert("certs/broker_root_cert.pem").unwrap(); + broker_root_cert_store.add(broker_root_cert_der).unwrap(); + // Public CA for Clients + let root_client_cert = load_cert("certs/client_root_cert.pem").unwrap(); + // My Client Certificate for authentication + let client_cert = load_cert("certs/client_cert.pem").unwrap(); + let client_cert_prkey = load_prkey("certs/client_key.pem").unwrap(); // Load TLS Config let tlsconfig = ClientConfig::builder() - .with_root_certificates(server_root_cert_store) - // .with_no_client_auth(); - .with_client_auth_cert(vec![client_cert, root_client_cert], client_prkey.into()) + .with_root_certificates(broker_root_cert_store.clone()) + .with_client_auth_cert(vec![client_cert, root_client_cert], client_cert_prkey.into()) .unwrap(); let connector = TlsConnector::from(Arc::new(tlsconfig)); let dnsname = ServerName::try_from("localhost").unwrap(); @@ -41,34 +38,46 @@ async fn main() -> std::io::Result<()> { let stream = connector.connect(dnsname, stream).await?; let mut transport = Framed::new(stream, LengthDelimitedCodec::new()); - - let msg1 = ClientMessage::Announce { name: client_name.into() }; - transport.send(rmp_serde::to_vec(&msg1).unwrap().into()).await.unwrap(); - for i in 0..10 { - let msg = ClientMessage::Response { status_code: 100+i, msg: Some(format!("yay {}", i)) }; - transport.send(rmp_serde::to_vec(&msg).unwrap().into()).await.unwrap(); - tokio::time::sleep(std::time::Duration::from_secs(1)).await; + let msg = FromClientCommand::ServerList; + transport.send(rmp_serde::to_vec(&msg).unwrap().into()).await.unwrap(); + match transport.next().await { + None => panic!("None in the transport"), + Some(item) => match item { + Ok(buf) => { + use ToClientResponse::*; + let msg: ToClientResponse = rmp_serde::from_slice(&buf).unwrap(); + match msg { + OkRequest { .. } => error!("Wrong reply!"), + OkServerList { data } => info!("{}", data.join("\n")), + GenericError => error!("Generic Error during remote command execution"), + } + } + Err(e) => { + error!("Error: {:?}", e); + } + } + } + tokio::time::sleep(Duration::from_secs(5)).await; + let msg = FromClientCommand::RequestServer { name: "cicciopizza".into() }; + transport.send(rmp_serde::to_vec(&msg).unwrap().into()).await.unwrap(); + match transport.next().await { + None => panic!("None in the transport"), + Some(item) => match item { + Ok(buf) => { + use ToClientResponse::*; + let msg: ToClientResponse = rmp_serde::from_slice(&buf).unwrap(); + match msg { + OkRequest { conn_id } => { + info!("Received Client Connection ID: {:?}", conn_id); + } + OkServerList { .. } => error!("Wrong reply!"), + GenericError => error!("Generic Error during remote command execution"), + } + } + Err(e) => { + error!("Error: {:?}", e); + } + } } - - // transport.for_each(|item| async move { - // let a: ClientMessage = rmp_serde::from_slice(&item.unwrap()).unwrap(); - // println!("{:?}", a); - // }).await; - - // let mut buf = vec![0;1024]; - // let (mut rd,mut tx) = split(stream); - // - // - // tokio::spawn(async move { - // let mut stdout = tokio::io::stdout(); - // tokio::io::copy(&mut rd, &mut stdout).await.unwrap(); - // }); - // - // let mut reader = tokio::io::BufReader::new(tokio::io::stdin()).lines(); - // - // while let Some(line) = reader.next_line().await.unwrap() { - // tx.write_all(line.as_bytes()).await.unwrap(); - // } - Ok(()) } \ No newline at end of file diff --git a/bonknet_server/src/bin/server.rs b/bonknet_server/src/bin/server.rs index 949319b..6ab04d3 100644 --- a/bonknet_server/src/bin/server.rs +++ b/bonknet_server/src/bin/server.rs @@ -190,11 +190,11 @@ async fn main() -> std::io::Result<()> { Msg { reply_id, body } => { use ToServerMessageBody::*; match body { - Required { id } => { - info!("I'm required with Connection ID {}", id); + Request { conn_id } => { + info!("I'm required with Connection ID {}", conn_id); out = Some(FromServerReply::Msg { reply_id, - body: FromServerReplyBody::RequiredAccepted, + body: FromServerReplyBody::RequestAccepted, }) } } diff --git a/libbonknet/Cargo.toml b/libbonknet/Cargo.toml index 1ecabcd..6352398 100644 --- a/libbonknet/Cargo.toml +++ b/libbonknet/Cargo.toml @@ -9,3 +9,4 @@ edition = "2021" tokio-rustls = "0.25.0" rustls-pemfile = "2.0.0" serde = { version = "1.0", features = ["derive"] } +uuid = { version = "1.7.0", features = ["serde"] } diff --git a/libbonknet/src/lib.rs b/libbonknet/src/lib.rs index 9e4e869..c0977a5 100644 --- a/libbonknet/src/lib.rs +++ b/libbonknet/src/lib.rs @@ -2,6 +2,7 @@ use std::io::{BufReader, Error, ErrorKind}; use rustls_pemfile::{read_one, Item}; use serde::{Deserialize, Serialize}; use tokio_rustls::rustls::pki_types::{CertificateDer, PrivatePkcs8KeyDer}; +use uuid::Uuid; pub fn load_cert(filename: &str) -> std::io::Result { let cert_file = std::fs::File::open(filename).unwrap(); @@ -60,7 +61,7 @@ pub enum YouAreValues { #[derive(Debug, Serialize, Deserialize)] pub enum ToServerMessageBody { - Required { id: String }, + Request { conn_id: Uuid }, } #[derive(Debug, Serialize, Deserialize)] @@ -74,8 +75,8 @@ pub enum ToServerMessage { #[derive(Debug, Serialize, Deserialize)] pub enum FromServerReplyBody { - RequiredAccepted, - RequiredFailed, + RequestAccepted, + RequestFailed, Pong, } @@ -113,3 +114,17 @@ impl ToGuestServerMessage { } } } + +// Client things +#[derive(Debug, Serialize, Deserialize)] +pub enum FromClientCommand { + RequestServer { name: String }, + ServerList, +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum ToClientResponse { + OkRequest { conn_id: Uuid }, + OkServerList { data: Vec }, + GenericError, +}