diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 224915c5..0e12c8ab 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -7,7 +7,7 @@ on: branches: [develop] env: - # From-scratch builds with incremental compilation enabled adds unneeded performance and disk overhead. + # From-scratch builds with incremental compilation enabled adds unneeded performance and disk overhead. CARGO_INCREMENTAL: "0" jobs: @@ -33,7 +33,8 @@ jobs: key: ${{ hashFiles('.github/cache_bust') }}-${{ runner.os }}-${{ matrix.make_target }}-${{ hashFiles('**/Cargo.lock') }} restore-keys: | ${{ hashFiles('.github/cache_bust') }}-${{ runner.os }}-${{ matrix.make_target }} - - run: rustup default 1.76.0 + # print the current rustc. replace stable to pin to a specific toolchain version. + - run: rustup default stable - run: rustup component add rustfmt - run: rustup component add clippy - run: make ${{ matrix.make_target }} diff --git a/Cargo.lock b/Cargo.lock index 78491297..58956c91 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,9 +43,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.14" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", @@ -58,33 +58,33 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.3" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", "windows-sys 0.52.0", @@ -109,12 +109,12 @@ dependencies = [ [[package]] name = "assert_cmd" -version = "2.0.14" +version = "2.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed72493ac66d5804837f480ab3766c72bdfab91a65e565fc54fa9e42db0073a8" +checksum = "bc65048dd435533bb1baf2ed9956b9a278fbfdcf90301b39ee117f06c0199d37" dependencies = [ "anstyle", - "bstr 1.9.1", + "bstr 1.10.0", "doc-comment", "predicates", "predicates-core", @@ -130,7 +130,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] @@ -152,7 +152,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] @@ -163,7 +163,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] @@ -240,9 +240,9 @@ dependencies = [ [[package]] name = "aws-sdk-kms" -version = "1.35.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16bbfeaffab8514ae56938de28de5b5c698e7146549f1085cb772ccf1f42aa8" +checksum = "d91f43512620f4b0d9e67ccf7d768fab5ed310ac2229ebb9422177abe99c36ba" dependencies = [ "aws-credential-types", "aws-runtime", @@ -262,9 +262,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssm" -version = "1.38.0" +version = "1.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c714521388cb8555ad098282350528f5e99272f130331df3815567e584bc84" +checksum = "59b7cf15ca37f504a530c208ecdd52c5d7b88900c7b3d2e4aaeb6266e872ab85" dependencies = [ "aws-credential-types", "aws-runtime", @@ -285,9 +285,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.34.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdcfae7bf8b8f14cade7579ffa8956fcee91dc23633671096b4b5de7d16f682a" +checksum = "6acca681c53374bf1d9af0e317a41d12a44902ca0f2d1e10e5cb5bb98ed74f35" dependencies = [ "aws-credential-types", "aws-runtime", @@ -307,9 +307,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.35.0" +version = "1.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b30def8f02ba81276d5dbc22e7bf3bed20d62d1b175eef82680d6bdc7a6f4c" +checksum = "b79c6bdfe612503a526059c05c9ccccbf6bd9530b003673cb863e547fd7c0c9a" dependencies = [ "aws-credential-types", "aws-runtime", @@ -329,9 +329,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.34.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0804f840ad31537d5d1a4ec48d59de5e674ad05f1db7d3def2c9acadaf1f7e60" +checksum = "32e6ecdb2bd756f3b2383e6f0588dc10a4e65f5d551e70a56e0bfe0c884673ce" dependencies = [ "aws-credential-types", "aws-runtime", @@ -415,9 +415,9 @@ dependencies = [ [[package]] name = "aws-smithy-protocol-test" -version = "0.60.7" +version = "0.60.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31e8279cb24640c7349f2bda6ca818d5fcc85129386bd73c1d0999430d6ddf2" +checksum = "020468b04f916b36e0a791c4ebf80777ad2c25d8b9ebb8db14939e98a37abec0" dependencies = [ "assert-json-diff", "aws-smithy-runtime-api", @@ -441,9 +441,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df4217d39fe940066174e6238310167bf466bfbebf3be0661e53cacccde6313" +checksum = "ce87155eba55e11768b8c1afa607f3e864ae82f03caf63258b37455b0ad02537" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -455,7 +455,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "http-body 1.0.0", + "http-body 1.0.1", "httparse", "hyper", "hyper-rustls", @@ -501,7 +501,7 @@ dependencies = [ "http 0.2.12", "http 1.1.0", "http-body 0.4.6", - "http-body 1.0.0", + "http-body 1.0.1", "http-body-util", "itoa", "num-integer", @@ -668,9 +668,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.9.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" +checksum = "40723b8fb387abc38f4f4a37c09073622e41dd12327033091ef8950659e6dc0c" dependencies = [ "memchr", "regex-automata 0.4.7", @@ -683,11 +683,17 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "bytes-utils" @@ -701,9 +707,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.106" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "066fce287b1d4eafef758e89e09d724a24808a9196fe9756b8ca90e86d0719a2" +checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" [[package]] name = "cfg-if" @@ -726,9 +732,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.8" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" +checksum = "0fbb260a053428790f3de475e304ff84cdbc4face759ea7a3e64c1edd938a7fc" dependencies = [ "clap_builder", "clap_derive", @@ -736,9 +742,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.8" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" +checksum = "64b17d7ea74e9f833c7dbf2cbe4fb12ff26783eda4782a8975b72f895c9b4d99" dependencies = [ "anstream", "anstyle", @@ -748,27 +754,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.8" +version = "4.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" +checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] name = "clap_lex" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "colorchoice" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "core-foundation" @@ -1035,7 +1041,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] @@ -1115,7 +1121,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" dependencies = [ "aho-corasick", - "bstr 1.9.1", + "bstr 1.10.0", "log", "regex-automata 0.4.7", "regex-syntax 0.8.4", @@ -1214,9 +1220,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 1.1.0", @@ -1231,7 +1237,7 @@ dependencies = [ "bytes", "futures-util", "http 1.1.0", - "http-body 1.0.0", + "http-body 1.0.1", "pin-project-lite", ] @@ -1277,9 +1283,9 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.29" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f361cde2f109281a220d4307746cdfd5ee3f410da58a70377762396775634b33" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -1363,9 +1369,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.2.6" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" dependencies = [ "equivalent", "hashbrown", @@ -1380,9 +1386,9 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is_terminal_polyfill" -version = "1.70.0" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] name = "itoa" @@ -1491,13 +1497,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1596,16 +1603,6 @@ 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 = "num_threads" version = "0.1.7" @@ -1617,9 +1614,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.1" +version = "0.36.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "081b846d1d56ddfc18fdf1a922e4f6e07a11768ea1b92dec44e42b72712ccfce" +checksum = "3f203fa8daa7bb185f760ae12bd8e097f63d17041dcdcaf675ac54cdf863170e" dependencies = [ "memchr", ] @@ -1641,9 +1638,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[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", "cfg-if", @@ -1662,7 +1659,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] @@ -1673,9 +1670,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", @@ -1734,7 +1731,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] @@ -1763,15 +1760,18 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "dee4364d9f3b902ef14fab8a1ddffb783a1cb6b4bba3bfc1fa3922732c7de97f" +dependencies = [ + "zerocopy", +] [[package]] name = "predicates" -version = "3.1.0" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b87bfd4605926cdfefc1c3b5f8fe560e3feca9d5552cf68c466d3d8236c7e8" +checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" dependencies = [ "anstyle", "difflib", @@ -1780,15 +1780,15 @@ dependencies = [ [[package]] name = "predicates-core" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b794032607612e7abeb4db69adb4e33590fa6cf1149e95fd7cb00e634b92f174" +checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" [[package]] name = "predicates-tree" -version = "1.0.9" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368ba315fb8c5052ab692e68a0eefec6ec57b23a36959c14496f0b0df2c0cecf" +checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" dependencies = [ "predicates-core", "termtree", @@ -1898,9 +1898,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -2135,9 +2135,9 @@ dependencies = [ [[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", "core-foundation", @@ -2148,9 +2148,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" +checksum = "75da29fe9b9b08fe9d6b22b5b4bcbc75d8db3aa31e639aa56bb62e9d46bfceaf" dependencies = [ "core-foundation-sys", "libc", @@ -2179,17 +2179,18 @@ checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] name = "serde_json" -version = "1.0.120" +version = "1.0.122" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da" dependencies = [ "indexmap", "itoa", + "memchr", "ryu", "serde", ] @@ -2282,9 +2283,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "snafu" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418b8136fec49956eba89be7da2847ec1909df92a9ae4178b5ff0ff092c8d95e" +checksum = "2b835cb902660db3415a672d862905e791e54d306c6e8189168c7f3d9ae1c79d" dependencies = [ "backtrace", "futures-core", @@ -2294,14 +2295,14 @@ dependencies = [ [[package]] name = "snafu-derive" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a4812a669da00d17d8266a0439eddcacbc88b17f732f927e52eeb9d196f7fb5" +checksum = "38d1e02fca405f6280643174a50c942219f0bbf4dbf7d480f1dd864d6f211ae5" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] @@ -2345,9 +2346,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.70" +version = "2.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" +checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" dependencies = [ "proc-macro2", "quote", @@ -2383,12 +2384,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.1" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +checksum = "b8fcd239983515c23a32fb82099f97d0b11b8c72f654ed659363a95c3dad7a53" dependencies = [ "cfg-if", "fastrand", + "once_cell", "rustix", "windows-sys 0.52.0", ] @@ -2410,22 +2412,22 @@ checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] @@ -2488,31 +2490,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "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", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] @@ -2751,7 +2752,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", ] [[package]] @@ -2847,9 +2848,9 @@ dependencies = [ [[package]] name = "typed-path" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3023f4683cd1a846dbd2666e8c34f54338ee5cebae578cda981a87cecd7aa" +checksum = "04645b6c01cfb2ddabffc7c67ae6bfe7c3e28a5c37d729f6bb498e784f1fd70c" [[package]] name = "typenum" @@ -2918,9 +2919,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.9.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de17fd2f7da591098415cff336e12965a28061ddace43b59cb3c430179c9439" +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" [[package]] name = "valuable" @@ -2936,9 +2937,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 = "vsimd" @@ -3001,7 +3002,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", "wasm-bindgen-shared", ] @@ -3035,7 +3036,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.70", + "syn 2.0.72", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3276,6 +3277,27 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +[[package]] +name = "zerocopy" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854e949ac82d619ee9a14c66a1b674ac730422372ccb759ce0c39cabcf2bf8e6" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "zeroize" version = "1.8.1" diff --git a/Makefile b/Makefile index 4f63432c..55bf5325 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ ci: check-licenses build integ # installs cargo-deny .PHONY: cargo-deny cargo-deny: - cargo install --version 0.14.20 cargo-deny --locked + cargo install --version 0.14.24 cargo-deny --locked # checks each crate, and evaluates licenses. requires cargo-deny. .PHONY: check-licenses diff --git a/deny.toml b/deny.toml index 6cbfb6be..a64e8c33 100644 --- a/deny.toml +++ b/deny.toml @@ -5,7 +5,7 @@ confidence-threshold = 0.93 # Commented license types are allowed but not currently used allow = [ "Apache-2.0", - # "BSD-2-Clause", + "BSD-2-Clause", "BSD-3-Clause", "BSL-1.0", # "CC0-1.0", diff --git a/tough-kms/src/lib.rs b/tough-kms/src/lib.rs index b7573704..fe2a57ef 100644 --- a/tough-kms/src/lib.rs +++ b/tough-kms/src/lib.rs @@ -61,7 +61,7 @@ pub struct KmsKeySource { pub profile: Option, /// Identifies an asymmetric CMK in AWS KMS. pub key_id: String, - /// KmsClient Object to query AWS KMS + /// `KmsClient` Object to query AWS KMS pub client: Option, /// Signing Algorithm to be used for the message digest, only `KmsSigningAlgorithm::RsassaPssSha256` is supported at present. pub signing_algorithm: KmsSigningAlgorithm, @@ -146,7 +146,7 @@ pub struct KmsRsaKey { key_id: String, /// Aws account profile profile: Option, - /// KmsClient Object to query AWS KMS + /// `KmsClient` Object to query AWS KMS client: Option, /// Public Key corresponding to Customer Managed Key public_key: Decoded, diff --git a/tough/src/cache.rs b/tough/src/cache.rs index 97e70502..69c0c510 100644 --- a/tough/src/cache.rs +++ b/tough/src/cache.rs @@ -17,7 +17,7 @@ impl Repository { /// * `metadata_outdir` is the directory where cached metadata files will be saved. /// * `targets_outdir` is the directory where cached targets files will be saved. /// * `targets_subset` is the list of targets to include in the cached repo. If no subset is - /// specified (`None`), then *all* targets are included in the cache. + /// specified (`None`), then *all* targets are included in the cache. /// * `cache_root_chain` specifies whether or not we will cache all versions of `root.json`. pub async fn cache( &self, @@ -96,7 +96,8 @@ impl Repository { { self.cache_file_from_transport( self.snapshot_filename().as_str(), - self.max_snapshot_size()?, + self.max_snapshot_size()? + .unwrap_or(self.limits.max_snapshot_size), "timestamp.json", &metadata_outdir, ) @@ -237,7 +238,7 @@ impl Repository { } /// Gets the max size of the snapshot.json file as specified by the timestamp file. - fn max_snapshot_size(&self) -> Result { + fn max_snapshot_size(&self) -> Result> { let snapshot_meta = self.timestamp() .signed diff --git a/tough/src/datastore.rs b/tough/src/datastore.rs index aa3dfb4d..2eecb71e 100644 --- a/tough/src/datastore.rs +++ b/tough/src/datastore.rs @@ -17,7 +17,7 @@ use tokio::sync::{Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard}; pub(crate) struct Datastore { /// A lock around retrieving the datastore path. path_lock: Arc>, - /// A lock to treat the system_time function as a critical section. + /// A lock to treat the `system_time` function as a critical section. time_lock: Arc>, } diff --git a/tough/src/editor/mod.rs b/tough/src/editor/mod.rs index 377d725e..6ec91b27 100644 --- a/tough/src/editor/mod.rs +++ b/tough/src/editor/mod.rs @@ -17,8 +17,8 @@ use crate::key_source::KeySource; use crate::schema::decoded::{Decoded, Hex}; use crate::schema::key::Key; use crate::schema::{ - Hashes, KeyHolder, PathSet, Role, RoleType, Root, Signed, Snapshot, SnapshotMeta, Target, - Targets, Timestamp, TimestampMeta, + Hashes, KeyHolder, Metafile, PathSet, Role, RoleType, Root, Signed, Snapshot, Target, Targets, + Timestamp, }; use crate::transport::{IntoVec, Transport}; use crate::{encode_filename, Limits}; @@ -700,13 +700,13 @@ impl RepositoryEditor { Ok(snapshot) } - /// Build a `SnapshotMeta` struct from a given `SignedRole`. This metadata + /// Build a `Metafiles` struct from a given `SignedRole`. This metadata /// includes the sha256 and length of the signed role. - fn snapshot_meta(role: &SignedRole) -> SnapshotMeta + fn snapshot_meta(role: &SignedRole) -> Metafile where R: Role, { - SnapshotMeta { + Metafile { hashes: Some(Hashes { sha256: role.sha256.to_vec().into(), _extra: HashMap::new(), @@ -738,18 +738,18 @@ impl RepositoryEditor { Ok(timestamp) } - /// Build a `TimestampMeta` struct from a given `SignedRole`. This metadata + /// Build a `Metafiles` struct from a given `SignedRole`. This metadata /// includes the sha256 and length of the signed role. - fn timestamp_meta(role: &SignedRole) -> TimestampMeta + fn timestamp_meta(role: &SignedRole) -> Metafile where R: Role, { - TimestampMeta { - hashes: Hashes { + Metafile { + hashes: Some(Hashes { sha256: role.sha256.to_vec().into(), _extra: HashMap::new(), - }, - length: role.length, + }), + length: Some(role.length), version: role.signed.signed.version(), _extra: HashMap::new(), } diff --git a/tough/src/error.rs b/tough/src/error.rs index a97f5e14..403998b2 100644 --- a/tough/src/error.rs +++ b/tough/src/error.rs @@ -612,7 +612,7 @@ pub enum Error { source: schema::Error, }, - /// SignedDelegatedTargets has more than 1 signed targets + /// `SignedDelegatedTargets` has more than 1 signed targets #[snafu(display("Exactly 1 role was required, but {} were created", count))] InvalidRoleCount { count: usize }, @@ -620,7 +620,7 @@ pub enum Error { #[snafu(display("Could not create a targets map: {}", source))] TargetsMap { source: schema::Error }, - /// A key_holder wasn't set + /// A `key_holder` wasn't set #[snafu(display("A key holder must be set"))] NoKeyHolder, diff --git a/tough/src/lib.rs b/tough/src/lib.rs index 57acd5da..95264251 100644 --- a/tough/src/lib.rs +++ b/tough/src/lib.rs @@ -250,8 +250,8 @@ impl<'a> RepositoryLoader<'a> { /// are set higher than what would reasonably be expected by a repository, but not so high that the /// amount of data could interfere with the system. /// -/// `max_root_size` and `max_timestamp_size` are the maximum size for the `root.json` and -/// `timestamp.json` files, respectively, downloaded from the repository. These must be +/// `max_root_size`, `max_timestamp_size` and `max_snapshot_size` are the maximum size for the `root.json`, +/// `timestamp.json` and `snapshot.json` files, respectively, downloaded from the repository. These must be /// sufficiently large such that future updates to your repository's key management strategy /// will still be supported, but sufficiently small such that you are protected against an /// endless data attack (defined by TUF as an attacker responding to clients with extremely @@ -261,6 +261,7 @@ impl<'a> RepositoryLoader<'a> { /// * `max_root_size`: 1 MiB /// * `max_targets_size`: 10 MiB /// * `max_timestamp_size`: 1 MiB +/// * `max_snapshot_size`: 1 MiB /// * `max_root_updates`: 1024 #[derive(Debug, Clone, Copy)] pub struct Limits { @@ -275,6 +276,9 @@ pub struct Limits { /// The maximum allowable size in bytes for the downloaded timestamp.json file. pub max_timestamp_size: u64, + /// The maximum allowable size in bytes for the downloaded snapshot.json file. + pub max_snapshot_size: u64, + /// The maximum number of updates to root.json to download. pub max_root_updates: u64, } @@ -285,6 +289,7 @@ impl Default for Limits { max_root_size: 1024 * 1024, // 1 MiB max_targets_size: 1024 * 1024 * 10, // 10 MiB max_timestamp_size: 1024 * 1024, // 1 MiB + max_snapshot_size: 1024 * 1024, // 1 MiB max_root_updates: 1024, } } @@ -360,6 +365,7 @@ impl Repository { transport.as_ref(), &root, ×tamp, + limits.max_snapshot_size, &datastore, &metadata_base_url, expiration_enforcement, @@ -610,7 +616,7 @@ impl Repository { /// [urllib.parse.quote] (given a 'safe' parameter value of `""`) which follows RFC 3986 and states /// /// > Replace special characters in string using the %xx escape. Letters, digits, and the characters -/// `_.-~` are never quoted. +/// > `_.-~` are never quoted. /// /// [urllib.parse.quote]: https://docs.python.org/3/library/urllib.parse.html#url-quoting const CHARACTERS_TO_ESCAPE: AsciiSet = NON_ALPHANUMERIC @@ -906,10 +912,12 @@ async fn load_timestamp( } /// Step 3 of the client application, which loads the snapshot metadata file. +#[allow(clippy::too_many_lines)] async fn load_snapshot( transport: &dyn Transport, root: &Signed, timestamp: &Signed, + max_snapshot_size: u64, datastore: &Datastore, metadata_base_url: &Url, expiration_enforcement: ExpirationEnforcement, @@ -941,14 +949,25 @@ async fn load_snapshot( path: path.clone(), url: metadata_base_url.clone(), })?; - let stream = fetch_sha256( - transport, - url.clone(), - snapshot_meta.length, - "timestamp.json", - &snapshot_meta.hashes.sha256, - ) - .await?; + let stream = if let Some(hashes) = &snapshot_meta.hashes { + fetch_sha256( + transport, + url.clone(), + snapshot_meta.length.unwrap_or(max_snapshot_size), + "timestamp.json", + &hashes.sha256, + ) + .await? + } else { + fetch_max_size( + transport, + url.clone(), + snapshot_meta.length.unwrap_or(max_snapshot_size), + "timestamp.json", + ) + .await? + }; + let data = stream .into_vec() .await diff --git a/tough/src/schema/key.rs b/tough/src/schema/key.rs index bda86a70..e6512b53 100644 --- a/tough/src/schema/key.rs +++ b/tough/src/schema/key.rs @@ -57,7 +57,7 @@ pub enum Key { #[serde(flatten)] _extra: HashMap, }, - /// An EcdsaKey. + /// An Ecdsa key. Ecdsa { /// The Ecdsa key. keyval: EcdsaKey, @@ -67,7 +67,7 @@ pub enum Key { #[serde(flatten)] _extra: HashMap, }, - /// An EcdsaKey with the old key type. + /// An Ecdsa key with the old key type. #[serde(rename = "ecdsa-sha2-nistp256")] EcdsaOld { /// The Ecdsa key. diff --git a/tough/src/schema/mod.rs b/tough/src/schema/mod.rs index f3e2846c..72efa332 100644 --- a/tough/src/schema/mod.rs +++ b/tough/src/schema/mod.rs @@ -1,4 +1,4 @@ -#![allow(clippy::used_underscore_binding)] // #20 +#![allow(clippy::used_underscore_binding, clippy::pub_underscore_fields)] // #20 //! Provides the schema objects as defined by the TUF spec. @@ -61,7 +61,7 @@ derive_fromstr_from_deserialize!(RoleType); /// A role identifier #[derive(Debug, Clone)] pub enum RoleId { - /// Top level roles are identified by a RoleType + /// Top level roles are identified by a `RoleType` StandardRole(RoleType), /// A delegated role is identified by a String DelegatedRole(String), @@ -256,11 +256,11 @@ pub struct Snapshot { /// Determines when metadata should be considered expired and no longer trusted by clients. pub expires: DateTime, - /// A list of what the TUF spec calls 'METAFILES' (`SnapshotMeta` objects). The TUF spec + /// A list of what the TUF spec calls 'METAFILES' (`Metafiles` objects). The TUF spec /// describes the hash key in 4.4: METAPATH is the file path of the metadata on the repository /// relative to the metadata base URL. For snapshot.json, these are top-level targets metadata /// and delegated targets metadata. - pub meta: HashMap, + pub meta: HashMap, /// Extra arguments found during deserialization. /// @@ -272,7 +272,7 @@ pub struct Snapshot { pub _extra: HashMap, } -/// Represents a metadata file in a `snapshot.json` file. +/// Represents a metadata file in a `snapshot.json` and in a `timestamp.json` file. /// TUF 4.4: METAFILES is an object whose format is the following: /// ```text /// { METAPATH : { @@ -292,7 +292,7 @@ pub struct Snapshot { /// }, /// ``` #[derive(Debug, Clone, Deserialize, Serialize, Eq, PartialEq)] -pub struct SnapshotMeta { +pub struct Metafile { /// LENGTH is the integer length in bytes of the metadata file at METAPATH. It is OPTIONAL and /// can be omitted to reduce the snapshot metadata file size. In that case the client MUST use a /// custom download limit for the listed metadata. @@ -898,12 +898,12 @@ pub enum PathSet { #[serde(rename = "paths")] Paths(Vec), - /// The "path_hash_prefixes" list is used to succinctly describe a set of target paths. - /// Specifically, each HEX_DIGEST in "path_hash_prefixes" describes a set of target paths; - /// therefore, "path_hash_prefixes" is the union over each prefix of its set of target paths. + /// The `path_hash_prefixes` list is used to succinctly describe a set of target paths. + /// Specifically, each `HEX_DIGEST` in `path_hash_prefixes` describes a set of target paths; + /// therefore, `path_hash_prefixes` is the union over each prefix of its set of target paths. /// The target paths must meet this condition: each target path, when hashed with the SHA-256 - /// hash function to produce a 64-byte hexadecimal digest (HEX_DIGEST), must share the same - /// prefix as one of the prefixes in "path_hash_prefixes". This is useful to split a large + /// hash function to produce a 64-byte hexadecimal digest (`HEX_DIGEST`), must share the same + /// prefix as one of the prefixes in `path_hash_prefixes`. This is useful to split a large /// number of targets into separate bins identified by consistent hashing. #[serde(rename = "path_hash_prefixes")] PathHashPrefixes(Vec), @@ -1112,7 +1112,7 @@ pub struct Timestamp { /// METAFILES is the same as described for the snapshot.json file. In the case of the /// timestamp.json file, this MUST only include a description of the snapshot.json file. - pub meta: HashMap, + pub meta: HashMap, /// Extra arguments found during deserialization. /// @@ -1124,29 +1124,6 @@ pub struct Timestamp { pub _extra: HashMap, } -/// METAFILES is the same as described for the snapshot.json file. In the case of the timestamp.json -/// file, this MUST only include a description of the snapshot.json file. -#[derive(Debug, Clone, Deserialize, Serialize, Eq, PartialEq)] -pub struct TimestampMeta { - /// The integer length in bytes of the snapshot.json file. - pub length: u64, - - /// The hashes of the snapshot.json file. - pub hashes: Hashes, - - /// An integer that is greater than 0. Clients MUST NOT replace a metadata file with a version - /// number less than the one currently trusted. - pub version: NonZeroU64, - - /// Extra arguments found during deserialization. - /// - /// We must store these to correctly verify signatures for this object. - /// - /// If you're instantiating this struct, you should make this `HashMap::empty()`. - #[serde(flatten)] - pub _extra: HashMap, -} - impl Timestamp { /// Creates a new `Timestamp` object. pub fn new(spec_version: String, version: NonZeroU64, expires: DateTime) -> Self { diff --git a/tough/src/urlpath.rs b/tough/src/urlpath.rs index 9464216c..eaec6395 100644 --- a/tough/src/urlpath.rs +++ b/tough/src/urlpath.rs @@ -59,11 +59,12 @@ mod test { .expect("Could not create URL from CARGO_MANIFEST_DIR"); let escaped_test_path = encode_filename("a/../b/././c/.."); - let traversal_url = url_base.join(&escaped_test_path).expect(&format!( - "Could not create URL from unusual traversal path '{}' + '{}'", - url_base.to_string(), - escaped_test_path - )); + let traversal_url = url_base.join(&escaped_test_path).unwrap_or_else(|_| { + panic!( + "Could not create URL from unusual traversal path '{}' + '{}'", + url_base, escaped_test_path + ) + }); assert_eq!( manifest_dir().join("a%2F..%2Fb%2F.%2F.%2Fc%2F.."), diff --git a/tough/tests/interop.rs b/tough/tests/interop.rs index a60b5a35..2e6781e7 100644 --- a/tough/tests/interop.rs +++ b/tough/tests/interop.rs @@ -80,6 +80,7 @@ async fn test_tuf_reference_impl_default_transport() { max_root_size: 1000, max_targets_size: 2000, max_timestamp_size: 3000, + max_snapshot_size: 4000, max_root_updates: 1, }) .datastore(datastore.path()) diff --git a/tuftool/src/error.rs b/tuftool/src/error.rs index 8bf5aeb7..0489fd64 100644 --- a/tuftool/src/error.rs +++ b/tuftool/src/error.rs @@ -128,9 +128,6 @@ pub(crate) enum Error { backtrace: Backtrace, }, - #[snafu(display("Can't build URL from path '{}'", path.display()))] - FileUrl { path: PathBuf, backtrace: Backtrace }, - #[snafu(display("Failed to write to {}: {}", path.display(), source))] FileWrite { path: PathBuf, @@ -296,25 +293,6 @@ pub(crate) enum Error { backtrace: Backtrace, }, - #[snafu(display("Failed to add targets from directory '{}': {}", dir.display(), source))] - TargetsFromDir { - dir: PathBuf, - source: tough::error::Error, - backtrace: Backtrace, - }, - - #[snafu(display("Target not found: {}", target))] - TargetNotFound { - target: String, - backtrace: Backtrace, - }, - - #[snafu(display("Failed to create temporary directory: {}", source))] - TempDir { - source: std::io::Error, - backtrace: Backtrace, - }, - #[snafu(display("Unrecognized URL scheme \"{}\"", scheme))] UnrecognizedScheme { scheme: String, @@ -374,12 +352,6 @@ pub(crate) enum Error { backtrace: Backtrace, }, - #[snafu(display("Failed writing target data to disk: {}", source))] - WriteTarget { - source: std::io::Error, - backtrace: Backtrace, - }, - #[snafu(display("Failed to join a task: {}", source))] JoinTask { source: tokio::task::JoinError, diff --git a/tuftool/src/source.rs b/tuftool/src/source.rs index 7a44bde4..16c6c8d3 100644 --- a/tuftool/src/source.rs +++ b/tuftool/src/source.rs @@ -55,7 +55,7 @@ pub(crate) fn parse_key_source(input: &str) -> Result> { PathOrUrl::Path(path) => Ok(Box::new(LocalKeySource { path })), PathOrUrl::Url(url) => { match url.scheme() { - #[cfg(any(feature = "aws-sdk-rust-native-tls", feature = "aws-sdk-rust-rustls"))] + #[cfg(any(feature = "aws-sdk-rust", feature = "aws-sdk-rust-rustls"))] "aws-ssm" => Ok(Box::new(SsmKeySource { profile: url.host_str().and_then(|s| { if s.is_empty() {