diff --git a/Cargo.lock b/Cargo.lock index fd89117..be55342 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -168,17 +168,6 @@ dependencies = [ "syn", ] -[[package]] -name = "async-trait" -version = "0.1.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507401cad91ec6a857ed5513a2073c82a9b9048762b885bb98655b306964681" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "async_zip" version = "0.0.17" @@ -201,32 +190,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" -[[package]] -name = "aws-lc-rs" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f379c4e505c0692333bd90a334baa234990faa06bdabefd3261f765946aa920" -dependencies = [ - "aws-lc-sys", - "mirai-annotations", - "paste", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68aa3d613f42dbf301dbbcaf3dc260805fd33ffd95f6d290ad7231a9e5d877a7" -dependencies = [ - "bindgen", - "cmake", - "dunce", - "fs_extra", - "libc", - "paste", -] - [[package]] name = "backtrace" version = "0.3.71" @@ -260,35 +223,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bindgen" -version = "0.69.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" -dependencies = [ - "bitflags 2.5.0", - "cexpr", - "clang-sys", - "itertools", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn", - "which", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" version = "2.5.0" @@ -354,15 +288,6 @@ version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd97381a8cc6493395a5afc4c691c1084b3768db713b73aa215217aa245d153" -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-if" version = "1.0.0" @@ -392,17 +317,6 @@ dependencies = [ "windows-targets 0.52.4", ] -[[package]] -name = "clang-sys" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "4.4.18" @@ -440,15 +354,6 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" -[[package]] -name = "cmake" -version = "0.1.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" -dependencies = [ - "cc", -] - [[package]] name = "colorchoice" version = "1.0.0" @@ -464,16 +369,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.6" @@ -562,18 +457,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "diqwest" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad41e37bc7d22a32ada3a0dad12b12b2347e88e8511683b111967b776f750eb" -dependencies = [ - "async-trait", - "digest_auth", - "reqwest", - "url", -] - [[package]] name = "doc-comment" version = "0.3.3" @@ -597,13 +480,13 @@ dependencies = [ "clap", "clap_complete", "content_inspector", - "diqwest", + "digest_auth", "form_urlencoded", "futures-util", "glob", "headers", "http-body-util", - "hyper 1.2.0", + "hyper", "hyper-util", "if-addrs", "indexmap", @@ -618,7 +501,7 @@ dependencies = [ "regex", "reqwest", "rstest", - "rustls-pemfile 2.1.2", + "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", @@ -636,18 +519,6 @@ dependencies = [ "xml-rs", ] -[[package]] -name = "dunce" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" - -[[package]] -name = "either" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" - [[package]] name = "encoding_rs" version = "0.8.33" @@ -713,12 +584,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - [[package]] name = "futures" version = "0.3.30" @@ -879,30 +744,11 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 2.5.0", + "bitflags", "ignore", "walkdir", ] -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http 0.2.12", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "h2" version = "0.4.4" @@ -914,7 +760,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http 1.1.0", + "http", "indexmap", "slab", "tokio", @@ -937,7 +783,7 @@ dependencies = [ "base64 0.21.7", "bytes", "headers-core", - "http 1.1.0", + "http", "httpdate", "mime", "sha1", @@ -949,7 +795,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" dependencies = [ - "http 1.1.0", + "http", ] [[package]] @@ -964,26 +810,6 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - [[package]] name = "http" version = "1.1.0" @@ -995,17 +821,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http 0.2.12", - "pin-project-lite", -] - [[package]] name = "http-body" version = "1.0.0" @@ -1013,7 +828,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", - "http 1.1.0", + "http", ] [[package]] @@ -1024,8 +839,8 @@ checksum = "0475f8b2ac86659c21b64320d5d653f9efe42acd2a4e560073ec61a155a34f1d" dependencies = [ "bytes", "futures-core", - "http 1.1.0", - "http-body 1.0.0", + "http", + "http-body", "pin-project-lite", ] @@ -1041,30 +856,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "hyper" -version = "0.14.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.2.0" @@ -1074,29 +865,33 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.4", - "http 1.1.0", - "http-body 1.0.0", + "h2", + "http", + "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", "smallvec", "tokio", + "want", ] [[package]] name = "hyper-rustls" -version = "0.24.2" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" dependencies = [ "futures-util", - "http 0.2.12", - "hyper 0.14.28", - "rustls 0.21.10", + "http", + "hyper", + "hyper-util", + "rustls 0.22.3", + "rustls-pki-types", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls 0.25.0", + "tower-service", ] [[package]] @@ -1106,13 +901,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca38ef113da30126bbff9cd1705f9273e15d45498615d138b0c20279ac7a76aa" dependencies = [ "bytes", + "futures-channel", "futures-util", - "http 1.1.0", - "http-body 1.0.0", - "hyper 1.2.0", + "http", + "http-body", + "hyper", "pin-project-lite", "socket2", "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -1190,15 +989,6 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.11" @@ -1220,28 +1010,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" -[[package]] -name = "libloading" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" -dependencies = [ - "cfg-if", - "windows-targets 0.52.4", -] - [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -1303,12 +1077,6 @@ dependencies = [ "unicase", ] -[[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.2" @@ -1329,22 +1097,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "mirai-annotations" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9be0862c1b3f26a88803c4a49de6889c10e608b3ee9344e6ef5b45fb37ad3d1" - -[[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 = "normalize-line-endings" version = "0.3.0" @@ -1391,12 +1143,6 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - [[package]] name = "percent-encoding" version = "2.3.1" @@ -1483,16 +1229,6 @@ dependencies = [ "termtree", ] -[[package]] -name = "prettyplease" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3928fb5db768cb86f891ff014f0144589297e3c6a1aba6ed7cecfdace270c7" -dependencies = [ - "proc-macro2", - "syn", -] - [[package]] name = "proc-macro2" version = "1.0.79" @@ -1578,20 +1314,21 @@ checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "3e6cc1e89e689536eb5aeede61520e874df5a4707df811cd5da4aa5fbb2aae19" dependencies = [ - "base64 0.21.7", + "base64 0.22.0", "bytes", - "encoding_rs", + "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.28", + "http", + "http-body", + "http-body-util", + "hyper", "hyper-rustls", + "hyper-util", "ipnet", "js-sys", "log", @@ -1600,15 +1337,15 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls 0.21.10", - "rustls-pemfile 1.0.4", + "rustls 0.22.3", + "rustls-pemfile", + "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", - "tokio-rustls 0.24.1", + "tokio-rustls 0.25.0", "tower-service", "url", "wasm-bindgen", @@ -1668,12 +1405,6 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc_version" version = "0.4.0" @@ -1689,7 +1420,7 @@ version = "0.38.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65e04861e65f21776e67888bfbea442b3642beaa0138fdb1dd7a84a52dffdb89" dependencies = [ - "bitflags 2.5.0", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -1698,14 +1429,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.10" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +checksum = "99008d7ad0bbbea527ec27bddbc0e432c5b87d8175178cee68d2eec9c4a1813c" dependencies = [ "log", "ring", - "rustls-webpki 0.101.7", - "sct", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] @@ -1714,24 +1447,14 @@ version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c4d6d8ad9f2492485e13453acbb291dd08f64441b6609c491f1c2cd2c6b4fe1" dependencies = [ - "aws-lc-rs", - "log", "once_cell", + "ring", "rustls-pki-types", - "rustls-webpki 0.102.2", + "rustls-webpki", "subtle", "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - [[package]] name = "rustls-pemfile" version = "2.1.2" @@ -1748,23 +1471,12 @@ version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecd36cc4259e3e4514335c4a138c6b43171a8d61d8f5c9348f9fc7529416f247" -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "rustls-webpki" version = "0.102.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" dependencies = [ - "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -1785,16 +1497,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "semver" version = "1.0.22" @@ -1891,12 +1593,6 @@ dependencies = [ "digest", ] -[[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.1" @@ -1977,27 +1673,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "tempfile" version = "3.10.1" @@ -2092,11 +1767,12 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" dependencies = [ - "rustls 0.21.10", + "rustls 0.22.3", + "rustls-pki-types", "tokio", ] @@ -2126,6 +1802,28 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -2138,6 +1836,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-core", ] @@ -2356,20 +2055,11 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.4" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" - -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" dependencies = [ - "either", - "home", - "once_cell", - "rustix", + "rustls-pki-types", ] [[package]] @@ -2546,9 +2236,9 @@ checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winreg" -version = "0.50.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ "cfg-if", "windows-sys 0.48.0", diff --git a/Cargo.toml b/Cargo.toml index f5cdbcf..1fcd455 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,7 @@ headers = "0.4" mime_guess = "2.0" if-addrs = "0.12" rustls-pemfile = { version = "2.0", optional = true } -tokio-rustls = { version = "0.26", optional = true } +tokio-rustls = { version = "0.26", optional = true, default-features = false, features = ["ring", "tls12"]} md5 = "0.7" lazy_static = "1.4" uuid = { version = "1.7", features = ["v4", "fast-rng"] } @@ -59,14 +59,14 @@ tls = ["rustls-pemfile", "tokio-rustls"] [dev-dependencies] assert_cmd = "2" -reqwest = { version = "0.11", features = ["blocking", "multipart", "rustls-tls"], default-features = false } +reqwest = { version = "0.12", features = ["blocking", "multipart", "rustls-tls"], default-features = false } assert_fs = "1" port_check = "0.2" rstest = "0.18" regex = "1" url = "2" -diqwest = { version = "2.0", features = ["blocking"], default-features = false } predicates = "3" +digest_auth = "0.3.1" [profile.release] opt-level = 3 diff --git a/tests/auth.rs b/tests/auth.rs index 34a5d69..adaf63f 100644 --- a/tests/auth.rs +++ b/tests/auth.rs @@ -1,7 +1,8 @@ +mod digest_auth_util; mod fixtures; mod utils; -use diqwest::blocking::WithDigestAuth; +use digest_auth_util::send_with_digest_auth; use fixtures::{server, Error, TestServer}; use indexmap::IndexSet; use rstest::rstest; @@ -32,9 +33,7 @@ fn auth(#[case] server: TestServer, #[case] user: &str, #[case] pass: &str) -> R let url = format!("{}file1", server.url()); let resp = fetch!(b"PUT", &url).body(b"abc".to_vec()).send()?; assert_eq!(resp.status(), 401); - let resp = fetch!(b"PUT", &url) - .body(b"abc".to_vec()) - .send_with_digest_auth(user, pass)?; + let resp = send_with_digest_auth(fetch!(b"PUT", &url).body(b"abc".to_vec()), user, pass)?; assert_eq!(resp.status(), 201); Ok(()) } @@ -67,13 +66,12 @@ fn auth_hashed_password( let url = format!("{}file1", server.url()); let resp = fetch!(b"PUT", &url).body(b"abc".to_vec()).send()?; assert_eq!(resp.status(), 401); - if let Err(err) = fetch!(b"PUT", &url) - .body(b"abc".to_vec()) - .send_with_digest_auth("user", "pass") + if let Err(err) = + send_with_digest_auth(fetch!(b"PUT", &url).body(b"abc".to_vec()), "user", "pass") { assert_eq!( - format!("{err:?}"), - r#"DigestAuth(MissingRequired("realm", "Basic realm=\"DUFS\""))"# + err.to_string(), + r#"Missing "realm" in header: Basic realm="DUFS""# ); } let resp = fetch!(b"PUT", &url) @@ -91,9 +89,7 @@ fn auth_and_public( let url = format!("{}file1", server.url()); let resp = fetch!(b"PUT", &url).body(b"abc".to_vec()).send()?; assert_eq!(resp.status(), 401); - let resp = fetch!(b"PUT", &url) - .body(b"abc".to_vec()) - .send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"PUT", &url).body(b"abc".to_vec()), "user", "pass")?; assert_eq!(resp.status(), 201); let resp = fetch!(b"GET", &url).send()?; assert_eq!(resp.status(), 200); @@ -125,9 +121,9 @@ fn auth_check( let url = format!("{}index.html", server.url()); let resp = fetch!(b"WRITEABLE", &url).send()?; assert_eq!(resp.status(), 401); - let resp = fetch!(b"WRITEABLE", &url).send_with_digest_auth("user2", "pass2")?; + let resp = send_with_digest_auth(fetch!(b"WRITEABLE", &url), "user2", "pass2")?; assert_eq!(resp.status(), 403); - let resp = fetch!(b"WRITEABLE", &url).send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"WRITEABLE", &url), "user", "pass")?; assert_eq!(resp.status(), 200); Ok(()) } @@ -139,9 +135,9 @@ fn auth_compact_rules( let url = format!("{}index.html", server.url()); let resp = fetch!(b"WRITEABLE", &url).send()?; assert_eq!(resp.status(), 401); - let resp = fetch!(b"WRITEABLE", &url).send_with_digest_auth("user2", "pass2")?; + let resp = send_with_digest_auth(fetch!(b"WRITEABLE", &url), "user2", "pass2")?; assert_eq!(resp.status(), 403); - let resp = fetch!(b"WRITEABLE", &url).send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"WRITEABLE", &url), "user", "pass")?; assert_eq!(resp.status(), 200); Ok(()) } @@ -153,12 +149,10 @@ fn auth_readonly( let url = format!("{}index.html", server.url()); let resp = fetch!(b"GET", &url).send()?; assert_eq!(resp.status(), 401); - let resp = fetch!(b"GET", &url).send_with_digest_auth("user2", "pass2")?; + let resp = send_with_digest_auth(fetch!(b"GET", &url), "user2", "pass2")?; assert_eq!(resp.status(), 200); let url = format!("{}file1", server.url()); - let resp = fetch!(b"PUT", &url) - .body(b"abc".to_vec()) - .send_with_digest_auth("user2", "pass2")?; + let resp = send_with_digest_auth(fetch!(b"PUT", &url).body(b"abc".to_vec()), "user2", "pass2")?; assert_eq!(resp.status(), 403); Ok(()) } @@ -171,13 +165,9 @@ fn auth_nest( let url = format!("{}dir1/file1", server.url()); let resp = fetch!(b"PUT", &url).body(b"abc".to_vec()).send()?; assert_eq!(resp.status(), 401); - let resp = fetch!(b"PUT", &url) - .body(b"abc".to_vec()) - .send_with_digest_auth("user3", "pass3")?; + let resp = send_with_digest_auth(fetch!(b"PUT", &url).body(b"abc".to_vec()), "user3", "pass3")?; assert_eq!(resp.status(), 201); - let resp = fetch!(b"PUT", &url) - .body(b"abc".to_vec()) - .send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"PUT", &url).body(b"abc".to_vec()), "user", "pass")?; assert_eq!(resp.status(), 201); Ok(()) } @@ -219,9 +209,11 @@ fn auth_webdav_move( ) -> Result<(), Error> { let origin_url = format!("{}dir1/test.html", server.url()); let new_url = format!("{}test2.html", server.url()); - let resp = fetch!(b"MOVE", &origin_url) - .header("Destination", &new_url) - .send_with_digest_auth("user3", "pass3")?; + let resp = send_with_digest_auth( + fetch!(b"MOVE", &origin_url).header("Destination", &new_url), + "user3", + "pass3", + )?; assert_eq!(resp.status(), 403); Ok(()) } @@ -233,9 +225,11 @@ fn auth_webdav_copy( ) -> Result<(), Error> { let origin_url = format!("{}dir1/test.html", server.url()); let new_url = format!("{}test2.html", server.url()); - let resp = fetch!(b"COPY", &origin_url) - .header("Destination", &new_url) - .send_with_digest_auth("user3", "pass3")?; + let resp = send_with_digest_auth( + fetch!(b"COPY", &origin_url).header("Destination", &new_url), + "user3", + "pass3", + )?; assert_eq!(resp.status(), 403); Ok(()) } @@ -247,7 +241,7 @@ fn auth_path_prefix( let url = format!("{}xyz/index.html", server.url()); let resp = fetch!(b"GET", &url).send()?; assert_eq!(resp.status(), 401); - let resp = fetch!(b"GET", &url).send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"GET", &url), "user", "pass")?; assert_eq!(resp.status(), 200); Ok(()) } @@ -256,12 +250,15 @@ fn auth_path_prefix( fn auth_partial_index( #[with(&["--auth", "user:pass@/dir1:rw,/dir2:rw", "-A"])] server: TestServer, ) -> Result<(), Error> { - let resp = fetch!(b"GET", server.url()).send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"GET", server.url()), "user", "pass")?; assert_eq!(resp.status(), 200); let paths = utils::retrieve_index_paths(&resp.text()?); assert_eq!(paths, IndexSet::from(["dir1/".into(), "dir2/".into()])); - let resp = fetch!(b"GET", format!("{}?q={}", server.url(), "test.html")) - .send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth( + fetch!(b"GET", format!("{}?q={}", server.url(), "test.html")), + "user", + "pass", + )?; assert_eq!(resp.status(), 200); let paths = utils::retrieve_index_paths(&resp.text()?); assert_eq!( @@ -288,7 +285,7 @@ fn auth_propfind_dir( #[with(&["--auth", "admin:admin@/:rw", "--auth", "user:pass@/dir-assets", "-A"])] server: TestServer, ) -> Result<(), Error> { - let resp = fetch!(b"PROPFIND", server.url()).send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"PROPFIND", server.url()), "user", "pass")?; assert_eq!(resp.status(), 207); let body = resp.text()?; assert!(body.contains("/dir-assets/")); @@ -320,15 +317,11 @@ fn auth_precedence( #[with(&["--auth", "user:pass@/dir1:rw,/dir1/test.txt", "-A"])] server: TestServer, ) -> Result<(), Error> { let url = format!("{}dir1/test.txt", server.url()); - let resp = fetch!(b"PUT", &url) - .body(b"abc".to_vec()) - .send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"PUT", &url).body(b"abc".to_vec()), "user", "pass")?; assert_eq!(resp.status(), 403); let url = format!("{}dir1/file1", server.url()); - let resp = fetch!(b"PUT", &url) - .body(b"abc".to_vec()) - .send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"PUT", &url).body(b"abc".to_vec()), "user", "pass")?; assert_eq!(resp.status(), 201); Ok(()) diff --git a/tests/config.rs b/tests/config.rs index d380d83..477f30c 100644 --- a/tests/config.rs +++ b/tests/config.rs @@ -1,9 +1,10 @@ +mod digest_auth_util; mod fixtures; mod utils; use assert_cmd::prelude::*; use assert_fs::TempDir; -use diqwest::blocking::WithDigestAuth; +use digest_auth_util::send_with_digest_auth; use fixtures::{port, tmpdir, wait_for_port, Error}; use rstest::rstest; use std::path::PathBuf; @@ -27,20 +28,18 @@ fn use_config_file(tmpdir: TempDir, port: u16) -> Result<(), Error> { assert_eq!(resp.status(), 401); let url = format!("http://localhost:{port}/dufs/index.html"); - let resp = fetch!(b"GET", &url).send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"GET", &url), "user", "pass")?; assert_eq!(resp.text()?, "This is index.html"); let url = format!("http://localhost:{port}/dufs?simple"); - let resp = fetch!(b"GET", &url).send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"GET", &url), "user", "pass")?; let text: String = resp.text().unwrap(); assert!(text.split('\n').any(|c| c == "dir1/")); assert!(!text.split('\n').any(|c| c == "dir3/")); assert!(!text.split('\n').any(|c| c == "test.txt")); let url = format!("http://localhost:{port}/dufs/dir1/upload.txt"); - let resp = fetch!(b"PUT", &url) - .body("Hello") - .send_with_digest_auth("user", "pass")?; + let resp = send_with_digest_auth(fetch!(b"PUT", &url).body("Hello"), "user", "pass")?; assert_eq!(resp.status(), 201); child.kill()?; diff --git a/tests/digest_auth_util.rs b/tests/digest_auth_util.rs new file mode 100644 index 0000000..61c06f2 --- /dev/null +++ b/tests/digest_auth_util.rs @@ -0,0 +1,91 @@ +/// Refs https://github.dev/maoertel/diqwest/blob/main/src/blocking.rs +use anyhow::{anyhow, Result}; +use digest_auth::{AuthContext, AuthorizationHeader, HttpMethod}; +use hyper::{header::AUTHORIZATION, HeaderMap, StatusCode}; +use reqwest::blocking::{RequestBuilder, Response}; +use url::Position; + +pub fn send_with_digest_auth( + request_builder: RequestBuilder, + username: &str, + password: &str, +) -> Result { + let first_response = try_clone_request_builder(&request_builder)?.send()?; + match first_response.status() { + StatusCode::UNAUTHORIZED => { + try_digest_auth(request_builder, first_response, username, password) + } + _ => Ok(first_response), + } +} + +fn try_digest_auth( + request_builder: RequestBuilder, + first_response: Response, + username: &str, + password: &str, +) -> Result { + if let Some(answer) = get_answer( + &request_builder, + first_response.headers(), + username, + password, + )? { + return Ok(request_builder + .header(AUTHORIZATION, answer.to_header_string()) + .send()?); + }; + + Ok(first_response) +} + +fn try_clone_request_builder(request_builder: &RequestBuilder) -> Result { + request_builder + .try_clone() + .ok_or_else(|| anyhow!("Request body must not be a stream")) +} + +fn get_answer( + request_builder: &RequestBuilder, + first_response: &HeaderMap, + username: &str, + password: &str, +) -> Result> { + let answer = calculate_answer(request_builder, first_response, username, password); + match answer { + Ok(answer) => Ok(Some(answer)), + Err(error) => Err(error), + } +} + +fn calculate_answer( + request_builder: &RequestBuilder, + headers: &HeaderMap, + username: &str, + password: &str, +) -> Result { + let request = try_clone_request_builder(request_builder)?.build()?; + let path = &request.url()[Position::AfterPort..]; + let method = HttpMethod::from(request.method().as_str()); + let body = request.body().and_then(|b| b.as_bytes()); + + parse_digest_auth_header(headers, path, method, body, username, password) +} + +fn parse_digest_auth_header( + header: &HeaderMap, + path: &str, + method: HttpMethod, + body: Option<&[u8]>, + username: &str, + password: &str, +) -> Result { + let www_auth = header + .get("www-authenticate") + .ok_or_else(|| anyhow!("The header 'www-authenticate' is missing."))? + .to_str()?; + let context = AuthContext::new_with_method(username, password, path, body, method); + let mut prompt = digest_auth::parse(www_auth)?; + + Ok(prompt.respond(&context)?) +} diff --git a/tests/http_logger.rs b/tests/http_logger.rs index a3a2da1..9256d13 100644 --- a/tests/http_logger.rs +++ b/tests/http_logger.rs @@ -1,7 +1,8 @@ +mod digest_auth_util; mod fixtures; mod utils; -use diqwest::blocking::WithDigestAuth; +use digest_auth_util::send_with_digest_auth; use fixtures::{port, tmpdir, wait_for_port, Error}; use assert_cmd::prelude::*; @@ -31,12 +32,12 @@ fn log_remote_user( let stdout = child.stdout.as_mut().expect("Failed to get stdout"); - let req = fetch!(b"GET", &format!("http://localhost:{port}")); + let req_builder = fetch!(b"GET", &format!("http://localhost:{port}")); let resp = if is_basic { - req.basic_auth("user", Some("pass")).send()? + req_builder.basic_auth("user", Some("pass")).send()? } else { - req.send_with_digest_auth("user", "pass")? + send_with_digest_auth(req_builder, "user", "pass")? }; assert_eq!(resp.status(), 200);