From e151a799efc7840db2cbfdaab847d4664440cd37 Mon Sep 17 00:00:00 2001 From: maix0 Date: Fri, 27 Sep 2024 20:07:55 +0200 Subject: [PATCH] update: cloudflare sucks --- .envrc | 2 +- .gitignore | 1 + Cargo.lock | 785 +++++++++++++++--------------------- Cargo.toml | 7 +- flake.lock | 254 +----------- flake.nix | 12 +- src/main.rs | 468 ++++----------------- src/oauth2.rs | 134 ++++++ src/utils/memory_db_util.rs | 58 --- src/utils/mod.rs | 1 - 10 files changed, 566 insertions(+), 1156 deletions(-) create mode 100644 src/oauth2.rs delete mode 100644 src/utils/memory_db_util.rs delete mode 100644 src/utils/mod.rs diff --git a/.envrc b/.envrc index cffc922..3550a30 100644 --- a/.envrc +++ b/.envrc @@ -1 +1 @@ -use flake . --impure +use flake diff --git a/.gitignore b/.gitignore index 7a479a3..899e68c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ envfile .direnv .target +.env diff --git a/Cargo.lock b/Cargo.lock index 3f13cc4..167306e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,26 +52,11 @@ dependencies = [ "subtle", ] -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - [[package]] name = "async-trait" -version = "0.1.80" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", @@ -86,15 +71,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6c9af12842a67734c9a2e355436e5d03b22383ed60cf13cd0c18fbfe3dcbcf" +checksum = "8f43644eed690f5374f1af436ecd6aea01cd201f6fbdf0178adaf6907afb2cec" dependencies = [ "async-trait", "axum-core", @@ -128,9 +113,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" +checksum = "5e6b8ba012a258d63c9adfa28b9ddcf66149da6f986c5b5452e629d5ee64bf00" dependencies = [ "async-trait", "bytes", @@ -141,7 +126,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 0.1.2", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", "tracing", @@ -149,9 +134,9 @@ dependencies = [ [[package]] name = "axum-extra" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0be6ea09c9b96cb5076af0de2e383bd2bc0c18f827cf1967bdd353e0b910d733" +checksum = "73c3220b188aea709cf1b6c5f9b01c3bd936bb08bd2b5184a12b35ac8131b1f9" dependencies = [ "axum", "axum-core", @@ -172,11 +157,10 @@ dependencies = [ [[package]] name = "axum-macros" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00c055ee2d014ae5981ce1016374e8213682aa14d9bf40e48ab48b5f3ef20eaa" +checksum = "57d123550fa8d071b7255cb0cc04dc302baa6c8c4a79f55701552684d8399bce" dependencies = [ - "heck", "proc-macro2", "quote", "syn", @@ -203,27 +187,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - [[package]] name = "botloc" version = "0.1.0" @@ -231,7 +200,10 @@ dependencies = [ "axum", "axum-extra", "base64", - "oauth2", + "color-eyre", + "http", + "pct-str", + "rand", "reqwest", "serde", "serde_json", @@ -248,16 +220,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] -name = "bytes" -version = "1.6.0" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "cc" -version = "1.0.100" +version = "1.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c891175c3fb232128f48de6590095e59198bbeb8620c310be349bfc3afd12c7b" +checksum = "9540e661f81799159abee814118cc139a2004b3a3aa3ea37724a1b66530b90e0" +dependencies = [ + "shlex", +] [[package]] name = "cfg-if" @@ -265,21 +246,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.5", -] - [[package]] name = "cipher" version = "0.4.4" @@ -290,6 +256,33 @@ dependencies = [ "inout", ] +[[package]] +name = "color-eyre" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + [[package]] name = "cookie" version = "0.18.1" @@ -317,15 +310,15 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -359,16 +352,6 @@ dependencies = [ "powerfmt", ] -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - [[package]] name = "encoding_rs" version = "0.8.34" @@ -395,10 +378,20 @@ dependencies = [ ] [[package]] -name = "fastrand" -version = "2.1.0" +name = "eyre" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fnv" @@ -486,10 +479,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi", - "wasm-bindgen", ] [[package]] @@ -510,9 +501,9 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "h2" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ "atomic-waker", "bytes", @@ -533,12 +524,6 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "hermit-abi" version = "0.3.9" @@ -558,9 +543,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", @@ -593,9 +578,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe575dd17d0862a9a33781c8c4696a55c320909004a67a00fb286ba8b1bc496d" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", @@ -614,9 +599,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.2" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http", @@ -627,7 +612,6 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots", ] [[package]] @@ -648,9 +632,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.5" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b875924a60b96e5d7b9ae7b066540b1dd1cbd90d1828f54c92e02a283351c56" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ "bytes", "futures-channel", @@ -661,34 +645,10 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - [[package]] name = "idna" version = "0.5.0" @@ -700,10 +660,16 @@ dependencies = [ ] [[package]] -name = "indexmap" -version = "2.2.6" +name = "indenter" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown", @@ -720,9 +686,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" [[package]] name = "itoa" @@ -732,9 +698,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -747,9 +713,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "linux-raw-sys" @@ -769,9 +735,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "matchit" @@ -802,13 +768,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -861,45 +828,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -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 = "oauth2" -version = "5.0.0-alpha.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "098af5a5110b4deacf3200682963713b143ae9d28762b739bdb7b98429dfaf68" -dependencies = [ - "base64", - "chrono", - "getrandom", - "http", - "rand", - "reqwest", - "serde", - "serde_json", - "serde_path_to_error", - "sha2", - "thiserror", - "url", -] - [[package]] name = "object" version = "0.32.2" @@ -923,11 +851,11 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.64" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "bitflags 2.6.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -955,9 +883,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.102" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -971,6 +899,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + [[package]] name = "parking_lot" version = "0.12.3" @@ -991,7 +925,17 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.5", + "windows-targets", +] + +[[package]] +name = "pct-str" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf1bdcc492c285a50bed60860dfa00b50baf1f60c73c7d6b435b01a2a11fd6ff" +dependencies = [ + "thiserror", + "utf8-decode", ] [[package]] @@ -1000,26 +944,6 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "pin-project-lite" version = "0.2.14" @@ -1034,9 +958,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "polyval" @@ -1058,9 +982,12 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" @@ -1071,58 +998,11 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "quinn" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ceeeeabace7857413798eb1ffa1e9c905a9946a57d81fb69b4b71c4d8eb3ad" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddf517c03a109db8100448a4be38d498df8a210a99fe0e1b9eaf39e78c640efe" -dependencies = [ - "bytes", - "rand", - "ring", - "rustc-hash", - "rustls", - "slab", - "thiserror", - "tinyvec", - "tracing", -] - -[[package]] -name = "quinn-udp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9096629c45860fc7fb143e125eb826b5e721e10be3263160c7d60ca832cf8c46" -dependencies = [ - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.52.0", -] - [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -1159,18 +1039,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "355ae415ccd3a04315d3f8246e86d67689ea74d88d915576e1589a351062a13b" dependencies = [ - "bitflags 2.6.0", + "bitflags", ] [[package]] name = "reqwest" -version = "0.12.5" +version = "0.12.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" dependencies = [ "base64", "bytes", @@ -1193,10 +1073,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "quinn", - "rustls", "rustls-pemfile", - "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", @@ -1204,14 +1081,12 @@ dependencies = [ "system-configuration", "tokio", "tokio-native-tls", - "tokio-rustls", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", - "winreg", + "windows-registry", ] [[package]] @@ -1235,19 +1110,13 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ - "bitflags 2.6.0", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -1256,12 +1125,11 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.10" +version = "0.23.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05cff451f60db80f490f3c182b77c35260baace73209e9cdbbe526bfe3a4d402" +checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" dependencies = [ "once_cell", - "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -1270,9 +1138,9 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" dependencies = [ "base64", "rustls-pki-types", @@ -1280,15 +1148,15 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" +checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" [[package]] name = "rustls-webpki" -version = "0.102.4" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff448f7e92e913c4b7d4c6d8e4540a1724b319b4152b8aef6d4cf8339712b33e" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ "ring", "rustls-pki-types", @@ -1309,11 +1177,11 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "schannel" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -1324,11 +1192,11 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -1337,9 +1205,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -1347,18 +1215,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.203" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -1367,11 +1235,12 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.118" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d947f6b3163d8857ea16c4fa0dd4840d52f3041039a85decd46867eb1abef2e4" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -1398,17 +1267,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sharded-slab" version = "0.1.7" @@ -1418,6 +1276,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "signal-hook-registry" version = "1.4.2" @@ -1466,9 +1330,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.68" +version = "2.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +checksum = "81b9b4733a9c8b8aaa20634df36eeb68cc0c0669f2e18fb287006b496a14195d" dependencies = [ "proc-macro2", "quote", @@ -1486,23 +1350,26 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -1510,30 +1377,31 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.1" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", @@ -1583,9 +1451,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" dependencies = [ "tinyvec_macros", ] @@ -1598,28 +1466,27 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", @@ -1649,9 +1516,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -1662,14 +1529,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper 0.1.2", "tokio", "tower-layer", "tower-service", @@ -1678,15 +1545,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -1721,6 +1588,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber", +] + [[package]] name = "tracing-log" version = "0.2.0" @@ -1766,15 +1643,15 @@ checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" -version = "0.1.23" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ "tinyvec", ] @@ -1804,9 +1681,14 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", - "serde", ] +[[package]] +name = "utf8-decode" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca61eb27fa339aa08826a29f03e87b99b4d8f0fc2255306fd266bb1b6a9de498" + [[package]] name = "valuable" version = "0.1.0" @@ -1821,9 +1703,9 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "want" @@ -1842,19 +1724,20 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", @@ -1867,9 +1750,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -1879,9 +1762,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1889,9 +1772,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", @@ -1902,29 +1785,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.26.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7c23921eeb1713a4e851530e9b9756e4fb0e89978582942612524cf09f01cd" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "winapi" version = "0.3.9" @@ -1948,21 +1822,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows-registry" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ - "windows-targets 0.52.5", + "windows-result", + "windows-strings", + "windows-targets", ] [[package]] -name = "windows-sys" -version = "0.48.0" +name = "windows-result" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.48.5", + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", ] [[package]] @@ -1971,138 +1857,101 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.5", + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnullvm" -version = "0.52.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" +name = "zerocopy" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "cfg-if", - "windows-sys 0.48.0", + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c1c51fe..04a02a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,11 @@ edition = "2021" axum = { version = "0.7.5", features = ["multipart", "macros"] } axum-extra = { version = "0.9.3", features = ["cookie-private"] } base64 = "0.22.1" -oauth2 = "5.0.0-alpha" -reqwest = { version = "0.12.5", features = ["json"] } +color-eyre = "0.6.3" +http = "1.1.0" +pct-str = "2.0.0" +rand = "0.8.5" +reqwest = { version = "0.12.5", features = ["json", "default-tls"] } serde = { version = "1.0.203", features = ["derive"] } serde_json = "1.0.118" time = "0.3.36" diff --git a/flake.lock b/flake.lock index d60fc80..e59a420 100644 --- a/flake.lock +++ b/flake.lock @@ -1,109 +1,15 @@ { "nodes": { - "cargo-semver-checks": { - "inputs": { - "flake-utils": "flake-utils", - "naersk": "naersk", - "nixpkgs": "nixpkgs_2" - }, - "locked": { - "lastModified": 1718446388, - "narHash": "sha256-/4a5CS5EdI+g1Y/nzOeAmI04olLDCk8SDhQbPqL82s4=", - "owner": "Maix0", - "repo": "cargo-semver-checks-flake", - "rev": "10641cbb61ecb2ec40c4847080a08c8d4ee8bec0", - "type": "github" - }, - "original": { - "owner": "Maix0", - "repo": "cargo-semver-checks-flake", - "type": "github" - } - }, - "cargo-workspace": { - "inputs": { - "cargo-workspaces-git": "cargo-workspaces-git", - "flake-utils": "flake-utils_2", - "naersk": "naersk_2", - "nixpkgs": "nixpkgs_4" - }, - "locked": { - "lastModified": 1718446390, - "narHash": "sha256-YAgg27LQwK6BfOIut/U8zqDN87L0SxU9SRC98Bsp16w=", - "owner": "Maix0", - "repo": "cargo-ws-flake", - "rev": "bbb8a52d1a294549f81a52c226fa3c085e44e5af", - "type": "github" - }, - "original": { - "owner": "Maix0", - "repo": "cargo-ws-flake", - "type": "github" - } - }, - "cargo-workspaces-git": { - "flake": false, - "locked": { - "lastModified": 1683825807, - "narHash": "sha256-WlJu8FLaTMzR5JCU5eASHfmJ3C4IdwlPZ6//m5xOb1k=", - "owner": "pksunkara", - "repo": "cargo-workspaces", - "rev": "8bf9c4ab519eeed45e83cbc64aa646431bddd899", - "type": "github" - }, - "original": { - "owner": "pksunkara", - "ref": "v0.2.41", - "repo": "cargo-workspaces", - "type": "github" - } - }, "flake-utils": { "inputs": { "systems": "systems" }, "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", + "lastModified": 1726560853, + "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=", "owner": "numtide", "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_2": { - "inputs": { - "systems": "systems_2" - }, - "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_3": { - "inputs": { - "systems": "systems_3" - }, - "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a", "type": "github" }, "original": { @@ -117,47 +23,11 @@ "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1717067539, - "narHash": "sha256-oIs5EF+6VpHJRvvpVWuqCYJMMVW/6h59aYUv9lABLtY=", + "lastModified": 1721727458, + "narHash": "sha256-r/xppY958gmZ4oTfLiHN0ZGuQ+RSTijDblVgVLFi1mw=", "owner": "nix-community", "repo": "naersk", - "rev": "fa19d8c135e776dc97f4dcca08656a0eeb28d5c0", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "naersk", - "type": "github" - } - }, - "naersk_2": { - "inputs": { - "nixpkgs": "nixpkgs_3" - }, - "locked": { - "lastModified": 1717067539, - "narHash": "sha256-oIs5EF+6VpHJRvvpVWuqCYJMMVW/6h59aYUv9lABLtY=", - "owner": "nix-community", - "repo": "naersk", - "rev": "fa19d8c135e776dc97f4dcca08656a0eeb28d5c0", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "naersk", - "type": "github" - } - }, - "naersk_3": { - "inputs": { - "nixpkgs": "nixpkgs_5" - }, - "locked": { - "lastModified": 1718727675, - "narHash": "sha256-uFsCwWYI2pUpt0awahSBorDUrUfBhaAiyz+BPTS2MHk=", - "owner": "nix-community", - "repo": "naersk", - "rev": "941ce6dc38762a7cfb90b5add223d584feed299b", + "rev": "3fb418eaf352498f6b6c30592e3beb63df42ef11", "type": "github" }, "original": { @@ -169,8 +39,8 @@ "nixpkgs": { "locked": { "lastModified": 0, - "narHash": "sha256-yZKhxVIKd2lsbOqYd5iDoUIwsRZFqE87smE2Vzf6Ck0=", - "path": "/nix/store/5jgh89kgmrb687c254wxdac4cj5hqjw8-source", + "narHash": "sha256-o8VBeCWHBxGd4kVMceIayf5GApqTavJbTa44Xcg5Rrk=", + "path": "/nix/store/p2hby44a0qzrnd1vxcpcgfav6160rmcv-source", "type": "path" }, "original": { @@ -180,11 +50,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1718276985, - "narHash": "sha256-u1fA0DYQYdeG+5kDm1bOoGcHtX0rtC7qs2YA2N1X++I=", + "lastModified": 1727335715, + "narHash": "sha256-1uw3y94dA4l22LkqHRIsb7qr3rV5XdxQFqctINfx8Cc=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3f84a279f1a6290ce154c5531378acc827836fbb", + "rev": "28b5b8af91ffd2623e995e20aee56510db49001a", "type": "github" }, "original": { @@ -195,62 +65,6 @@ } }, "nixpkgs_3": { - "locked": { - "lastModified": 0, - "narHash": "sha256-yZKhxVIKd2lsbOqYd5iDoUIwsRZFqE87smE2Vzf6Ck0=", - "path": "/nix/store/5jgh89kgmrb687c254wxdac4cj5hqjw8-source", - "type": "path" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_4": { - "locked": { - "lastModified": 1718276985, - "narHash": "sha256-u1fA0DYQYdeG+5kDm1bOoGcHtX0rtC7qs2YA2N1X++I=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "3f84a279f1a6290ce154c5531378acc827836fbb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_5": { - "locked": { - "lastModified": 0, - "narHash": "sha256-4Zu0RYRcAY/VWuu6awwq4opuiD//ahpc2aFHg2CWqFY=", - "path": "/nix/store/qqwr649pc0qprc9lw2fmdsi1km6p7q2h-source", - "type": "path" - }, - "original": { - "id": "nixpkgs", - "type": "indirect" - } - }, - "nixpkgs_6": { - "locked": { - "lastModified": 1719223410, - "narHash": "sha256-jtIo8xR0Zp4SalIwmD+OdCwHF4l7OU6PD63UUK4ckt4=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "efb39c6052f3ce51587cf19733f5f4e5d515aa13", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_7": { "locked": { "lastModified": 1718428119, "narHash": "sha256-WdWDpNaq6u1IPtxtYHHWpl5BmabtpmLnMAx0RdJ/vo8=", @@ -268,24 +82,22 @@ }, "root": { "inputs": { - "cargo-semver-checks": "cargo-semver-checks", - "cargo-workspace": "cargo-workspace", - "flake-utils": "flake-utils_3", - "naersk": "naersk_3", - "nixpkgs": "nixpkgs_6", + "flake-utils": "flake-utils", + "naersk": "naersk", + "nixpkgs": "nixpkgs_2", "rust-overlay": "rust-overlay" } }, "rust-overlay": { "inputs": { - "nixpkgs": "nixpkgs_7" + "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1719281921, - "narHash": "sha256-LIBMfhM9pMOlEvBI757GOK5l0R58SRi6YpwfYMbf4yc=", + "lastModified": 1727404165, + "narHash": "sha256-kZCiYpQJBZ3kL9QymS88mCxpQwqo8KqvZeHk6LATuY8=", "owner": "oxalica", "repo": "rust-overlay", - "rev": "b6032d3a404d8a52ecfc8571ff0c26dfbe221d07", + "rev": "76f0a61e733259e1034dd6523e039d04932ffefc", "type": "github" }, "original": { @@ -308,36 +120,6 @@ "repo": "default", "type": "github" } - }, - "systems_2": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_3": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 8cf4684..6874869 100644 --- a/flake.nix +++ b/flake.nix @@ -4,8 +4,6 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; rust-overlay.url = "github:oxalica/rust-overlay"; - cargo-workspace.url = "github:Maix0/cargo-ws-flake"; - cargo-semver-checks.url = "github:Maix0/cargo-semver-checks-flake"; naersk.url = "github:nix-community/naersk"; }; outputs = { @@ -49,7 +47,7 @@ else "default"; in buildRustToolchain { - toolchain = toolchainType; + toolchain = toolchainType; version = toolchainVersion; profile = toolchainProfile; } @@ -89,14 +87,6 @@ shellHook = '' export RUST_STD="${rust_dev}/share/doc/rust/html/std/index.html" - - if [ -z $CARGO_TARGET_DIR ] then - : "''${XDG_CACHE_HOME:="''$HOME/.cache"}" - local hash path - hash="$(sha1sum - <<< "$PWD" | head -c40)" - path="''${PWD//[^a-zA-Z0-9]/}" - export CARGO_TARGET_DIR="''${XDG_CACHE_HOME}/rust-targets/$hash-$path" - fi ''; }; }); diff --git a/src/main.rs b/src/main.rs index ae8225b..fba5e96 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,144 +20,35 @@ use axum::{ }; use axum_extra::extract::{ cookie::{Cookie, Expiration, Key, SameSite}, - CookieJar, + CookieJar, PrivateCookieJar, }; use base64::Engine; +use color_eyre::eyre::Context; +use reqwest::tls::Version; use serde::{de::DeserializeOwned, Deserialize, Serialize}; use serde_json::{json, Value}; -use tokio::io::AsyncReadExt; +use tokio::{io::AsyncReadExt, sync::Mutex}; use tracing::{error, info}; -use oauth2::{ - basic::*, AuthUrl, AuthorizationCode, ClientId, ClientSecret, CsrfToken, EndpointNotSet, - EndpointSet, IntrospectionUrl, RedirectUrl, RefreshToken, TokenResponse, TokenUrl, -}; - macro_rules! unwrap_env { ($name:literal) => { std::env::var($name).expect(&format!("missing `{}` env var", $name)) }; } -type OClient = BasicClient; - -#[derive(Clone, Debug)] -struct Token { - token: String, - refresh: String, -} - -impl Token { - async fn refresh(tok: &BearerToken, config: &AppState) -> Result<(), ()> { - let token = match tok { - BearerToken::User(i) => { - let users = config.users.write().unwrap(); - users.get(&i).ok_or(())?.refresh.clone() - } - BearerToken::Provided(_) => return Err(()), - BearerToken::App => { - let code = config - .oauth - .exchange_client_credentials() - .request_async(&config.http) - .await - .unwrap(); - config.token.write().unwrap().token = code.access_token().secret().clone(); - return Ok(()); - } - }; - let refresh_token = RefreshToken::new(token); - - match config - .oauth - .exchange_refresh_token(&refresh_token) - .request_async(&config.http) - .await - { - Err(e) => Err(error!("Unable to refresh token ! {e}")), - Ok(t) => { - info!("Refreshed a token !"); - match tok { - BearerToken::User(i) => { - let mut users = config.users.write().unwrap(); - let u = users.get_mut(&i).ok_or(())?; - u.token = t.access_token().secret().clone(); - u.refresh = t.refresh_token().unwrap().secret().clone(); - } - _ => return Err(()), - }; - Ok(()) - } - } - } -} +mod oauth2; #[derive(Clone)] struct AppState { http: reqwest::Client, - oauth: OClient, + oauth: Arc, + tutors: Arc>>, key: Key, - users: Arc>>, - token: Arc>, - tutors: Arc>>, } + impl FromRef for Key { - fn from_ref(state: &AppState) -> Self { - state.key.clone() - } -} - -enum BearerToken { - App, - User(u64), - Provided(Token), -} - -impl AppState { - async fn do_request( - &self, - url: impl reqwest::IntoUrl + Clone, - query: impl Serialize, - mut tok: BearerToken, - ) -> Result { - let res = { - let mut users = self.users.write().unwrap(); - let mut lock = match &tok { - BearerToken::App => Some(self.token.write().unwrap()), - _ => None, - }; - let token = match &mut lock { - Some(s) => Ok(&mut **s), - None => { - if let BearerToken::User(id) = &tok { - users.get_mut(&id).ok_or(()) - } else if let BearerToken::Provided(t) = &mut tok { - Ok(t) - } else { - Err(()) - } - } - }?; - - self.http - .get(url.clone()) - .bearer_auth(&token.token) - .query(&query) - .send() - }; - let res = res.await.map_err(|e| error!("Error with request {e}"))?; - let json = res - .json::() - .await - .map_err(|e| error!("Error with request response {e}"))?; - - if !json["error"].is_null() && json["message"].as_str() == Some("The access token expired") - { - Token::refresh(&tok, self).await?; - return Box::pin(Self::do_request(self, url, query, tok)).await; - } - - serde_json::from_value(json).map_err(|e| error!("error when parsing json {e}")) + fn from_ref(input: &AppState) -> Self { + input.key.clone() } } @@ -174,19 +65,19 @@ struct GroupsUsers { async fn tutors(config: AppState) { loop { { - let mut lock = config.tutors.write().unwrap(); + let mut lock = config.tutors.lock().await; lock.clear(); let mut page_nb = 0; loop { info!("tutor request (page {page_nb})"); let res = config - .do_request::>( + .oauth + .do_request::>( "https://api.intra.42.fr/v2/groups/166/users", - json! ({ + &json! ({ "page[number]": page_nb, "page[size]": 100, }), - BearerToken::App, ) .await .unwrap(); @@ -209,27 +100,13 @@ async fn main() { local .run_until(async { // initialize tracing - let oauth = BasicClient::new(ClientId::new(unwrap_env!("CLIENT_ID"))) - .set_redirect_uri( - RedirectUrl::new("https://t.maix.me/auth/callback".to_string()).unwrap(), - ) - .set_introspection_url( - IntrospectionUrl::new("https://api.intra.42.fr/oauth/token/info".to_string()) - .unwrap(), - ) - .set_client_secret(ClientSecret::new(unwrap_env!("CLIENT_SECRET"))) - .set_auth_uri( - AuthUrl::new("https://api.intra.42.fr/oauth/authorize".to_string()) - .expect("invalid authUrl"), - ) - .set_token_uri( - TokenUrl::new("https://api.intra.42.fr/oauth/token".to_string()) - .expect("invalid tokenUrl"), - ); - let http = reqwest::ClientBuilder::new() // Following redirects opens the client up to SSRF vulnerabilities. .redirect(reqwest::redirect::Policy::none()) + .user_agent("AlterPoste/1.0") + .tls_info(true) + .min_tls_version(Version::TLS_1_0) + .max_tls_version(Version::TLS_1_2) .build() .expect("Client should build"); @@ -238,22 +115,20 @@ async fn main() { .decode(cookie_secret) .unwrap(); let key: Key = Key::from(&base64_value); + let oauth = oauth2::OauthClient::new( + http.clone(), + unwrap_env!("CLIENT_ID"), + unwrap_env!("CLIENT_SECRET"), + "http://local.maix.me/auth/callback", + ) + .await + .unwrap(); - let code = oauth - .exchange_client_credentials() - .request_async(&http) - .await - .unwrap(); let state = AppState { - token: Arc::new(RwLock::new(Token { - token: code.access_token().secret().clone(), - refresh: String::new(), - })), - tutors: Default::default(), - key, http, - oauth, - users: Default::default(), + key, + oauth: Arc::new(oauth), + tutors: Default::default(), }; tokio::task::spawn_local(tutors(state.clone())); @@ -265,26 +140,39 @@ async fn main() { .route("/stop", get(stop)) .route("/start", get(start)) .route("/restart", get(restart)) - .route("/config", get(get_config)) - .route("/db", get(get_db)) .route("/pull", get(git_pull)) .route("/auth/callback", get(oauth2_callback)) .route("/auth/login", get(oauth2_login)) .with_state(state); // run our app with hyper - let listener = tokio::net::TcpListener::bind("127.0.0.1:9911") - .await - .unwrap(); + let listener = tokio::net::TcpListener::bind(format!( + "127.0.0.1:{}", + std::env::args() + .nth(1) + .and_then(|s| s.parse::().ok()) + .unwrap_or(9911) + )) + .await + .unwrap(); tracing::info!("listening on {}", listener.local_addr().unwrap()); axum::serve(listener, app).await.unwrap(); }) .await; } -async fn oauth2_login(State(state): State) -> Redirect { - let (url, _) = state.oauth.authorize_url(CsrfToken::new_random).url(); - Redirect::to(url.as_str()) +async fn oauth2_login(State(state): State) -> Result { + Ok(Redirect::to( + &(state + .oauth + .get_auth_url() + .await + .map_err(|e| { + error!("{e}"); + StatusCode::INTERNAL_SERVER_ERROR + })? + .to_string()), + )) } use time::Duration as TDuration; @@ -294,95 +182,46 @@ use time::OffsetDateTime; async fn oauth2_callback( State(state): State, Query(params): Query>, - jar: CookieJar, -) -> impl IntoResponse { - let Some(code) = params.get("code") else { - return (jar, Redirect::to("/")); + jar: PrivateCookieJar, +) -> Result { + let inner = || async { + let Some(code) = params.get("code") else { + return Ok::<_, color_eyre::eyre::Report>((jar, Redirect::to("/"))); + }; + let Some(state_csrf) = params.get("state") else { + return Ok((jar, Redirect::to("/"))); + }; + let token = state + .oauth + .get_user_token(code, state_csrf) + .await + .wrap_err("callback")?; + + let rep = state + .http + .get("https://api.intra.42.fr/v2/users/me") + .bearer_auth(&token.access_token) + .send() + .await + .wrap_err("Unable to get user self")?; + + let json: User42 = rep.json().await.wrap_err("unable to parse api reply")?; + let mut cookie = Cookie::new("token", json.id.to_string()); + cookie.set_same_site(SameSite::None); + cookie.set_secure(true); + cookie.set_path("/"); + // cookie.set_domain("localhost:3000"); + // cookie.set_http_only(Some(false)); + let ujar = jar.add(cookie); + Ok((ujar, Redirect::to("/"))) }; - let Some(state_csrf) = params.get("state") else { - return (jar, Redirect::to("/")); - }; - let mut form_data = HashMap::new(); - form_data.insert("grant_type", "authorization_code".to_string()); - form_data.insert("client_id", unwrap_env!("CLIENT_ID")); - form_data.insert("client_secret", unwrap_env!("CLIENT_SECRET")); - form_data.insert("code", code.to_string()); - form_data.insert( - "redirect_uri", - state.oauth.redirect_uri().unwrap().to_string(), - ); - form_data.insert("state", state_csrf.to_string()); - let token_res = match state - .http - .post(state.oauth.token_uri().as_str()) - .form(&form_data) - .send() - .await - { - Ok(o) => o.json::().await.unwrap(), + match inner().await { + Ok(ret) => Ok(ret), Err(e) => { - error!("{e}"); - return (jar, Redirect::to("/auth/error")); + error!("{:?}", e); + Err(StatusCode::INTERNAL_SERVER_ERROR) } - }; - let Ok(rep) = state - .do_request::( - "https://api.intra.42.fr/v2/me", - (), - BearerToken::Provided( - match token_res["access_token"].as_str().ok_or(()).and_then(|t| { - token_res["refresh_token"] - .as_str() - .ok_or(()) - .map(|r| Token { - token: t.to_string(), - refresh: r.to_string(), - }) - }) { - Ok(v) => v, - Err(_) => return (jar, Redirect::to("/error/")), - }, - ), - ) - .await - else { - info!("failed to get id"); - return (jar, Redirect::to("/error/")); - }; - - if !state.tutors.read().unwrap().contains(&rep.id) { - info!("non tutor tried to login"); - return (jar, Redirect::to("/error/")); } - - let mut cookie = Cookie::new("token", rep.id.to_string()); - let mut now = OffsetDateTime::now_utc(); - now += TDuration::weeks(52); - cookie.set_expires(Some(now)); - cookie.set_same_site(SameSite::None); - cookie.set_secure(true); - // cookie.set_domain("localhost:3000"); - cookie.set_path("/"); - //cookie.set_http_only(Some(false)); - state.users.write().unwrap().insert( - rep.id, - match token_res["access_token"].as_str().ok_or(()).and_then(|t| { - dbg!(&token_res)["refresh_token"] - .as_str() - .ok_or(()) - .map(|r| Token { - token: t.to_string(), - refresh: r.to_string(), - }) - }) { - Ok(v) => v, - Err(_) => return (jar, Redirect::to("/error/")), - }, - ); - - let ujar = jar.add(cookie); - info!("logged in"); - (ujar, Redirect::to("/")) } #[derive(Clone, Debug)] @@ -420,7 +259,7 @@ impl FromRequestParts for UserLoggedIn { )); }; - if state.tutors.read().unwrap().contains(&user_id) { + if state.tutors.lock().await.contains(&user_id) { info!("is tut"); Ok(UserLoggedIn { id: user_id }) } else { @@ -444,7 +283,6 @@ async fn root(_user: UserLoggedIn) -> Html<&'static str> { stop
start
status
- config
db
git pull (ask before!)
"#, @@ -484,137 +322,10 @@ async fn stop(_user: UserLoggedIn) -> Redirect { Redirect::to("/") } -#[derive(Serialize, Deserialize)] -struct BotConfig { - piscine: Vec, - pc_tut: Vec, - id_server: u64, - id_channel_alerte: u64, - id_role: u64, - mois: String, - annee: String, -} - -async fn get_config(_user: UserLoggedIn) -> Result, (StatusCode, String)> { - info!("Requested config"); - let Ok(mut file) = tokio::fs::File::open( - std::env::var("BOTLOC_DIR").map_err(|e| { - error!("Failed to open config file: {e}"); - ( - StatusCode::INTERNAL_SERVER_ERROR, - "please set env CONFIG_PATH".to_string(), - ) - })? + "/config.json", - ) - .await - .map_err(|e| { - error!("Failed to open config file: {e}"); - e - }) else { - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - format!( - "failed to open config file: {}/config.json", - std::env::var("BOTLOC_DIR").unwrap() - ), - )); - }; - - let mut s = String::new(); - if file - .read_to_string(&mut s) - .await - .map_err(|e| { - error!("Failed to open config file: {e}"); - e - }) - .is_err() - { - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - format!( - "Failed to read config file at {}/config.json", - std::env::var("BOTLOC_DIR").unwrap() - ), - )); - }; - let Ok(val) = serde_json::from_str::(&s).map_err(|e| { - error!("Failed to open config file: {e}"); - e - }) else { - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - format!( - "Failed to read config file as json at {}/config.json", - std::env::var("BOTLOC_DIR").unwrap() - ), - )); - }; - Ok(Json(val)) -} - -async fn get_db(_user: UserLoggedIn) -> Result, (StatusCode, String)> { - info!("Requested config"); - let Ok(mut file) = tokio::fs::File::open( - std::env::var("BOTLOC_DIR").map_err(|e| { - error!("Failed to open config file: {e}"); - ( - StatusCode::INTERNAL_SERVER_ERROR, - "please set env CONFIG_PATH".to_string(), - ) - })? + "/db.json", - ) - .await - .map_err(|e| { - error!("Failed to open config file: {e}"); - e - }) else { - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - format!( - "failed to open config file: {}/db.json", - std::env::var("BOTLOC_DIR").unwrap() - ), - )); - }; - - let mut s = String::new(); - if file - .read_to_string(&mut s) - .await - .map_err(|e| { - error!("Failed to open config file: {e}"); - e - }) - .is_err() - { - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - format!( - "Failed to read config file at {}/db.json", - std::env::var("BOTLOC_DIR").unwrap() - ), - )); - }; - let Ok(val) = serde_json::from_str::(&s).map_err(|e| { - error!("Failed to open config file: {e}"); - e - }) else { - return Err(( - StatusCode::INTERNAL_SERVER_ERROR, - format!( - "Failed to read config file as json at {}/db.json", - std::env::var("BOTLOC_DIR").unwrap() - ), - )); - }; - Ok(Json(val)) -} - async fn status() -> Result { info!("Requested status"); - let mut output = tokio::process::Command::new("systemctl") - .args(["--user", "status", "botloc.service"]) + let mut output = tokio::process::Command::new("journalctl") + .args(["-xeu", "botloc"]) .output() .await // let mut output = child.wait_with_output().await @@ -631,7 +342,6 @@ async fn status() -> Result { } async fn git_pull() -> Result { - dbg!(std::env::var("PATH")); info!("Requested to pull"); let mut output = tokio::process::Command::new("/home/maix/.nix-profile/bin/git") .current_dir(std::env::var("BOTLOC_DIR").map_err(|e| { diff --git a/src/oauth2.rs b/src/oauth2.rs new file mode 100644 index 0000000..832815d --- /dev/null +++ b/src/oauth2.rs @@ -0,0 +1,134 @@ +use std::collections::HashMap; + +use base64::Engine; +use color_eyre::eyre::{self, WrapErr}; +use serde::{de::DeserializeOwned, Deserialize, Serialize}; + +#[derive(Clone, Debug)] +pub struct OauthClient { + client_id: String, + client_secret: String, + redirect_uri: String, + token: Token, + http: reqwest::Client, +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct Token { + #[serde(default)] + refresh_token: Option, + pub access_token: String, + token_type: String, + expires_in: u64, + scope: String, + created_at: u64, +} + +impl OauthClient { + async fn get_app_token( + client: reqwest::Client, + uid: impl AsRef, + secret: impl AsRef, + ) -> eyre::Result { + let uid = uid.as_ref(); + let secret = secret.as_ref(); + + let mut form_data = HashMap::new(); + form_data.insert("grant_type", "client_credentials"); + form_data.insert("client_id", uid); + form_data.insert("client_secret", secret); + let response = client + .post("https://api.intra.42.fr/oauth/token") + .form(&form_data) + .send() + .await + .wrap_err("Sending request to fetch 42 API token")?; + let body = response.bytes().await?; + let text = String::from_utf8_lossy(&body); + println!("{}", text); + let json: Token = serde_json::from_slice(&body).unwrap(); // response.json().await.wrap_err("API response to json")?; + Ok(json) + } + pub async fn new( + client: reqwest::Client, + uid: impl AsRef, + secret: impl AsRef, + redirect_uri: impl AsRef, + ) -> eyre::Result { + let uid = uid.as_ref(); + let secret = secret.as_ref(); + let redirect_uri = redirect_uri.as_ref().to_string(); + let token = Self::get_app_token(client.clone(), uid, secret).await?; + Ok(Self { + client_id: uid.to_string(), + client_secret: secret.to_string(), + token, + redirect_uri, + http: client, + }) + } + + pub async fn get_auth_url(&self) -> eyre::Result { + let redirect_uri = + pct_str::PctString::encode(self.redirect_uri.chars(), pct_str::URIReserved); + let csrf = [(); 64].map(|()| rand::random()); + + let uri = http::Uri::builder() + .scheme("https") + .authority("api.intra.42.fr") + .path_and_query(format!( + "/oauth/authorize?client_id={}&scope=public&response_type=code&redirect_uri={redirect_uri}&code={}", + self.client_id, base64::engine::general_purpose::URL_SAFE.encode(csrf) + )) + .build() + .wrap_err("Failed to build URI")?; + Ok(uri) + } + + pub async fn get_user_token( + &self, + code: impl AsRef, + csrf: impl AsRef, + ) -> eyre::Result { + let code = code.as_ref(); + let csrf = csrf.as_ref(); + + let mut form_data = HashMap::new(); + form_data.insert("code", code); + form_data.insert("state", csrf); + form_data.insert("client_id", &self.client_id); + form_data.insert("client_secret", &self.client_secret); + form_data.insert("redirect_uri", &self.redirect_uri); + form_data.insert("grant_type", "authorization_code"); + let response = self + .http + .post("https://api.intra.42.fr/oauth/token") + .form(&form_data) + .send() + .await + .wrap_err("Failed to get token for user")?; + let json: Token = response.json().await.wrap_err("API response to json")?; + Ok(json) + } + + pub async fn do_request( + &self, + url: impl AsRef, + qs: &impl Serialize, + ) -> eyre::Result { + let url = url.as_ref(); + let req = self + .http + .get(url) + .query(qs) + .bearer_auth(&self.token.access_token) + .send() + .await + .wrap_err("Failed to send request")?; + let json = req + .json() + .await + .wrap_err("Failed to Deserialize response")?; + Ok(json) + } +} diff --git a/src/utils/memory_db_util.rs b/src/utils/memory_db_util.rs deleted file mode 100644 index 6f5a5fe..0000000 --- a/src/utils/memory_db_util.rs +++ /dev/null @@ -1,58 +0,0 @@ -use std::{ - collections::HashMap, - sync::{Arc, Mutex}, - thread::spawn, - time::SystemTime, -}; - -#[derive(Clone)] -pub struct AxumState { - db: Arc>>, -} - -#[derive(Clone, Debug)] -pub struct ItemOauthAxum { - pub verifier: String, - pub created_at: SystemTime, -} - -impl AxumState { - pub fn new() -> Self { - let db: Arc>> = Arc::new(Mutex::new(HashMap::new())); - let db_binding = Arc::clone(&db); - spawn(move || loop { - std::thread::sleep(std::time::Duration::from_secs(10)); - let mut db = db_binding.lock().unwrap(); - let now = SystemTime::now(); - db.retain(|_, item| now.duration_since(item.created_at).unwrap().as_secs() < 900); - }); - AxumState { - db: Arc::clone(&db), - } - } - - pub fn get(&self, key: String) -> Option { - let db = self.db.lock().unwrap(); - if let Some(item) = db.get(&key) { - Some(item.verifier.clone()) - } else { - None - } - } - - pub fn set(&self, key: String, value: String) { - let mut db = self.db.lock().unwrap(); - db.insert( - key, - ItemOauthAxum { - verifier: value, - created_at: SystemTime::now(), - }, - ); - } - - pub fn get_all_items(&self) -> Vec { - let db = self.db.lock().unwrap(); - db.values().cloned().collect::>() - } -} diff --git a/src/utils/mod.rs b/src/utils/mod.rs deleted file mode 100644 index d7cc83f..0000000 --- a/src/utils/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod memory_db_utils;