diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2f9fac01..f7c62aab 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,15 +31,8 @@ jobs: - name: Checkout sources uses: actions/checkout@v4 - - name: Install stable toolchain - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: ${{ matrix.rust }} - override: true - - - name: Install Protoc - uses: arduino/setup-protoc@v3 + - name: Install devbox + uses: jetify-com/devbox-install-action@v0.11.0 - uses: Swatinem/rust-cache@v2 @@ -147,7 +140,7 @@ jobs: cp "target/${{ matrix.target }}/release/$BIN_NAME" "dist/" fi - - uses: actions/upload-artifact@v2.2.4 + - uses: actions/upload-artifact@v4 with: name: bins-${{ matrix.build }} path: dist diff --git a/Cargo.lock b/Cargo.lock index 0819bf32..44deaa42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -101,6 +101,96 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-io" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.6.0", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel 2.3.1", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.0", + "futures-lite 2.6.0", + "rustix", + "tracing", +] + +[[package]] +name = "async-signal" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfb3634b73397aa844481f814fad23bbf07fdb0eabec10f2eb95e58944b1ec32" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.52.0", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -123,6 +213,12 @@ dependencies = [ "syn 2.0.59", ] +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" version = "0.1.80" @@ -134,6 +230,12 @@ dependencies = [ "syn 2.0.59", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atty" version = "0.2.14" @@ -170,10 +272,10 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "fastrand", + "fastrand 2.0.2", "hex", "http 0.2.12", - "hyper", + "hyper 0.14.28", "ring", "time", "tokio", @@ -208,7 +310,7 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "fastrand", + "fastrand 2.0.2", "http 0.2.12", "http-body 0.4.6", "percent-encoding 2.3.1", @@ -233,7 +335,7 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "fastrand", + "fastrand 2.0.2", "http 0.2.12", "once_cell", "regex-lite", @@ -256,7 +358,7 @@ dependencies = [ "aws-smithy-types", "aws-types", "bytes", - "fastrand", + "fastrand 2.0.2", "http 0.2.12", "once_cell", "regex-lite", @@ -414,12 +516,12 @@ dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", "bytes", - "fastrand", + "fastrand 2.0.2", "h2", "http 0.2.12", "http-body 0.4.6", "http-body 1.0.0", - "hyper", + "hyper 0.14.28", "hyper-rustls 0.24.2", "once_cell", "pin-project-lite", @@ -509,7 +611,7 @@ dependencies = [ "futures-util", "http 0.2.12", "http-body 0.4.6", - "hyper", + "hyper 0.14.28", "itoa", "matchit", "memchr", @@ -518,7 +620,7 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper", + "sync_wrapper 0.1.2", "tower", "tower-layer", "tower-service", @@ -541,6 +643,68 @@ dependencies = [ "tower-service", ] +[[package]] +name = "azure_core" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ce3de4b65b1ee2667c81d1fc692949049502a4cf9c38118d811d6d79a7eaef" +dependencies = [ + "async-trait", + "base64 0.22.0", + "bytes", + "dyn-clone", + "futures", + "getrandom 0.2.14", + "http-types", + "once_cell", + "paste", + "pin-project", + "rand 0.8.5", + "reqwest 0.12.5", + "rustc_version", + "serde", + "serde_json", + "time", + "tracing", + "url 2.5.0", + "uuid", +] + +[[package]] +name = "azure_identity" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c97790480791ec1ee9b76f5c6499b1d0aac0d4cd1e62010bfc19bb545544c5" +dependencies = [ + "async-lock", + "async-process", + "async-trait", + "azure_core", + "futures", + "oauth2", + "pin-project", + "serde", + "time", + "tracing", + "tz-rs", + "url 2.5.0", + "uuid", +] + +[[package]] +name = "azure_security_keyvault" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "338cac645bda0555f59189873be0cccaf420c26791f009b2207b62474cebbab8" +dependencies = [ + "async-trait", + "azure_core", + "futures", + "serde", + "serde_json", + "time", +] + [[package]] name = "backtrace" version = "0.3.71" @@ -605,6 +769,19 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite 2.6.0", + "piper", +] + [[package]] name = "bollard" version = "0.13.0" @@ -618,7 +795,7 @@ dependencies = [ "futures-util", "hex", "http 0.2.12", - "hyper", + "hyper 0.14.28", "hyperlocal", "log", "pin-project-lite", @@ -695,8 +872,10 @@ checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", "serde", + "wasm-bindgen", "windows-targets 0.52.5", ] @@ -804,6 +983,15 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console" version = "0.15.8" @@ -817,6 +1005,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "const_fn" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f8a2ca5ac02d09563609681103aada9e1777d54fc57a5acd7a41404f9c93b6e" + [[package]] name = "content_inspector" version = "0.2.4" @@ -1179,7 +1373,7 @@ dependencies = [ "dyn-clone", "futures", "lazy_static", - "rand", + "rand 0.8.5", "secrecy", "serde", "serde_json", @@ -1197,7 +1391,7 @@ dependencies = [ "derive_builder 0.11.2", "dockertest", "futures", - "rand", + "rand 0.8.5", "tempfile", "type-map", ] @@ -1306,6 +1500,33 @@ dependencies = [ "tower-service", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + [[package]] name = "exitcode" version = "1.1.2" @@ -1322,6 +1543,15 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "fastrand" version = "2.0.2" @@ -1449,6 +1679,34 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand 2.0.2", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.30" @@ -1500,6 +1758,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.2.14" @@ -1507,8 +1776,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ "cfg-if", + "js-sys", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -1556,7 +1827,7 @@ dependencies = [ "base64 0.13.1", "chrono", "http 0.2.12", - "hyper", + "hyper 0.14.28", "itertools 0.10.5", "mime", "serde", @@ -1577,7 +1848,7 @@ dependencies = [ "anyhow", "google-apis-common", "http 0.2.12", - "hyper", + "hyper 0.14.28", "hyper-rustls 0.24.2", "itertools 0.10.5", "mime", @@ -1646,6 +1917,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -1726,6 +2003,26 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-types" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad" +dependencies = [ + "anyhow", + "async-channel 1.9.0", + "base64 0.13.1", + "futures-lite 1.13.0", + "infer", + "pin-project-lite", + "rand 0.7.3", + "serde", + "serde_json", + "serde_qs", + "serde_urlencoded", + "url 2.5.0", +] + [[package]] name = "httparse" version = "1.8.0" @@ -1787,6 +2084,25 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "256fb8d4bd6413123cc9d91832d78325c48ff41677595be797d90f42969beae0" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -1795,7 +2111,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper", + "hyper 0.14.28", "log", "rustls 0.21.10", "rustls-native-certs 0.6.3", @@ -1811,7 +2127,7 @@ checksum = "399c78f9338483cb7e630c8474b07268983c6bd5acee012e4211f9f7bb21b070" dependencies = [ "futures-util", "http 0.2.12", - "hyper", + "hyper 0.14.28", "log", "rustls 0.22.3", "rustls-native-certs 0.7.0", @@ -1826,7 +2142,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" dependencies = [ - "hyper", + "hyper 0.14.28", "pin-project-lite", "tokio", "tokio-io-timeout", @@ -1839,12 +2155,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper", + "hyper 0.14.28", "native-tls", "tokio", "tokio-native-tls", ] +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.5.2", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cde7055719c54e36e95e8719f95883f22072a48ede39db7fc17a4e1d5281e9b9" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "hyper 1.5.2", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", +] + [[package]] name = "hyperlocal" version = "0.8.0" @@ -1853,7 +2205,7 @@ checksum = "0fafdf7b2b2de7c9784f76e02c0935e65a8117ec3b768644379983ab333ac98c" dependencies = [ "futures-util", "hex", - "hyper", + "hyper 0.14.28", "pin-project", "tokio", ] @@ -1951,6 +2303,12 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "infer" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac" + [[package]] name = "insta" version = "1.38.0" @@ -1967,6 +2325,15 @@ dependencies = [ "similar", ] +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -2101,7 +2468,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.48.0", ] @@ -2188,6 +2555,25 @@ dependencies = [ "libc", ] +[[package]] +name = "oauth2" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c38841cdd844847e3e7c8d29cef9dcfed8877f8f56f9071f77843ecf3baf937f" +dependencies = [ + "base64 0.13.1", + "chrono", + "getrandom 0.2.14", + "http 0.2.12", + "rand 0.8.5", + "serde", + "serde_json", + "serde_path_to_error", + "sha2", + "thiserror", + "url 2.5.0", +] + [[package]] name = "object" version = "0.32.2" @@ -2275,6 +2661,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.1" @@ -2307,6 +2699,12 @@ dependencies = [ "regex", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "percent-encoding" version = "1.0.1" @@ -2400,7 +2798,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" dependencies = [ "phf_shared", - "rand", + "rand 0.8.5", ] [[package]] @@ -2444,12 +2842,38 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand 2.0.2", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "polling" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2549,6 +2973,19 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + [[package]] name = "rand" version = "0.8.5" @@ -2556,8 +2993,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", ] [[package]] @@ -2567,7 +3014,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", ] [[package]] @@ -2576,7 +3032,16 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.14", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", ] [[package]] @@ -2672,9 +3137,9 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper", + "hyper 0.14.28", "hyper-rustls 0.24.2", - "hyper-tls", + "hyper-tls 0.5.0", "ipnet", "js-sys", "log", @@ -2688,7 +3153,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", "tokio-native-tls", @@ -2699,7 +3164,48 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots 0.25.4", - "winreg", + "winreg 0.50.0", +] + +[[package]] +name = "reqwest" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +dependencies = [ + "base64 0.22.0", + "bytes", + "futures-core", + "futures-util", + "http 1.1.0", + "http-body 1.0.0", + "http-body-util", + "hyper 1.5.2", + "hyper-tls 0.6.0", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding 2.3.1", + "pin-project-lite", + "rustls-pemfile 2.1.2", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tokio-native-tls", + "tokio-util", + "tower-service", + "url 2.5.0", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "winreg 0.52.0", ] [[package]] @@ -2710,7 +3216,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.14", "libc", "spin", "untrusted", @@ -2726,7 +3232,7 @@ dependencies = [ "base64 0.22.0", "futures", "http 0.2.12", - "hyper", + "hyper 0.14.28", "hyper-rustls 0.24.2", "quick-error", "serde", @@ -2768,7 +3274,7 @@ dependencies = [ "async-trait", "bytes", "http 0.2.12", - "reqwest", + "reqwest 0.11.27", "rustify_derive", "serde", "serde_json", @@ -3023,6 +3529,27 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_path_to_error" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +dependencies = [ + "itoa", + "serde", +] + +[[package]] +name = "serde_qs" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6" +dependencies = [ + "percent-encoding 2.3.1", + "serde", + "thiserror", +] + [[package]] name = "serde_spanned" version = "0.6.5" @@ -3372,6 +3899,12 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + [[package]] name = "synstructure" version = "0.12.6" @@ -3467,7 +4000,10 @@ dependencies = [ "aws-config", "aws-sdk-secretsmanager", "aws-sdk-ssm", + "azure_identity", + "azure_security_keyvault", "base64 0.22.0", + "chrono", "crc32c", "dockertest", "dockertest-server", @@ -3476,7 +4012,7 @@ dependencies = [ "fs-err", "google-secretmanager1", "home", - "hyper", + "hyper 0.14.28", "insta", "lazy_static", "rs-consul", @@ -3501,7 +4037,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand", + "fastrand 2.0.2", "rustix", "windows-sys 0.52.0", ] @@ -3520,7 +4056,7 @@ dependencies = [ "percent-encoding 2.3.1", "pest", "pest_derive", - "rand", + "rand 0.8.5", "regex", "serde", "serde_json", @@ -3603,6 +4139,7 @@ checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", + "js-sys", "libc", "num-conv", "num_threads", @@ -3775,7 +4312,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper", + "hyper 0.14.28", "hyper-timeout", "percent-encoding 2.3.1", "pin-project", @@ -3812,7 +4349,7 @@ dependencies = [ "indexmap 1.9.3", "pin-project", "pin-project-lite", - "rand", + "rand 0.8.5", "slab", "tokio", "tokio-util", @@ -3955,6 +4492,15 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "tz-rs" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33851b15c848fad2cf4b105c6bb66eb9512b6f6c44a4b13f57c53c73c707e2b4" +dependencies = [ + "const_fn", +] + [[package]] name = "ucd-trie" version = "0.1.6" @@ -4095,6 +4641,7 @@ dependencies = [ "form_urlencoded", "idna 0.5.0", "percent-encoding 2.3.1", + "serde", ] [[package]] @@ -4114,6 +4661,9 @@ name = "uuid" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +dependencies = [ + "getrandom 0.2.14", +] [[package]] name = "valuable" @@ -4131,7 +4681,7 @@ dependencies = [ "bytes", "derive_builder 0.12.0", "http 0.2.12", - "reqwest", + "reqwest 0.11.27", "rustify", "rustify_derive", "serde", @@ -4168,6 +4718,12 @@ dependencies = [ "libc", ] +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + [[package]] name = "walkdir" version = "2.5.0" @@ -4187,6 +4743,12 @@ dependencies = [ "try-lock", ] +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -4259,6 +4821,19 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +[[package]] +name = "wasm-streams" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e072d4e72f700fb3443d8fe94a39315df013eef1104903cdb0a2abd322bbecd" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "web-sys" version = "0.3.69" @@ -4482,6 +5057,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "xmlparser" version = "0.13.6" @@ -4523,7 +5108,7 @@ dependencies = [ "base64 0.21.7", "futures", "http 0.2.12", - "hyper", + "hyper 0.14.28", "hyper-rustls 0.25.0", "itertools 0.12.1", "log", diff --git a/README.md b/README.md index f968b793..65071edf 100644 --- a/README.md +++ b/README.md @@ -318,6 +318,94 @@ Example format: You can get a list of the providers and their described configuration values [in the documentation](https://docs.rs/teller-providers/latest/teller_providers/providers/index.html). +### Azure Key Vault + +Uses Azure Key Vault as a secrets engine. + +```yaml +providers: + azurekv: + kind: azure_keyvault + options: + vault_name: "your-vault-name" +``` + +**Authentication:** Uses [`DefaultAzureCredential`](https://docs.rs/azure_identity/latest/azure_identity/struct.DefaultAzureCredential.html) which supports various methods like environment variables, managed identity, Azure CLI, etc. + +**Options:** + +* `vault_name` (required): The name of your Azure Key Vault instance (e.g., `my-vault`). The URL will be constructed as `https://.vault.azure.net/`. + +### Dotenv + +Uses `.env` files as a secrets engine. + +```yaml +providers: + dotenv: + kind: dotenv + maps: + - id: development + path: .env +``` + +### Google Secret Manager + +Uses Google Secret Manager as a secrets engine. + +```yaml +providers: + google: + kind: google_secretmanager + project_id: "your-gcp-project-id" +``` + +### HashiCorp Consul + +Uses HashiCorp Consul as a secrets engine. + +```yaml +providers: + consul: + kind: hashicorp_consul + address: "127.0.0.1:8500" # Address of your Consul agent + scheme: "http" # or "https" if using HTTPS +``` + +### HashiCorp Vault + +Uses HashiCorp Vault as a secrets engine. + +```yaml +providers: + vault: + kind: hashicorp + address: "http://127.0.0.1:8200" # Address of your Vault server + token: "your-vault-token" # Optional, if not using agent or other auth methods +``` + +### AWS Secrets Manager + +Uses AWS Secrets Manager as a secrets engine. + +```yaml +providers: + aws: + kind: aws_secretsmanager + region: "us-west-2" # Your AWS region +``` + +### SSM Parameter Store + +Uses AWS SSM Parameter Store as a secrets engine. + +```yaml +providers: + ssm: + kind: ssm + region: "us-west-2" # Your AWS region +``` + ### Testing check list: * [ ] **docker on windows**: if you have a container based test that uses Docker, make sure to exclude it on Windows using `#[cfg(not(windows))]` diff --git a/devbox.json b/devbox.json new file mode 100644 index 00000000..818b9f16 --- /dev/null +++ b/devbox.json @@ -0,0 +1,6 @@ +{ + "packages": [ + "rustup", + "protobuf" + ] +} \ No newline at end of file diff --git a/devbox.lock b/devbox.lock new file mode 100644 index 00000000..3eedc6e9 --- /dev/null +++ b/devbox.lock @@ -0,0 +1,18 @@ +{ + "lockfile_version": "1", + "packages": { + "github:NixOS/nixpkgs/nixpkgs-unstable": { + "last_modified": "2025-04-13T09:22:33Z", + "resolved": "github:NixOS/nixpkgs/18dd725c29603f582cf1900e0d25f9f1063dbf11?lastModified=1744536153&narHash=sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg%2FN38%3D" + }, + "protobuf": { + "resolved": "github:NixOS/nixpkgs/18dd725c29603f582cf1900e0d25f9f1063dbf11?narHash=sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg%2FN38%3D#protobuf", + "source": "nixpkg" + }, + "rustup": { + "plugin_version": "0.0.1", + "resolved": "github:NixOS/nixpkgs/18dd725c29603f582cf1900e0d25f9f1063dbf11?narHash=sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg%2FN38%3D#rustup", + "source": "nixpkg" + } + } +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 5d56faf9..292fe499 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "nightly" +channel = "stable" diff --git a/teller-providers/Cargo.toml b/teller-providers/Cargo.toml index 23b33131..ae4c1487 100644 --- a/teller-providers/Cargo.toml +++ b/teller-providers/Cargo.toml @@ -21,6 +21,7 @@ default = [ "google_secretmanager", "hashicorp_consul", "etcd", + "azure_keyvault", ] ssm = ["aws", "dep:aws-sdk-ssm"] @@ -31,6 +32,7 @@ dotenv = ["dep:dotenvy"] hashicorp_consul = ["dep:rs-consul"] aws = ["dep:aws-config"] etcd = ["dep:etcd-client"] +azure_keyvault = ["dep:azure_identity", "dep:azure_security_keyvault"] [dependencies] async-trait = { workspace = true } @@ -47,6 +49,9 @@ home = "0.5.5" hyper = "0.14" base64 = "0.22.0" tokio = "1" +# Azure Key Vault dependencies +azure_identity = { version = "0.20.0", optional = true } +azure_security_keyvault = { version = "0.20.0", optional = true } # gcp google-secretmanager1 = { version = "5.0.2", optional = true } crc32c = { version = "0.6", optional = true } @@ -73,3 +78,4 @@ dockertest = "0.3.0" tokio = { workspace = true } test-log = "0.2" tracing = "0.1" +chrono = "0.4" diff --git a/teller-providers/src/providers/azure_keyvault.rs b/teller-providers/src/providers/azure_keyvault.rs new file mode 100644 index 00000000..cba6bc16 --- /dev/null +++ b/teller-providers/src/providers/azure_keyvault.rs @@ -0,0 +1,233 @@ +/// Azure Key Vault Provider +/// +/// Uses Azure Key Vault as a secrets engine. +/// +/// ```yaml +/// providers: +/// azurekv: +/// kind: azure_keyvault +/// options: +/// vault_name: "your-vault-name" # Provide the name, not the full URL +/// ``` +/// +/// **Authentication:** Uses [`DefaultAzureCredential`](https://docs.rs/azure_identity/latest/azure_identity/struct.DefaultAzureCredential.html) which supports various methods like environment variables, managed identity, Azure CLI, etc. +/// +/// **Options:** +/// +/// * `vault_name` (required): The name of your Azure Key Vault instance (e.g., `my-vault`). The URL will be constructed as `https://.vault.azure.net/`. +use async_trait::async_trait; +use azure_identity::DefaultAzureCredentialBuilder; // Use builder pattern +use azure_security_keyvault::SecretClient; + +use crate::providers::ProviderKind; +use crate::{ + config::{PathMap, ProviderInfo, KV}, + Error, Provider, Result, +}; // Import ProviderInfo // Import ProviderKind for ProviderInfo + +// Add Debug derive for test panic message +#[derive(Debug)] +pub struct AzureKeyVault { + client: SecretClient, + name: String, + kind: ProviderKind, // Store kind for ProviderInfo +} + +impl AzureKeyVault { + pub async fn new(name: &str, vault_name: &str) -> Result { + // Handle the Result from the builder + let credential = DefaultAzureCredentialBuilder::new().build().map_err(|e| { + Error::CreateProviderError(format!( + "Failed to build Azure credential for '{}': {}", + name, e + )) + })?; + let credential_arc = std::sync::Arc::new(credential); + + let client = SecretClient::new( + &format!("https://{}.vault.azure.net/", vault_name), + credential_arc, + ) + .map_err(|e| { + Error::CreateProviderError(format!( + "Failed to create Azure Key Vault client for '{}': {}", + name, e + )) + })?; + Ok(Self { + client, + name: name.to_string(), + kind: ProviderKind::AzureKeyVault, + }) + } +} + +#[async_trait] +impl Provider for AzureKeyVault { + // Return ProviderInfo struct + fn kind(&self) -> ProviderInfo { + ProviderInfo { + kind: self.kind.clone(), + name: self.name.clone(), + } + } + + async fn get(&self, pm: &PathMap) -> Result> { + let secret_name = &pm.path; + let secret = self + .client + .get(secret_name) + .await + .map_err(|e| Error::GetError { + path: secret_name.clone(), + msg: format!("Provider '{}': {}", self.name, e), // Format details into msg + })?; + + let value = secret.value; + // Pass &str to from_value + Ok(vec![KV::from_value( + &value, + secret_name, + secret_name, + pm, + self.kind(), + )]) + } + + // Mark pm as unused + async fn put(&self, _pm: &PathMap, kvs: &[KV]) -> Result<()> { + for kv in kvs { + self.client + .set(&kv.key, &kv.value) + .await + .map_err(|e| Error::PutError { + path: kv.key.clone(), + msg: format!("Provider '{}': {}", self.name, e), + })?; + } + Ok(()) + } + + // Rename method to del + async fn del(&self, pm: &PathMap) -> Result<()> { + // The delete operation returns a DeletedSecretBundle, we just need to check for error + self.client + .delete(&pm.path) + .await + .map_err(|e| Error::DeleteError { + path: pm.path.clone(), + msg: format!("Provider '{}': {}", self.name, e), // Format details into msg + })?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use chrono::Utc; + use tokio; + + use super::*; + use crate::config::{MetaInfo, PathInfo, PathMap, Sensitivity, KV}; + // Helper to create a provider instance using the constant vault name + async fn create_provider() -> AzureKeyVault { + AzureKeyVault::new("test-akv", &"tellertestkv") + .await + .expect( + "Failed to create AzureKeyVault provider for testing. Ensure TEST_VAULT_NAME \ + constant is set correctly.", + ) + } + + #[tokio::test] + #[ignore] + async fn test_azure_keyvault_put_get_delete() { + let provider = create_provider().await; + let provider_info = provider.kind(); // Get provider info + let test_key = format!("teller-test-secret-{}", Utc::now().timestamp_millis()); + let test_value = "test-value"; + + // Use correct PathMap fields + let pm = PathMap { + id: "test-map".to_string(), // Add id + path: test_key.clone(), + keys: Default::default(), // Add keys + sensitivity: Sensitivity::None, // Add sensitivity + // other fields default + ..Default::default() + }; + + // Use correct KV fields and types + let kv = KV { + key: test_key.clone(), + value: test_value.to_string(), // Value should be String + from_key: test_key.clone(), + path: Some(PathInfo { + id: pm.id.clone(), + path: pm.path.clone(), + }), + provider: Some(provider_info.clone()), + meta: Some(MetaInfo { + sensitivity: Sensitivity::High, // Example sensitivity + ..Default::default() + }), + }; + + // PUT + provider + .put(&pm, &[kv.clone()]) + .await + .expect("Failed to put secret"); + println!("Successfully put secret: {}", test_key); + + // GET + let fetched_kvs = provider.get(&pm).await.expect("Failed to get secret"); + assert_eq!(fetched_kvs.len(), 1); + assert_eq!(fetched_kvs[0].key, test_key); + assert_eq!(fetched_kvs[0].value, test_value); // Compare String with &str + println!("Successfully got secret: {}", test_key); + + // DELETE (call del) + provider.del(&pm).await.expect("Failed to delete secret"); + println!("Successfully deleted secret: {}", test_key); + + // Verify deletion (GET should fail) + let get_result = provider.get(&pm).await; + assert!(get_result.is_err()); + // Check for the correct error variant + if let Err(Error::GetError { path, .. }) = get_result { + assert_eq!(path, test_key); + println!( + "Verified secret deletion (get failed as expected): {}", + test_key + ); + } else { + panic!("Expected GetError after deletion, but got {:?}", get_result); + } + } + + #[tokio::test] + #[ignore] + async fn test_azure_keyvault_get_nonexistent() { + let provider = create_provider().await; + let test_key = "teller-nonexistent-secret"; + // Use correct PathMap fields + let pm = PathMap { + id: "test-nonexistent".to_string(), + path: test_key.to_string(), + ..Default::default() + }; + + let get_result = provider.get(&pm).await; + assert!(get_result.is_err()); + // Check for the correct error variant + if let Err(Error::GetError { path, .. }) = get_result { + assert_eq!(path, test_key); + } else { + panic!( + "Expected GetError for non-existent secret, but got {:?}", + get_result + ); + } + } +} diff --git a/teller-providers/src/providers/mod.rs b/teller-providers/src/providers/mod.rs index b88ca07a..c72182c3 100644 --- a/teller-providers/src/providers/mod.rs +++ b/teller-providers/src/providers/mod.rs @@ -30,6 +30,9 @@ pub mod hashicorp_consul; #[cfg(feature = "etcd")] pub mod etcd; +#[cfg(feature = "azure_keyvault")] +pub mod azure_keyvault; + lazy_static! { pub static ref PROVIDER_KINDS: String = { let providers: Vec = ProviderKind::iter() @@ -73,6 +76,10 @@ pub enum ProviderKind { #[cfg(feature = "etcd")] #[serde(rename = "etcd")] Etcd, + + #[cfg(feature = "azure_keyvault")] + #[serde(rename = "azure_keyvault")] + AzureKeyVault, } impl std::fmt::Display for ProviderKind { diff --git a/teller-providers/src/registry.rs b/teller-providers/src/registry.rs index f9f2e3d2..6826b159 100644 --- a/teller-providers/src/registry.rs +++ b/teller-providers/src/registry.rs @@ -90,6 +90,19 @@ impl Registry { ) .await?, ), + + #[cfg(feature = "azure_keyvault")] + ProviderKind::AzureKeyVault => Box::new( + crate::providers::etcd::Etcd::new( + k, + provider + .options + .clone() + .map(serde_json::from_value) + .transpose()?, + ) + .await?, + ), }; loaded_providers.insert(k.clone(), provider); }