diff --git a/Cargo.lock b/Cargo.lock index cb793a3..82f9fee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,6 +28,19 @@ dependencies = [ "version_check", ] +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.3", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -156,7 +169,7 @@ checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", "synstructure", ] @@ -168,7 +181,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -177,7 +190,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" dependencies = [ - "event-listener", + "event-listener 5.4.0", "event-listener-strategy", "pin-project-lite", ] @@ -201,7 +214,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -212,7 +225,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -238,9 +251,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.8.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455e9fb7743c6f6267eb2830ccc08686fbb3d13c9a689369562fd4d4ef9ea462" +checksum = "ebd9b83179adf8998576317ce47785948bcff399ec5b15f4dfbdedd44ddf5b92" dependencies = [ "aws-credential-types", "aws-runtime", @@ -268,9 +281,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.3" +version = "1.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687bc16bc431a8533fe0097c7f0182874767f920989d7260950172ae8e3c4465" +checksum = "b68c2194a190e1efc999612792e25b1ab3abfefe4306494efaaabc25933c0cbe" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -280,9 +293,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.13.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" +checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" dependencies = [ "aws-lc-sys", "zeroize", @@ -290,9 +303,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.29.0" +version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" +checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" dependencies = [ "bindgen", "cc", @@ -303,9 +316,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.8" +version = "1.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f6c68419d8ba16d9a7463671593c54f81ba58cab466e9b759418da606dcc2e2" +checksum = "b2090e664216c78e766b6bac10fe74d2f451c02441d43484cd76ac9a295075f7" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -328,9 +341,9 @@ dependencies = [ [[package]] name = "aws-sdk-route53" -version = "1.82.0" +version = "1.86.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a71ca3dd16c304f15687cc8f64c9c23379aec982c1afd0c203edceaf9c8fb4" +checksum = "ef2b3239c1444149b74f6f7ff3bc144f60e5d7569ccde530a08ea983fb429cff" dependencies = [ "aws-credential-types", "aws-runtime", @@ -350,9 +363,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.92.0" +version = "1.98.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f68db68f26c6337fb89c15916d5ac59c1b4224eb0111492a4f7b85c1058f9ca8" +checksum = "029e89cae7e628553643aecb3a3f054a0a0912ff0fd1f5d6a0b4fda421dce64b" dependencies = [ "aws-credential-types", "aws-runtime", @@ -384,9 +397,9 @@ dependencies = [ [[package]] name = "aws-sdk-secretsmanager" -version = "1.77.0" +version = "1.80.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f78dbba23909cb019804796ab361a1155ff793eb0ed38877132055af5a48aba" +checksum = "436ea6b6d5c73ffd039c21afada0c0ebe9f423e1c68ef2828fc0cd18fdc17d11" dependencies = [ "aws-credential-types", "aws-runtime", @@ -406,9 +419,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.73.0" +version = "1.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ac1674cba7872061a29baaf02209fefe499ff034dfd91bd4cc59e4d7741489" +checksum = "64bf26698dd6d238ef1486bdda46f22a589dc813368ba868dc3d94c8d27b56ba" dependencies = [ "aws-credential-types", "aws-runtime", @@ -428,9 +441,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.74.0" +version = "1.77.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6a22f077f5fd3e3c0270d4e1a110346cddf6769e9433eb9e6daceb4ca3b149" +checksum = "09cd07ed1edd939fae854a22054299ae3576500f4e0fadc560ca44f9c6ea1664" dependencies = [ "aws-credential-types", "aws-runtime", @@ -450,9 +463,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.75.0" +version = "1.78.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3258fa707f2f585ee3049d9550954b959002abd59176975150a01d5cf38ae3f" +checksum = "37f7766d2344f56d10d12f3c32993da36d78217f32594fe4fb8e57a538c1cdea" dependencies = [ "aws-credential-types", "aws-runtime", @@ -512,9 +525,9 @@ dependencies = [ [[package]] name = "aws-smithy-checksums" -version = "0.63.3" +version = "0.63.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2f77a921dbd2c78ebe70726799787c1d110a2245dd65e39b20923dfdfb2deee" +checksum = "5ab9472f7a8ec259ddb5681d2ef1cb1cf16c0411890063e67cdc7b62562cc496" dependencies = [ "aws-smithy-http", "aws-smithy-types", @@ -532,9 +545,9 @@ dependencies = [ [[package]] name = "aws-smithy-eventstream" -version = "0.60.9" +version = "0.60.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338a3642c399c0a5d157648426110e199ca7fd1c689cc395676b81aa563700c4" +checksum = "604c7aec361252b8f1c871a7641d5e0ba3a7f5a586e51b66bc9510a5519594d9" dependencies = [ "aws-smithy-types", "bytes", @@ -543,9 +556,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.1" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99335bec6cdc50a346fda1437f9fefe33abf8c99060739a546a16457f2862ca9" +checksum = "43c82ba4cab184ea61f6edaafc1072aad3c2a17dcf4c0fce19ac5694b90d8b5f" dependencies = [ "aws-smithy-eventstream", "aws-smithy-runtime-api", @@ -564,15 +577,15 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f491388e741b7ca73b24130ff464c1478acc34d5b331b7dd0a2ee4643595a15" +checksum = "f108f1ca850f3feef3009bdcc977be201bca9a91058864d9de0684e64514bee0" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "h2 0.3.26", - "h2 0.4.10", + "h2 0.3.27", + "h2 0.4.11", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", @@ -583,7 +596,7 @@ dependencies = [ "hyper-util", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.28", + "rustls 0.23.29", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -621,9 +634,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.8.3" +version = "1.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14302f06d1d5b7d333fd819943075b13d27c7700b414f574c3c35859bfb55d5e" +checksum = "660f70d9d8af6876b4c9aa8dcb0dbaf0f89b04ee9a4455bea1b4ba03b15f26f6" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -645,9 +658,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.8.1" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd8531b6d8882fd8f48f82a9754e682e29dd44cff27154af51fa3eb730f59efb" +checksum = "38280ac228bc479f347fcfccf4bf4d22d68f3bb4629685cb591cabd856567bbc" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -720,7 +733,7 @@ dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", "linked-hash-map", - "rustls 0.23.28", + "rustls 0.23.29", "serde", "serde_json", "serde_with", @@ -791,7 +804,7 @@ checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -869,16 +882,13 @@ dependencies = [ [[package]] name = "bigdecimal" -version = "0.4.8" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a22f228ab7a1b23027ccc6c350b72868017af7ea8356fbdf19f8d991c690013" +checksum = "a6773ddc0eafc0e509fb60e48dff7f450f8e674a0686ae8605e8d9901bd5eefa" dependencies = [ - "autocfg", - "libm", "num-bigint", "num-integer", "num-traits", - "serde", ] [[package]] @@ -900,7 +910,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.103", + "syn 2.0.104", "which", ] @@ -954,14 +964,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] name = "bumpalo" -version = "3.18.1" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytecheck" @@ -1009,9 +1019,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.27" +version = "1.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" dependencies = [ "jobserver", "libc", @@ -1094,9 +1104,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" dependencies = [ "clap_builder", "clap_derive", @@ -1104,9 +1114,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" dependencies = [ "anstream", "anstyle", @@ -1116,14 +1126,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -1199,9 +1209,9 @@ dependencies = [ [[package]] name = "config" -version = "0.15.11" +version = "0.15.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595aae20e65c3be792d05818e8c63025294ac3cb7e200f11459063a352a6ef80" +checksum = "5b1eb4fb07bc7f012422df02766c7bd5971effb894f573865642f06fa3265440" dependencies = [ "async-trait", "convert_case", @@ -1320,15 +1330,15 @@ dependencies = [ "crc", "digest", "libc", - "rand 0.9.1", + "rand 0.9.2", "regex", ] [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -1377,9 +1387,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" @@ -1436,7 +1446,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -1447,7 +1457,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -1501,6 +1511,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.10.7" @@ -1521,7 +1542,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -1643,12 +1664,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.12" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -1662,6 +1683,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[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" @@ -1679,7 +1706,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener", + "event-listener 5.4.0", "pin-project-lite", ] @@ -1854,7 +1881,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -1875,6 +1902,7 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ + "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -1972,9 +2000,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -1982,7 +2010,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.9.0", + "indexmap 2.10.0", "slab", "tokio", "tokio-util", @@ -1991,9 +2019,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" dependencies = [ "atomic-waker", "bytes", @@ -2001,7 +2029,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.9.0", + "indexmap 2.10.0", "slab", "tokio", "tokio-util", @@ -2024,7 +2052,7 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash", + "ahash 0.7.8", ] [[package]] @@ -2032,6 +2060,10 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash 0.8.12", + "allocator-api2", +] [[package]] name = "hashbrown" @@ -2044,6 +2076,15 @@ dependencies = [ "foldhash", ] +[[package]] +name = "hashlink" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +dependencies = [ + "hashbrown 0.14.5", +] + [[package]] name = "hashlink" version = "0.10.0" @@ -2058,6 +2099,9 @@ name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "heck" @@ -2176,14 +2220,14 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -2199,7 +2243,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "h2 0.4.10", + "h2 0.4.11", "http 1.3.1", "http-body 1.0.1", "httparse", @@ -2237,7 +2281,7 @@ dependencies = [ "hyper 1.6.0", "hyper-util", "log", - "rustls 0.23.28", + "rustls 0.23.29", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", @@ -2263,9 +2307,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2fdfdbff08affe55bb779f33b053aa1fe5dd5b54c257343c17edfa55711bdb" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ "base64 0.22.1", "bytes", @@ -2279,7 +2323,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.0", "system-configuration", "tokio", "tower-service", @@ -2443,9 +2487,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown 0.15.4", @@ -2460,7 +2504,7 @@ checksum = "6c38228f24186d9cc68c729accb4d413be9eaed6ad07ff79e0270d9e56f3de13" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -2485,6 +2529,17 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + [[package]] name = "ipnet" version = "2.11.0" @@ -2607,10 +2662,11 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libsqlite3-sys" -version = "0.30.1" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" dependencies = [ + "cc", "pkg-config", "vcpkg", ] @@ -2750,7 +2806,7 @@ dependencies = [ "crossbeam-channel", "crossbeam-epoch", "crossbeam-utils", - "event-listener", + "event-listener 5.4.0", "futures-util", "loom", "parking_lot", @@ -2840,7 +2896,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -2926,7 +2982,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -2958,9 +3014,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "4.6.0" +version = "3.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" dependencies = [ "num-traits", ] @@ -2977,9 +3033,9 @@ dependencies = [ [[package]] name = "ouroboros" -version = "0.18.5" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" +checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" dependencies = [ "aliasable", "ouroboros_macro", @@ -2988,15 +3044,15 @@ dependencies = [ [[package]] name = "ouroboros_macro" -version = "0.18.5" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" +checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" dependencies = [ "heck 0.4.1", + "proc-macro-error", "proc-macro2", - "proc-macro2-diagnostics", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -3013,9 +3069,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "owo-colors" -version = "4.2.1" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec" +checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" [[package]] name = "p256" @@ -3069,6 +3125,12 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pathdiff" version = "0.2.3" @@ -3131,7 +3193,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -3144,15 +3206,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "pgvector" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc58e2d255979a31caa7cabfa7aac654af0354220719ab7a68520ae7a91e8c0b" -dependencies = [ - "serde", -] - [[package]] name = "pin-project-lite" version = "0.2.16" @@ -3234,12 +3287,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.34" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6837b9e10d61f45f987d50808f83d1ee3d206c66acf650c3e4ae2e1f6ddedf55" +checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" dependencies = [ "proc-macro2", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -3260,6 +3313,30 @@ dependencies = [ "toml_edit", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro-error-attr2" version = "2.0.0" @@ -3279,7 +3356,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -3291,19 +3368,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.103", - "version_check", - "yansi", -] - [[package]] name = "ptr_meta" version = "0.1.4" @@ -3370,9 +3434,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -3446,11 +3510,11 @@ dependencies = [ "num-bigint", "percent-encoding", "pin-project-lite", - "rustls 0.23.28", + "rustls 0.23.29", "rustls-native-certs 0.8.1", "ryu", "sha1_smol", - "socket2", + "socket2 0.5.10", "tokio", "tokio-rustls 0.26.2", "tokio-util", @@ -3459,9 +3523,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec" dependencies = [ "bitflags", ] @@ -3483,7 +3547,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -3547,15 +3611,15 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.20" +version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", "futures-core", - "h2 0.4.10", + "h2 0.4.11", "http 1.3.1", "http-body 1.0.1", "http-body-util", @@ -3683,13 +3747,12 @@ dependencies = [ [[package]] name = "rust-ini" -version = "0.21.1" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e310ef0e1b6eeb79169a1171daf9abcb87a2e17c03bee2c4bb100b55c75409f" +checksum = "e7295b7ce3bf4806b419dc3420745998b447178b7005e2011947b38fc5aa6791" dependencies = [ "cfg-if", "ordered-multimap", - "trim-in-place", ] [[package]] @@ -3753,15 +3816,15 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ "bitflags", "errno", "libc", "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -3778,16 +3841,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.3", + "rustls-webpki 0.103.4", "subtle", "zeroize", ] @@ -3846,9 +3909,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "aws-lc-rs", "ring", @@ -3901,6 +3964,18 @@ dependencies = [ "serde_json", ] +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -3933,23 +4008,22 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] name = "sea-orm" -version = "1.1.12" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18b7272b88bd608cd846de24f41b74a0315a135fe761b0aed4ec1ce6a6327a93" +checksum = "c8814e37dc25de54398ee62228323657520b7f29713b8e238649385dbe473ee0" dependencies = [ "async-stream", "async-trait", "bigdecimal", "chrono", - "futures-util", + "futures", "log", "ouroboros", - "pgvector", "rust_decimal", "sea-orm-macros", "sea-query", @@ -3958,7 +4032,7 @@ dependencies = [ "serde_json", "sqlx", "strum", - "thiserror 2.0.12", + "thiserror 1.0.69", "time", "tracing", "url", @@ -3967,9 +4041,9 @@ dependencies = [ [[package]] name = "sea-orm-cli" -version = "1.1.12" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a4961b0d9098a9dc992d6e75fb761f9e5c442bb46746eeffa08e47b53759fce" +checksum = "620bc560062ae251b1366bde43b3f1508445cab5c2c8cbdb397034638ab1b357" dependencies = [ "chrono", "clap", @@ -3977,7 +4051,6 @@ dependencies = [ "glob", "regex", "sea-schema", - "sqlx", "tracing", "tracing-subscriber", "url", @@ -3985,27 +4058,28 @@ dependencies = [ [[package]] name = "sea-orm-macros" -version = "1.1.12" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c38255a6b2e6d1ae2d5df35696507a345f03c036ae32caeb0a3b922dbab610d" +checksum = "5e115c6b078e013aa963cc2d38c196c2c40b05f03d0ac872fe06b6e0d5265603" dependencies = [ - "heck 0.5.0", + "heck 0.4.1", "proc-macro2", "quote", "sea-bae", - "syn 2.0.103", + "syn 2.0.104", "unicode-ident", ] [[package]] name = "sea-orm-migration" -version = "1.1.12" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82f58c3b1dcf6c137f08394f0228f9baf1574a2a799e93dc5da3cd9228bef9c5" +checksum = "ee8269bc6ff71afd6b78aa4333ac237a69eebd2cdb439036291e64fb4b8db23c" dependencies = [ "async-trait", "clap", "dotenvy", + "futures", "sea-orm", "sea-orm-cli", "sea-schema", @@ -4015,14 +4089,15 @@ dependencies = [ [[package]] name = "sea-query" -version = "0.32.6" +version = "0.30.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c91783d1514b99754fc6a4079081dcc2c587dadbff65c48c7f62297443536a" +checksum = "4166a1e072292d46dc91f31617c2a1cdaf55a8be4b5c9f4bf2ba248e3ac4999b" dependencies = [ "bigdecimal", "chrono", + "derivative", "inherent", - "ordered-float 4.6.0", + "ordered-float 3.9.2", "rust_decimal", "sea-query-derive", "serde_json", @@ -4032,9 +4107,9 @@ dependencies = [ [[package]] name = "sea-query-binder" -version = "0.7.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0019f47430f7995af63deda77e238c17323359af241233ec768aba1faea7608" +checksum = "36bbb68df92e820e4d5aeb17b4acd5cc8b5d18b2c36a4dd6f4626aabfa7ab1b9" dependencies = [ "bigdecimal", "chrono", @@ -4056,33 +4131,31 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", "thiserror 2.0.12", ] [[package]] name = "sea-schema" -version = "0.16.2" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2239ff574c04858ca77485f112afea1a15e53135d3097d0c86509cef1def1338" +checksum = "30d148608012d25222442d1ebbfafd1228dbc5221baf4ec35596494e27a2394e" dependencies = [ "futures", "sea-query", - "sea-query-binder", "sea-schema-derive", - "sqlx", ] [[package]] name = "sea-schema-derive" -version = "0.3.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "debdc8729c37fdbf88472f97fd470393089f997a909e535ff67c544d18cfccf0" +checksum = "c6f686050f76bffc4f635cda8aea6df5548666b830b52387e8bc7de11056d11e" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.103", + "syn 1.0.109", ] [[package]] @@ -4110,7 +4183,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77253fb2d4451418d07025826028bcb96ee42d3e58859689a70ce62908009db6" dependencies = [ "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -4143,9 +4216,9 @@ dependencies = [ [[package]] name = "secrecy" -version = "0.10.3" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" dependencies = [ "serde", "zeroize", @@ -4232,14 +4305,14 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" dependencies = [ "itoa", "memchr", @@ -4259,9 +4332,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.9" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" dependencies = [ "serde", ] @@ -4280,16 +4353,17 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf65a400f8f66fb7b0552869ad70157166676db75ed8181f8104ea91cf9d0b42" +checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.9.0", - "schemars", + "indexmap 2.10.0", + "schemars 0.9.0", + "schemars 1.0.4", "serde", "serde_derive", "serde_json", @@ -4299,14 +4373,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81679d9ed988d5e9a5e6531dc3f2c28efbd639cbd1dfb628df08edea6004da77" +checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -4410,9 +4484,6 @@ name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -dependencies = [ - "serde", -] [[package]] name = "socket2" @@ -4424,6 +4495,16 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "spin" version = "0.9.8" @@ -4453,11 +4534,21 @@ dependencies = [ "der 0.7.10", ] +[[package]] +name = "sqlformat" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bba3a93db0cc4f7bdece8bb09e77e2e785c20bfebf79eb8340ed80708048790" +dependencies = [ + "nom", + "unicode_categories", +] + [[package]] name = "sqlx" -version = "0.8.6" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fefb893899429669dcdd979aff487bd78f4064e5e7907e4269081e0ef7d97dc" +checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" dependencies = [ "sqlx-core", "sqlx-macros", @@ -4468,67 +4559,73 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.8.6" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee6798b1838b6a0f69c007c133b8df5866302197e404e8b6ee8ed3e3a5e68dc6" +checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" dependencies = [ - "base64 0.22.1", + "ahash 0.8.12", + "atoi", "bigdecimal", + "byteorder", "bytes", "chrono", "crc", "crossbeam-queue", "either", - "event-listener", + "event-listener 2.5.3", + "futures-channel", "futures-core", "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.4", - "hashlink", - "indexmap 2.9.0", + "hashlink 0.8.4", + "hex", + "indexmap 2.10.0", "log", "memchr", "once_cell", + "paste", "percent-encoding", "rust_decimal", - "rustls 0.23.28", + "rustls 0.21.12", + "rustls-pemfile", "serde", "serde_json", "sha2", "smallvec", - "thiserror 2.0.12", + "sqlformat", + "thiserror 1.0.69", "time", "tokio", "tokio-stream", "tracing", "url", "uuid", - "webpki-roots 0.26.11", + "webpki-roots 0.25.4", ] [[package]] name = "sqlx-macros" -version = "0.8.6" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2d452988ccaacfbf5e0bdbc348fb91d7c8af5bee192173ac3636b5fb6e6715d" +checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.103", + "syn 1.0.109", ] [[package]] name = "sqlx-macros-core" -version = "0.8.6" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a9c1841124ac5a61741f96e1d9e2ec77424bf323962dd894bdb93f37d5219b" +checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" dependencies = [ "dotenvy", "either", - "heck 0.5.0", + "heck 0.4.1", "hex", "once_cell", "proc-macro2", @@ -4540,19 +4637,20 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.103", + "syn 1.0.109", + "tempfile", "tokio", "url", ] [[package]] name = "sqlx-mysql" -version = "0.8.6" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa003f0038df784eb8fecbbac13affe3da23b45194bd57dba231c8f48199c526" +checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", - "base64 0.22.1", + "base64 0.21.7", "bigdecimal", "bitflags", "byteorder", @@ -4585,7 +4683,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.12", + "thiserror 1.0.69", "time", "tracing", "uuid", @@ -4594,12 +4692,12 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.8.6" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db58fcd5a53cf07c184b154801ff91347e4c30d17a3562a635ff028ad5deda46" +checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", - "base64 0.22.1", + "base64 0.21.7", "bigdecimal", "bitflags", "byteorder", @@ -4609,6 +4707,7 @@ dependencies = [ "etcetera", "futures-channel", "futures-core", + "futures-io", "futures-util", "hex", "hkdf", @@ -4628,7 +4727,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.12", + "thiserror 1.0.69", "time", "tracing", "uuid", @@ -4637,9 +4736,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.8.6" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2d12fe70b2c1b4401038055f90f151b78208de1f9f89a7dbfd41587a10c3eea" +checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" dependencies = [ "atoi", "chrono", @@ -4653,12 +4752,11 @@ dependencies = [ "log", "percent-encoding", "serde", - "serde_urlencoded", "sqlx-core", - "thiserror 2.0.12", "time", "tracing", "url", + "urlencoding", "uuid", ] @@ -4703,11 +4801,11 @@ dependencies = [ "p256 0.13.2", "pem", "public-suffix", - "rand 0.9.1", + "rand 0.9.2", "rcgen", "redis", "reqwest", - "rustls 0.23.28", + "rustls 0.23.29", "rustls-pki-types", "sea-orm", "sea-orm-migration", @@ -4725,7 +4823,7 @@ dependencies = [ "tracing", "tracing-subscriber", "uuid", - "webpki-roots 1.0.0", + "webpki-roots 1.0.2", "x509-parser", ] @@ -4748,9 +4846,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.26.3" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" [[package]] name = "subtle" @@ -4771,9 +4869,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.103" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -4797,7 +4895,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -4842,7 +4940,7 @@ dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", - "rustix 1.0.7", + "rustix 1.0.8", "windows-sys 0.59.0", ] @@ -4872,7 +4970,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -4883,7 +4981,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -4982,18 +5080,20 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.1" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "slab", + "socket2 0.5.10", "tokio-macros", "windows-sys 0.52.0", ] @@ -5021,7 +5121,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -5050,7 +5150,7 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.28", + "rustls 0.23.29", "tokio", ] @@ -5080,14 +5180,15 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.23" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac" dependencies = [ "serde", "serde_spanned", - "toml_datetime", - "toml_edit", + "toml_datetime 0.7.0", + "toml_parser", + "winnow", ] [[package]] @@ -5095,6 +5196,12 @@ name = "toml_datetime" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + +[[package]] +name = "toml_datetime" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" dependencies = [ "serde", ] @@ -5105,10 +5212,17 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.9.0", - "serde", - "serde_spanned", - "toml_datetime", + "indexmap 2.10.0", + "toml_datetime 0.6.11", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" +dependencies = [ "winnow", ] @@ -5180,7 +5294,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -5232,12 +5346,6 @@ dependencies = [ "tracing-log", ] -[[package]] -name = "trim-in-place" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343e926fc669bc8cde4fa3129ab681c63671bae288b1f1081ceee6d9d37904fc" - [[package]] name = "try-lock" version = "0.2.5" @@ -5289,6 +5397,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode_categories" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" + [[package]] name = "untrusted" version = "0.9.0" @@ -5421,7 +5535,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", "wasm-bindgen-shared", ] @@ -5456,7 +5570,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5482,18 +5596,15 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.26.11" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" -dependencies = [ - "webpki-roots 1.0.0", -] +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] @@ -5596,7 +5707,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -5607,7 +5718,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -5628,9 +5739,9 @@ dependencies = [ [[package]] name = "windows-registry" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bab093bdd303a1240bb99b8aba8ea8a69ee19d34c9e2ef9594e708a4878820" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ "windows-link", "windows-result", @@ -5682,6 +5793,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.2", +] + [[package]] name = "windows-targets" version = "0.48.5" @@ -5878,9 +5998,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -5940,15 +6060,9 @@ checksum = "4ce2a4ff45552406d02501cea6c18d8a7e50228e7736a872951fe2fe75c91be7" dependencies = [ "arraydeque", "encoding_rs", - "hashlink", + "hashlink 0.10.0", ] -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - [[package]] name = "yasna" version = "0.5.2" @@ -5978,7 +6092,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", "synstructure", ] @@ -5999,7 +6113,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] [[package]] @@ -6019,7 +6133,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", "synstructure", ] @@ -6059,5 +6173,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.103", + "syn 2.0.104", ] diff --git a/Cargo.toml b/Cargo.toml index 75ec683..9a5752c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,12 +19,12 @@ axum = { version = "0.8", features = ["macros"] } tower-http = { version = "0.6", features = ["cors", "trace", "catch-panic"] } # Database and ORM -sea-orm = { version = "1.1", features = [ +sea-orm = { version = "0.12.15", features = [ "sqlx-postgres", "runtime-tokio-rustls", "macros", ] } -sea-orm-migration = { version = "1.1", features = [ +sea-orm-migration = { version = "0.12.15", features = [ "sqlx-postgres", "runtime-tokio-rustls", ] } @@ -39,7 +39,7 @@ jsonwebtoken = "9.3" rustls = "0.23" webpki-roots = "1" rustls-pki-types = "1.12" -secrecy = { version = "0.10", features = ["serde"] } +secrecy = { version = "0.8.0", features = ["serde"] } rcgen = { version = "0.13", features = ["pem"] } # Serialization @@ -86,7 +86,7 @@ features = ["pkcs8", "ecdsa", "alloc", "pem"] [dev-dependencies] sealed_test = "1.1.0" -sea-orm = { version = "1.1", features = ["mock"] } +sea-orm = { version = "0.12.15", features = ["mock"] } [target.'cfg(not(target_env = "msvc"))'.dependencies] tikv-jemallocator = "0.6" diff --git a/README.md b/README.md index d216674..647eb36 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,25 @@ By default, the server will listen on `http://localhost:8000`. You can modify th - `404 NOT FOUND`: Status list not found - `406 NOT ACCEPTABLE`: Requested format not supported +### Status List Aggregation + +- **Endpoint:** `GET /statuslists` +- **Description:** Returns a JSON object containing an array of all status list URIs managed by the server. This allows Relying Parties to discover and cache all available status lists for offline or batch validation. +- **Response Example:** + + ```json + { + "status_lists": [ + "https://example.com/statuslists/1", + "https://example.com/statuslists/2", + "https://example.com/statuslists/3" + ] + } + ``` +- **Content-Type:** `application/json` +- **Authentication:** Not required (public endpoint) + + ## Authentication The server uses JWT-based authentication with the following requirements: diff --git a/architecture.md b/architecture.md index 8e229e3..6b879ff 100644 --- a/architecture.md +++ b/architecture.md @@ -61,7 +61,8 @@ "lst": "eyJhbGciOiJFUzI1NiIsImtpZCI6IjEyIiwidHlwIjoic3RhdHVzbGlzdCtqd3QifQ..." }, "exp": 2291720170, - "ttl": 43200 + "ttl": 43200, + "aggregation_uri": "https://statuslist.example.com/statuslists/aggregation" } ``` - **Status List Token (CWT Example)**: @@ -72,6 +73,25 @@ 646269747301636c73744a78dadbb918000217015d5840251d844ecc6541b8b2fd24 e681836c1a072cad61716fb174d57b162b4b392c1ea08b875a493ca8d1cf4328eee1 b14f33aa899e532844778ba2fff80b5c1e56e5 + aggregation_uri: "https://statuslist.example.com/statuslists/aggregation" + ``` + +--- + +### **Status List Aggregation** + +- The Status List Server exposes an aggregation endpoint at `/statuslists/aggregation`. +- This endpoint returns a JSON object with a `status_lists` array containing all status list URIs managed by the server. +- Each status list token (JWT or CWT) includes an `aggregation_uri` claim pointing to this endpoint, enabling Relying Parties to discover and cache all available status lists for offline or batch validation. +- Example response: + + ```json + { + "status_lists": [ + "https://statuslist.example.com/statuslists/1", + "https://statuslist.example.com/statuslists/2" + ] + } ``` ## **5. Application Design** diff --git a/src/config.rs b/src/config.rs index 178ab09..a3ffa7b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -21,6 +21,7 @@ pub struct ServerConfig { pub domain: String, pub port: u16, pub cert: CertConfig, + pub aggregation_uri: Option, } #[derive(Debug, Clone, Deserialize)] @@ -82,7 +83,7 @@ impl RedisConfig { root_cert: Option<&str>, ) -> RedisResult { let client = if !self.require_tls { - RedisClient::open(self.uri.expose_secret())? + RedisClient::open(self.uri.expose_secret().to_string())? } else { let client_tls = match (cert_pem, key_pem) { (Some(cert), Some(key)) => Some(ClientTlsConfig { @@ -94,7 +95,7 @@ impl RedisConfig { let root_cert = root_cert.map(|cert| cert.as_bytes().to_vec()); RedisClient::build_with_tls( - self.uri.expose_secret(), + self.uri.expose_secret().clone(), TlsCertificates { client_tls, root_cert, @@ -178,6 +179,7 @@ mod tests { ("APP_REDIS__REQUIRE_TLS", "true"), ("APP_SERVER__CERT__EMAIL", "test@gmail.com"), ("APP_SERVER__CERT__ACME_DIRECTORY_URL", "https://acme-v02.api.letsencrypt.org/directory"), + ("APP_SERVER__AGGREGATION_URI", "https://example.com/aggregation"), ])] fn test_env_config() { // Test configuration overrides via environment variables @@ -199,5 +201,9 @@ mod tests { config.server.cert.acme_directory_url, "https://acme-v02.api.letsencrypt.org/directory" ); + assert_eq!( + config.server.aggregation_uri, + Some("https://example.com/aggregation".to_string()) + ); } } diff --git a/src/database/queries.rs b/src/database/queries.rs index b2e5d3e..bba3933 100644 --- a/src/database/queries.rs +++ b/src/database/queries.rs @@ -99,6 +99,13 @@ impl SeaOrmStore { .await .map_err(|e| RepositoryError::FindError(e.to_string())) } + + pub async fn find_all(&self) -> Result, RepositoryError> { + status_lists::Entity::find() + .all(&*self.db) + .await + .map_err(|e| RepositoryError::FindError(e.to_string())) + } } impl SeaOrmStore { diff --git a/src/lib.rs b/src/lib.rs index bc94176..8841da5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,13 +1,10 @@ -mod database; -#[cfg(test)] -mod test_resources; -#[cfg(test)] -mod test_utils; -mod utils; - pub mod config; +pub mod database; pub mod models; pub mod startup; +pub mod test_resources; +pub mod test_utils; +pub mod utils; pub mod web; pub use utils::{cert_manager, state}; diff --git a/src/models.rs b/src/models.rs index e5e1a74..8e8086d 100644 --- a/src/models.rs +++ b/src/models.rs @@ -38,7 +38,7 @@ impl sea_orm::sea_query::ValueType for Alg { } fn column_type() -> sea_orm::sea_query::ColumnType { - sea_orm::sea_query::ColumnType::String(sea_orm::sea_query::StringLen::N(255)) + sea_orm::sea_query::ColumnType::Text } } diff --git a/src/startup.rs b/src/startup.rs index 88ad63e..29c3f3f 100644 --- a/src/startup.rs +++ b/src/startup.rs @@ -18,7 +18,9 @@ use crate::{ utils::state::AppState, web::{ auth::auth, - handlers::{credential_handler, get_status_list, publish_status, update_status}, + handlers::{ + aggregation, credential_handler, get_status_list, publish_status, update_status, + }, }, }; @@ -76,5 +78,6 @@ fn status_list_routes(state: AppState) -> Router { Router::new() .merge(protected_routes) + .route("/", get(aggregation)) .route("/{list_id}", get(get_status_list)) } diff --git a/src/test_utils.rs b/src/test_utils.rs index 38dc981..4705d1d 100644 --- a/src/test_utils.rs +++ b/src/test_utils.rs @@ -7,7 +7,7 @@ use crate::{ }, }; use async_trait::async_trait; -use sea_orm::{DbBackend, MockDatabase}; +use sea_orm::Database as MockDatabase; use std::{collections::HashMap, sync::Arc}; pub struct MockStorage { @@ -40,7 +40,9 @@ pub async fn test_app_state(db_conn: Option>) - let _ = rustls::crypto::aws_lc_rs::default_provider().install_default(); let db = db_conn.unwrap_or(Arc::new( - MockDatabase::new(DbBackend::Postgres).into_connection(), + MockDatabase::connect("postgres://username:password@localhost/test_db") + .await + .unwrap(), )); let key_pem = include_str!("test_resources/ec-private.pem").to_string(); @@ -69,5 +71,6 @@ pub async fn test_app_state(db_conn: Option>) - server_domain: "example.com".to_string(), cert_manager: Arc::new(certificate_manager), cache: Cache::new(5 * 60, 100), + aggregation_uri: Some("https://example.com/aggregation".to_string()), } } diff --git a/src/utils/cert_manager/challenge/dns01.rs b/src/utils/cert_manager/challenge/dns01.rs index 8e0bb1b..72e809c 100644 --- a/src/utils/cert_manager/challenge/dns01.rs +++ b/src/utils/cert_manager/challenge/dns01.rs @@ -182,7 +182,7 @@ impl AwsRoute53DnsUpdater { change_action: ChangeAction, value: &str, ) -> Result { - let record_name = format!("_acme-challenge.{}", domain); + let record_name = format!("_acme-challenge.{domain}"); let hosted_zone_id = self.find_hosted_zone(domain).await?; // Prepare the TXT record to change @@ -195,7 +195,7 @@ impl AwsRoute53DnsUpdater { .ttl(60) .resource_records( ResourceRecord::builder() - .value(format!("\"{}\"", value)) + .value(format!("\"{value}\"")) .build() .map_err(|e| ChallengeError::AwsSdk(e.into()))?, ) @@ -279,7 +279,7 @@ impl PebbleDnsUpdater { #[async_trait] impl DnsUpdater for PebbleDnsUpdater { async fn upsert_record(&self, domain: &str, value: &str) -> Result<(), ChallengeError> { - let record_name = format!("_acme-challenge.{}.", domain); + let record_name = format!("_acme-challenge.{domain}."); let url = format!("{}/set-txt", self.addr); let body = json!({"host": record_name, "value": value}); @@ -296,7 +296,7 @@ impl DnsUpdater for PebbleDnsUpdater { } async fn remove_record(&self, domain: &str, _value: &str) -> Result<(), ChallengeError> { - let record_name = format!("_acme-challenge.{}.", domain); + let record_name = format!("_acme-challenge.{domain}."); let url = format!("{}/clear-txt", self.addr); let body = json!({"host": record_name}); diff --git a/src/utils/state.rs b/src/utils/state.rs index efc89a4..9a6f5d3 100644 --- a/src/utils/state.rs +++ b/src/utils/state.rs @@ -32,6 +32,7 @@ pub struct AppState { pub server_domain: String, pub cert_manager: Arc, pub cache: Cache, + pub aggregation_uri: Option, } pub async fn build_state(config: &AppConfig) -> EyeResult { @@ -98,5 +99,6 @@ pub async fn build_state(config: &AppConfig) -> EyeResult { server_domain: config.server.domain.clone(), cert_manager: Arc::new(certificate_manager), cache: Cache::new(config.cache.ttl, config.cache.max_capacity), + aggregation_uri: config.server.aggregation_uri.clone(), }) } diff --git a/src/web/auth/mod.rs b/src/web/auth/mod.rs index 1124bb8..365062d 100644 --- a/src/web/auth/mod.rs +++ b/src/web/auth/mod.rs @@ -320,7 +320,7 @@ mod tests { let request = Request::builder() .uri("/test") - .header(header::AUTHORIZATION, format!("Bearer {}", token)) + .header(header::AUTHORIZATION, format!("Bearer {token}")) .body(Body::empty()) .unwrap(); diff --git a/src/web/handlers.rs b/src/web/handlers.rs index 5d892d7..62951de 100644 --- a/src/web/handlers.rs +++ b/src/web/handlers.rs @@ -3,5 +3,6 @@ pub mod status_list; pub use issue_credential::credential_handler; pub use status_list::{ - get_status_list::get_status_list, publish_status::publish_status, update_status::update_status, + aggregation::aggregation, get_status_list::get_status_list, publish_status::publish_status, + update_status::update_status, }; diff --git a/src/web/handlers/status_list/aggregation.rs b/src/web/handlers/status_list/aggregation.rs new file mode 100644 index 0000000..1800097 --- /dev/null +++ b/src/web/handlers/status_list/aggregation.rs @@ -0,0 +1,84 @@ +use crate::utils::state::AppState; +use crate::web::handlers::status_list::error::StatusListError; +use axum::{extract::State, response::IntoResponse, Json}; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize)] +pub struct AggregationResponse { + pub status_lists: Vec, +} + +pub async fn aggregation( + State(state): State, +) -> Result { + let records = state.status_list_repo.find_all().await.map_err(|e| { + tracing::error!("Failed to fetch all status lists: {:?}", e); + StatusListError::InternalServerError + })?; + let status_lists = records.into_iter().map(|rec| rec.sub).collect(); + Ok(Json(AggregationResponse { status_lists })) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::{ + models::{status_lists, StatusList, StatusListRecord}, + test_utils::test_app_state, + }; + use axum::{body::to_bytes, http::StatusCode, Router}; + use sea_orm::{DatabaseBackend, MockDatabase}; + use std::sync::Arc; + use tower::ServiceExt; // for .oneshot() + + #[tokio::test] + async fn test_aggregation_returns_all_status_list_uris() { + let status_list1 = StatusListRecord { + list_id: "list1".to_string(), + issuer: "issuer1".to_string(), + status_list: StatusList { + bits: 1, + lst: "foo".to_string(), + }, + sub: "https://example.com/statuslists/list1".to_string(), + }; + let status_list2 = StatusListRecord { + list_id: "list2".to_string(), + issuer: "issuer2".to_string(), + status_list: StatusList { + bits: 1, + lst: "bar".to_string(), + }, + sub: "https://example.com/statuslists/list2".to_string(), + }; + let mock_db = MockDatabase::new(DatabaseBackend::Postgres) + .append_query_results::, _>(vec![vec![ + status_list1.clone(), + status_list2.clone(), + ]]) + .into_connection(); + let app_state = test_app_state(Some(Arc::new(mock_db))).await; + let app = Router::new() + .route("/aggregation", axum::routing::get(aggregation)) + .with_state(app_state); + let response = app + .oneshot( + axum::http::Request::builder() + .uri("/aggregation") + .body(axum::body::Body::empty()) + .unwrap(), + ) + .await + .unwrap(); + assert_eq!(response.status(), StatusCode::OK); + let body = to_bytes(response.into_body(), 1024 * 1024).await.unwrap(); + let result: AggregationResponse = serde_json::from_slice(&body).unwrap(); + assert_eq!(result.status_lists.len(), 2); + assert!(result + .status_lists + .contains(&"https://example.com/statuslists/list1".to_string())); + assert!(result + .status_lists + .contains(&"https://example.com/statuslists/list2".to_string())); + } +} diff --git a/src/web/handlers/status_list/get_status_list.rs b/src/web/handlers/status_list/get_status_list.rs index 21905d4..73dc253 100644 --- a/src/web/handlers/status_list/get_status_list.rs +++ b/src/web/handlers/status_list/get_status_list.rs @@ -131,8 +131,8 @@ async fn build_response_from_record( }; let token_bytes = match accept { - ACCEPT_STATUS_LISTS_HEADER_CWT => issue_cwt(status_record, &keypair, certs_parts)?, - _ => issue_jwt(status_record, &keypair, certs_parts)?.into_bytes(), + ACCEPT_STATUS_LISTS_HEADER_CWT => issue_cwt(status_record, &keypair, certs_parts, state)?, + _ => issue_jwt(status_record, &keypair, certs_parts, state)?.into_bytes(), }; Ok(( @@ -151,6 +151,7 @@ fn issue_cwt( status_record: &StatusListRecord, keypair: &Keypair, cert_chain: Vec, + state: &AppState, ) -> Result, StatusListError> { let mut claims = vec![]; @@ -191,6 +192,13 @@ fn issue_cwt( CborValue::Map(status_list), )); + if let Some(aggregation_uri) = &state.aggregation_uri { + claims.push(( + CborValue::Text("aggregation_uri".into()), + CborValue::Text(aggregation_uri.clone()), + )); + } + let payload = CborValue::Map(claims).to_vec().map_err(|err| { tracing::error!("Failed to serialize claims: {err:?}"); StatusListError::InternalServerError @@ -253,12 +261,15 @@ pub struct StatusListToken { pub status_list: StatusList, pub sub: String, pub ttl: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub aggregation_uri: Option, } fn issue_jwt( status_record: &StatusListRecord, keypair: &Keypair, cert_chain: Vec, + state: &AppState, ) -> Result { let iat = Utc::now().timestamp(); let ttl = TOKEN_TTL; @@ -270,6 +281,7 @@ fn issue_jwt( status_list: status_record.status_list.clone(), sub: status_record.sub.to_owned(), ttl: Some(ttl), + aggregation_uri: state.aggregation_uri.clone(), }; // Building the header let mut header = Header::new(jsonwebtoken::Algorithm::ES256); @@ -382,6 +394,7 @@ mod tests { token_data.claims.status_list.lst, encode_compressed(&[0, 0, 0]).unwrap() ); + assert_eq!(token_data.claims.aggregation_uri, app_state.aggregation_uri); } #[tokio::test] @@ -496,6 +509,17 @@ mod tests { .1 .clone(); assert_eq!(ttl, CborValue::Integer(300.into())); + + let aggregation_uri = claims + .iter() + .find(|(k, _)| k == &CborValue::Text("aggregation_uri".to_string())) + .unwrap() + .1 + .clone(); + assert_eq!( + aggregation_uri, + CborValue::Text(app_state.aggregation_uri.unwrap()) + ); } #[tokio::test] diff --git a/src/web/handlers/status_list/mod.rs b/src/web/handlers/status_list/mod.rs index 51e6f05..f9531c6 100644 --- a/src/web/handlers/status_list/mod.rs +++ b/src/web/handlers/status_list/mod.rs @@ -1,6 +1,7 @@ use crate::models::StatusEntry; use serde::Deserialize; +pub(crate) mod aggregation; pub(super) mod constants; pub(super) mod error; pub(crate) mod get_status_list;