From c9371473446ba332da328186fa1cda195f02d761 Mon Sep 17 00:00:00 2001 From: Javier Arias Date: Wed, 1 Apr 2026 13:19:59 +0100 Subject: [PATCH 01/11] Update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fc394df..e4d3595f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [[1.0.0]](https://github.com/thoth-pub/thoth/releases/tag/v1.0.0) - 2026-04-01 +## [[1.0.1]](https://github.com/thoth-pub/thoth/releases/tag/v1.0.1) - 2026-04-01 ### Fixed - Return raw JATS XML rather than attempting to validate it From 2725001d618de6842998be4b8048241b32611c2e Mon Sep 17 00:00:00 2001 From: Javier Arias Date: Wed, 1 Apr 2026 16:19:30 +0100 Subject: [PATCH 02/11] Remove permissive tags --- thoth-api/src/markup/mod.rs | 37 ++++--------------------------------- 1 file changed, 4 insertions(+), 33 deletions(-) diff --git a/thoth-api/src/markup/mod.rs b/thoth-api/src/markup/mod.rs index 6e042d40..42d5275a 100644 --- a/thoth-api/src/markup/mod.rs +++ b/thoth-api/src/markup/mod.rs @@ -55,34 +55,18 @@ fn looks_like_markup(content: &str) -> bool { fn validate_jats_subset(content: &str) -> ThothResult<()> { let allowed_tags = [ - "html", "p", "break", - "br", "bold", - "strong", - "b", "italic", - "em", - "i", "underline", - "u", "strike", - "s", - "del", - "strikethrough", "monospace", - "code", "sup", "sub", "sc", - "text", "list", - "ul", - "ol", "list-item", - "li", - "a", "ext-link", "inline-formula", "tex-math", @@ -509,21 +493,6 @@ mod tests { assert!(output.contains("")); } - #[test] - fn test_jatsxml_legacy_inline_html_is_normalized_on_write() { - let input = r#"

Italic Underline Link

"#; - let output = convert_to_jats( - input.to_string(), - MarkupFormat::JatsXml, - ConversionLimit::Abstract, - ) - .unwrap(); - - assert!(output.contains("Italic")); - assert!(output.contains("Underline")); - assert!(output.contains(r#"Link"#)); - } - #[test] fn test_html_break_formula_email_and_uri_conversion() { let input = r#"

Line
E=mc^2 user@example.org https://example.org

"#; @@ -686,7 +655,8 @@ mod tests { #[test] fn test_convert_from_jats_jatsxml_passes_through_legacy_markup() { - let input = r#"

Italic Underline Link

"#; + let input = + r#"

Italic Underline Link

"#; let output = convert_from_jats(input, MarkupFormat::JatsXml, ConversionLimit::Abstract).unwrap(); assert_eq!(input, output); @@ -694,7 +664,8 @@ mod tests { #[test] fn test_convert_from_jats_html_accepts_legacy_inline_html_tags() { - let input = r#"

Italic Underline Link

"#; + let input = + r#"

Italic Underline Link

"#; let output = convert_from_jats(input, MarkupFormat::Html, ConversionLimit::Abstract).unwrap(); From 34bd6a34b81a059d13b38326d4f4cccaac49f246 Mon Sep 17 00:00:00 2001 From: Javier Arias Date: Thu, 2 Apr 2026 09:32:00 +0100 Subject: [PATCH 03/11] Upgrade jsonwebtoken and aws-lc-sys --- Cargo.lock | 848 +++++++++++++++++------------------- Cargo.toml | 2 +- thoth-api-server/Cargo.toml | 2 +- thoth-api/Cargo.toml | 4 +- thoth-errors/Cargo.toml | 2 +- 5 files changed, 396 insertions(+), 462 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4ed36838..efdc5d8c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -182,7 +182,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.6.2", + "socket2 0.6.3", "time", "tracing", "url", @@ -260,9 +260,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.21" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" dependencies = [ "anstyle", "anstyle-parse", @@ -275,15 +275,15 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anstyle-parse" -version = "0.2.7" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" dependencies = [ "utf8parse", ] @@ -316,9 +316,9 @@ checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arc-swap" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5" +checksum = "a07d1f37ff60921c83bdfc7407723bdefe89b44b98a9b772f225c8f9d67141a6" dependencies = [ "rustversion", ] @@ -348,28 +348,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "async-trait" version = "0.1.89" @@ -449,19 +427,20 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.16.1" +version = "1.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bffc006df10ac2a68c83692d734a465f8ee6c5b384d8545a636f81d858f4bf" +checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" dependencies = [ "aws-lc-sys", + "untrusted 0.7.1", "zeroize", ] [[package]] name = "aws-lc-sys" -version = "0.38.0" +version = "0.39.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4321e568ed89bb5a7d291a7f37997c2c0df89809d7b6d12062c81ddb54aa782e" +checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" dependencies = [ "cc", "cmake", @@ -499,9 +478,9 @@ dependencies = [ [[package]] name = "aws-sdk-cloudfront" -version = "1.113.0" +version = "1.115.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ec35f8c6e83e537f8fd1047235dd17ddc568f87892bfa38aaa46f70f1bad0" +checksum = "e93d605a0e2012695273c48bdb787e82851bd6d2cc3930ed4bb6820fb5b3852e" dependencies = [ "aws-credential-types", "aws-runtime", @@ -523,9 +502,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.125.0" +version = "1.128.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "223f5c95650d9557925a91f4c2db3def189e8f659452134a29e5cd2d37d708ed" +checksum = "99304b64672e0d81a3c100a589b93d9ef5e9c0ce12e21c848fd39e50f493c2a1" dependencies = [ "aws-credential-types", "aws-runtime", @@ -558,9 +537,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.96.0" +version = "1.97.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64a6eded248c6b453966e915d32aeddb48ea63ad17932682774eb026fbef5b1" +checksum = "9aadc669e184501caaa6beafb28c6267fc1baef0810fb58f9b205485ca3f2567" dependencies = [ "aws-credential-types", "aws-runtime", @@ -582,9 +561,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.98.0" +version = "1.99.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db96d720d3c622fcbe08bae1c4b04a72ce6257d8b0584cb5418da00ae20a344f" +checksum = "1342a7db8f358d3de0aed2007a0b54e875458e39848d54cc1d46700b2bfcb0a8" dependencies = [ "aws-credential-types", "aws-runtime", @@ -606,9 +585,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.100.0" +version = "1.101.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fafbdda43b93f57f699c5dfe8328db590b967b8a820a13ccdd6687355dfcc7ca" +checksum = "ab41ad64e4051ecabeea802d6a17845a91e83287e1dd249e6963ea1ba78c428a" dependencies = [ "aws-credential-types", "aws-runtime", @@ -737,7 +716,7 @@ dependencies = [ "http 1.4.0", "http-body 0.4.6", "hyper 0.14.32", - "hyper 1.8.1", + "hyper 1.9.0", "hyper-rustls 0.24.2", "hyper-rustls 0.27.7", "hyper-util", @@ -748,7 +727,7 @@ dependencies = [ "rustls-pki-types", "tokio", "tokio-rustls 0.26.4", - "tower 0.5.3", + "tower", "tracing", ] @@ -824,9 +803,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.4.6" +version = "1.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b1117b3b2bbe166d11199b540ceed0d0f7676e36e7b962b5a437a9971eac75" +checksum = "9d73dbfbaa8e4bc57b9045137680b958d274823509a360abfd8e1d514d40c95c" dependencies = [ "base64-simd", "bytes", @@ -873,11 +852,10 @@ dependencies = [ [[package]] name = "axum" -version = "0.7.9" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" dependencies = [ - "async-trait", "axum-core", "bytes", "futures-util", @@ -890,30 +868,27 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper 1.0.2", - "tower 0.5.3", + "serde_core", + "sync_wrapper", + "tower", "tower-layer", "tower-service", ] [[package]] name = "axum-core" -version = "0.4.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" dependencies = [ - "async-trait", "bytes", - "futures-util", + "futures-core", "http 1.4.0", "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", - "rustversion", - "sync_wrapper 1.0.2", + "sync_wrapper", "tower-layer", "tower-service", ] @@ -930,12 +905,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - [[package]] name = "base64" version = "0.21.7" @@ -1064,9 +1033,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.56" +version = "1.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" dependencies = [ "find-msvc-tools", "jobserver", @@ -1089,6 +1058,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.44" @@ -1105,18 +1080,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstream", "anstyle", @@ -1126,15 +1101,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] @@ -1150,9 +1125,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "combine" @@ -1401,8 +1376,18 @@ version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -1419,13 +1404,37 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + [[package]] name = "darling_macro" version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ - "darling_core", + "darling_core 0.21.3", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", "quote", "syn 2.0.117", ] @@ -1552,9 +1561,9 @@ dependencies = [ [[package]] name = "diesel" -version = "2.3.6" +version = "2.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b6c2fc184a6fb6ebcf5f9a5e3bbfa84d8fd268cdfcce4ed508979a6259494d" +checksum = "f4ae09a41a4b89f94ec1e053623da8340d996bc32c6517d325a9daad9b239358" dependencies = [ "bitflags 2.11.0", "byteorder", @@ -1665,7 +1674,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd122633e4bef06db27737f21d3738fb89c8f6d5360d6d9d7635dda142a7757e" dependencies = [ - "darling", + "darling 0.21.3", "either", "heck 0.5.0", "proc-macro2", @@ -1820,9 +1829,9 @@ dependencies = [ [[package]] name = "env_filter" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a1c3cc8e57274ec99de65301228b537f1e4eedc1b8e0f9411c6caac8ae7308f" +checksum = "32e90c2accc4b07a8456ea0debdc2e7587bdd890680d71173a15d4ae604f6eef" dependencies = [ "log", "regex", @@ -1830,9 +1839,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.11.9" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2daee4ea451f429a58296525ddf28b45a3b64f1acf6587e2067437bb11e218d" +checksum = "0621c04f2196ac3f488dd583365b9c09be011a4ab8b9f37248ffcc8f6198b56a" dependencies = [ "anstream", "anstyle", @@ -2116,9 +2125,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 5.3.0", "wasip2", + "wasm-bindgen", ] [[package]] @@ -2427,9 +2438,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -2442,7 +2453,6 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -2470,7 +2480,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.4.0", - "hyper 1.8.1", + "hyper 1.9.0", "hyper-util", "rustls 0.23.37", "rustls-native-certs", @@ -2478,6 +2488,7 @@ dependencies = [ "tokio", "tokio-rustls 0.26.4", "tower-service", + "webpki-roots", ] [[package]] @@ -2486,7 +2497,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.8.1", + "hyper 1.9.0", "hyper-util", "pin-project-lite", "tokio", @@ -2501,7 +2512,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.8.1", + "hyper 1.9.0", "hyper-util", "native-tls", "tokio", @@ -2521,13 +2532,13 @@ dependencies = [ "futures-util", "http 1.4.0", "http-body 1.0.1", - "hyper 1.8.1", + "hyper 1.9.0", "ipnet", "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.2", - "system-configuration 0.7.0", + "socket2 0.6.3", + "system-configuration", "tokio", "tower-service", "tracing", @@ -2560,12 +2571,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -2573,9 +2585,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -2586,9 +2598,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -2600,15 +2612,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -2620,15 +2632,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -2721,9 +2733,9 @@ checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ "memchr", "serde", @@ -2755,15 +2767,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.14.0" @@ -2775,9 +2778,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" @@ -2815,26 +2818,30 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] [[package]] name = "jsonwebtoken" -version = "9.3.1" +version = "10.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1" dependencies = [ + "aws-lc-rs", "base64 0.22.1", + "getrandom 0.2.17", "js-sys", "pem", - "ring", "serde", "serde_json", + "signature 2.2.0", "simple_asn1", ] @@ -2894,9 +2901,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.182" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] name = "libm" @@ -2912,9 +2919,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "local-channel" @@ -2957,6 +2964,12 @@ dependencies = [ "hashbrown 0.16.1", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "mac" version = "0.1.1" @@ -2988,9 +3001,9 @@ dependencies = [ [[package]] name = "matchit" -version = "0.7.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "md-5" @@ -3057,9 +3070,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "log", @@ -3130,9 +3143,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-integer" @@ -3176,16 +3189,16 @@ dependencies = [ [[package]] name = "oauth2" -version = "4.4.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c38841cdd844847e3e7c8d29cef9dcfed8877f8f56f9071f77843ecf3baf937f" +checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" dependencies = [ - "base64 0.13.1", + "base64 0.22.1", "chrono", "getrandom 0.2.17", - "http 0.2.12", + "http 1.4.0", "rand 0.8.5", - "reqwest 0.11.27", + "reqwest", "serde", "serde_json", "serde_path_to_error", @@ -3196,9 +3209,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "once_cell_polyfill" @@ -3219,16 +3232,16 @@ dependencies = [ [[package]] name = "openidconnect" -version = "3.5.0" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47e80a9cfae4462dd29c41e987edd228971d6565553fbc14b8a11e666d91590" +checksum = "0d8c6709ba2ea764bbed26bce1adf3c10517113ddea6f2d4196e4851757ef2b2" dependencies = [ - "base64 0.13.1", + "base64 0.21.7", "chrono", "dyn-clone", "ed25519-dalek", "hmac", - "http 0.2.12", + "http 1.4.0", "itertools 0.10.5", "log", "oauth2", @@ -3238,7 +3251,6 @@ dependencies = [ "rsa", "serde", "serde-value", - "serde_derive", "serde_json", "serde_path_to_error", "serde_plain", @@ -3251,9 +3263,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.75" +version = "0.10.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" dependencies = [ "bitflags 2.11.0", "cfg-if", @@ -3283,9 +3295,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.111" +version = "0.9.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" dependencies = [ "cc", "libc", @@ -3470,31 +3482,31 @@ dependencies = [ [[package]] name = "pbjson" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e6349fa080353f4a597daffd05cb81572a9c031a6d4fff7e504947496fcc68" +checksum = "e8edd1efdd8ab23ba9cb9ace3d9987a72663d5d7c9f74fa00b51d6213645cf6c" dependencies = [ - "base64 0.21.7", + "base64 0.22.1", "serde", ] [[package]] name = "pbjson-build" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eea3058763d6e656105d1403cb04e0a41b7bbac6362d413e7c33be0c32279c9" +checksum = "2ed4d5c6ae95e08ac768883c8401cf0e8deb4e6e1d6a4e1fd3d2ec4f0ec63200" dependencies = [ "heck 0.5.0", - "itertools 0.13.0", + "itertools 0.14.0", "prost", "prost-types", ] [[package]] name = "pbjson-types" -version = "0.7.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54e5e7bfb1652f95bc361d76f3c780d8e526b134b85417e774166ee941f0887" +checksum = "a14e2757d877c0f607a82ce1b8560e224370f159d66c5d52eb55ea187ef0350e" dependencies = [ "bytes", "chrono", @@ -3532,11 +3544,12 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "petgraph" -version = "0.7.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", + "hashbrown 0.15.5", "indexmap 2.13.0", ] @@ -3707,18 +3720,18 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" +checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" dependencies = [ "portable-atomic", ] [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -3807,9 +3820,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.13.5" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" dependencies = [ "bytes", "prost-derive", @@ -3817,15 +3830,14 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.13.5" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" +checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ "heck 0.5.0", "itertools 0.14.0", "log", "multimap", - "once_cell", "petgraph", "prettyplease", "prost", @@ -3837,9 +3849,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.13.5" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" dependencies = [ "anyhow", "itertools 0.14.0", @@ -3850,18 +3862,18 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.13.5" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" dependencies = [ "prost", ] [[package]] name = "pulldown-cmark" -version = "0.13.1" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c41efbf8f90ac44de7f3a868f0867851d261b56291732d0cbf7cceaaeb55a6" +checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" dependencies = [ "bitflags 2.11.0", "getopts", @@ -3885,6 +3897,61 @@ dependencies = [ "memchr", ] +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.37", + "socket2 0.6.3", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls 0.23.37", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.3", + "tracing", + "windows-sys 0.60.2", +] + [[package]] name = "quote" version = "1.0.45" @@ -4070,47 +4137,6 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration 0.5.1", - "tokio", - "tokio-rustls 0.24.1", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots", - "winreg", -] - [[package]] name = "reqwest" version = "0.12.28" @@ -4125,7 +4151,7 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", + "hyper 1.9.0", "hyper-rustls 0.27.7", "hyper-tls", "hyper-util", @@ -4135,20 +4161,24 @@ dependencies = [ "native-tls", "percent-encoding", "pin-project-lite", + "quinn", + "rustls 0.23.37", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper", "tokio", "tokio-native-tls", - "tower 0.5.3", + "tokio-rustls 0.26.4", + "tower", "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots", ] [[package]] @@ -4160,7 +4190,7 @@ dependencies = [ "anyhow", "async-trait", "http 1.4.0", - "reqwest 0.12.28", + "reqwest", "serde", "thiserror 1.0.69", "tower-service", @@ -4177,9 +4207,9 @@ dependencies = [ "futures", "getrandom 0.2.17", "http 1.4.0", - "hyper 1.8.1", + "hyper 1.9.0", "parking_lot 0.11.2", - "reqwest 0.12.28", + "reqwest", "reqwest-middleware", "retry-policies", "thiserror 1.0.69", @@ -4228,7 +4258,7 @@ dependencies = [ "cfg-if", "getrandom 0.2.17", "libc", - "untrusted", + "untrusted 0.9.0", "windows-sys 0.52.0", ] @@ -4261,6 +4291,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + [[package]] name = "rustc_version" version = "0.4.1" @@ -4306,7 +4342,7 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.9", + "rustls-webpki 0.103.10", "subtle", "zeroize", ] @@ -4323,30 +4359,13 @@ dependencies = [ "security-framework", ] -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ + "web-time", "zeroize", ] @@ -4357,19 +4376,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ "ring", - "untrusted", + "untrusted 0.9.0", ] [[package]] name = "rustls-webpki" -version = "0.103.9" +version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ "aws-lc-rs", "ring", "rustls-pki-types", - "untrusted", + "untrusted 0.9.0", ] [[package]] @@ -4386,9 +4405,9 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] @@ -4461,7 +4480,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ "ring", - "untrusted", + "untrusted 0.9.0", ] [[package]] @@ -4615,9 +4634,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -4636,9 +4655,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.17.0" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381b283ce7bc6b476d903296fb59d0d36633652b633b27f64db4fb46dcbfc3b9" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" dependencies = [ "base64 0.22.1", "chrono", @@ -4655,11 +4674,11 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.17.0" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6d4e30573c8cb306ed6ab1dca8423eec9a463ea0e155f45399455e0368b27e0" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" dependencies = [ - "darling", + "darling 0.23.0", "proc-macro2", "quote", "syn 2.0.117", @@ -4753,9 +4772,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "simple_asn1" @@ -4816,12 +4835,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -4967,12 +4986,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - [[package]] name = "sync_wrapper" version = "1.0.2" @@ -4993,17 +5006,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "system-configuration-sys 0.5.0", -] - [[package]] name = "system-configuration" version = "0.7.0" @@ -5012,17 +5014,7 @@ checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ "bitflags 2.11.0", "core-foundation 0.9.4", - "system-configuration-sys 0.6.0", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", + "system-configuration-sys", ] [[package]] @@ -5037,9 +5029,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.26.0" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", "getrandom 0.4.2", @@ -5178,7 +5170,7 @@ version = "1.0.1" dependencies = [ "chrono", "graphql_client", - "reqwest 0.12.28", + "reqwest", "reqwest-middleware", "reqwest-retry", "serde", @@ -5201,7 +5193,7 @@ dependencies = [ "juniper", "marc", "phf 0.11.3", - "reqwest 0.12.28", + "reqwest", "reqwest-middleware", "serde", "serde_json", @@ -5271,14 +5263,29 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.50.0" @@ -5291,7 +5298,7 @@ dependencies = [ "parking_lot 0.12.5", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.2", + "socket2 0.6.3", "tokio-macros", "windows-sys 0.61.2", ] @@ -5371,7 +5378,7 @@ dependencies = [ "serde_spanned", "toml_datetime", "toml_parser", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -5385,20 +5392,19 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow", + "winnow 1.0.1", ] [[package]] name = "tonic" -version = "0.12.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" dependencies = [ - "async-stream", "async-trait", "axum", "base64 0.22.1", @@ -5407,48 +5413,46 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.8.1", + "hyper 1.9.0", "hyper-timeout", "hyper-util", "percent-encoding", "pin-project", - "prost", "rustls-native-certs", - "rustls-pemfile 2.2.0", - "socket2 0.5.10", + "socket2 0.6.3", + "sync_wrapper", "tokio", "tokio-rustls 0.26.4", "tokio-stream", - "tower 0.4.13", + "tower", "tower-layer", "tower-service", "tracing", ] [[package]] -name = "tonic-types" -version = "0.12.3" +name = "tonic-prost" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0081d8ee0847d01271392a5aebe960a4600f5d4da6c67648a6382a0940f8b367" +checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" dependencies = [ + "bytes", "prost", - "prost-types", "tonic", ] [[package]] name = "tower" -version = "0.4.13" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", - "indexmap 1.9.3", - "pin-project", + "indexmap 2.13.0", "pin-project-lite", - "rand 0.8.5", "slab", + "sync_wrapper", "tokio", "tokio-util", "tower-layer", @@ -5456,21 +5460,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper 1.0.2", - "tokio", - "tower-layer", - "tower-service", -] - [[package]] name = "tower-http" version = "0.6.8" @@ -5484,7 +5473,7 @@ dependencies = [ "http-body 1.0.1", "iri-string", "pin-project-lite", - "tower 0.5.3", + "tower", "tower-layer", "tower-service", ] @@ -5559,9 +5548,9 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-width" @@ -5581,6 +5570,12 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "untrusted" version = "0.9.0" @@ -5626,9 +5621,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -5695,9 +5690,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" dependencies = [ "cfg-if", "once_cell", @@ -5708,23 +5703,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.64" +version = "0.4.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5732,9 +5723,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" dependencies = [ "bumpalo", "proc-macro2", @@ -5745,9 +5736,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" dependencies = [ "unicode-ident", ] @@ -5803,9 +5794,19 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.91" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ "js-sys", "wasm-bindgen", @@ -5813,9 +5814,12 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.25.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +dependencies = [ + "rustls-pki-types", +] [[package]] name = "winapi" @@ -5909,15 +5913,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -5954,21 +5949,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -6002,12 +5982,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -6020,12 +5994,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -6038,12 +6006,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -6068,12 +6030,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -6086,12 +6042,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -6104,12 +6054,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -6122,12 +6066,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -6147,14 +6085,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" [[package]] -name = "winreg" -version = "0.50.0" +name = "winnow" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" [[package]] name = "wit-bindgen" @@ -6264,9 +6198,9 @@ checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -6275,9 +6209,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -6287,18 +6221,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.40" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.40" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -6307,18 +6241,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -6334,9 +6268,9 @@ checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -6345,9 +6279,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -6356,9 +6290,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", @@ -6367,9 +6301,9 @@ dependencies = [ [[package]] name = "zitadel" -version = "5.5.1" +version = "5.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168b66027ca4fd1aa3c529f1359a59f94495db612b57223bf933b2900df4e052" +checksum = "108cb026fe6d26cc61bf0922ec5b34a0be82eff6e9df7530a6722b631ca645ca" dependencies = [ "actix-web", "base64-compat", @@ -6379,14 +6313,14 @@ dependencies = [ "pbjson-types", "prost", "prost-types", - "reqwest 0.11.27", + "reqwest", "serde", "serde_json", "serde_urlencoded", "time", "tokio", "tonic", - "tonic-types", + "tonic-prost", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 5a11b781..8afe3307 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,4 +25,4 @@ dialoguer = { version = "0.11.0", features = ["password"] } dotenv = "0.15.0" lazy_static = "1.5.0" tokio = { version = "1.44.1", features = ["rt", "rt-multi-thread", "macros"] } -zitadel = { version = "5.5.1", features = ["api", "interceptors"]} +zitadel = { version = "5.7.6", features = ["api", "interceptors"]} diff --git a/thoth-api-server/Cargo.toml b/thoth-api-server/Cargo.toml index b4c8e4c7..4e9a165d 100644 --- a/thoth-api-server/Cargo.toml +++ b/thoth-api-server/Cargo.toml @@ -19,4 +19,4 @@ env_logger = "0.11.7" futures-util = "0.3.31" log = "0.4.26" serde = { version = "1.0", features = ["derive"] } -zitadel = { version = "5.5.1", features = ["actix"]} +zitadel = { version = "5.7.6", features = ["actix"]} diff --git a/thoth-api/Cargo.toml b/thoth-api/Cargo.toml index 60f461a4..4f304723 100644 --- a/thoth-api/Cargo.toml +++ b/thoth-api/Cargo.toml @@ -44,7 +44,7 @@ diesel-derive-newtype = "2.1.2" diesel_migrations = { version = "2.2.0", features = ["postgres"], optional = true } dotenv = "0.15.0" futures = { version = "0.3.31", optional = true } -jsonwebtoken = { version = "9.3.1", optional = true } +jsonwebtoken = { version = "10.3.0", optional = true } juniper = { version = "0.16.1", features = ["chrono", "schema-language", "uuid"] } lazy_static = "1.5.0" pulldown-cmark = "0.13.0" @@ -55,7 +55,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" strum = { version = "0.27.1", features = ["derive"] } uuid = { version = "1.16.0", features = ["serde", "v4"] } -zitadel = { version = "5.5.1", features = ["actix"], optional = true } +zitadel = { version = "5.7.6", features = ["actix"], optional = true } aws-sdk-s3 = { version = "1", optional = true } aws-sdk-cloudfront = { version = "1", optional = true } aws-config = { version = "1", optional = true } diff --git a/thoth-errors/Cargo.toml b/thoth-errors/Cargo.toml index bbf106e5..cd9a63ac 100644 --- a/thoth-errors/Cargo.toml +++ b/thoth-errors/Cargo.toml @@ -23,6 +23,6 @@ reqwest-middleware = "0.4" serde = "1.0" serde_json = "1.0" thiserror = "2.0" -tonic = "0.12.1" +tonic = "0.14.2" uuid = { package = "uuid", version = "1.16.0", features = ["serde", "v4"] } xml-rs = "0.8.25" From a5a87e2c9914338df283fc8e35ec6415e63215cd Mon Sep 17 00:00:00 2001 From: Javier Arias Date: Thu, 2 Apr 2026 09:34:25 +0100 Subject: [PATCH 04/11] Update changelog --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4d3595f..3de2fad8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Security + - Upgrade `aws-lc-sys` to v0.39.1 + - Upgrade `jsonwebtoken` to v10.3.0 + - Upgrade `rustls-webpki` to v0.103.10 + ## [[1.0.1]](https://github.com/thoth-pub/thoth/releases/tag/v1.0.1) - 2026-04-01 ### Fixed - Return raw JATS XML rather than attempting to validate it From 195918dfd156e6ca01df6bfbce1dc74bf66db867 Mon Sep 17 00:00:00 2001 From: Javier Arias Date: Thu, 2 Apr 2026 09:51:15 +0100 Subject: [PATCH 05/11] Fix imprint policy --- thoth-api/src/model/work/policy.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/thoth-api/src/model/work/policy.rs b/thoth-api/src/model/work/policy.rs index d52a355f..ff13a540 100644 --- a/thoth-api/src/model/work/policy.rs +++ b/thoth-api/src/model/work/policy.rs @@ -25,7 +25,10 @@ impl UpdatePolicy for WorkPolicy { ) -> ThothResult<()> { let user = ctx.require_publisher_for(current)?; ctx.require_publisher_for(patch)?; - current.can_update_imprint(ctx.db())?; + + if patch.imprint_id != current.imprint_id { + current.can_update_imprint(ctx.db())?; + } if patch.work_type == WorkType::BookChapter { current.can_be_chapter(ctx.db())?; From 8be1b5f514615f3b287c28010588ebf0bd4d40f4 Mon Sep 17 00:00:00 2001 From: Javier Arias Date: Thu, 2 Apr 2026 11:57:13 +0100 Subject: [PATCH 06/11] Fix allow publisher admins to update metadata without storage-field superuser check --- thoth-api/src/graphql/mutation.rs | 22 ++++- thoth-api/tests/graphql_permissions.rs | 115 +++++++++++++++++++++++++ 2 files changed, 135 insertions(+), 2 deletions(-) diff --git a/thoth-api/src/graphql/mutation.rs b/thoth-api/src/graphql/mutation.rs index 17df2a41..0aa0219d 100644 --- a/thoth-api/src/graphql/mutation.rs +++ b/thoth-api/src/graphql/mutation.rs @@ -42,7 +42,9 @@ use crate::model::{ work_relation::{NewWorkRelation, PatchWorkRelation, WorkRelation, WorkRelationPolicy}, Crud, Reorder, }; -use crate::policy::{CreatePolicy, DeletePolicy, MovePolicy, PolicyContext, UpdatePolicy}; +use crate::policy::{ + CreatePolicy, DeletePolicy, MovePolicy, PolicyContext, UpdatePolicy, UserAccess, +}; use crate::storage::{ additional_resource_cleanup_plan, build_cdn_url, copy_temp_object_to_final, delete_object, head_object, probe_video_dimensions, publication_cleanup_plan, reconcile_replaced_object, @@ -401,7 +403,23 @@ impl MutationRoot { context: &Context, #[graphql(description = "Values to apply to existing imprint")] data: PatchImprint, ) -> FieldResult { - let imprint = context.load_current(&data.imprint_id)?; + let imprint: Imprint = context.load_current(&data.imprint_id)?; + let mut data = data; + + if !context.user().is_some_and(|user| user.is_superuser()) { + // Non-superusers cannot modify storage fields. If these fields are omitted in the + // GraphQL payload, Juniper deserializes them as `None`, so preserve existing values. + if data.s3_bucket.is_none() { + data.s3_bucket = imprint.s3_bucket.clone(); + } + if data.cdn_domain.is_none() { + data.cdn_domain = imprint.cdn_domain.clone(); + } + if data.cloudfront_dist_id.is_none() { + data.cloudfront_dist_id = imprint.cloudfront_dist_id.clone(); + } + } + ImprintPolicy::can_update(context, &imprint, &data, ())?; imprint.update(context, &data).map_err(Into::into) diff --git a/thoth-api/tests/graphql_permissions.rs b/thoth-api/tests/graphql_permissions.rs index 9334da79..682d149d 100644 --- a/thoth-api/tests/graphql_permissions.rs +++ b/thoth-api/tests/graphql_permissions.rs @@ -608,6 +608,121 @@ mutation($data: PatchImprint!) { support::assert_no_access(&response); } +#[tokio::test(flavor = "current_thread")] +async fn test_update_imprint_keeps_storage_fields_when_admin_omits_them() { + let _guard = support::test_lock(); + let pool = support::db_pool(); + support::reset_db(&pool).expect("Failed to reset DB"); + + let org_id = format!("org-{}", Uuid::new_v4()); + let publisher_id = create_publisher(pool.clone(), org_id.as_str()).await; + let imprint = create_imprint_record( + pool.clone(), + publisher_id, + Some("bucket-existing"), + Some("existing.example.org"), + Some("dist-existing"), + ) + .await; + + let update_query = r#" +mutation($data: PatchImprint!) { + updateImprint(data: $data) { + imprintId + defaultCurrency + defaultLocale + } +} +"#; + + let update_variables = json!({ + "data": { + "imprintId": imprint.imprint_id, + "publisherId": publisher_id, + "imprintName": imprint.imprint_name, + "defaultCurrency": "USD", + "defaultLocale": "EN", + } + }); + let update_response = support::execute_graphql( + pool.clone(), + Some(support::user_with_roles( + "user-admin", + &[("PUBLISHER_ADMIN", org_id.as_str())], + )), + update_query, + Some(update_variables), + ) + .await; + support::assert_no_errors(&update_response); + + assert_eq!( + update_response + .pointer("/data/updateImprint/defaultCurrency") + .and_then(|v| v.as_str()), + Some("USD") + ); + assert_eq!( + update_response + .pointer("/data/updateImprint/defaultLocale") + .and_then(|v| v.as_str()), + Some("EN") + ); + + let read_query = r#" +query($imprintId: Uuid!) { + imprint(imprintId: $imprintId) { + defaultCurrency + defaultLocale + s3Bucket + cdnDomain + cloudfrontDistId + } +} +"#; + + let read_variables = json!({ "imprintId": imprint.imprint_id }); + let read_response = support::execute_graphql( + pool, + Some(support::superuser("superuser-1")), + read_query, + Some(read_variables), + ) + .await; + support::assert_no_errors(&read_response); + + assert_eq!( + read_response + .pointer("/data/imprint/defaultCurrency") + .and_then(|v| v.as_str()), + Some("USD") + ); + assert_eq!( + read_response + .pointer("/data/imprint/defaultLocale") + .and_then(|v| v.as_str()), + Some("EN") + ); + assert_eq!( + read_response + .pointer("/data/imprint/s3Bucket") + .and_then(|v| v.as_str()), + Some("bucket-existing") + ); + assert_eq!( + read_response + .pointer("/data/imprint/cdnDomain") + .and_then(|v| v.as_str()), + Some("existing.example.org") + ); + assert_eq!( + read_response + .pointer("/data/imprint/cloudfrontDistId") + .and_then(|v| v.as_str()), + Some("dist-existing") + ); +} + #[tokio::test(flavor = "current_thread")] async fn test_update_imprint_storage_fields_round_trip_for_superuser() { let _guard = support::test_lock(); From 3a78d0cb0c09bf35f1706dfdbdb36bc79d5f052e Mon Sep 17 00:00:00 2001 From: Javier Arias Date: Thu, 2 Apr 2026 11:57:40 +0100 Subject: [PATCH 07/11] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3de2fad8..a2af2607 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Upgrade `jsonwebtoken` to v10.3.0 - Upgrade `rustls-webpki` to v0.103.10 +### Fixed + - Allow publisher admins to update metadata without storage-field superuser check + ## [[1.0.1]](https://github.com/thoth-pub/thoth/releases/tag/v1.0.1) - 2026-04-01 ### Fixed - Return raw JATS XML rather than attempting to validate it From 31d13ad31fd0767296cdff4b4ccbdd88c299fc57 Mon Sep 17 00:00:00 2001 From: Javier Arias Date: Thu, 2 Apr 2026 12:15:57 +0100 Subject: [PATCH 08/11] Remove redundant dependencies --- Cargo.lock | 50 +--------------------------------- thoth-api/Cargo.toml | 2 -- thoth-export-server/Cargo.toml | 3 -- 3 files changed, 1 insertion(+), 54 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index efdc5d8c..f126f2f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -323,25 +323,6 @@ dependencies = [ "rustversion", ] -[[package]] -name = "argon2rs" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392" -dependencies = [ - "blake2-rfc", - "scoped_threadpool", -] - -[[package]] -name = "arrayvec" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" -dependencies = [ - "nodrop", -] - [[package]] name = "arrayvec" version = "0.7.6" @@ -954,16 +935,6 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" -[[package]] -name = "blake2-rfc" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" -dependencies = [ - "arrayvec 0.4.12", - "constant_time_eq", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -1162,12 +1133,6 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "convert_case" version = "0.10.0" @@ -2753,7 +2718,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9453fa60f42de77ba9bf54e3628a20390cba0fbf0932799dad81e7ce4e12ed20" dependencies = [ - "arrayvec 0.7.6", + "arrayvec", "codegen", "roxmltree", ] @@ -3109,12 +3074,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - [[package]] name = "num-bigint" version = "0.4.6" @@ -4445,12 +4404,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "scoped_threadpool" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" - [[package]] name = "scopeguard" version = "1.2.0" @@ -5113,7 +5066,6 @@ name = "thoth-api" version = "1.0.1" dependencies = [ "actix-web", - "argon2rs", "aws-config", "aws-credential-types", "aws-sdk-cloudfront", diff --git a/thoth-api/Cargo.toml b/thoth-api/Cargo.toml index 4f304723..5f3f1f8a 100644 --- a/thoth-api/Cargo.toml +++ b/thoth-api/Cargo.toml @@ -21,7 +21,6 @@ backend = [ "jsonwebtoken", "deadpool-redis", "rand", - "argon2rs", "zitadel", "aws-sdk-s3", "aws-sdk-cloudfront", @@ -34,7 +33,6 @@ backend = [ [dependencies] thoth-errors = { version = "=1.0.1", path = "../thoth-errors" } actix-web = { version = "4.10", optional = true } -argon2rs = { version = "0.2.5", optional = true } isbn = "0.6.0" chrono = { version = "0.4.40", features = ["serde"] } deadpool-redis = { version = "0.20.0", optional = true } diff --git a/thoth-export-server/Cargo.toml b/thoth-export-server/Cargo.toml index c4883f87..24c50731 100644 --- a/thoth-export-server/Cargo.toml +++ b/thoth-export-server/Cargo.toml @@ -31,8 +31,5 @@ xml-rs = "0.8.25" quick-xml = "0.36" regex = "1.11.1" -[dev-dependencies] -regex = "1.11.1" - [build-dependencies] dotenv = "0.15.0" From 3439c3ee17750c78cbcbac6a286d2311e10a443d Mon Sep 17 00:00:00 2001 From: Javier Arias Date: Thu, 2 Apr 2026 13:41:31 +0100 Subject: [PATCH 09/11] Remove redundant dependencies --- Cargo.lock | 131 ++++++++----------------------------------- thoth-api/Cargo.toml | 6 +- 2 files changed, 25 insertions(+), 112 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f126f2f8..c015d5ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -691,23 +691,17 @@ dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", "aws-smithy-types", - "h2 0.3.27", "h2 0.4.13", - "http 0.2.12", "http 1.4.0", - "http-body 0.4.6", - "hyper 0.14.32", - "hyper 1.9.0", - "hyper-rustls 0.24.2", - "hyper-rustls 0.27.7", + "hyper", + "hyper-rustls", "hyper-util", "pin-project-lite", - "rustls 0.21.12", - "rustls 0.23.37", + "rustls", "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower", "tracing", ] @@ -2377,30 +2371,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "hyper" -version = "0.14.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.27", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.10", - "tokio", - "tower-service", - "tracing", - "want", -] - [[package]] name = "hyper" version = "1.9.0" @@ -2423,21 +2393,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-rustls" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" -dependencies = [ - "futures-util", - "http 0.2.12", - "hyper 0.14.32", - "log", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - [[package]] name = "hyper-rustls" version = "0.27.7" @@ -2445,13 +2400,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ "http 1.4.0", - "hyper 1.9.0", + "hyper", "hyper-util", - "rustls 0.23.37", + "rustls", "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower-service", "webpki-roots", ] @@ -2462,7 +2417,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "hyper 1.9.0", + "hyper", "hyper-util", "pin-project-lite", "tokio", @@ -2477,7 +2432,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.9.0", + "hyper", "hyper-util", "native-tls", "tokio", @@ -2497,7 +2452,7 @@ dependencies = [ "futures-util", "http 1.4.0", "http-body 1.0.1", - "hyper 1.9.0", + "hyper", "ipnet", "libc", "percent-encoding", @@ -3793,7 +3748,7 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ - "heck 0.5.0", + "heck 0.4.1", "itertools 0.14.0", "log", "multimap", @@ -3868,7 +3823,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.37", + "rustls", "socket2 0.6.3", "thiserror 2.0.18", "tokio", @@ -3888,7 +3843,7 @@ dependencies = [ "rand 0.9.2", "ring", "rustc-hash", - "rustls 0.23.37", + "rustls", "rustls-pki-types", "slab", "thiserror 2.0.18", @@ -4110,8 +4065,8 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.9.0", - "hyper-rustls 0.27.7", + "hyper", + "hyper-rustls", "hyper-tls", "hyper-util", "js-sys", @@ -4121,7 +4076,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.37", + "rustls", "rustls-pki-types", "serde", "serde_json", @@ -4129,7 +4084,7 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-native-tls", - "tokio-rustls 0.26.4", + "tokio-rustls", "tower", "tower-http", "tower-service", @@ -4166,7 +4121,7 @@ dependencies = [ "futures", "getrandom 0.2.17", "http 1.4.0", - "hyper 1.9.0", + "hyper", "parking_lot 0.11.2", "reqwest", "reqwest-middleware", @@ -4278,18 +4233,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "rustls" -version = "0.21.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring", - "rustls-webpki 0.101.7", - "sct", -] - [[package]] name = "rustls" version = "0.23.37" @@ -4301,7 +4244,7 @@ dependencies = [ "once_cell", "ring", "rustls-pki-types", - "rustls-webpki 0.103.10", + "rustls-webpki", "subtle", "zeroize", ] @@ -4328,16 +4271,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring", - "untrusted 0.9.0", -] - [[package]] name = "rustls-webpki" version = "0.103.10" @@ -4426,16 +4359,6 @@ dependencies = [ "tendril", ] -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring", - "untrusted 0.9.0", -] - [[package]] name = "sec1" version = "0.3.0" @@ -5276,23 +5199,13 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.37", + "rustls", "tokio", ] @@ -5365,7 +5278,7 @@ dependencies = [ "http 1.4.0", "http-body 1.0.1", "http-body-util", - "hyper 1.9.0", + "hyper", "hyper-timeout", "hyper-util", "percent-encoding", @@ -5374,7 +5287,7 @@ dependencies = [ "socket2 0.6.3", "sync_wrapper", "tokio", - "tokio-rustls 0.26.4", + "tokio-rustls", "tokio-stream", "tower", "tower-layer", diff --git a/thoth-api/Cargo.toml b/thoth-api/Cargo.toml index 5f3f1f8a..e68f4ac8 100644 --- a/thoth-api/Cargo.toml +++ b/thoth-api/Cargo.toml @@ -54,9 +54,9 @@ serde_json = "1.0" strum = { version = "0.27.1", features = ["derive"] } uuid = { version = "1.16.0", features = ["serde", "v4"] } zitadel = { version = "5.7.6", features = ["actix"], optional = true } -aws-sdk-s3 = { version = "1", optional = true } -aws-sdk-cloudfront = { version = "1", optional = true } -aws-config = { version = "1", optional = true } +aws-sdk-s3 = { version = "1", default-features = false, features = ["rt-tokio", "http-1x", "sigv4a", "default-https-client"], optional = true } +aws-sdk-cloudfront = { version = "1", default-features = false, features = ["rt-tokio", "default-https-client"], optional = true } +aws-config = { version = "1", default-features = false, features = ["rt-tokio", "credentials-process", "sso", "default-https-client"], optional = true } aws-credential-types = { version = "1", optional = true } base64 = { version = "0.22", optional = true } hex = { version = "0.4", optional = true } From fdf4fe0c0a571acfae997932f1ddd2616d0fe67d Mon Sep 17 00:00:00 2001 From: Javier Arias Date: Thu, 2 Apr 2026 19:22:59 +0100 Subject: [PATCH 10/11] Normalise ISBN --- thoth-api/src/graphql/mutation.rs | 6 +- thoth-api/src/graphql/tests.rs | 175 +++++++++++++++++++++++ thoth-api/src/model/publication/mod.rs | 23 +++ thoth-api/src/model/publication/tests.rs | 28 ++++ 4 files changed, 231 insertions(+), 1 deletion(-) diff --git a/thoth-api/src/graphql/mutation.rs b/thoth-api/src/graphql/mutation.rs index 0aa0219d..99808d7c 100644 --- a/thoth-api/src/graphql/mutation.rs +++ b/thoth-api/src/graphql/mutation.rs @@ -28,7 +28,9 @@ use crate::model::{ language::{Language, LanguagePolicy, NewLanguage, PatchLanguage}, location::{Location, LocationPolicy, NewLocation, PatchLocation}, price::{NewPrice, PatchPrice, Price, PricePolicy}, - publication::{NewPublication, PatchPublication, Publication, PublicationPolicy}, + publication::{ + NewPublication, PatchPublication, Publication, PublicationPolicy, PublicationProperties, + }, publisher::{NewPublisher, PatchPublisher, Publisher, PublisherPolicy}, r#abstract::{Abstract, AbstractPolicy, NewAbstract, PatchAbstract}, reference::{NewReference, PatchReference, Reference, ReferencePolicy}, @@ -107,6 +109,7 @@ impl MutationRoot { context: &Context, #[graphql(description = "Values for publication to be created")] data: NewPublication, ) -> FieldResult { + let data = data.into_normalised()?; PublicationPolicy::can_create(context, &data, ())?; Publication::create(&context.db, &data).map_err(Into::into) } @@ -453,6 +456,7 @@ impl MutationRoot { context: &Context, #[graphql(description = "Values to apply to existing publication")] data: PatchPublication, ) -> FieldResult { + let data = data.into_normalised()?; let publication = context.load_current(&data.publication_id)?; PublicationPolicy::can_update(context, &publication, &data, ())?; diff --git a/thoth-api/src/graphql/tests.rs b/thoth-api/src/graphql/tests.rs index 8ca16201..572b2080 100644 --- a/thoth-api/src/graphql/tests.rs +++ b/thoth-api/src/graphql/tests.rs @@ -459,6 +459,10 @@ fn make_new_publication(work_id: Uuid) -> NewPublication { } } +fn raw_isbn(value: &str) -> Isbn { + serde_json::from_str(&format!("\"{value}\"")).expect("Failed to deserialize raw ISBN scalar") +} + fn make_new_location(publication_id: Uuid, canonical: bool) -> NewLocation { NewLocation { publication_id, @@ -2739,6 +2743,177 @@ fn graphql_create_abstract_allows_canonical_short_and_long_for_same_work() { ); } +#[test] +fn graphql_create_publication_normalises_hyphenless_isbn() { + let (_guard, pool) = test_db::setup_test_db(); + let schema = create_schema(); + let superuser = test_db::test_superuser("user-publication-create-isbn-normalisation"); + let context = test_db::test_context_with_user(pool.clone(), superuser); + let seed = seed_data(&schema, &context); + + let doi = Doi::from_str(&format!( + "https://doi.org/10.1234/{}", + unique("publication-create-isbn-normalisation") + )) + .expect("Failed to build DOI"); + let work = create_with_data( + &schema, + &context, + "createWork", + "NewWork", + "workId", + make_new_work(seed.imprint_id, WorkType::Monograph, doi), + ); + let work_id = json_uuid(&work["workId"]); + + let publication = create_with_data( + &schema, + &context, + "createPublication", + "NewPublication", + "publicationId isbn", + NewPublication { + publication_type: PublicationType::Paperback, + work_id, + isbn: Some(raw_isbn("9783943253962")), + width_mm: None, + width_in: None, + height_mm: None, + height_in: None, + depth_mm: None, + depth_in: None, + weight_g: None, + weight_oz: None, + accessibility_standard: None, + accessibility_additional_standard: None, + accessibility_exception: None, + accessibility_report_url: None, + }, + ); + let publication_id = json_uuid(&publication["publicationId"]); + let stored_publication = + Publication::from_id(pool.as_ref(), &publication_id).expect("Failed to fetch publication"); + let expected = Isbn::from_str("9783943253962").expect("Failed to parse expected ISBN"); + + assert_eq!(stored_publication.isbn, Some(expected.clone())); + assert_eq!(publication["isbn"], JsonValue::String(expected.to_string())); +} + +#[test] +fn graphql_update_publication_normalises_hyphenless_isbn() { + let (_guard, pool) = test_db::setup_test_db(); + let schema = create_schema(); + let superuser = test_db::test_superuser("user-publication-update-isbn-normalisation"); + let context = test_db::test_context_with_user(pool.clone(), superuser); + let seed = seed_data(&schema, &context); + + let publication = Publication::from_id(pool.as_ref(), &seed.publication_id) + .expect("Failed to fetch seeded publication"); + let mut patch = patch_publication(&publication); + patch.isbn = Some(raw_isbn("9783943253962")); + + let updated = update_with_data( + &schema, + &context, + "updatePublication", + "PatchPublication", + "publicationId isbn", + patch, + ); + let publication_id = json_uuid(&updated["publicationId"]); + let stored_publication = + Publication::from_id(pool.as_ref(), &publication_id).expect("Failed to fetch publication"); + let expected = Isbn::from_str("9783943253962").expect("Failed to parse expected ISBN"); + + assert_eq!(stored_publication.isbn, Some(expected.clone())); + assert_eq!(updated["isbn"], JsonValue::String(expected.to_string())); +} + +#[test] +fn graphql_create_publication_rejects_invalid_isbn_before_db_constraint() { + use crate::schema::publication::dsl as publication_dsl; + use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl}; + + let (_guard, pool) = test_db::setup_test_db(); + let schema = create_schema(); + let superuser = test_db::test_superuser("user-publication-invalid-isbn-validation"); + let context = test_db::test_context_with_user(pool.clone(), superuser); + let seed = seed_data(&schema, &context); + + let doi = Doi::from_str(&format!( + "https://doi.org/10.1234/{}", + unique("publication-invalid-isbn-validation") + )) + .expect("Failed to build DOI"); + let work = create_with_data( + &schema, + &context, + "createWork", + "NewWork", + "workId", + make_new_work(seed.imprint_id, WorkType::Monograph, doi), + ); + let work_id = json_uuid(&work["workId"]); + + let query = r#" + mutation CreatePublication($data: NewPublication!) { + createPublication(data: $data) { + publicationId + } + } + "#; + let mut vars = Variables::new(); + insert_var( + &mut vars, + "data", + NewPublication { + publication_type: PublicationType::Paperback, + work_id, + isbn: Some(raw_isbn("not-an-isbn")), + width_mm: None, + width_in: None, + height_mm: None, + height_in: None, + depth_mm: None, + depth_in: None, + weight_g: None, + weight_oz: None, + accessibility_standard: None, + accessibility_additional_standard: None, + accessibility_exception: None, + accessibility_report_url: None, + }, + ); + + let (value, errors) = juniper::execute_sync(query, None, &schema, &vars, &context) + .expect("GraphQL execution should succeed with validation errors"); + assert!(!errors.is_empty(), "Expected GraphQL validation error"); + let message = errors[0].error().message(); + assert!( + message.contains("validly formatted ISBN"), + "Expected parse-style ISBN error, got: {message}" + ); + assert!( + !message.contains("exactly 17 characters"), + "Should fail before database ISBN length constraint, got: {message}" + ); + let payload = serde_json::to_value(value).expect("Failed to serialize GraphQL response"); + assert!( + payload.get("createPublication").is_none() || payload["createPublication"].is_null(), + "Expected no createPublication payload on validation error, got: {payload:?}" + ); + + let mut connection = pool.get().expect("Failed to get DB connection"); + let publications = publication_dsl::publication + .filter(publication_dsl::work_id.eq(work_id)) + .load::(&mut connection) + .expect("Failed to query publications for work"); + assert!( + publications.is_empty(), + "Invalid ISBN should not create publication rows" + ); +} + #[test] fn graphql_mutations_cover_all() { let (_guard, pool) = test_db::setup_test_db(); diff --git a/thoth-api/src/model/publication/mod.rs b/thoth-api/src/model/publication/mod.rs index 848ac2af..159b4d3e 100644 --- a/thoth-api/src/model/publication/mod.rs +++ b/thoth-api/src/model/publication/mod.rs @@ -1,4 +1,5 @@ use serde::{Deserialize, Serialize}; +use std::str::FromStr; use strum::Display; use strum::EnumString; use thoth_errors::{ThothError, ThothResult}; @@ -361,8 +362,27 @@ pub trait PublicationProperties { fn weight_g(&self) -> &Option; fn weight_oz(&self) -> &Option; fn isbn(&self) -> &Option; + fn isbn_mut(&mut self) -> &mut Option; fn work_id(&self) -> &Uuid; + fn normalise_isbn(&mut self) -> ThothResult<()> { + let normalised = self + .isbn() + .as_ref() + .map(|isbn| Isbn::from_str(&isbn.to_string())) + .transpose()?; + *self.isbn_mut() = normalised; + Ok(()) + } + + fn into_normalised(mut self) -> ThothResult + where + Self: Sized, + { + self.normalise_isbn()?; + Ok(self) + } + fn is_physical(&self) -> bool { matches!( self.publication_type(), @@ -473,6 +493,9 @@ macro_rules! publication_properties { fn isbn(&self) -> &Option { &self.isbn } + fn isbn_mut(&mut self) -> &mut Option { + &mut self.isbn + } fn work_id(&self) -> &Uuid { &self.work_id } diff --git a/thoth-api/src/model/publication/tests.rs b/thoth-api/src/model/publication/tests.rs index 14417d3d..00282cbd 100644 --- a/thoth-api/src/model/publication/tests.rs +++ b/thoth-api/src/model/publication/tests.rs @@ -227,6 +227,12 @@ mod helpers { mod validation { use super::*; + use std::str::FromStr; + + fn raw_isbn(value: &str) -> Isbn { + serde_json::from_str(&format!("\"{value}\"")) + .expect("Failed to deserialize raw ISBN scalar") + } #[test] fn validate_dimensions_enforces_width_constraints() { @@ -363,6 +369,28 @@ mod validation { publication.weight_oz = Some(3.5); assert!(publication.validate_dimensions_constraints().is_ok()); } + + #[test] + fn normalise_isbn_accepts_valid_hyphenless_isbn13() { + let mut publication: Publication = Default::default(); + publication.isbn = Some(raw_isbn("9783943253962")); + + publication.normalise_isbn().expect("ISBN should normalise"); + + assert_eq!( + publication.isbn, + Some(Isbn::from_str("9783943253962").expect("Failed to parse canonical ISBN")) + ); + } + + #[test] + fn normalise_isbn_rejects_invalid_isbn() { + let mut publication: Publication = Default::default(); + publication.isbn = Some(raw_isbn("not-an-isbn")); + + let result = publication.normalise_isbn(); + assert!(matches!(result, Err(ThothError::IsbnParseError(_)))); + } } #[cfg(feature = "backend")] From 847ca6fb37a1f4bbf5a7bcbc95cbfe687dc2950f Mon Sep 17 00:00:00 2001 From: Javier Arias Date: Fri, 3 Apr 2026 07:26:59 +0100 Subject: [PATCH 11/11] Fix linting --- thoth-api/src/model/publication/tests.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/thoth-api/src/model/publication/tests.rs b/thoth-api/src/model/publication/tests.rs index 00282cbd..a59a2fe7 100644 --- a/thoth-api/src/model/publication/tests.rs +++ b/thoth-api/src/model/publication/tests.rs @@ -372,8 +372,10 @@ mod validation { #[test] fn normalise_isbn_accepts_valid_hyphenless_isbn13() { - let mut publication: Publication = Default::default(); - publication.isbn = Some(raw_isbn("9783943253962")); + let mut publication = Publication { + isbn: Some(raw_isbn("9783943253962")), + ..Default::default() + }; publication.normalise_isbn().expect("ISBN should normalise"); @@ -385,8 +387,10 @@ mod validation { #[test] fn normalise_isbn_rejects_invalid_isbn() { - let mut publication: Publication = Default::default(); - publication.isbn = Some(raw_isbn("not-an-isbn")); + let mut publication = Publication { + isbn: Some(raw_isbn("not-an-isbn")), + ..Default::default() + }; let result = publication.normalise_isbn(); assert!(matches!(result, Err(ThothError::IsbnParseError(_))));