From 1ffd8be071f2aab36435e4b132945cc222ff7c6e Mon Sep 17 00:00:00 2001 From: Artem Goncharov Date: Tue, 23 Sep 2025 09:09:05 +0000 Subject: [PATCH] fix: Diverse fixes from the devstack parallel deploy Multiple fixes that became necessary once installing the project in parallel to the devstack (mysql related, config, error handling, ...) --- Cargo.lock | 1002 +++++++++-------- Cargo.toml | 5 +- doc/src/federation.md | 8 +- doc/src/oidc.md | 166 +++ src/api/auth.rs | 3 + src/api/mod.rs | 26 +- src/api/types.rs | 53 +- src/api/v3/mod.rs | 20 +- src/api/v4/auth/passkey/finish.rs | 2 +- src/api/v4/auth/passkey/start.rs | 42 +- src/api/v4/federation/error.rs | 12 + src/api/v4/federation/jwt.rs | 13 +- src/api/v4/mod.rs | 20 +- src/assignment/backends/error.rs | 8 +- src/bin/keystone.rs | 19 +- src/bin/keystone_db.rs | 15 +- src/catalog/backends/error.rs | 32 +- src/config.rs | 10 +- src/db/entity/federated_identity_provider.rs | 2 +- src/db_migration/m20250301_000001_passkey.rs | 4 +- src/federation/backends/error.rs | 8 +- .../backends/sql/identity_provider.rs | 45 +- src/federation/error.rs | 4 +- src/federation/mod.rs | 2 +- src/identity/backends/error.rs | 8 +- src/identity/backends/sql/common.rs | 14 + src/resource/backends/error.rs | 8 +- src/token/application_credential.rs | 4 +- src/token/domain_scoped.rs | 4 +- src/token/error.rs | 10 + src/token/federation_domain_scoped.rs | 4 +- src/token/federation_project_scoped.rs | 4 +- src/token/federation_unscoped.rs | 4 +- src/token/fernet.rs | 6 +- src/token/fernet_utils.rs | 21 +- src/token/mod.rs | 2 +- src/token/project_scoped.rs | 4 +- src/token/types.rs | 102 +- src/token/unscoped.rs | 4 +- tests/github/main.rs | 2 +- tests/keycloak/main.rs | 2 +- 41 files changed, 1067 insertions(+), 657 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aa3cd27e..c92985f7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -75,12 +75,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -98,9 +92,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -128,35 +122,35 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] @@ -203,7 +197,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] @@ -215,23 +209,20 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "async-compression" -version = "0.4.27" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" +checksum = "977eb15ea9efd848bb8a4a1a2500347ed7f0bf794edf0dc3ddcf439f43d36b23" dependencies = [ - "brotli", - "flate2", + "compression-codecs", + "compression-core", "futures-core", - "memchr", "pin-project-lite", "tokio", - "zstd", - "zstd-safe", ] [[package]] @@ -253,18 +244,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -351,7 +342,7 @@ checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -406,9 +397,9 @@ dependencies = [ [[package]] name = "bcrypt" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92758ad6077e4c76a6cadbce5005f666df70d4f13b19976b1a8062eef880040f" +checksum = "abaf6da45c74385272ddf00e1ac074c7d8a6c1a1dda376902bd6a427522a8b2c" dependencies = [ "base64 0.22.1", "blowfish", @@ -433,9 +424,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" dependencies = [ "serde", ] @@ -500,14 +491,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "brotli" -version = "8.0.1" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -584,10 +575,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.30" +version = "1.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" +checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -595,9 +587,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -607,17 +599,16 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.2.0", ] [[package]] @@ -678,9 +669,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.41" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" +checksum = "e2134bb3ea021b78629caa971416385309e0131b351b25e01dc16fb54e1b5fae" dependencies = [ "clap_builder", "clap_derive", @@ -688,9 +679,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.41" +version = "4.5.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" +checksum = "c2ba64afa3c0a6df7fa517765e31314e983f51dda798ffba27b988194fb65dc9" dependencies = [ "anstream", "anstyle", @@ -700,14 +691,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.41" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -722,7 +713,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -758,6 +749,26 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "compression-codecs" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485abf41ac0c8047c07c87c72c8fb3eb5197f6e9d7ded615dfd1a00ae00a0f64" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "memchr", + "zstd", + "zstd-safe", +] + +[[package]] +name = "compression-core" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" + [[package]] name = "concurrent-queue" version = "2.5.0" @@ -769,9 +780,9 @@ dependencies = [ [[package]] name = "config" -version = "0.15.13" +version = "0.15.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1eb4fb07bc7f012422df02766c7bd5971effb894f573865642f06fa3265440" +checksum = "cef036f0ecf99baef11555578630e2cca559909b4c50822dbba828c252d21c49" dependencies = [ "async-trait", "convert_case", @@ -779,7 +790,8 @@ dependencies = [ "pathdiff", "ron", "rust-ini", - "serde", + "serde-untagged", + "serde_core", "serde_json", "toml", "winnow", @@ -919,7 +931,7 @@ dependencies = [ "cranelift-entity", "cranelift-isle", "gimli", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "log", "pulley-interpreter", "regalloc2", @@ -1147,7 +1159,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1156,8 +1168,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -1171,7 +1193,21 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.104", + "syn 2.0.106", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.106", ] [[package]] @@ -1180,9 +1216,20 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1218,9 +1265,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", "serde", @@ -1228,13 +1275,13 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1252,10 +1299,10 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1265,7 +1312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1288,7 +1335,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1319,15 +1366,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb333721800c025e363e902b293040778f8ac79913db4f013abf1f1d7d382fd7" dependencies = [ "rust_decimal", - "thiserror 2.0.12", + "thiserror 2.0.16", "winnow", ] [[package]] name = "dyn-clone" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "ecdsa" @@ -1424,14 +1471,25 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.0", ] [[package]] @@ -1447,9 +1505,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -1511,6 +1569,12 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" + [[package]] name = "flate2" version = "1.1.2" @@ -1562,9 +1626,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1647,7 +1711,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1713,7 +1777,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] @@ -1724,15 +1788,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" dependencies = [ "fallible-iterator", - "indexmap 2.10.0", + "indexmap 2.11.4", "stable_deref_trait", ] [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "group" @@ -1747,9 +1811,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -1757,7 +1821,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.10.0", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", @@ -1797,9 +1861,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -1807,13 +1871,19 @@ dependencies = [ "serde", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "hashlink" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.15.5", ] [[package]] @@ -1965,9 +2035,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64 0.22.1", "bytes", @@ -1981,7 +2051,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.0", + "socket2", "system-configuration", "tokio", "tower-service", @@ -1991,9 +2061,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -2113,9 +2183,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -2134,9 +2204,9 @@ dependencies = [ [[package]] name = "indenter" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" [[package]] name = "indexmap" @@ -2151,24 +2221,25 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] name = "inherent" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c38228f24186d9cc68c729accb4d413be9eaed6ad07ff79e0270d9e56f3de13" +checksum = "c727f80bfa4a6c6e2508d2f05b6f4bfce242030bd88ed15ae5331c5b5d30fba7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2183,9 +2254,9 @@ dependencies = [ [[package]] name = "io-uring" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ "bitflags", "cfg-if", @@ -2249,9 +2320,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ "getrandom 0.3.3", "libc", @@ -2259,9 +2330,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" dependencies = [ "once_cell", "wasm-bindgen", @@ -2302,9 +2373,9 @@ dependencies = [ [[package]] name = "keycloak" -version = "26.3.100" +version = "26.3.200" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7909fea553cd883f21f831285f76a64da512f4acdef8915b91ed05cf0faace3" +checksum = "61d2ba7d275689304179711ef8b0f12facfdaa351270bc8d6aaea8295d88315a" dependencies = [ "async-trait", "percent-encoding", @@ -2331,9 +2402,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.174" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libm" @@ -2341,6 +2412,17 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags", + "libc", + "redox_syscall", +] + [[package]] name = "libsqlite3-sys" version = "0.30.1" @@ -2353,24 +2435,18 @@ dependencies = [ [[package]] name = "libz-rs-sys" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172a788537a2221661b480fee8dc5f96c580eb34fa88764d3205dc356c7e4221" +checksum = "840db8cf39d9ec4dd794376f38acc40d0fc65eec2a8f484f7fd375b84602becd" dependencies = [ "zlib-rs", ] [[package]] name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" @@ -2390,9 +2466,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "lru-slab" @@ -2442,11 +2518,11 @@ checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memfd" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" dependencies = [ - "rustix 0.38.44", + "rustix", ] [[package]] @@ -2514,7 +2590,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2526,7 +2602,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2655,8 +2731,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "crc32fast", - "hashbrown 0.15.4", - "indexmap 2.10.0", + "hashbrown 0.15.5", + "indexmap 2.11.4", "memchr", ] @@ -2689,9 +2765,9 @@ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "opa-wasm" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffac78b55eda1af0a1fb2360b636ca8e6d23ee62865f0a24148a6d51e2f70088" +checksum = "cdd2bab45ae1b87f45b4ddea74902158543322dc49bf45d2f714c50bbf8cf44f" dependencies = [ "anyhow", "base64 0.22.1", @@ -2715,7 +2791,7 @@ dependencies = [ "sha1", "sha2", "sprintf", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "urlencoding", @@ -2777,7 +2853,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2837,7 +2913,7 @@ dependencies = [ "serde_urlencoded", "tempfile", "thirtyfour", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tokio-util", "tower", @@ -2903,7 +2979,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2979,9 +3055,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pastey" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a8cb46bdc156b1c90460339ae6bfd45ba0394e5effbaa640badb4987fdc261" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] name = "pathdiff" @@ -3000,26 +3076,26 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" +checksum = "21e0a3a33733faeaf8651dfee72dd0f388f0c8e5ad496a3478fa5a922f49cfa8" dependencies = [ "memchr", - "thiserror 2.0.12", + "thiserror 2.0.16", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc" +checksum = "bc58706f770acb1dbd0973e6530a3cff4746fb721207feb3a8a6064cd0b6c663" dependencies = [ "pest", "pest_generator", @@ -3027,22 +3103,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966" +checksum = "6d4f36811dfe07f7b8573462465d5cb8965fffc2e71ae377a33aecf14c2c9a2f" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "pest_meta" -version = "2.8.1" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5" +checksum = "42919b05089acbd0a5dcd5405fb304d17d1053847b81163d09c4ad18ce8e8420" dependencies = [ "pest", "sha2", @@ -3156,9 +3232,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec", ] @@ -3215,9 +3291,9 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ "toml_edit", ] @@ -3241,14 +3317,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -3261,7 +3337,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "version_check", "yansi", ] @@ -3315,14 +3391,14 @@ checksum = "076f1be746801280af4c96c4407b5fd1d09cfa53ab27ba0ac7dd8f207e7bbf83" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "quinn" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -3331,8 +3407,8 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.5.10", - "thiserror 2.0.12", + "socket2", + "thiserror 2.0.16", "tokio", "tracing", "web-time", @@ -3340,9 +3416,9 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.12" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "getrandom 0.3.3", @@ -3353,7 +3429,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time", @@ -3361,16 +3437,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -3455,9 +3531,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -3465,9 +3541,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -3475,9 +3551,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.15" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags", ] @@ -3499,7 +3575,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3510,7 +3586,7 @@ checksum = "5216b1837de2149f8bc8e6d5f88a9326b63b8c836ed58ce4a0a29ec736a59734" dependencies = [ "allocator-api2", "bumpalo", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "log", "rustc-hash", "smallvec", @@ -3518,9 +3594,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", @@ -3530,9 +3606,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", @@ -3541,9 +3617,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "rend" @@ -3556,9 +3632,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.22" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64 0.22.1", "bytes", @@ -3716,7 +3792,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.104", + "syn 2.0.106", "walkdir", ] @@ -3732,9 +3808,9 @@ dependencies = [ [[package]] name = "rust-ini" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7295b7ce3bf4806b419dc3420745998b447178b7005e2011947b38fc5aa6791" +checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" dependencies = [ "cfg-if", "ordered-multimap", @@ -3742,9 +3818,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.37.2" +version = "1.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b203a6425500a03e0919c42d3c47caca51e79f1132046626d2c8871c5092035d" +checksum = "c8975fc98059f365204d635119cf9c5a60ae67b841ed49b5422a9a7e56cdfac0" dependencies = [ "arrayvec", "borsh", @@ -3758,9 +3834,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -3788,35 +3864,22 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.0.8" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ "bitflags", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", + "linux-raw-sys", + "windows-sys 0.61.0", ] [[package]] name = "rustls" -version = "0.23.29" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "once_cell", "ring", @@ -3838,9 +3901,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "ring", "rustls-pki-types", @@ -3849,9 +3912,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -3870,11 +3933,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] @@ -3911,7 +3974,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3930,14 +3993,14 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "sea-orm" -version = "1.1.15" +version = "1.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458d38dfa73e8ab64260f9fd96d61e1ca96a312d06e94b71615a417ef29efcac" +checksum = "335d87ec8e5c6eb4b2afb866dc53ed57a5cba314af63ce288db83047aa0fed4d" dependencies = [ "async-stream", "async-trait", @@ -3955,7 +4018,7 @@ dependencies = [ "serde_json", "sqlx", "strum", - "thiserror 2.0.12", + "thiserror 2.0.16", "time", "tracing", "url", @@ -3964,9 +4027,9 @@ dependencies = [ [[package]] name = "sea-orm-cli" -version = "1.1.14" +version = "1.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc17cb2b24e93fc1d56de7751a12222f2303c06e83ed4d7a1e929e39f30c7d7" +checksum = "f6d4ff77d7c27f64942273513e7c103a1594c88deba33dfb2f490b362ea220b4" dependencies = [ "chrono", "clap", @@ -3975,6 +4038,7 @@ dependencies = [ "regex", "sea-schema", "sqlx", + "tokio", "tracing", "tracing-subscriber", "url", @@ -3982,23 +4046,23 @@ dependencies = [ [[package]] name = "sea-orm-macros" -version = "1.1.15" +version = "1.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af976292446b09dd51d7b1784d6195dec76844e9e9e980b5fb12634ef417d6ea" +checksum = "68de7a2258410fd5e6ba319a4fe6c4af7811507fc714bbd76534ae6caa60f95f" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", "sea-bae", - "syn 2.0.104", + "syn 2.0.106", "unicode-ident", ] [[package]] name = "sea-orm-migration" -version = "1.1.14" +version = "1.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695e830a1332a4e3e57b5972eee00574a36060e1938afca7041a524e0955d5ba" +checksum = "c4649155dbfd88f92e2aa9f5defe0b020e43d7c4d52a2189658d8813e26b61bd" dependencies = [ "async-trait", "clap", @@ -4012,9 +4076,9 @@ dependencies = [ [[package]] name = "sea-query" -version = "0.32.6" +version = "0.32.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c91783d1514b99754fc6a4079081dcc2c587dadbff65c48c7f62297443536a" +checksum = "8a5d1c518eaf5eda38e5773f902b26ab6d5e9e9e2bb2349ca6c64cf96f80448c" dependencies = [ "bigdecimal", "chrono", @@ -4049,12 +4113,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bae0cbad6ab996955664982739354128c58d16e126114fe88c2a493642502aab" dependencies = [ - "darling", + "darling 0.20.11", "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.104", - "thiserror 2.0.12", + "syn 2.0.106", + "thiserror 2.0.16", ] [[package]] @@ -4079,7 +4143,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4117,9 +4181,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -4127,19 +4191,32 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" dependencies = [ + "serde_core", "serde_derive", ] +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + [[package]] name = "serde-value" version = "0.7.0" @@ -4152,11 +4229,12 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.17" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -4169,15 +4247,24 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.226" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4188,20 +4275,21 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.141" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.4", "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -4210,7 +4298,7 @@ version = "0.9.42" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e408f29489b5fd500fab51ff1484fc859bb655f32c671f307dcd733b72e8168c" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.4", "itoa", "ryu", "serde", @@ -4219,12 +4307,13 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -4244,16 +4333,16 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "serde_spanned" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -4270,15 +4359,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" +checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.10.0", + "indexmap 2.11.4", "schemars 0.9.0", "schemars 1.0.4", "serde", @@ -4290,14 +4379,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" +checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" dependencies = [ - "darling", + "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4306,7 +4395,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.4", "itoa", "ryu", "serde", @@ -4352,9 +4441,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -4402,16 +4491,6 @@ dependencies = [ "serde", ] -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "socket2" version = "0.6.0" @@ -4447,7 +4526,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78222247fc55e10208ed1ba60f8296390bc67a489bc27a36231765d8d6f60ec5" dependencies = [ - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -4481,11 +4560,12 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "hashlink", - "indexmap 2.10.0", + "indexmap 2.11.4", "log", "memchr", + "native-tls", "once_cell", "percent-encoding", "rust_decimal", @@ -4493,7 +4573,7 @@ dependencies = [ "serde_json", "sha2", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "time", "tokio", "tokio-stream", @@ -4512,7 +4592,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4535,7 +4615,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 2.0.104", + "syn 2.0.106", "tokio", "url", ] @@ -4580,7 +4660,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.12", + "thiserror 2.0.16", "time", "tracing", "uuid", @@ -4623,7 +4703,7 @@ dependencies = [ "smallvec", "sqlx-core", "stringprep", - "thiserror 2.0.12", + "thiserror 2.0.16", "time", "tracing", "uuid", @@ -4650,7 +4730,7 @@ dependencies = [ "serde", "serde_urlencoded", "sqlx-core", - "thiserror 2.0.12", + "thiserror 2.0.16", "time", "tracing", "url", @@ -4720,9 +4800,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -4746,7 +4826,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4778,21 +4858,21 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "target-lexicon" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" [[package]] name = "tempfile" -version = "3.22.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", - "rustix 1.0.8", - "windows-sys 0.60.2", + "rustix", + "windows-sys 0.61.0", ] [[package]] @@ -4824,7 +4904,7 @@ dependencies = [ "const_format", "futures-util", "http", - "indexmap 2.10.0", + "indexmap 2.11.4", "paste", "reqwest", "serde", @@ -4832,7 +4912,7 @@ dependencies = [ "serde_repr", "stringmatch", "thirtyfour-macros", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "url", @@ -4846,7 +4926,7 @@ checksum = "5cf0ffc3ba4368e99597bd6afd83f4ff6febad66d9ae541ab46e697d32285fc0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4860,11 +4940,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.16", ] [[package]] @@ -4875,18 +4955,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4900,9 +4980,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -4915,15 +4995,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -4960,9 +5040,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -4975,9 +5055,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", @@ -4987,7 +5067,7 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2 0.6.0", + "socket2", "tokio-macros", "windows-sys 0.59.0", ] @@ -5000,7 +5080,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5015,9 +5095,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "05f63835928ca123f1bef57abbcd23bb2ba0ac9ae1235f1e65bda0d06e7786bd" dependencies = [ "rustls", "tokio", @@ -5036,9 +5116,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -5049,48 +5129,43 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.2" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac" +checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" dependencies = [ - "serde", + "serde_core", "serde_spanned", - "toml_datetime 0.7.0", + "toml_datetime", "toml_parser", "winnow", ] [[package]] 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" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.23.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" dependencies = [ - "indexmap 2.10.0", - "toml_datetime 0.6.11", + "indexmap 2.11.4", + "toml_datetime", + "toml_parser", "winnow", ] [[package]] name = "toml_parser" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97200572db069e74c512a14117b296ba0a80a30123fbbb5aa1f4a348f639ca30" +checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" dependencies = [ "winnow", ] @@ -5167,7 +5242,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5237,7 +5312,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04659ddb06c87d233c566112c1c9c5b9e98256d9af50ec3bc9c8327f873a7568" dependencies = [ "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5248,7 +5323,7 @@ checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5257,6 +5332,12 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" version = "1.18.0" @@ -5283,9 +5364,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-normalization" @@ -5334,9 +5415,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -5368,7 +5449,7 @@ version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fcc29c80c21c31608227e0912b2d7fddba57ad76b606890627ba8ee7964e993" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.4", "serde", "serde_json", "serde_norway", @@ -5397,7 +5478,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5426,9 +5507,9 @@ checksum = "e2eebbbfe4093922c2b6734d7c679ebfebd704a0d7e56dfcb0d05818ce28977d" [[package]] name = "uuid" -version = "1.18.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -5481,11 +5562,20 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] @@ -5496,35 +5586,36 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67" dependencies = [ "cfg-if", "js-sys", @@ -5535,9 +5626,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5545,22 +5636,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" dependencies = [ "unicode-ident", ] @@ -5582,8 +5673,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b51cb03afce7964bbfce46602d6cb358726f36430b6ba084ac6020d8ce5bc102" dependencies = [ "bitflags", - "hashbrown 0.15.4", - "indexmap 2.10.0", + "hashbrown 0.15.5", + "indexmap 2.11.4", "semver", "serde", ] @@ -5612,8 +5703,8 @@ dependencies = [ "bumpalo", "cc", "cfg-if", - "hashbrown 0.15.4", - "indexmap 2.10.0", + "hashbrown 0.15.5", + "indexmap 2.11.4", "libc", "log", "mach2", @@ -5624,7 +5715,7 @@ dependencies = [ "psm", "pulley-interpreter", "rayon", - "rustix 1.0.8", + "rustix", "serde", "serde_derive", "smallvec", @@ -5661,7 +5752,7 @@ dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasmtime-component-util", "wasmtime-wit-bindgen", "wit-parser", @@ -5693,7 +5784,7 @@ dependencies = [ "pulley-interpreter", "smallvec", "target-lexicon", - "thiserror 2.0.12", + "thiserror 2.0.16", "wasmparser", "wasmtime-environ", "wasmtime-math", @@ -5710,7 +5801,7 @@ dependencies = [ "cranelift-bitset", "cranelift-entity", "gimli", - "indexmap 2.10.0", + "indexmap 2.11.4", "log", "object", "postcard", @@ -5733,7 +5824,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "rustix 1.0.8", + "rustix", "wasmtime-asm-macros", "wasmtime-versioned-export-macros", "windows-sys 0.59.0", @@ -5774,7 +5865,7 @@ checksum = "9ca100ed168ffc9b37aefc07a5be440645eab612a2ff6e2ff884e8cc3740e666" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5785,15 +5876,15 @@ checksum = "233fdcb96f9097be697319ba647ef42bdbdb40e89f04c8ae3713103813b5b793" dependencies = [ "anyhow", "heck 0.5.0", - "indexmap 2.10.0", + "indexmap 2.11.4", "wit-parser", ] [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc" dependencies = [ "js-sys", "wasm-bindgen", @@ -5888,34 +5979,34 @@ dependencies = [ [[package]] name = "whoami" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6994d13118ab492c3c80c1f81928718159254c53c472bf9ce36f8dae4add02a7" +checksum = "5d4a4db5077702ca3015d3d02d74974948aba2ad9e12ab7df718ee64ccd7e97d" dependencies = [ - "redox_syscall", + "libredox", "wasite", ] [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" dependencies = [ "windows-implement", "windows-interface", - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.2.0", + "windows-result 0.4.0", + "windows-strings 0.5.0", ] [[package]] @@ -5926,7 +6017,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5937,7 +6028,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5946,15 +6037,21 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + [[package]] name = "windows-registry" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -5963,7 +6060,16 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +dependencies = [ + "windows-link 0.2.0", ] [[package]] @@ -5972,7 +6078,16 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +dependencies = [ + "windows-link 0.2.0", ] [[package]] @@ -6008,7 +6123,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.2", + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", ] [[package]] @@ -6044,10 +6168,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link 0.1.3", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -6198,21 +6323,18 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "wit-parser" @@ -6222,7 +6344,7 @@ checksum = "f22f1cd55247a2e616870b619766e9522df36b7abafbb29bbeb34b7a9da7e9f0" dependencies = [ "anyhow", "id-arena", - "indexmap 2.10.0", + "indexmap 2.11.4", "log", "semver", "serde", @@ -6266,9 +6388,9 @@ dependencies = [ [[package]] name = "yaml-rust2" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ce2a4ff45552406d02501cea6c18d8a7e50228e7736a872951fe2fe75c91be7" +checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" dependencies = [ "arraydeque", "encoding_rs", @@ -6301,28 +6423,28 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -6342,7 +6464,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] @@ -6363,7 +6485,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -6379,9 +6501,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -6396,7 +6518,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -6408,16 +6530,16 @@ dependencies = [ "arbitrary", "crc32fast", "flate2", - "indexmap 2.10.0", + "indexmap 2.11.4", "memchr", "zopfli", ] [[package]] name = "zlib-rs" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626bd9fa9734751fc50d6060752170984d7053f5a39061f524cda68023d4db8a" +checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2" [[package]] name = "zopfli" @@ -6451,9 +6573,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index f890a809..66e772e9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,9 @@ authors = ["Artem Goncharov (gtema)"] rust-version = "1.85" # MSRV repository = "https://github.com/gtema/keystone" +[package.metadata.clippy] +warn = ["clippy::unused_results"] + [[bin]] name="keystone" path="src/bin/keystone.rs" @@ -42,7 +45,7 @@ regex = { version = "1.11"} reqwest = { version = "0.12", features = ["json"] } rmp = { version = "0.8" } schemars = { version = "1.0" } -sea-orm = { version = "1.1", features = ["sqlx-mysql", "sqlx-postgres", "runtime-tokio"] } +sea-orm = { version = "1.1", features = ["sqlx-mysql", "sqlx-postgres", "runtime-tokio", "runtime-tokio-native-tls"] } sea-orm-migration = { version = "1.1", features = ["sqlx-mysql", "sqlx-postgres", "runtime-tokio"] } serde = { version = "1.0" } serde_bytes = { version = "0.11" } diff --git a/doc/src/federation.md b/doc/src/federation.md index 55cc0cf3..b94636d3 100644 --- a/doc/src/federation.md +++ b/doc/src/federation.md @@ -57,13 +57,13 @@ Following tables are added: - federated_identity_provider ```rust -{{#rustdoc_include ../../src/db/entity/federated_identity_provider.rs:9:21}} +{{#rustdoc_include ../../src/db/entity/federated_identity_provider.rs:9:22}} ``` - federated_mapping ```rust -{{#include ../../src/db/entity/federated_mapping.rs:9:24}} +{{#include ../../src/db/entity/federated_mapping.rs:10:26}} ``` - federated_auth_state @@ -81,8 +81,8 @@ it certain compatibility steps are implemented: - Identity provider is "mirrored" into the existing identity_provider with the subset of attributes -- For every identity provider "oidc" protocol entry in the federation_protocol - table is created pointing to the "<>" mapping. +- For every identity provider "oidc" and "jwt" protocol entries in the + federation_protocol table is created pointing to the "\<\\>" mapping. ## Testing diff --git a/doc/src/oidc.md b/doc/src/oidc.md index a902878b..6fcb11e5 100644 --- a/doc/src/oidc.md +++ b/doc/src/oidc.md @@ -34,3 +34,169 @@ localhost). User client is catching this callback containing the OIDC authorization code. Afterwards this code is being sent to the Keystone together with the authentication state and the user receives regular scoped or unscoped Keystone token. + +## User domain mapping + +Long years of working with multiple CSPs showed that there is no single way how +users are stored in external IdPs. Sometimes it is desired to have a single +"realm" with all users of the cloud differentiated by certain attributes or +group memberships. Or every OpenStack domain is mapped as a dedicated "realm" in +which case users are more isolated from each other. Or every customer is having +a physically different IdP. + +A Keystone identity provider can be bound to a single domain by setting the +domain-id attribute on it. This means all users federated from such IDP would be +placed in the specified domain. + +A Keystone attribute mapping can be dedicated for a certain domain by setting +the domain-id attribute. In such case all users authenticating using such +attribute mapping would be placed in the specified domain. This makes it +possible for the users to obtain memberhip in other domain and should therefore +be used with extra care and only when absolutely necessary. + +The ultimate flexibility of having a single IdP for multiple domains is by +specifying the claim attribute that specifies domain the user should belong to. +This is implemented by using the `domain-id-claim` attribute of the mapping. +Authentication with the claim missing is going to be rejected. + +## Using Okta as the Identity provider for a single domain + +Okta/Auth0 as an managed Identity provider can be easily integrated as a source +of the users and groups for the customer dedicated domain. [A dedicated +application](https://developer.okta.com/docs/guides/implement-grant-type/authcode/main/#set-up-your-app) +need to be established on Okta (i.e. OpenStack) for the authentication +delegation. There are many configuration options that can be used on the Okta +side and will influence the interaction. It is not possible to describe every +single one precisely, therefore only the basic setting are described here: + +- grant type: authorization code +- sign in redirect uris (enable the cli login): [`http://localhost:8050/oidc/callback`]. + +Group memberships are not exposed by default and require [additional +changes](https://developer.okta.com/docs/guides/customize-tokens-groups-claim/main/#add-a-groups-claim-for-a-custom-authorization-server) + +On the Keystone side the following must be implemented: + +- register an identity provider with the data obtained from Okta app + configuration: + + ```console + osc identity4 federation identity-provider create --bound-issuer --oidc-client-id --oidc-client-secret --oidc-discovery-url --default-mapping-name okta --domain-id --name okta + ``` + + Default mapping name is created in the next step and is not explicitly + required. It is used when no mapping was explicitly specified in the + authentication request. The provider name can be also obfuscated more. The + authentication depends on the identity provider ID and not the name. + +- create authentication mapping + + ```console + osc identity4 federation mapping create --user-id-claim sub --idp-id --user-name-claim preferred_username --name okta --oidc-scopes openid,profile + ``` + +Afterwards `osc` can be used by users to authenticate. + +clouds.yaml +```yaml +clouds: + devstack-oidc-okta: + auth_type: v4federation + auth: + auth_url: + identity_provider: +``` + +```console +$ osc --os-cloud devstack-oidc-okta auth show +A default browser is going to be opened at `https://.okta.com/oauth2/default/v1/authorize?response_type=code&client_id=&state=&code_challenge=&code_challenge_method=S256&redirect_uri=http%3A%2F%2Flocalhost%3A8050%2Foidc%2Fcallback&scope=openid+profile+openid&nonce=`. Do you want to continue? [y/n] +``` + +## Using Keycloak as the Identity provider for a single domain + +Keycloak can be used as an Identity provider by the Keystone. + +A dedicated client must be created with following settings: + +- client authentication (to obtain client_id and client_secret) + +- "standard flow" to allow the authorization code flow + +- valid_redirect_uris: [`http://localhost:8050/oidc/callback`] + + +On the Keystone side the following must be implemented: + +- register an identity provider with the data obtained from Okta app + configuration: + + ```console + osc identity4 federation identity-provider create --bound-issuer --oidc-client-id --oidc-client-secret --oidc-discovery-url --default-mapping-name keycloak --domain-id --name keycloak + ``` + + Default mapping name is created in the next step and is not explicitly + required. It is used when no mapping was explicitly specified in the + authentication request. The provider name can be also obfuscated more. The + authentication depends on the identity provider ID and not the name. + +- create authentication mapping + + ```console + osc identity4 federation mapping create --user-id-claim sub --idp-id --user-name-claim preferred_username --name keycloak --oidc-scopes openid,profile + ``` + +## Using Keycloak as the Identity provider as shared IdP + +In this scenario Keycloak is used to manage users belonging to different +OpenStack domains. During the login the domain relation is identified using the +additional attribute present in the claims. It must be set to the domain_id of +the domain the user belongs to. There are multiple ways how this attribute can +be set. For the sake of example simplicity domains are modelled as user groups +in Keycloak. Such group gets the attribute with the value of the domain_id. +Users belonging to such group inherit this attribute automatically. +Alternatively every user may be extended with the domain_id attribute +individually. + +Keycloak can be used as an Identity provider by the Keystone. + +A dedicated client must be created with following settings: + +- client authentication (to obtain client_id and client_secret) + +- "standard flow" to allow the authorization code flow + +- valid_redirect_uris: [`http://localhost:8050/oidc/callback`] + +A dedicated (and default) client scope must be created with the user attribute +claim mapper populating "domain_id" scope with the corresponding value. + + +On the Keystone side the following must be implemented: + +- register an identity provider with the data obtained from Okta app + configuration: + + ```console + osc identity4 federation identity-provider create --bound-issuer --oidc-client-id --oidc-client-secret --oidc-discovery-url --default-mapping-name keycloak --name keycloak + ``` + + Default mapping name is created in the next step and is not explicitly + required. It is used when no mapping was explicitly specified in the + authentication request. The provider name can be also obfuscated more. The + authentication depends on the identity provider ID and not the name. + +- create authentication mapping + + ```console + osc identity4 federation mapping create --user-id-claim sub --idp-id --allowed-redirect-uris https:///v4/federation/oidc/callback --user-name-claim preferred_username --name keycloak --oidc-scopes openid,profile --domain-id-claim + ``` + +The clouds.yaml does not need any change for this authentication method. + +Alternatively user domain relation may be implemented using dedicated clients, +what would result in having multiple identity providers. A yet another +possibility is to use the dedicated mappings. In this case the domain-id +attribute may be set on the mapping itself, no domain-id-claim would be +respected, but also the authentication would need to explicitly specify the +desired mapping. This option enables user to gain membership in different +domains and may not be desired. diff --git a/src/api/auth.rs b/src/api/auth.rs index 8156bfc0..47c7b65f 100644 --- a/src/api/auth.rs +++ b/src/api/auth.rs @@ -17,6 +17,7 @@ use axum::{ http::request::Parts, }; use std::sync::Arc; +use tracing::{debug, error}; use crate::api::KeystoneApiError; use crate::keystone::ServiceState; @@ -41,6 +42,7 @@ where let auth_header = if let Some(auth_header) = auth_header { auth_header } else { + debug!("No supported information has been provided."); return Err(KeystoneApiError::Unauthorized)?; }; @@ -51,6 +53,7 @@ where .get_token_provider() .validate_token(auth_header, Some(false), None) .await + .inspect_err(|e| error!("{:#?}", e)) .map_err(|_| KeystoneApiError::Unauthorized)?; // Expand the information (user, project, roles, etc) about the user when a token is valid diff --git a/src/api/mod.rs b/src/api/mod.rs index 967e1f00..f43fdcad 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -14,6 +14,7 @@ //! Keystone API //! use axum::{ + extract::State, http::{HeaderMap, header}, response::IntoResponse, }; @@ -100,11 +101,22 @@ pub fn openapi_router() -> OpenApiRouter { ), tag = "version" )] -async fn version(headers: HeaderMap) -> Result { - let host = headers - .get(header::HOST) - .and_then(|header| header.to_str().ok()) - .unwrap_or("localhost"); +async fn version( + headers: HeaderMap, + State(state): State, +) -> Result { + let host = state + .config + .default + .as_ref() + .and_then(|dflt| dflt.public_endpoint.clone()) + .or_else(|| { + headers + .get(header::HOST) + .and_then(|header| header.to_str().map(|val| format!("http://{val}")).ok()) + //.and_then(|header| format!("http://{}", header.to_str().ok()).into()) + }) + .unwrap_or_else(|| "http://localhost".to_string()); let res = Versions { versions: Values { @@ -112,14 +124,14 @@ async fn version(headers: HeaderMap) -> Result); @@ -113,7 +113,7 @@ impl IntoResponse for Catalog { } } -/// A catalog object +/// A catalog object. #[derive(Builder, Clone, Debug, Default, Deserialize, PartialEq, Serialize, ToSchema)] #[builder(setter(strip_option, into))] pub struct CatalogService { @@ -134,7 +134,7 @@ impl From<(Service, Vec)> for CatalogService { } } -/// A Catalog Endpoint +/// A Catalog Endpoint. #[derive(Builder, Clone, Debug, Default, Deserialize, PartialEq, Serialize, ToSchema)] #[builder(setter(strip_option, into))] pub struct Endpoint { @@ -168,63 +168,64 @@ impl From)>> for Catalog { } } -/// The authorization scope, including the system (Since v3.10), a project, or a domain (Since -/// v3.4). If multiple scopes are specified in the same request (e.g. project and domain or domain -/// and system) an HTTP 400 Bad Request will be returned, as a token cannot be simultaneously -/// scoped to multiple authorization targets. An ID is sufficient to uniquely identify a project -/// but if a project is specified by name, then the domain of the project must also be specified in -/// order to uniquely identify the project by name. A domain scope may be specified by either the -/// domain’s ID or name with equivalent results. +/// The authorization scope, including the system, a project, or a domain. +/// +/// If multiple scopes are specified in the same request (e.g. project and domain or domain and +/// system) an HTTP 400 Bad Request will be returned, as a token cannot be simultaneously scoped to +/// multiple authorization targets. An ID is sufficient to uniquely identify a project but if a +/// project is specified by name, then the domain of the project must also be specified in order to +/// uniquely identify the project by name. A domain scope may be specified by either the domain’s +/// ID or name with equivalent results. #[derive(Clone, Debug, Deserialize, PartialEq, Serialize, ToSchema)] #[serde(rename_all = "lowercase")] pub enum Scope { - /// Project scope + /// Project scope. Project(ProjectScope), - /// Domain scope + /// Domain scope. Domain(Domain), - /// System scope + /// System scope. System(System), } -/// Project scope information +/// Project scope information. #[derive(Builder, Clone, Debug, Default, Deserialize, PartialEq, Serialize, ToSchema)] pub struct ProjectScope { - /// Project ID + /// Project ID. pub id: Option, - /// Project Name + /// Project Name. pub name: Option, - /// project domain + /// project domain. pub domain: Option, } -/// Domain information +/// Domain information. #[derive(Builder, Clone, Debug, Default, Deserialize, PartialEq, Serialize, ToSchema)] #[builder(setter(into))] pub struct Domain { - /// Domain ID + /// Domain ID. #[builder(default)] pub id: Option, - /// Domain Name + /// Domain Name. #[builder(default)] pub name: Option, } -/// Project information +/// Project information. #[derive(Builder, Clone, Debug, Default, Deserialize, PartialEq, Serialize, ToSchema)] pub struct Project { - /// Project ID + /// Project ID. pub id: String, - /// Project Name + /// Project Name. pub name: String, - /// project domain + /// project domain. pub domain: Domain, } -/// System scope +/// System scope. #[derive(Builder, Clone, Debug, Default, Deserialize, PartialEq, Serialize, ToSchema)] #[builder(setter(into))] pub struct System { - /// system scope + /// All systems access. #[builder(default)] pub all: Option, } diff --git a/src/api/v3/mod.rs b/src/api/v3/mod.rs index 1272bf83..91282c6d 100644 --- a/src/api/v3/mod.rs +++ b/src/api/v3/mod.rs @@ -15,7 +15,7 @@ //! v3 API use axum::{ - extract::{OriginalUri, Request}, + extract::{OriginalUri, Request, State}, http::{HeaderMap, header}, response::IntoResponse, }; @@ -55,15 +55,23 @@ pub(super) fn openapi_router() -> OpenApiRouter { async fn version( headers: HeaderMap, OriginalUri(uri): OriginalUri, + State(state): State, _req: Request, ) -> Result { - let host = headers - .get(header::HOST) - .and_then(|header| header.to_str().ok()) - .unwrap_or("localhost"); + let host = state + .config + .default + .as_ref() + .and_then(|dflt| dflt.public_endpoint.clone()) + .or_else(|| { + headers + .get(header::HOST) + .and_then(|header| header.to_str().map(|val| format!("http://{val}")).ok()) + }) + .unwrap_or_else(|| "http://localhost".to_string()); let link = Link { rel: "self".into(), - href: format!("http://{}{}", host, uri.path()), + href: format!("{}{}", host, uri.path()), }; let version = Version { id: "v3.14".into(), diff --git a/src/api/v4/auth/passkey/finish.rs b/src/api/v4/auth/passkey/finish.rs index d73b52ea..ba69ab97 100644 --- a/src/api/v4/auth/passkey/finish.rs +++ b/src/api/v4/auth/passkey/finish.rs @@ -109,7 +109,7 @@ pub(super) async fn finish( .get_token_provider() .issue_token(authed_info, AuthzInfo::Unscoped)?; - let mut api_token = TokenResponse { + let api_token = TokenResponse { token: ApiResponseToken::from_provider_token(&state, &token).await?, }; Ok(( diff --git a/src/api/v4/auth/passkey/start.rs b/src/api/v4/auth/passkey/start.rs index dca557e4..d352cba1 100644 --- a/src/api/v4/auth/passkey/start.rs +++ b/src/api/v4/auth/passkey/start.rs @@ -104,35 +104,23 @@ impl From impl From for AuthenticatorTransport { fn from(val: webauthn_rs_proto::options::AuthenticatorTransport) -> Self { match val { - webauthn_rs_proto::options::AuthenticatorTransport::Ble => AuthenticatorTransport::Ble, - webauthn_rs_proto::options::AuthenticatorTransport::Hybrid => { - AuthenticatorTransport::Hybrid - } - webauthn_rs_proto::options::AuthenticatorTransport::Internal => { - AuthenticatorTransport::Internal - } - webauthn_rs_proto::options::AuthenticatorTransport::Nfc => AuthenticatorTransport::Nfc, - webauthn_rs_proto::options::AuthenticatorTransport::Test => { - AuthenticatorTransport::Test - } - webauthn_rs_proto::options::AuthenticatorTransport::Unknown => { - AuthenticatorTransport::Unknown - } - webauthn_rs_proto::options::AuthenticatorTransport::Usb => AuthenticatorTransport::Usb, + webauthn_rs_proto::options::AuthenticatorTransport::Ble => Self::Ble, + webauthn_rs_proto::options::AuthenticatorTransport::Hybrid => Self::Hybrid, + webauthn_rs_proto::options::AuthenticatorTransport::Internal => Self::Internal, + webauthn_rs_proto::options::AuthenticatorTransport::Nfc => Self::Nfc, + webauthn_rs_proto::options::AuthenticatorTransport::Test => Self::Test, + webauthn_rs_proto::options::AuthenticatorTransport::Unknown => Self::Unknown, + webauthn_rs_proto::options::AuthenticatorTransport::Usb => Self::Usb, } } } impl From for UserVerificationPolicy { fn from(val: webauthn_rs_proto::options::UserVerificationPolicy) -> Self { match val { - webauthn_rs_proto::options::UserVerificationPolicy::Required => { - UserVerificationPolicy::Required - } - webauthn_rs_proto::options::UserVerificationPolicy::Preferred => { - UserVerificationPolicy::Preferred - } + webauthn_rs_proto::options::UserVerificationPolicy::Required => Self::Required, + webauthn_rs_proto::options::UserVerificationPolicy::Preferred => Self::Preferred, webauthn_rs_proto::options::UserVerificationPolicy::Discouraged_DO_NOT_USE => { - UserVerificationPolicy::DiscouragedDoNotUse + Self::DiscouragedDoNotUse } } } @@ -142,14 +130,10 @@ impl From for PublicKeyCre fn from(val: webauthn_rs_proto::options::PublicKeyCredentialHints) -> Self { match val { webauthn_rs_proto::options::PublicKeyCredentialHints::ClientDevice => { - PublicKeyCredentialHint::ClientDevice - } - webauthn_rs_proto::options::PublicKeyCredentialHints::Hybrid => { - PublicKeyCredentialHint::Hybrid - } - webauthn_rs_proto::options::PublicKeyCredentialHints::SecurityKey => { - PublicKeyCredentialHint::SecurityKey + Self::ClientDevice } + webauthn_rs_proto::options::PublicKeyCredentialHints::Hybrid => Self::Hybrid, + webauthn_rs_proto::options::PublicKeyCredentialHints::SecurityKey => Self::SecurityKey, } } } diff --git a/src/api/v4/federation/error.rs b/src/api/v4/federation/error.rs index fa7452fe..d374ad9b 100644 --- a/src/api/v4/federation/error.rs +++ b/src/api/v4/federation/error.rs @@ -31,6 +31,12 @@ pub enum OidcError { )] MappingRequired, + #[error("JWT login requires `openstack-mapping` header to be present.")] + MappingRequiredJwt, + + #[error("`bearer` authorization token is missing.")] + BearerJwtTokenMissing, + #[error("mapping id or mapping name with idp id must be specified")] MappingIdOrNameWithIdp, @@ -146,6 +152,12 @@ impl From for KeystoneApiError { OidcError::MappingRequired => { KeystoneApiError::BadRequest("Federated authentication requires mapping being specified in the payload or default set on the identity provider.".to_string()) } + OidcError::MappingRequiredJwt => { + KeystoneApiError::BadRequest("JWT authentication requires `openstack-mapping` header to be provided.".to_string()) + } + OidcError::BearerJwtTokenMissing => { + KeystoneApiError::BadRequest("`bearer` token is missing in the `Authorization` header.".to_string()) + } OidcError::MappingIdOrNameWithIdp => { KeystoneApiError::BadRequest("Federated authentication requires mapping being specified in the payload either with ID or name with identity provider id.".to_string()) } diff --git a/src/api/v4/federation/jwt.rs b/src/api/v4/federation/jwt.rs index 03993494..0c31cee5 100644 --- a/src/api/v4/federation/jwt.rs +++ b/src/api/v4/federation/jwt.rs @@ -26,7 +26,7 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use std::collections::HashMap; use std::str::FromStr; -use tracing::{debug, warn}; +use tracing::warn; use utoipa_axum::{router::OpenApiRouter, routes}; use openidconnect::core::{ @@ -149,16 +149,20 @@ pub async fn login( .find(|m| *m == "openid") .ok_or(KeystoneApiError::AuthMethodNotSupported)?; - let jwt: String = headers + let jwt: String = match headers .get(AUTHORIZATION) .ok_or(KeystoneApiError::SubjectTokenMissing)? .to_str() .map_err(|_| KeystoneApiError::InvalidHeader)? - .to_string(); + .split_once(' ') + { + Some(("bearer", token)) => token.to_string(), + _ => return Err(OidcError::BearerJwtTokenMissing.into()), + }; let mapping: String = headers .get("openstack-mapping") - .ok_or(KeystoneApiError::SubjectTokenMissing)? + .ok_or(OidcError::MappingRequiredJwt)? .to_str() .map_err(|_| KeystoneApiError::InvalidHeader)? .to_string(); @@ -349,7 +353,6 @@ pub async fn login( .into(); api_token.token.catalog = Some(catalog); - debug!("response is {:?}", api_token); Ok(( StatusCode::OK, [( diff --git a/src/api/v4/mod.rs b/src/api/v4/mod.rs index d5f76fe9..39424d99 100644 --- a/src/api/v4/mod.rs +++ b/src/api/v4/mod.rs @@ -15,7 +15,7 @@ //! v4 API use axum::{ - extract::{OriginalUri, Request}, + extract::{OriginalUri, Request, State}, http::{HeaderMap, header}, response::IntoResponse, }; @@ -57,15 +57,23 @@ pub(super) fn openapi_router() -> OpenApiRouter { async fn version( headers: HeaderMap, OriginalUri(uri): OriginalUri, + State(state): State, _req: Request, ) -> Result { - let host = headers - .get(header::HOST) - .and_then(|header| header.to_str().ok()) - .unwrap_or("localhost"); + let host = state + .config + .default + .as_ref() + .and_then(|dflt| dflt.public_endpoint.clone()) + .or_else(|| { + headers + .get(header::HOST) + .and_then(|header| header.to_str().map(|val| format!("http://{val}")).ok()) + }) + .unwrap_or_else(|| "http://localhost".to_string()); let link = Link { rel: "self".into(), - href: format!("http://{}{}", host, uri.path()), + href: format!("{}{}", host, uri.path()), }; let version = Version { id: "v4.0".into(), diff --git a/src/assignment/backends/error.rs b/src/assignment/backends/error.rs index 7727a251..ed7ac09f 100644 --- a/src/assignment/backends/error.rs +++ b/src/assignment/backends/error.rs @@ -57,13 +57,13 @@ pub enum AssignmentDatabaseError { impl From for AssignmentDatabaseError { fn from(err: sea_orm::DbErr) -> Self { - match err.sql_err() { - Some(err) => match err { + err.sql_err().map_or_else( + || Self::Database { source: err }, + |err| match err { SqlErr::UniqueConstraintViolation(descr) => Self::Conflict(descr), SqlErr::ForeignKeyConstraintViolation(descr) => Self::Conflict(descr), other => Self::Sql(other.to_string()), }, - None => Self::Database { source: err }, - } + ) } } diff --git a/src/bin/keystone.rs b/src/bin/keystone.rs index 550c7f3c..e083fc5b 100644 --- a/src/bin/keystone.rs +++ b/src/bin/keystone.rs @@ -35,7 +35,10 @@ use tower_http::{ trace::{DefaultOnRequest, DefaultOnResponse, TraceLayer}, }; use tracing::{Level, debug, error, info, info_span, trace}; -use tracing_subscriber::{filter::*, prelude::*}; +use tracing_subscriber::{ + filter::{LevelFilter, Targets}, + prelude::*, +}; use utoipa::OpenApi; use utoipa_axum::router::OpenApiRouter; use utoipa_swagger_ui::SwaggerUi; @@ -50,9 +53,9 @@ use openstack_keystone::plugin_manager::PluginManager; use openstack_keystone::policy::PolicyFactory; use openstack_keystone::provider::Provider; -/// OpenStack Keystone. +/// `OpenStack` Keystone. /// -/// Keystone is an OpenStack service that provides API client authentication, service discovery, +/// Keystone is an `OpenStack` service that provides API client authentication, service discovery, /// and distributed multi-tenant authorization by implementing OpenStack’s Identity API. #[derive(Parser, Debug)] #[command(version, about, long_about = None)] @@ -65,7 +68,7 @@ struct Args { #[arg(short, long, global=true, action = clap::ArgAction::Count, display_order = 920)] pub verbose: u8, - /// Print the OpenAPI schema json instead of running the Keystone. + /// Print the `OpenAPI` schema json instead of running the Keystone. #[arg(long)] pub dump_openapi: Option, } @@ -140,7 +143,7 @@ async fn main() -> Result<(), Report> { let cfg = Config::new(args.config)?; let db_url = cfg.database.get_connection(); - let mut opt = ConnectOptions::new(db_url.to_owned()); + let mut opt = ConnectOptions::new(db_url.clone()); if args.verbose < 2 { opt.sqlx_logging(false); } @@ -241,7 +244,7 @@ async fn cleanup(cancel: CancellationToken, state: ServiceState) { error!("Error during cleanup job: {}", e); } }, - _ = cancel.cancelled() => { + () = cancel.cancelled() => { info!("Cancellation requested. Stopping cleanup task."); break; // Exit the loop } @@ -268,7 +271,7 @@ async fn shutdown_signal(state: ServiceState) { let terminate = std::future::pending::<()>(); tokio::select! { - _ = ctrl_c => {state.terminate().await.unwrap();}, - _ = terminate => {state.terminate().await.unwrap();}, + () = ctrl_c => {state.terminate().await.unwrap();}, + () = terminate => {state.terminate().await.unwrap();}, } } diff --git a/src/bin/keystone_db.rs b/src/bin/keystone_db.rs index 016d4a06..ed4b0ff1 100644 --- a/src/bin/keystone_db.rs +++ b/src/bin/keystone_db.rs @@ -16,7 +16,10 @@ use color_eyre::Report; use std::io; use std::path::PathBuf; use tracing::info; -use tracing_subscriber::{filter::*, prelude::*}; +use tracing_subscriber::{ + filter::{LevelFilter, Targets}, + prelude::*, +}; use sea_orm::ConnectOptions; use sea_orm::Database; @@ -84,7 +87,7 @@ async fn main() -> Result<(), Report> { tracing_subscriber::registry().with(log_layer).init(); let cfg = Config::new(cli.config)?; let db_url = cfg.database.get_connection(); - let mut opt = ConnectOptions::new(db_url.to_owned()); + let mut opt = ConnectOptions::new(db_url.clone()); if cli.verbose < 2 { opt.sqlx_logging(false); @@ -104,14 +107,14 @@ async fn main() -> Result<(), Report> { } Commands::Status => { let migrations = Migrator::get_pending_migrations(&conn).await?; - if !migrations.is_empty() { + if migrations.is_empty() { + println!("No pending migrations!"); + } else { println!("Pending migrations:"); for mig in migrations { println!("{}", mig.name()); } - } else { - println!("No pending migrations!") - }; + } let migrations = Migrator::get_applied_migrations(&conn).await?; println!("Applied migrations:"); for mig in migrations { diff --git a/src/catalog/backends/error.rs b/src/catalog/backends/error.rs index 62a53b34..b7a3de5d 100644 --- a/src/catalog/backends/error.rs +++ b/src/catalog/backends/error.rs @@ -12,6 +12,7 @@ // // SPDX-License-Identifier: Apache-2.0 +use sea_orm::SqlErr; use thiserror::Error; use crate::catalog::types::*; @@ -24,12 +25,6 @@ pub enum CatalogDatabaseError { source: serde_json::Error, }, - #[error("database data")] - Database { - #[from] - source: sea_orm::DbErr, - }, - #[error(transparent)] EndpointBuilder { #[from] @@ -44,4 +39,29 @@ pub enum CatalogDatabaseError { #[error("service {0} not found")] ServiceNotFound(String), + + /// Conflict + #[error("{0}")] + Conflict(String), + + /// SqlError + #[error("{0}")] + Sql(String), + + /// Database error + #[error(transparent)] + Database { source: sea_orm::DbErr }, +} + +impl From for CatalogDatabaseError { + fn from(err: sea_orm::DbErr) -> Self { + err.sql_err().map_or_else( + || Self::Database { source: err }, + |err| match err { + SqlErr::UniqueConstraintViolation(descr) => Self::Conflict(descr), + SqlErr::ForeignKeyConstraintViolation(descr) => Self::Conflict(descr), + other => Self::Sql(other.to_string()), + }, + ) + } } diff --git a/src/config.rs b/src/config.rs index e04ad2ee..14fdd5b9 100644 --- a/src/config.rs +++ b/src/config.rs @@ -13,7 +13,7 @@ // SPDX-License-Identifier: Apache-2.0 use config::{File, FileFormat}; -use eyre::Report; +use eyre::{Report, WrapErr}; use regex::Regex; use serde::{Deserialize, Deserializer}; use std::collections::HashMap; @@ -78,6 +78,8 @@ pub struct Config { pub struct DefaultSection { /// Debug logging pub debug: Option, + /// Public endpoint + pub public_endpoint: Option, } #[derive(Debug, Default, Deserialize, Clone)] @@ -226,7 +228,11 @@ impl Config { builder = builder.add_source(File::from(path).format(FileFormat::Ini)); } - Ok(builder.build()?.try_deserialize()?) + builder + .build() + .wrap_err("Failed to read configuration file")? + .try_deserialize() + .wrap_err("Failed to parse configuration file") } } diff --git a/src/db/entity/federated_identity_provider.rs b/src/db/entity/federated_identity_provider.rs index 97965e4e..7c5b1ff5 100644 --- a/src/db/entity/federated_identity_provider.rs +++ b/src/db/entity/federated_identity_provider.rs @@ -5,7 +5,7 @@ use sea_orm::entity::prelude::*; #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)] #[sea_orm(table_name = "federated_identity_provider")] pub struct Model { - #[sea_orm(primary_key)] + #[sea_orm(primary_key, auto_increment = false)] pub id: String, pub name: String, pub domain_id: Option, diff --git a/src/db_migration/m20250301_000001_passkey.rs b/src/db_migration/m20250301_000001_passkey.rs index 78cd069e..c1830729 100644 --- a/src/db_migration/m20250301_000001_passkey.rs +++ b/src/db_migration/m20250301_000001_passkey.rs @@ -31,7 +31,7 @@ impl MigrationTrait for Migration { .col(pk_auto(WebauthnCredential::Id)) .col(string_len(WebauthnCredential::UserId, 64)) .col(string_len(WebauthnCredential::CredentialId, 1024)) - .col(string(WebauthnCredential::Passkey)) + .col(text(WebauthnCredential::Passkey)) .col(string_len(WebauthnCredential::Type, 25)) .col(string_len_null(WebauthnCredential::Aaguid, 36)) .col(date_time(WebauthnCredential::CreatedAt)) @@ -54,7 +54,7 @@ impl MigrationTrait for Migration { .table(WebauthnState::Table) .if_not_exists() .col(string_len(WebauthnCredential::UserId, 64)) - .col(string(WebauthnState::State)) + .col(text(WebauthnState::State)) .col(string_len(WebauthnState::Type, 10)) .col(date_time(WebauthnState::CreatedAt)) .primary_key(Index::create().col(WebauthnState::UserId)) diff --git a/src/federation/backends/error.rs b/src/federation/backends/error.rs index a8d15f55..9ec2d241 100644 --- a/src/federation/backends/error.rs +++ b/src/federation/backends/error.rs @@ -66,13 +66,13 @@ pub enum FederationDatabaseError { impl From for FederationDatabaseError { fn from(err: sea_orm::DbErr) -> Self { - match err.sql_err() { - Some(err) => match err { + err.sql_err().map_or_else( + || Self::Database { source: err }, + |err| match err { SqlErr::UniqueConstraintViolation(descr) => Self::Conflict(descr), SqlErr::ForeignKeyConstraintViolation(descr) => Self::Conflict(descr), other => Self::Sql(other.to_string()), }, - None => Self::Database { source: err }, - } + ) } } diff --git a/src/federation/backends/sql/identity_provider.rs b/src/federation/backends/sql/identity_provider.rs index f4af3152..738fa8ff 100644 --- a/src/federation/backends/sql/identity_provider.rs +++ b/src/federation/backends/sql/identity_provider.rs @@ -21,7 +21,10 @@ use crate::db::entity::{ federated_identity_provider as db_federated_identity_provider, federation_protocol as db_old_federation_protocol, identity_provider as db_old_identity_provider, - prelude::FederatedIdentityProvider as DbFederatedIdentityProvider, + prelude::{ + FederatedIdentityProvider as DbFederatedIdentityProvider, + IdentityProvider as DbIdentityProvider, + }, }; use crate::federation::backends::error::FederationDatabaseError; use crate::federation::types::*; @@ -192,6 +195,9 @@ pub async fn update>( if let Some(val) = idp.provider_config { entry.provider_config = Set(val.to_owned()); } + if let Some(val) = idp.default_mapping_name { + entry.default_mapping_name = Set(val.to_owned()); + } let db_entry: db_federated_identity_provider::Model = entry.update(db).await?; db_entry.try_into() @@ -211,6 +217,9 @@ pub async fn delete>( .exec(db) .await?; if res.rows_affected == 1 { + DbIdentityProvider::delete_by_id(id.as_ref()) + .exec(db) + .await?; Ok(()) } else { Err(FederationDatabaseError::IdentityProviderNotFound( @@ -498,7 +507,7 @@ mod tests { ), Transaction::from_sql_and_values( DatabaseBackend::Postgres, - r#"UPDATE "federated_identity_provider" SET "name" = $1, "oidc_discovery_url" = $2, "oidc_client_id" = $3, "oidc_client_secret" = $4, "oidc_response_mode" = $5, "oidc_response_types" = $6, "jwks_url" = $7, "jwt_validation_pubkeys" = $8, "bound_issuer" = $9, "provider_config" = $10 WHERE "federated_identity_provider"."id" = $11 RETURNING "id", "name", "domain_id", "oidc_discovery_url", "oidc_client_id", "oidc_client_secret", "oidc_response_mode", "oidc_response_types", "jwks_url", "jwt_validation_pubkeys", "bound_issuer", "default_mapping_name", "provider_config""#, + r#"UPDATE "federated_identity_provider" SET "name" = $1, "oidc_discovery_url" = $2, "oidc_client_id" = $3, "oidc_client_secret" = $4, "oidc_response_mode" = $5, "oidc_response_types" = $6, "jwks_url" = $7, "jwt_validation_pubkeys" = $8, "bound_issuer" = $9, "default_mapping_name" = $10, "provider_config" = $11 WHERE "federated_identity_provider"."id" = $12 RETURNING "id", "name", "domain_id", "oidc_discovery_url", "oidc_client_id", "oidc_client_secret", "oidc_response_mode", "oidc_response_types", "jwks_url", "jwt_validation_pubkeys", "bound_issuer", "default_mapping_name", "provider_config""#, [ "idp".into(), "url".into(), @@ -509,6 +518,7 @@ mod tests { "http://jwks".into(), "jt1,jt2".into(), "bi".into(), + "dummy".into(), json!({"foo": "bar"}).into(), "1".into(), ] @@ -521,10 +531,16 @@ mod tests { async fn test_delete() { // Create MockDatabase with mock query results let db = MockDatabase::new(DatabaseBackend::Postgres) - .append_exec_results([MockExecResult { - rows_affected: 1, - ..Default::default() - }]) + .append_exec_results([ + MockExecResult { + rows_affected: 1, + ..Default::default() + }, + MockExecResult { + rows_affected: 1, + ..Default::default() + }, + ]) .into_connection(); let config = Config::default(); @@ -532,11 +548,18 @@ mod tests { // Checking transaction log assert_eq!( db.into_transaction_log(), - [Transaction::from_sql_and_values( - DatabaseBackend::Postgres, - r#"DELETE FROM "federated_identity_provider" WHERE "federated_identity_provider"."id" = $1"#, - ["id".into()] - ),] + [ + Transaction::from_sql_and_values( + DatabaseBackend::Postgres, + r#"DELETE FROM "federated_identity_provider" WHERE "federated_identity_provider"."id" = $1"#, + ["id".into()] + ), + Transaction::from_sql_and_values( + DatabaseBackend::Postgres, + r#"DELETE FROM "identity_provider" WHERE "identity_provider"."id" = $1"#, + ["id".into()] + ), + ] ); } } diff --git a/src/federation/error.rs b/src/federation/error.rs index 609a129e..903469a3 100644 --- a/src/federation/error.rs +++ b/src/federation/error.rs @@ -38,11 +38,11 @@ pub enum FederationProviderError { MappingNotFound(String), /// Use of token_user_id requires domain_id to be set. - #[error("`mapping.token_user_id` must be set")] + #[error("`mapping.domain_id` must be set")] MappingTokenUserDomainUnset, /// Use of token_project_id requires domain_id to be set. - #[error("`mapping.token_project_id` must be set")] + #[error("`mapping.domain_id` must be set")] MappingTokenProjectDomainUnset, /// Conflict. diff --git a/src/federation/mod.rs b/src/federation/mod.rs index a7152670..4d4134ff 100644 --- a/src/federation/mod.rs +++ b/src/federation/mod.rs @@ -280,7 +280,7 @@ impl FederationApi for FederationProvider { ) -> Result { let mut mod_idp = idp; if mod_idp.id.is_empty() { - mod_idp.id = Uuid::new_v4().into(); + mod_idp.id = Uuid::new_v4().simple().to_string(); } self.backend_driver diff --git a/src/identity/backends/error.rs b/src/identity/backends/error.rs index 153a4f4c..5856386f 100644 --- a/src/identity/backends/error.rs +++ b/src/identity/backends/error.rs @@ -70,13 +70,13 @@ pub enum IdentityDatabaseError { impl From for IdentityDatabaseError { fn from(err: sea_orm::DbErr) -> Self { - match err.sql_err() { - Some(err) => match err { + err.sql_err().map_or_else( + || Self::Database { source: err }, + |err| match err { SqlErr::UniqueConstraintViolation(descr) => Self::Conflict(descr), SqlErr::ForeignKeyConstraintViolation(descr) => Self::Conflict(descr), other => Self::Sql(other.to_string()), }, - None => Self::Database { source: err }, - } + ) } } diff --git a/src/identity/backends/sql/common.rs b/src/identity/backends/sql/common.rs index 962e36e4..6d95c2f9 100644 --- a/src/identity/backends/sql/common.rs +++ b/src/identity/backends/sql/common.rs @@ -94,10 +94,24 @@ pub fn get_federated_user_builder< opts: O, ) -> UserResponseBuilder { let mut user_builder: UserResponseBuilder = get_user_builder(user, opts); + let mut feds: Vec = Vec::new(); if let Some(first) = data.into_iter().next() { if let Some(name) = first.display_name { user_builder.name(name.clone()); } + + let mut fed = FederationBuilder::default(); + fed.idp_id(first.idp_id.clone()); + fed.unique_id(first.unique_id.clone()); + let protocol = FederationProtocol { + protocol_id: first.protocol_id.clone(), + unique_id: first.unique_id.clone(), + }; + fed.protocols(vec![protocol]); + if let Ok(fed_obj) = fed.build() { + feds.push(fed_obj); + } } + user_builder.federated(feds); user_builder } diff --git a/src/resource/backends/error.rs b/src/resource/backends/error.rs index c6166bef..e24fdd00 100644 --- a/src/resource/backends/error.rs +++ b/src/resource/backends/error.rs @@ -54,13 +54,13 @@ pub enum ResourceDatabaseError { impl From for ResourceDatabaseError { fn from(err: sea_orm::DbErr) -> Self { - match err.sql_err() { - Some(err) => match err { + err.sql_err().map_or_else( + || Self::Database { source: err }, + |err| match err { SqlErr::UniqueConstraintViolation(descr) => Self::Conflict(descr), SqlErr::ForeignKeyConstraintViolation(descr) => Self::Conflict(descr), other => Self::Sql(other.to_string()), }, - None => Self::Database { source: err }, - } + ) } } diff --git a/src/token/application_credential.rs b/src/token/application_credential.rs index 55d1cba8..501f5676 100644 --- a/src/token/application_credential.rs +++ b/src/token/application_credential.rs @@ -75,12 +75,12 @@ impl ApplicationCredentialPayloadBuilder { impl From for Token { fn from(value: ApplicationCredentialPayload) -> Self { - Token::ApplicationCredential(value) + Self::ApplicationCredential(value) } } impl MsgPackToken for ApplicationCredentialPayload { - type Token = ApplicationCredentialPayload; + type Token = Self; fn assemble( &self, diff --git a/src/token/domain_scoped.rs b/src/token/domain_scoped.rs index 7dad9059..617d17b4 100644 --- a/src/token/domain_scoped.rs +++ b/src/token/domain_scoped.rs @@ -74,12 +74,12 @@ impl DomainScopePayloadBuilder { impl From for Token { fn from(value: DomainScopePayload) -> Self { - Token::DomainScope(value) + Self::DomainScope(value) } } impl MsgPackToken for DomainScopePayload { - type Token = DomainScopePayload; + type Token = Self; fn assemble( &self, diff --git a/src/token/error.rs b/src/token/error.rs index 750c23b4..8b9b3453 100644 --- a/src/token/error.rs +++ b/src/token/error.rs @@ -16,6 +16,7 @@ use std::num::TryFromIntError; use thiserror::Error; +/// Token provider error. #[derive(Error, Debug)] pub enum TokenProviderError { /// IO error. @@ -26,6 +27,15 @@ pub enum TokenProviderError { source: std::io::Error, }, + /// Fernet key read error. + #[error("fernet key read error: {}", source)] + FernetKeyRead { + /// The source of the error. + source: std::io::Error, + /// Key file name. + path: std::path::PathBuf, + }, + /// Fernet Decryption #[error("fernet decryption error")] FernetDecryption { diff --git a/src/token/federation_domain_scoped.rs b/src/token/federation_domain_scoped.rs index 31cd6814..12cd216f 100644 --- a/src/token/federation_domain_scoped.rs +++ b/src/token/federation_domain_scoped.rs @@ -78,12 +78,12 @@ impl FederationDomainScopePayloadBuilder { impl From for Token { fn from(value: FederationDomainScopePayload) -> Self { - Token::FederationDomainScope(value) + Self::FederationDomainScope(value) } } impl MsgPackToken for FederationDomainScopePayload { - type Token = FederationDomainScopePayload; + type Token = Self; fn assemble( &self, diff --git a/src/token/federation_project_scoped.rs b/src/token/federation_project_scoped.rs index 3456ccb6..b53c67e4 100644 --- a/src/token/federation_project_scoped.rs +++ b/src/token/federation_project_scoped.rs @@ -78,12 +78,12 @@ impl FederationProjectScopePayloadBuilder { impl From for Token { fn from(value: FederationProjectScopePayload) -> Self { - Token::FederationProjectScope(value) + Self::FederationProjectScope(value) } } impl MsgPackToken for FederationProjectScopePayload { - type Token = FederationProjectScopePayload; + type Token = Self; fn assemble( &self, diff --git a/src/token/federation_unscoped.rs b/src/token/federation_unscoped.rs index f23540b3..925fd635 100644 --- a/src/token/federation_unscoped.rs +++ b/src/token/federation_unscoped.rs @@ -71,12 +71,12 @@ impl FederationUnscopedPayloadBuilder { impl From for Token { fn from(value: FederationUnscopedPayload) -> Self { - Token::FederationUnscoped(value) + Self::FederationUnscoped(value) } } impl MsgPackToken for FederationUnscopedPayload { - type Token = FederationUnscopedPayload; + type Token = Self; fn assemble( &self, diff --git a/src/token/fernet.rs b/src/token/fernet.rs index a7ea9eb6..5cca3905 100644 --- a/src/token/fernet.rs +++ b/src/token/fernet.rs @@ -158,21 +158,21 @@ impl FernetTokenProvider { data.assemble(&mut buf, &self.auth_map)?; } Token::FederationUnscoped(data) => { - write_array_len(&mut buf, 7) + write_array_len(&mut buf, 8) .map_err(|x| TokenProviderError::RmpEncode(x.to_string()))?; write_pfix(&mut buf, 4) .map_err(|x| TokenProviderError::RmpEncode(x.to_string()))?; data.assemble(&mut buf, &self.auth_map)?; } Token::FederationProjectScope(data) => { - write_array_len(&mut buf, 8) + write_array_len(&mut buf, 9) .map_err(|x| TokenProviderError::RmpEncode(x.to_string()))?; write_pfix(&mut buf, 5) .map_err(|x| TokenProviderError::RmpEncode(x.to_string()))?; data.assemble(&mut buf, &self.auth_map)?; } Token::FederationDomainScope(data) => { - write_array_len(&mut buf, 8) + write_array_len(&mut buf, 9) .map_err(|x| TokenProviderError::RmpEncode(x.to_string()))?; write_pfix(&mut buf, 6) .map_err(|x| TokenProviderError::RmpEncode(x.to_string()))?; diff --git a/src/token/fernet_utils.rs b/src/token/fernet_utils.rs index 9ea3c017..420dd461 100644 --- a/src/token/fernet_utils.rs +++ b/src/token/fernet_utils.rs @@ -47,8 +47,13 @@ impl FernetUtils { if let Ok(fname) = entry.file_name().into_string() { if let Ok(key_order) = fname.parse::() { // We are only interested in files named as integer (0, 1, 2, ...) - trace!("Loading key from {:?}", entry.file_name()); - let key = fs::read_to_string(entry.path())?; + trace!("Loading key {:?}", entry.file_name()); + let key = fs::read_to_string(entry.path()).map_err(|e| { + TokenProviderError::FernetKeyRead { + source: e, + path: entry.path(), + } + })?; keys.insert(key_order, key); } } @@ -56,6 +61,7 @@ impl FernetUtils { } Ok(keys.into_values().rev()) } + pub async fn load_keys_async( &self, ) -> Result + use<>, TokenProviderError> { @@ -66,8 +72,13 @@ impl FernetUtils { if let Ok(fname) = entry.file_name().into_string() { if let Ok(key_order) = fname.parse::() { // We are only interested in files named as integer (0, 1, 2, ...) - trace!("Loading key from {:?}", entry.file_name()); - let key = fs_async::read_to_string(entry.path()).await?; + trace!("Loading key {:?}", entry.file_name()); + let key = fs::read_to_string(entry.path()).map_err(|e| { + TokenProviderError::FernetKeyRead { + source: e, + path: entry.path(), + } + })?; keys.insert(key_order, key); } } @@ -109,7 +120,6 @@ pub fn read_uuid(rd: &mut &[u8]) -> Result { .as_simple() .to_string()); } - println!("1"); } Marker::False => { // This is not uuid @@ -141,7 +151,6 @@ pub fn read_uuid(rd: &mut &[u8]) -> Result { return Err(TokenProviderError::InvalidTokenUuidMarker(other)); } } - println!("here"); Err(TokenProviderError::InvalidTokenUuid) } diff --git a/src/token/mod.rs b/src/token/mod.rs index 1627427a..7b5248da 100644 --- a/src/token/mod.rs +++ b/src/token/mod.rs @@ -325,7 +325,7 @@ impl TokenApi for TokenProvider { > token .expires_at() .checked_add_signed(TimeDelta::seconds(window_seconds.unwrap_or(0))) - .unwrap_or(*token.expires_at()) + .unwrap_or_else(|| *token.expires_at()) && !allow_expired.unwrap_or(false) { return Err(TokenProviderError::Expired); diff --git a/src/token/project_scoped.rs b/src/token/project_scoped.rs index aa972812..07b11d41 100644 --- a/src/token/project_scoped.rs +++ b/src/token/project_scoped.rs @@ -74,12 +74,12 @@ impl ProjectScopePayloadBuilder { impl From for Token { fn from(value: ProjectScopePayload) -> Self { - Token::ProjectScope(value) + Self::ProjectScope(value) } } impl MsgPackToken for ProjectScopePayload { - type Token = ProjectScopePayload; + type Token = Self; fn assemble( &self, diff --git a/src/token/types.rs b/src/token/types.rs index a141890d..ae17a66b 100644 --- a/src/token/types.rs +++ b/src/token/types.rs @@ -42,88 +42,88 @@ pub enum Token { } impl Token { - pub fn user_id(&self) -> &String { + pub const fn user_id(&self) -> &String { match self { - Token::Unscoped(x) => &x.user_id, - Token::ProjectScope(x) => &x.user_id, - Token::DomainScope(x) => &x.user_id, - Token::FederationUnscoped(x) => &x.user_id, - Token::FederationProjectScope(x) => &x.user_id, - Token::FederationDomainScope(x) => &x.user_id, - Token::ApplicationCredential(x) => &x.user_id, + Self::Unscoped(x) => &x.user_id, + Self::ProjectScope(x) => &x.user_id, + Self::DomainScope(x) => &x.user_id, + Self::FederationUnscoped(x) => &x.user_id, + Self::FederationProjectScope(x) => &x.user_id, + Self::FederationDomainScope(x) => &x.user_id, + Self::ApplicationCredential(x) => &x.user_id, } } - pub fn user(&self) -> &Option { + pub const fn user(&self) -> &Option { match self { - Token::Unscoped(x) => &x.user, - Token::ProjectScope(x) => &x.user, - Token::DomainScope(x) => &x.user, - Token::FederationUnscoped(x) => &x.user, - Token::FederationProjectScope(x) => &x.user, - Token::FederationDomainScope(x) => &x.user, - Token::ApplicationCredential(x) => &x.user, + Self::Unscoped(x) => &x.user, + Self::ProjectScope(x) => &x.user, + Self::DomainScope(x) => &x.user, + Self::FederationUnscoped(x) => &x.user, + Self::FederationProjectScope(x) => &x.user, + Self::FederationDomainScope(x) => &x.user, + Self::ApplicationCredential(x) => &x.user, } } - pub fn expires_at(&self) -> &DateTime { + pub const fn expires_at(&self) -> &DateTime { match self { - Token::Unscoped(x) => &x.expires_at, - Token::ProjectScope(x) => &x.expires_at, - Token::DomainScope(x) => &x.expires_at, - Token::FederationUnscoped(x) => &x.expires_at, - Token::FederationProjectScope(x) => &x.expires_at, - Token::FederationDomainScope(x) => &x.expires_at, - Token::ApplicationCredential(x) => &x.expires_at, + Self::Unscoped(x) => &x.expires_at, + Self::ProjectScope(x) => &x.expires_at, + Self::DomainScope(x) => &x.expires_at, + Self::FederationUnscoped(x) => &x.expires_at, + Self::FederationProjectScope(x) => &x.expires_at, + Self::FederationDomainScope(x) => &x.expires_at, + Self::ApplicationCredential(x) => &x.expires_at, } } - pub fn methods(&self) -> &Vec { + pub const fn methods(&self) -> &Vec { match self { - Token::Unscoped(x) => &x.methods, - Token::ProjectScope(x) => &x.methods, - Token::DomainScope(x) => &x.methods, - Token::FederationUnscoped(x) => &x.methods, - Token::FederationProjectScope(x) => &x.methods, - Token::FederationDomainScope(x) => &x.methods, - Token::ApplicationCredential(x) => &x.methods, + Self::Unscoped(x) => &x.methods, + Self::ProjectScope(x) => &x.methods, + Self::DomainScope(x) => &x.methods, + Self::FederationUnscoped(x) => &x.methods, + Self::FederationProjectScope(x) => &x.methods, + Self::FederationDomainScope(x) => &x.methods, + Self::ApplicationCredential(x) => &x.methods, } } - pub fn audit_ids(&self) -> &Vec { + pub const fn audit_ids(&self) -> &Vec { match self { - Token::Unscoped(x) => &x.audit_ids, - Token::ProjectScope(x) => &x.audit_ids, - Token::DomainScope(x) => &x.audit_ids, - Token::FederationUnscoped(x) => &x.audit_ids, - Token::FederationProjectScope(x) => &x.audit_ids, - Token::FederationDomainScope(x) => &x.audit_ids, - Token::ApplicationCredential(x) => &x.audit_ids, + Self::Unscoped(x) => &x.audit_ids, + Self::ProjectScope(x) => &x.audit_ids, + Self::DomainScope(x) => &x.audit_ids, + Self::FederationUnscoped(x) => &x.audit_ids, + Self::FederationProjectScope(x) => &x.audit_ids, + Self::FederationDomainScope(x) => &x.audit_ids, + Self::ApplicationCredential(x) => &x.audit_ids, } } - pub fn project(&self) -> Option<&Project> { + pub const fn project(&self) -> Option<&Project> { match self { - Token::ProjectScope(x) => x.project.as_ref(), - Token::FederationProjectScope(x) => x.project.as_ref(), + Self::ProjectScope(x) => x.project.as_ref(), + Self::FederationProjectScope(x) => x.project.as_ref(), _ => None, } } - pub fn domain(&self) -> Option<&Domain> { + pub const fn domain(&self) -> Option<&Domain> { match self { - Token::DomainScope(x) => x.domain.as_ref(), - Token::FederationDomainScope(x) => x.domain.as_ref(), + Self::DomainScope(x) => x.domain.as_ref(), + Self::FederationDomainScope(x) => x.domain.as_ref(), _ => None, } } - pub fn roles(&self) -> Option<&Vec> { + pub const fn roles(&self) -> Option<&Vec> { match self { - Token::DomainScope(x) => x.roles.as_ref(), - Token::ProjectScope(x) => x.roles.as_ref(), - Token::FederationProjectScope(x) => x.roles.as_ref(), - Token::FederationDomainScope(x) => x.roles.as_ref(), + Self::DomainScope(x) => x.roles.as_ref(), + Self::ProjectScope(x) => x.roles.as_ref(), + Self::FederationProjectScope(x) => x.roles.as_ref(), + Self::FederationDomainScope(x) => x.roles.as_ref(), _ => None, } } diff --git a/src/token/unscoped.rs b/src/token/unscoped.rs index 1a72433e..bf2211f7 100644 --- a/src/token/unscoped.rs +++ b/src/token/unscoped.rs @@ -67,12 +67,12 @@ impl UnscopedPayloadBuilder { impl From for Token { fn from(value: UnscopedPayload) -> Self { - Token::Unscoped(value) + Self::Unscoped(value) } } impl MsgPackToken for UnscopedPayload { - type Token = UnscopedPayload; + type Token = Self; fn assemble( &self, diff --git a/tests/github/main.rs b/tests/github/main.rs index ff9e638b..0d21638d 100644 --- a/tests/github/main.rs +++ b/tests/github/main.rs @@ -37,7 +37,7 @@ async fn test_login_jwt() { "{}/v4/federation/identity_providers/{}/jwt", keystone_url, idp.identity_provider.id )) - .header(AUTHORIZATION, jwt) + .header(AUTHORIZATION, format!("bearer {jwt}")) .header("openstack-mapping", mapping.mapping.name) .send() .await diff --git a/tests/keycloak/main.rs b/tests/keycloak/main.rs index a68d1861..735cffbd 100644 --- a/tests/keycloak/main.rs +++ b/tests/keycloak/main.rs @@ -173,7 +173,7 @@ async fn test_login_jwt_keycloak() { "{}/v4/federation/identity_providers/{}/jwt", keystone_url, idp.identity_provider.id )) - .header(AUTHORIZATION, jwt) + .header(AUTHORIZATION, format!("bearer {jwt}")) .header("openstack-mapping", mapping.mapping.name) .send() .await