From b0ed997a4d709cd8651f8cc05842fe89c50262b1 Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Wed, 11 Feb 2026 22:01:48 -0500 Subject: [PATCH 01/12] data struct for owui CRD --- src/kube/openwebui/mod.rs | 70 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/src/kube/openwebui/mod.rs b/src/kube/openwebui/mod.rs index e09658d2..36b8b3cd 100644 --- a/src/kube/openwebui/mod.rs +++ b/src/kube/openwebui/mod.rs @@ -2,10 +2,76 @@ use std::marker::PhantomData; +use serde::Deserialize; + pub const OWUI: &str = "owui"; +/* +apiVersion: accelerate.science/v1 +kind: Owui +metadata: + name: u67aceff11a66c1fa7c99726c-openwebui + namespace: openwebui +spec: + # will remove this... makes no sense to have this + replica: 1 + retainPVC: false + + servicePort: 8080 + + image: + registry: quay.io + repository: ibmdpdev/open-webui-spati + tag: latest + pullPolicy: Always + + persistence: + size: 2Gi + storageClass: gp3 + + env: + - name: MOLVIEWER_URL + value: "moleviewer.open.accelerate.science" + - name: WEBUI_SECRET_KEY + # i dunno just make one up + value: "idontcarewhatthisisbecuasethisisrequiredforsomereason" + */ + // This is a placeholder for openwebui CRD +#[derive(Deserialize)] struct OpenWebUI { - _p: PhantomData<()>, - _id: uuid::Uuid, + spec: Spec, +} + +#[derive(Deserialize)] +struct Spec { + replica: u8, + #[serde(rename = "retainPVC")] + retain_pvc: bool, + #[serde(rename = "servicePort")] + service_port: u16, + image: Image, + env: Vec, +} + +#[derive(Deserialize)] +struct Image { + registry: String, + repository: String, + tag: String, + #[serde(rename = "pullPolicy")] + pull_policy: String, +} + +#[derive(Deserialize)] +struct Persistence { + size: String, + #[serde(rename = "storageClass")] + storage_class: String, +} + +#[derive(Deserialize)] +struct Env { + name: String, + value: String, } From 64a57093a4a1c6b4ad91e0d327cf50183ca1ac34 Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Sun, 15 Feb 2026 21:14:47 -0500 Subject: [PATCH 02/12] wip fix --- Cargo.lock | 532 ++++++++++++++++++++++++++------------ Cargo.toml | 10 +- src/kube/openwebui/mod.rs | 103 +++++++- src/web/helper.rs | 8 +- 4 files changed, 471 insertions(+), 182 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1bfc80a9..ce1b12c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -21,9 +21,9 @@ dependencies = [ [[package]] name = "actix-files" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4009a8beb4dc78a58286ac9d58969ee0a8acecb7912d5ce898b4da4335579341" +checksum = "df8c4f30e3272d7c345f88ae0aac3848507ef5ba871f9cc2a41c8085a0f0523b" dependencies = [ "actix-http", "actix-service", @@ -211,7 +211,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.6.1", + "socket2 0.6.2", "time", "tracing", "url", @@ -316,6 +316,12 @@ dependencies = [ "libc", ] +[[package]] +name = "anyhow" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" + [[package]] name = "arcstr" version = "1.2.0" @@ -393,9 +399,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.15.3" +version = "1.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e84ce723ab67259cfeb9877c6a639ee9eb7a27b28123abd71db7f0d5d0cc9d86" +checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256" dependencies = [ "aws-lc-sys", "zeroize", @@ -403,9 +409,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.36.0" +version = "0.37.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a442ece363113bd4bd4c8b18977a7798dd4d3c3383f34fb61936960e8f4ad8" +checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" dependencies = [ "cc", "cmake", @@ -510,21 +516,21 @@ dependencies = [ "p256", "parking_lot", "pin-project", - "rand 0.9.2", + "rand 0.10.0", "redis", "regex", - "reqwest 0.13.1", + "reqwest 0.13.2", "rust-argon2", "rustls", "rustls-pemfile", "rustls-pki-types", - "schemars 1.2.0", + "schemars 1.2.1", "serde", "serde_json", "serde_urlencoded", "sha2", "tera", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", "tokio", "tokio-rustls", @@ -601,9 +607,9 @@ checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "bytestring" @@ -616,9 +622,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.53" +version = "1.2.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932" +checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" dependencies = [ "find-msvc-tools", "jobserver", @@ -644,6 +650,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.0", +] + [[package]] name = "chrono" version = "0.4.43" @@ -799,6 +816,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -883,7 +909,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "curve25519-dalek-derive", "digest", "fiat-crypto", @@ -991,9 +1017,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" dependencies = [ "powerfmt", "serde_core", @@ -1267,15 +1293,15 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "find-msvc-tools" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "flate2" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" dependencies = [ "crc32fast", "miniz_oxide", @@ -1462,6 +1488,20 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "rand_core 0.10.0", + "wasip2", + "wasip3", +] + [[package]] name = "globset" version = "0.4.18" @@ -1553,6 +1593,15 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + [[package]] name = "hashbrown" version = "0.16.1" @@ -1594,7 +1643,7 @@ dependencies = [ "once_cell", "rand 0.9.2", "ring", - "thiserror 2.0.17", + "thiserror 2.0.18", "tinyvec", "tokio", "tracing", @@ -1617,7 +1666,7 @@ dependencies = [ "rand 0.9.2", "resolv-conf", "smallvec", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tracing", ] @@ -1778,14 +1827,13 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "base64 0.22.1", "bytes", "futures-channel", - "futures-core", "futures-util", "http 1.4.0", "http-body", @@ -1794,7 +1842,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.6.2", "system-configuration", "tokio", "tower-service", @@ -1804,9 +1852,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1907,6 +1955,12 @@ dependencies = [ "zerovec", ] +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + [[package]] name = "ident_case" version = "1.0.1" @@ -2024,9 +2078,9 @@ checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jiff" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67e8da4c49d6d9909fe03361f9b620f58898859f5c7aded68351e85e71ecf50" +checksum = "c867c356cc096b33f4981825ab281ecba3db0acefe60329f044c1789d94c6543" dependencies = [ "jiff-static", "log", @@ -2037,9 +2091,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c84ee7f197eca9a86c6fd6cb771e55eb991632f15f2bc3ca6ec838929e6e78" +checksum = "f7946b4325269738f270bb55b3c19ab5c5040525f83fd625259422a9d25d9be5" dependencies = [ "proc-macro2", "quote", @@ -2110,7 +2164,7 @@ dependencies = [ "pest_derive", "regex", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] @@ -2135,16 +2189,16 @@ dependencies = [ "num-bigint", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "yasna", "zeroize", ] [[package]] name = "jsonwebtoken" -version = "10.2.0" +version = "10.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76e1c7d7df3e34443b3621b459b066a7b79644f059fc8b2db7070c825fd417e" +checksum = "0529410abe238729a60b108898784df8984c87f6054c9c4fcacc47e4803c1ce1" dependencies = [ "base64 0.22.1", "ed25519-dalek", @@ -2177,9 +2231,9 @@ dependencies = [ [[package]] name = "kube" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dae7229247e4215781e5c5104a056e1e2163943e577f9084cf8bba7b5248f7a" +checksum = "f96b537b4c4f61fc183594edbecbbefa3037e403feac0701bb24e6eff78e0034" dependencies = [ "k8s-openapi", "kube-client", @@ -2190,9 +2244,9 @@ dependencies = [ [[package]] name = "kube-client" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "010875e291a9c0a4e076f4f9c35b97d82fd2372cb3bc713252c3d08b7e73ce5b" +checksum = "af97b8b696eb737e5694f087c498ca725b172c2a5bc3a6916328d160225537ee" dependencies = [ "base64 0.22.1", "bytes", @@ -2215,7 +2269,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-util", "tower", @@ -2225,9 +2279,9 @@ dependencies = [ [[package]] name = "kube-core" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac76281aa698dd34111e25b21f5f6561932a30feabab5357152be273f8a81bb" +checksum = "e7aeade7d2e9f165f96b3c1749ff01a8e2dc7ea954bd333bcfcecc37d5226bdd" dependencies = [ "derive_more", "form_urlencoded", @@ -2235,18 +2289,18 @@ dependencies = [ "jiff", "json-patch", "k8s-openapi", - "schemars 1.2.0", + "schemars 1.2.1", "serde", "serde-value", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", ] [[package]] name = "kube-derive" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "599c09721efcccc0e6a26e93df28c587da60ff5e099c657626fff2af0ae4cbb8" +checksum = "c98f59f4e68864624a0b993a1cc2424439ab7238eaede5c299e89943e2a093ff" dependencies = [ "darling 0.23.0", "proc-macro2", @@ -2258,9 +2312,9 @@ dependencies = [ [[package]] name = "kube-runtime" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db43d26700f564baf850f681f3cb0f1195d2699bd379bfa70750ecec4dcb209" +checksum = "fc158473d6d86ec22692874bd5ddccf07474eab5c6bb41f226c522e945da5244" dependencies = [ "ahash", "async-broadcast", @@ -2277,7 +2331,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-util", "tracing", @@ -2298,17 +2352,23 @@ dependencies = [ "spin", ] +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + [[package]] name = "libc" -version = "0.2.180" +version = "0.2.181" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" +checksum = "459427e2af2b9c839b132acb702a1c654d95e10f8c326bfc2ad11310e458b1c5" [[package]] name = "libm" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libmimalloc-sys" @@ -2424,9 +2484,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "mimalloc" @@ -2477,9 +2537,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.12" +version = "0.12.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3dec6bd31b08944e08b58fd99373893a6c17054d6f3ea5006cc894f4f4eee2a" +checksum = "b4ac832c50ced444ef6be0767a008b02c106a909ba79d1d830501e94b96f6b7e" dependencies = [ "crossbeam-channel", "crossbeam-epoch", @@ -2512,9 +2572,9 @@ checksum = "224484c5d09285a7b8cb0a0c117e847ebd14cb6e4470ecf68cdb89c503b0edb9" [[package]] name = "mongodb" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50ed2c028a2c04ad58faa2e0f4ee82c1319f0e495b710ca8e8498fde4b395f64" +checksum = "803dd859e8afa084c255a8effd8000ff86f7c8076a50cd6d8c99e8f3496f75c2" dependencies = [ "base64 0.22.1", "bitflags", @@ -2543,11 +2603,11 @@ dependencies = [ "serde_with", "sha1", "sha2", - "socket2 0.6.1", + "socket2 0.6.2", "stringprep", "strsim", "take_mut", - "thiserror 2.0.17", + "thiserror 2.0.18", "tokio", "tokio-rustls", "tokio-util", @@ -2558,9 +2618,9 @@ dependencies = [ [[package]] name = "mongodb-internal-macros" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a42ac35ea5c79f6539851d79d7cfe3322358f7d0d7bf040eb3e1558efc0a4c" +checksum = "a973ef3dd3dbc6f6e65bbdecfd9ec5e781b9e7493b0f369a7c62e35d8e5ae2c8" dependencies = [ "macro_magic", "proc-macro2", @@ -2605,9 +2665,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" [[package]] name = "num-integer" @@ -2728,9 +2788,9 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" @@ -2851,9 +2911,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.5" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" dependencies = [ "memchr", "ucd-trie", @@ -2861,9 +2921,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.8.5" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f9dbced329c441fa79d80472764b1a2c7e57123553b8519b36663a2fb234ed" +checksum = "11f486f1ea21e6c10ed15d5a7c77165d0ee443402f0780849d1768e7d9d6fe77" dependencies = [ "pest", "pest_generator", @@ -2871,9 +2931,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.5" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb96d5051a78f44f43c8f712d8e810adb0ebf923fc9ed2655a7f66f63ba8ee5" +checksum = "8040c4647b13b210a963c1ed407c1ff4fdfa01c31d6d2a098218702e6664f94f" dependencies = [ "pest", "pest_meta", @@ -2884,9 +2944,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.8.5" +version = "2.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "602113b5b5e8621770cfd490cfd90b9f84ab29bd2b0e49ad83eb6d186cef2365" +checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" dependencies = [ "pest", "sha2", @@ -2991,15 +3051,15 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "portable-atomic" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" dependencies = [ "portable-atomic", ] @@ -3028,6 +3088,16 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + [[package]] name = "primeorder" version = "0.13.6" @@ -3039,9 +3109,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -3059,8 +3129,8 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.1", - "thiserror 2.0.17", + "socket2 0.6.2", + "thiserror 2.0.18", "tokio", "tracing", "web-time", @@ -3082,7 +3152,7 @@ dependencies = [ "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.17", + "thiserror 2.0.18", "tinyvec", "tracing", "web-time", @@ -3097,16 +3167,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.1", + "socket2 0.6.2", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.43" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -3144,6 +3214,17 @@ dependencies = [ "rand_core 0.9.5", ] +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20", + "getrandom 0.4.1", + "rand_core 0.10.0", +] + [[package]] name = "rand_chacha" version = "0.3.1" @@ -3182,11 +3263,17 @@ dependencies = [ "getrandom 0.3.4", ] +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + [[package]] name = "redis" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfe20977fe93830c0e9817a16fbf1ed1cfd8d4bba366087a1841d2c6033c251" +checksum = "e969d1d702793536d5fda739a82b88ad7cbe7d04f8386ee8cd16ad3eff4854a5" dependencies = [ "arcstr", "bytes", @@ -3199,7 +3286,7 @@ dependencies = [ "pin-project-lite", "ryu", "sha1_smol", - "socket2 0.6.1", + "socket2 0.6.2", "tokio", "tokio-util", "url", @@ -3237,9 +3324,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.12.2" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -3249,9 +3336,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -3260,15 +3347,15 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d942b98df5e658f56f20d592c7f868833fe38115e65c33003d8cd224b0155da" +checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" [[package]] name = "reqwest" @@ -3310,9 +3397,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" dependencies = [ "base64 0.22.1", "bytes", @@ -3532,9 +3619,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "same-file" @@ -3568,9 +3655,9 @@ dependencies = [ [[package]] name = "schemars" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e910108742c57a770f492731f99be216a52fadd361b06c8fb59d74ccc267d2" +checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" dependencies = [ "dyn-clone", "ref-cast", @@ -3581,9 +3668,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4908ad288c5035a8eb12cfdf0d49270def0a268ee162b75eeee0f85d155a7c45" +checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" dependencies = [ "proc-macro2", "quote", @@ -3778,7 +3865,7 @@ dependencies = [ "indexmap 1.9.3", "indexmap 2.13.0", "schemars 0.9.0", - "schemars 1.2.0", + "schemars 1.2.1", "serde_core", "serde_json", "serde_with_macros", @@ -3827,7 +3914,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -3844,7 +3931,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "digest", ] @@ -3891,27 +3978,27 @@ checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" [[package]] name = "simple_asn1" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.17", + "thiserror 2.0.18", "time", ] [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "slug" @@ -3941,9 +4028,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" dependencies = [ "libc", "windows-sys 0.60.2", @@ -3996,9 +4083,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.114" +version = "2.0.115" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +checksum = "6e614ed320ac28113fa64972c4262d5dbc89deacdfd00c34a3e4cea073243c12" dependencies = [ "proc-macro2", "quote", @@ -4027,9 +4114,9 @@ dependencies = [ [[package]] name = "system-configuration" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ "bitflags", "core-foundation 0.9.4", @@ -4097,11 +4184,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.17", + "thiserror-impl 2.0.18", ] [[package]] @@ -4117,9 +4204,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.17" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -4137,9 +4224,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.45" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e442fc33d7fdb45aa9bfeb312c095964abdf596f7567261062b2a7107aaabd" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ "deranged", "itoa", @@ -4152,15 +4239,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b36ee98fd31ec7426d599183e8fe26932a8dc1fb76ddb6214d05493377d34ca" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.25" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e552d1249bf61ac2a52db88179fd0673def1e1ad8243a00d9ec9ed71fee3dd" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ "num-conv", "time-core", @@ -4212,7 +4299,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.1", + "socket2 0.6.2", "tokio-macros", "windows-sys 0.61.2", ] @@ -4283,9 +4370,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.11+spec-1.1.0" +version = "1.0.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" +checksum = "bbe30f93627849fa362d4a602212d41bb237dc2bd0f8ba0b2ce785012e124220" dependencies = [ "indexmap 2.13.0", "serde_core", @@ -4298,18 +4385,18 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.5+spec-1.1.0" +version = "1.0.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" dependencies = [ "serde_core", ] [[package]] name = "toml_parser" -version = "1.0.6+spec-1.1.0" +version = "1.0.8+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "0742ff5ff03ea7e67c8ae6c93cac239e0d9784833362da3f9a9c1da8dfefcbdc" dependencies = [ "winnow", ] @@ -4449,7 +4536,7 @@ dependencies = [ "rustls", "rustls-pki-types", "sha1", - "thiserror 2.0.17", + "thiserror 2.0.18", "url", "utf-8", ] @@ -4500,9 +4587,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" [[package]] name = "unicode-normalization" @@ -4584,9 +4671,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" dependencies = [ "getrandom 0.3.4", "js-sys", @@ -4652,6 +4739,15 @@ dependencies = [ "wit-bindgen", ] +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + [[package]] name = "wasm-bindgen" version = "0.2.108" @@ -4711,11 +4807,33 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap 2.13.0", + "wasm-encoder", + "wasmparser", +] + [[package]] name = "wasm-streams" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb" dependencies = [ "futures-util", "js-sys", @@ -4724,6 +4842,18 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap 2.13.0", + "semver", +] + [[package]] name = "web-sys" version = "0.3.85" @@ -4746,18 +4876,18 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc" +checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" dependencies = [ "rustls-pki-types", ] [[package]] name = "webpki-roots" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12bed680863276c63889429bfd6cab3b99943659923822de1c8a39c49e4d722c" +checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" dependencies = [ "rustls-pki-types", ] @@ -5156,6 +5286,88 @@ name = "wit-bindgen" version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap 2.13.0", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags", + "indexmap 2.13.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap 2.13.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] [[package]] name = "writeable" @@ -5212,18 +5424,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.33" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd" +checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.33" +version = "0.8.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" +checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" dependencies = [ "proc-macro2", "quote", @@ -5306,9 +5518,9 @@ dependencies = [ [[package]] name = "zmij" -version = "1.0.15" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f63c051f4fe3c1509da62131a678643c5b6fbdc9273b2b79d4378ebda003d2" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" [[package]] name = "zstd" diff --git a/Cargo.toml b/Cargo.toml index 89f5a4a7..0d8510d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,14 +41,14 @@ actix-files = "0.6.6" tera = { version = "1.20.0", features= ["builtins"] } reqwest = { version = "0.13", features = ["stream", "json"] } url = "2.5.0" -toml = "0.9.0" +toml = "1.0.1" urlencoding = "2.1.3" actix-ws = "0.3.0" tokio-tungstenite = { version = "0.28", features = ["url", "rustls-tls-native-roots"] } # Auth deps rust-argon2 = "~3.0" sha2 = "~0.10" -jsonwebtoken = { version = "=10.2.0", features = ["use_pem", "rust_crypto"] } +jsonwebtoken = { version = "=10.3.0", features = ["use_pem", "rust_crypto"] } openssl = "~0.10" tokio-rustls = "0.26" rustls = "0.23" @@ -65,7 +65,7 @@ regex = "~1.12" thiserror = "2" # DB mongodb = "=3.5" -redis = { version = "=1.0.2", features = ["tokio-comp", "num-bigint"] } +redis = { version = "=1.0.3", features = ["tokio-comp", "num-bigint"] } #macro utils = { path = "utils" } # Kubernetes @@ -77,8 +77,8 @@ either = { version = "1.13.0", optional = true } mimalloc = "~0.1" # security base64 = "~0.22.1" -rand = "~0.9" -uuid = { version = "~1.19", features = ["v4"] } +rand = "~0.10" +uuid = { version = "~1.20", features = ["v4"] } [dev-dependencies] jsonwebkey = { version = "~0.4", features = ["jwt-convert"] } diff --git a/src/kube/openwebui/mod.rs b/src/kube/openwebui/mod.rs index 36b8b3cd..ec31e580 100644 --- a/src/kube/openwebui/mod.rs +++ b/src/kube/openwebui/mod.rs @@ -1,8 +1,8 @@ #![allow(dead_code)] -use std::marker::PhantomData; - -use serde::Deserialize; +use kube::CustomResource; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; pub const OWUI: &str = "owui"; @@ -38,13 +38,14 @@ spec: */ // This is a placeholder for openwebui CRD -#[derive(Deserialize)] +#[derive(CustomResource, Clone, Deserialize, Serialize, Debug, JsonSchema)] +#[kube( + group = "accelerate.science", + version = "v1", + kind = "Owui", + namespaced +)] struct OpenWebUI { - spec: Spec, -} - -#[derive(Deserialize)] -struct Spec { replica: u8, #[serde(rename = "retainPVC")] retain_pvc: bool, @@ -54,7 +55,7 @@ struct Spec { env: Vec, } -#[derive(Deserialize)] +#[derive(Clone, Deserialize, Serialize, Debug, JsonSchema)] struct Image { registry: String, repository: String, @@ -63,15 +64,93 @@ struct Image { pull_policy: String, } -#[derive(Deserialize)] +#[derive(Clone, Deserialize, Serialize, Debug, JsonSchema)] struct Persistence { size: String, #[serde(rename = "storageClass")] storage_class: String, } -#[derive(Deserialize)] +#[derive(Clone, Deserialize, Serialize, Debug, JsonSchema)] struct Env { name: String, value: String, } + +#[cfg(test)] +mod test { + use crate::kube::KubeAPI; + + #[test] + fn test_deserialize_owui() { + // let yaml_data = r#" + // apiVersion: accelerate.science/v1 + // kind: Owui + // metadata: + // name: u67aceff11a66c1fa7c99726c-openwebui + // namespace: openwebui + // spec: + // # will remove this... makes no sense to have this + // replica: 1 + // retainPVC: false + // + // servicePort: 8080 + // + // image: + // registry: quay.io + // repository: ibmdpdev/open-webui-spati + // tag: latest + // pullPolicy: Always + // + // persistence: + // size: 2Gi + // storageClass: gp3 + // + // env: + // - name: MOLVIEWER_URL + // value: "moleviewer.open.accelerate.science" + // - name: WEBUI_SECRET_KEY + // value: "idontcarewhatthisisbecuasethisisrequiredforsomereason" + // "#; + // match serde_json::from_str::(yaml_data) { + // Ok(owui) => println!("Successfully deserialized OpenWebUI: {:?}", owui), + // Err(e) => eprintln!("Failed to deserialize OpenWebUI: {}", e), + // } + + let owui = super::Owui { + spec: super::OpenWebUI { + replica: 1, + retain_pvc: false, + service_port: 8080, + image: super::Image { + registry: "quay.io".to_string(), + repository: "ibmdpdev/open-webui-spati".to_string(), + tag: "latest".to_string(), + pull_policy: "Always".to_string(), + }, + env: vec![ + super::Env { + name: "MOLVIEWER_URL".to_string(), + value: "moleviewer.open.accelerate.science".to_string(), + }, + super::Env { + name: "WEBUI_SECRET_KEY".to_string(), + value: "idontcarewhatthisisbecuasethisisrequiredforsomereason".to_string(), + }, + ], + }, + metadata: kube::api::ObjectMeta { + name: Some("u67aceff11a66c1fa7c99726c-openwebui".to_string()), + namespace: Some("openwebui".to_string()), + ..Default::default() + }, + }; + // print as json + match serde_json::to_string_pretty(&owui) { + Ok(json) => println!("Successfully serialized OpenWebUI to JSON:\n{}", json), + Err(e) => eprintln!("Failed to serialize OpenWebUI to JSON: {}", e), + } + + // KubeAPI::new(owui); + } +} diff --git a/src/web/helper.rs b/src/web/helper.rs index 9c7e0000..6285f60a 100644 --- a/src/web/helper.rs +++ b/src/web/helper.rs @@ -1,9 +1,7 @@ use actix_web::web; use base64::{Engine, prelude::BASE64_STANDARD}; -#[cfg(feature = "observe")] -use mongodb::bson; use mongodb::bson::{Bson, to_bson}; -use rand::{Rng, rng}; +use rand::{RngExt as _, rng}; use serde::Deserialize; use tera::Context; use tokio_stream::StreamExt; @@ -186,8 +184,8 @@ pub fn maintenance_watch() -> Result<()> { #[inline] pub fn generate_salt() -> String { - let mut rnd = rng(); - let salt: Vec = (0..32).map(|_| rnd.random()).collect(); + let mut rng = rng(); + let salt: Vec = (0..32).map(|_| rng.random()).collect(); BASE64_STANDARD.encode(&salt) } From 90a6c8da619b6686166620b5ee6c6597628eb2e1 Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Mon, 16 Feb 2026 00:41:19 -0500 Subject: [PATCH 03/12] fix persistence --- src/kube/openwebui/mod.rs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/kube/openwebui/mod.rs b/src/kube/openwebui/mod.rs index ec31e580..af5df775 100644 --- a/src/kube/openwebui/mod.rs +++ b/src/kube/openwebui/mod.rs @@ -52,6 +52,7 @@ struct OpenWebUI { #[serde(rename = "servicePort")] service_port: u16, image: Image, + persistence: Persistence, env: Vec, } @@ -79,10 +80,11 @@ struct Env { #[cfg(test)] mod test { - use crate::kube::KubeAPI; + // use crate::config::CONFIG; + // use crate::kube::KubeAPI; - #[test] - fn test_deserialize_owui() { + #[tokio::test] + async fn test_deserialize_owui() { // let yaml_data = r#" // apiVersion: accelerate.science/v1 // kind: Owui @@ -138,6 +140,10 @@ mod test { value: "idontcarewhatthisisbecuasethisisrequiredforsomereason".to_string(), }, ], + persistence: super::Persistence { + size: "2Gi".to_string(), + storage_class: "gp3".to_string(), + }, }, metadata: kube::api::ObjectMeta { name: Some("u67aceff11a66c1fa7c99726c-openwebui".to_string()), @@ -145,12 +151,20 @@ mod test { ..Default::default() }, }; - // print as json + // ensure that we can serialize the OpenWebUI struct to JSON match serde_json::to_string_pretty(&owui) { Ok(json) => println!("Successfully serialized OpenWebUI to JSON:\n{}", json), Err(e) => eprintln!("Failed to serialize OpenWebUI to JSON: {}", e), } - // KubeAPI::new(owui); + // rustls::crypto::ring::default_provider() + // .install_default() + // .expect("Cannot install default provider with ring"); + // crate::kube::init_once().await; + // + // KubeAPI::new(owui) + // .create(CONFIG.owui_namespace.as_str()) + // .await + // .unwrap(); } } From 26f0b1f55ad0279ebe2c3cc5b935dd1e22c377b5 Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Mon, 16 Feb 2026 09:32:41 -0500 Subject: [PATCH 04/12] wip tomls --- config/openwebui.toml | 17 ++++++++ src/kube/openwebui/mod.rs | 85 ++------------------------------------- 2 files changed, 20 insertions(+), 82 deletions(-) create mode 100644 config/openwebui.toml diff --git a/config/openwebui.toml b/config/openwebui.toml new file mode 100644 index 00000000..3429024d --- /dev/null +++ b/config/openwebui.toml @@ -0,0 +1,17 @@ +[openwebui] +namespace = "openwebui" +service_port = 8080 + +[openwebui.image] +registry = "quay.io" +repository = "ibmdpdev/open-webui-spati" +tag = "latest" +pull_policy = "Always" + +[openwebui.persistence] +size = "5Gi" +storage_class = "gp3" + +[openwebui.env] +MOLVIEWER_URL = "moleviewer.open.accelerate.science" +WEBUI_SECRET = "1GOKv7uv358t82Km2iPrd4hXNuwFlDwNlg72l9sOyLI6EK" diff --git a/src/kube/openwebui/mod.rs b/src/kube/openwebui/mod.rs index af5df775..26e138cb 100644 --- a/src/kube/openwebui/mod.rs +++ b/src/kube/openwebui/mod.rs @@ -6,38 +6,6 @@ use serde::{Deserialize, Serialize}; pub const OWUI: &str = "owui"; -/* -apiVersion: accelerate.science/v1 -kind: Owui -metadata: - name: u67aceff11a66c1fa7c99726c-openwebui - namespace: openwebui -spec: - # will remove this... makes no sense to have this - replica: 1 - retainPVC: false - - servicePort: 8080 - - image: - registry: quay.io - repository: ibmdpdev/open-webui-spati - tag: latest - pullPolicy: Always - - persistence: - size: 2Gi - storageClass: gp3 - - env: - - name: MOLVIEWER_URL - value: "moleviewer.open.accelerate.science" - - name: WEBUI_SECRET_KEY - # i dunno just make one up - value: "idontcarewhatthisisbecuasethisisrequiredforsomereason" - */ - -// This is a placeholder for openwebui CRD #[derive(CustomResource, Clone, Deserialize, Serialize, Debug, JsonSchema)] #[kube( group = "accelerate.science", @@ -80,45 +48,8 @@ struct Env { #[cfg(test)] mod test { - // use crate::config::CONFIG; - // use crate::kube::KubeAPI; - - #[tokio::test] - async fn test_deserialize_owui() { - // let yaml_data = r#" - // apiVersion: accelerate.science/v1 - // kind: Owui - // metadata: - // name: u67aceff11a66c1fa7c99726c-openwebui - // namespace: openwebui - // spec: - // # will remove this... makes no sense to have this - // replica: 1 - // retainPVC: false - // - // servicePort: 8080 - // - // image: - // registry: quay.io - // repository: ibmdpdev/open-webui-spati - // tag: latest - // pullPolicy: Always - // - // persistence: - // size: 2Gi - // storageClass: gp3 - // - // env: - // - name: MOLVIEWER_URL - // value: "moleviewer.open.accelerate.science" - // - name: WEBUI_SECRET_KEY - // value: "idontcarewhatthisisbecuasethisisrequiredforsomereason" - // "#; - // match serde_json::from_str::(yaml_data) { - // Ok(owui) => println!("Successfully deserialized OpenWebUI: {:?}", owui), - // Err(e) => eprintln!("Failed to deserialize OpenWebUI: {}", e), - // } - + #[test] + fn test_deserialize_owui() { let owui = super::Owui { spec: super::OpenWebUI { replica: 1, @@ -154,17 +85,7 @@ mod test { // ensure that we can serialize the OpenWebUI struct to JSON match serde_json::to_string_pretty(&owui) { Ok(json) => println!("Successfully serialized OpenWebUI to JSON:\n{}", json), - Err(e) => eprintln!("Failed to serialize OpenWebUI to JSON: {}", e), + Err(e) => panic!("Failed to serialize OpenWebUI to JSON: {}", e), } - - // rustls::crypto::ring::default_provider() - // .install_default() - // .expect("Cannot install default provider with ring"); - // crate::kube::init_once().await; - // - // KubeAPI::new(owui) - // .create(CONFIG.owui_namespace.as_str()) - // .await - // .unwrap(); } } From b06b72a1388a1b07f846fb55d62b80bad419a462 Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Mon, 23 Feb 2026 16:12:36 -0500 Subject: [PATCH 05/12] wip --- Cargo.lock | 73 ++++++----- config/openwebui.toml | 1 + src/config/mod.rs | 83 ++++++++++--- src/db/models.rs | 9 ++ src/errors/mod.rs | 3 + src/kube/mod.rs | 2 +- src/kube/models.rs | 6 + src/kube/openwebui/mod.rs | 67 +++++----- src/web/mod.rs | 2 +- src/web/route/openwebui/mod.rs | 148 +++++++++++++++++++++-- src/web/route/portal/group_admin/mod.rs | 2 +- src/web/route/portal/system_admin/mod.rs | 2 +- src/web/route/portal/user_htmx.rs | 2 +- 13 files changed, 304 insertions(+), 96 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ce1b12c5..aa52733c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -456,9 +456,9 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "bitvec" @@ -622,9 +622,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.55" +version = "1.2.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b26a0954ae34af09b50f0de26458fa95369a0d478d8236d3f93082b219bd29" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ "find-msvc-tools", "jobserver", @@ -1363,9 +1363,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -1378,9 +1378,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -1388,15 +1388,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -1405,15 +1405,15 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", @@ -1422,21 +1422,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -1446,7 +1446,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -2360,9 +2359,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.181" +version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459427e2af2b9c839b132acb702a1c654d95e10f8c326bfc2ad11310e458b1c5" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" [[package]] name = "libm" @@ -3710,9 +3709,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.5.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" dependencies = [ "bitflags", "core-foundation 0.10.1", @@ -3723,9 +3722,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.15.0" +version = "2.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +checksum = "321c8673b092a9a42605034a9879d73cb79101ed5fd117bc9a597b89b4e9e61a" dependencies = [ "core-foundation-sys", "libc", @@ -4083,9 +4082,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.115" +version = "2.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e614ed320ac28113fa64972c4262d5dbc89deacdfd00c34a3e4cea073243c12" +checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" dependencies = [ "proc-macro2", "quote", @@ -4370,9 +4369,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.0.1+spec-1.1.0" +version = "1.0.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe30f93627849fa362d4a602212d41bb237dc2bd0f8ba0b2ce785012e124220" +checksum = "d1dfefef6a142e93f346b64c160934eb13b5594b84ab378133ac6815cb2bd57f" dependencies = [ "indexmap 2.13.0", "serde_core", @@ -4394,9 +4393,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.8+spec-1.1.0" +version = "1.0.9+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0742ff5ff03ea7e67c8ae6c93cac239e0d9784833362da3f9a9c1da8dfefcbdc" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" dependencies = [ "winnow", ] @@ -4587,9 +4586,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-normalization" diff --git a/config/openwebui.toml b/config/openwebui.toml index 3429024d..444225ad 100644 --- a/config/openwebui.toml +++ b/config/openwebui.toml @@ -1,6 +1,7 @@ [openwebui] namespace = "openwebui" service_port = 8080 +openweb_url = "oweb.open.accelerate.science" [openwebui.image] registry = "quay.io" diff --git a/src/config/mod.rs b/src/config/mod.rs index 49a8757c..31bd24d2 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -44,9 +44,7 @@ pub struct Configuration { #[cfg(feature = "chemchat")] pub chemchat_internal_url: String, #[cfg(feature = "openwebui")] - pub owui_namespace: String, - #[cfg(feature = "openwebui")] - pub openweb_url: String, + pub owui: OwuiConfig, #[cfg(feature = "openwebui")] pub moleviewer_url: String, #[cfg(feature = "openwebui")] @@ -54,6 +52,20 @@ pub struct Configuration { pub bridge_url: String, } +#[cfg(feature = "openwebui")] +pub struct OwuiConfig { + pub namespace: String, + pub service_port: u16, + pub url: String, + pub registry: String, + pub repository: String, + pub tag: String, + pub pull_policy: String, + pub env: Vec<(String, String)>, + pub persistence_size: String, + pub persistence_storage_class: String, +} + pub struct Database { pub url: String, pub name: String, @@ -169,6 +181,12 @@ pub fn init_once() -> Configuration { toml::from_str(&read_to_string(PathBuf::from_str(database_location_str).unwrap()).unwrap()) .unwrap(); + #[cfg(feature = "openwebui")] + let owui_table: toml::Table = toml::from_str( + &read_to_string(PathBuf::from_str("config/openwebui.toml").unwrap()).unwrap(), + ) + .unwrap(); + let mongo_table = db_table["mongodb"].as_table().unwrap(); let db = Database { url: if cfg!(debug_assertions) { @@ -236,31 +254,63 @@ pub fn init_once() -> Configuration { ) .unwrap(); - #[cfg(feature = "openwebui")] - let (owui_namespace, openweb_url, moleviewer_url, moleviewer_internal_url) = { + #[cfg(feature = "chemchat")] + let (chemchat_url, chemchat_internal_url) = { ( - app_conf["owui_namespace"].as_str().unwrap().to_string(), - app_conf["openweb_url"].as_str().unwrap().to_string(), - app_conf["moleviewer_url"].as_str().unwrap().to_string(), - app_conf["moleviewer_internal_url"] + app_conf["chemchat_url"].as_str().unwrap().to_string(), + app_conf["chemchat_internal_url"] .as_str() .unwrap() .to_string(), ) }; - #[cfg(feature = "chemchat")] - let (chemchat_url, chemchat_internal_url) = { + let bridge_url = app_conf["bridge_url"].as_str().unwrap().to_string(); + + #[cfg(feature = "openwebui")] + let (moleviewer_url, moleviewer_internal_url) = { ( - app_conf["chemchat_url"].as_str().unwrap().to_string(), - app_conf["chemchat_internal_url"] + app_conf["moleviewer_url"].as_str().unwrap().to_string(), + app_conf["moleviewer_internal_url"] .as_str() .unwrap() .to_string(), ) }; - let bridge_url = app_conf["bridge_url"].as_str().unwrap().to_string(); + #[cfg(feature = "openwebui")] + let owui = { + let owui_config = owui_table["openwebui"].as_table().unwrap(); + let image = owui_config["image"].as_table(); + let persistence = owui_config["persistence"].as_table(); + let env: Vec<_> = owui_config["env"] + .as_array() + .unwrap() + .iter() + .map(|item| { + let item = item.as_table().unwrap(); + let name = item["name"].as_str().unwrap().to_string(); + let value = item["value"].as_str().unwrap().to_string(); + (name, value) + }) + .collect(); + + OwuiConfig { + namespace: owui_config["namespace"].as_str().unwrap().to_string(), + service_port: owui_config["service_port"].as_integer().unwrap() as u16, + url: owui_config["url"].as_str().unwrap().to_string(), + registry: image.unwrap()["registry"].as_str().unwrap().to_string(), + repository: image.unwrap()["repository"].as_str().unwrap().to_string(), + tag: image.unwrap()["tag"].as_str().unwrap().to_string(), + pull_policy: image.unwrap()["pull_policy"].as_str().unwrap().to_string(), + env, + persistence_size: persistence.unwrap()["size"].as_str().unwrap().to_string(), + persistence_storage_class: persistence.unwrap()["storage_class"] + .as_str() + .unwrap() + .to_string(), + } + }; Configuration { encoder, @@ -284,10 +334,7 @@ pub fn init_once() -> Configuration { chemchat_url, #[cfg(feature = "chemchat")] chemchat_internal_url, - #[cfg(feature = "openwebui")] - owui_namespace, - #[cfg(feature = "openwebui")] - openweb_url, + owui, #[cfg(feature = "openwebui")] moleviewer_url, #[cfg(feature = "openwebui")] diff --git a/src/db/models.rs b/src/db/models.rs index 12b25fbb..dbc72482 100644 --- a/src/db/models.rs +++ b/src/db/models.rs @@ -50,6 +50,8 @@ pub struct User { pub user_type: UserType, pub token: Option, pub notebook: Option, + #[cfg_attr(feature = "openwebui", serde(skip_serializing_if = "Option::is_none"))] + pub owui: Option, pub created_at: time::OffsetDateTime, pub updated_at: time::OffsetDateTime, pub last_updated_by: String, @@ -91,6 +93,13 @@ pub struct NotebookInfo { pub persist_pvc: bool, } +#[derive(Debug, Default, Deserialize, Serialize)] +pub struct OwuiInfo { + pub start_time: Option, + pub last_active: Option, + pub persist_pvc: bool, +} + #[derive(Debug, Deserialize, Serialize)] pub struct UserNotebook { pub name: String, diff --git a/src/errors/mod.rs b/src/errors/mod.rs index 90d6f98c..6da0fb0e 100644 --- a/src/errors/mod.rs +++ b/src/errors/mod.rs @@ -27,6 +27,8 @@ pub enum BridgeError { NotAdmin, #[error("{0}")] Unauthorized(String), + #[error("{0}")] + Forbidden(String), #[error("Inference-Service header not found")] InferenceServiceHeaderNotFound, #[error("Service {0} does does not exist")] @@ -184,6 +186,7 @@ impl ResponseError for BridgeError { BridgeError::UserNotFound(_) => StatusCode::FORBIDDEN, BridgeError::NotAdmin => StatusCode::FORBIDDEN, + BridgeError::Forbidden(_) => StatusCode::FORBIDDEN, #[cfg(feature = "notebook")] BridgeError::NotebookAccessError(_) => StatusCode::FORBIDDEN, diff --git a/src/kube/mod.rs b/src/kube/mod.rs index c365c6bb..29506395 100644 --- a/src/kube/mod.rs +++ b/src/kube/mod.rs @@ -12,4 +12,4 @@ pub use notebook::{ #[cfg(feature = "openwebui")] mod openwebui; #[cfg(feature = "openwebui")] -pub use openwebui::OWUI; +pub use openwebui::{Env, Image, OWUI, OpenWebUI, Owui, Persistence}; diff --git a/src/kube/models.rs b/src/kube/models.rs index 16e989b1..5aea52c7 100644 --- a/src/kube/models.rs +++ b/src/kube/models.rs @@ -48,6 +48,12 @@ where )) } + pub async fn get_crds(namespace: &str) -> Result> { + let crd = Api::::namespaced(Self::get_kube_client()?.clone(), namespace); + let list = crd.list(&Default::default()).await?; + Ok(list.items) + } + pub async fn create(&self, namespace: &str) -> Result { let crd = Api::::namespaced(Self::get_kube_client()?.clone(), namespace); let pp = PostParams::default(); diff --git a/src/kube/openwebui/mod.rs b/src/kube/openwebui/mod.rs index 26e138cb..963bc35c 100644 --- a/src/kube/openwebui/mod.rs +++ b/src/kube/openwebui/mod.rs @@ -1,5 +1,7 @@ #![allow(dead_code)] +use std::borrow::Cow; + use kube::CustomResource; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; @@ -13,41 +15,43 @@ pub const OWUI: &str = "owui"; kind = "Owui", namespaced )] -struct OpenWebUI { - replica: u8, +pub struct OpenWebUI { + pub replica: u8, #[serde(rename = "retainPVC")] - retain_pvc: bool, + pub retain_pvc: bool, #[serde(rename = "servicePort")] - service_port: u16, - image: Image, - persistence: Persistence, - env: Vec, + pub service_port: u16, + pub image: Image, + pub persistence: Persistence, + pub env: Vec, } #[derive(Clone, Deserialize, Serialize, Debug, JsonSchema)] -struct Image { - registry: String, - repository: String, - tag: String, +pub struct Image { + pub registry: Cow<'static, str>, + pub repository: Cow<'static, str>, + pub tag: Cow<'static, str>, #[serde(rename = "pullPolicy")] - pull_policy: String, + pub pull_policy: Cow<'static, str>, } #[derive(Clone, Deserialize, Serialize, Debug, JsonSchema)] -struct Persistence { - size: String, +pub struct Persistence { + pub size: Cow<'static, str>, #[serde(rename = "storageClass")] - storage_class: String, + pub storage_class: Cow<'static, str>, } #[derive(Clone, Deserialize, Serialize, Debug, JsonSchema)] -struct Env { - name: String, - value: String, +pub struct Env { + pub name: Cow<'static, str>, + pub value: Cow<'static, str>, } #[cfg(test)] mod test { + use std::borrow::Cow; + #[test] fn test_deserialize_owui() { let owui = super::Owui { @@ -56,24 +60,24 @@ mod test { retain_pvc: false, service_port: 8080, image: super::Image { - registry: "quay.io".to_string(), - repository: "ibmdpdev/open-webui-spati".to_string(), - tag: "latest".to_string(), - pull_policy: "Always".to_string(), + registry: Cow::from("quay.io"), + repository: Cow::from("ibmdpdev/open-webui-spati"), + tag: Cow::from("latest"), + pull_policy: Cow::from("Always"), }, env: vec![ super::Env { - name: "MOLVIEWER_URL".to_string(), - value: "moleviewer.open.accelerate.science".to_string(), + name: Cow::from("MOLVIEWER_URL"), + value: Cow::from("moleviewer.open.accelerate.science"), }, super::Env { - name: "WEBUI_SECRET_KEY".to_string(), - value: "idontcarewhatthisisbecuasethisisrequiredforsomereason".to_string(), + name: Cow::from("WEBUI_SECRET_KEY"), + value: Cow::from("idontcarewhatthisisbecuasethisisrequiredforsomereason"), }, ], persistence: super::Persistence { - size: "2Gi".to_string(), - storage_class: "gp3".to_string(), + size: Cow::from("2Gi"), + storage_class: Cow::from("gp3"), }, }, metadata: kube::api::ObjectMeta { @@ -87,5 +91,12 @@ mod test { Ok(json) => println!("Successfully serialized OpenWebUI to JSON:\n{}", json), Err(e) => panic!("Failed to serialize OpenWebUI to JSON: {}", e), } + // rustls::crypto::ring::default_provider() + // .install_default() + // .expect("Cannot install default provider with ring"); + // + // crate::kube::init_once().await; + // let k = KubeAPI::new(owui); + // k.create("openwebui").await.unwrap(); } } diff --git a/src/web/mod.rs b/src/web/mod.rs index 3b83794a..58592897 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -146,7 +146,7 @@ pub async fn start_server(with_tls: bool) -> Result<()> { use self::bridge_middleware::{CookieCheck, OWUICookieCheck}; app.service( web::scope("") - .guard(guard::Host(&CONFIG.openweb_url)) + .guard(guard::Host(&CONFIG.owui.url)) .wrap(OWUICookieCheck) .configure(route::openwebui::config_openwebui), ) diff --git a/src/web/route/openwebui/mod.rs b/src/web/route/openwebui/mod.rs index 04d535d4..ae6212ed 100644 --- a/src/web/route/openwebui/mod.rs +++ b/src/web/route/openwebui/mod.rs @@ -1,4 +1,4 @@ -use std::{collections::HashSet, str::FromStr, sync::LazyLock}; +use std::{borrow::Cow, collections::HashSet, marker::PhantomData, str::FromStr, sync::LazyLock}; use actix_web::{ HttpRequest, HttpResponse, @@ -7,19 +7,29 @@ use actix_web::{ http::Method, web::{self, ReqData}, }; +use kube::api::ObjectMeta; +use mongodb::bson::doc; use tracing::instrument; use url::Url; use crate::{ config::CONFIG, - db::models::OWUICookie, + db::{ + Database, + models::{OWUICookie, OwuiInfo, USER, User}, + mongo::DB, + }, errors::{BridgeError, Result}, - web::helper::{self, forwarding}, + kube::{Env, Image, KubeAPI, OpenWebUI, Owui, Persistence}, + web::{ + bson, + helper::{self, forwarding}, + }, }; const OWUI_PORT: &str = "8080"; -pub static OWUI_NAMESPACE: LazyLock<&str> = LazyLock::new(|| &CONFIG.owui_namespace); +pub static OWUI_NAMESPACE: LazyLock<&str> = LazyLock::new(|| &CONFIG.owui.namespace); static WHITELIST_ENDPOINTS: LazyLock> = LazyLock::new(|| { HashSet::from([ "/api/v1/auths", @@ -103,6 +113,131 @@ async fn openwebui_forward( .await } +async fn create_owui( + req: HttpRequest, + payload: web::Payload, + method: Method, + peer_addr: Option, + owui_cookie: Option>, + db: web::Data<&DB>, + client: web::Data, +) -> Result { + if let Some(owui_cookie) = owui_cookie { + let subject = &owui_cookie.into_inner().subject; + let name = format!("u{}-openwebui", subject); + + let user: User = helper::log_with_level!( + db.find( + doc! { + "_id": subject, + }, + USER, + ) + .await, + error + )?; + + // check if an instance alreadu exists + let list_owui = KubeAPI::::get_crds(&CONFIG.owui.namespace).await?; + if list_owui + .iter() + .any(|o| o.metadata.name.as_ref().unwrap_or(&"".to_string()) == &name) + { + return Err(BridgeError::CRDExistsError(format!( + "OWUI instance already exists for user {}", + name + ))); + } + + let persist = req + .uri() + .query() + .map(|q| q.contains("persist=true")) + .unwrap_or(false); + + // create instance + let owui = Owui { + metadata: ObjectMeta { + name: Some(name), + namespace: Some(CONFIG.owui.namespace.clone()), + ..Default::default() + }, + spec: OpenWebUI { + replica: 1, // TODO: this needs to be removed from the operator.., for now set to 1 + retain_pvc: persist, + service_port: CONFIG.owui.service_port, + image: Image { + registry: Cow::from(&CONFIG.owui.registry), + repository: Cow::from(&CONFIG.owui.repository), + tag: Cow::from(&CONFIG.owui.tag), + pull_policy: Cow::from(&CONFIG.owui.pull_policy), + }, + persistence: Persistence { + size: Cow::from(&CONFIG.owui.persistence_size), + storage_class: Cow::from(&CONFIG.owui.persistence_storage_class), + }, + env: CONFIG + .owui + .env + .iter() + .map(|kv| Env { + name: Cow::from(&kv.0), + value: Cow::from(&kv.1), + }) + .collect(), + }, + }; + if let Err(e) = KubeAPI::new(owui).create(&CONFIG.owui.namespace).await { + return helper::log_with_level!( + Err(BridgeError::GeneralError(format!( + "Failed to create OWUI instance: {e}" + ))), + error + ); + } + + // update DB with instance information + let current_time = time::OffsetDateTime::now_utc(); + let r = db + .update( + doc! { + "_id": subject, + }, + doc! { + "$set": doc! { + "updated_at": bson(current_time)?, + "owui": bson(OwuiInfo{ + start_time: Some(current_time), + last_active: None, + persist_pvc: persist, + })?, + "last_updated_by": &user.sub, + }, + }, + USER, + PhantomData::, + ) + .await; + + // return + } + helper::log_with_level!( + Err(BridgeError::Forbidden( + "User does not have access to OWUI... middleware should have prevented this" + .to_string() + )), + error + ) +} + +async fn delete_owui() -> Result { + todo!() +} + +async fn status_owui() -> Result { + todo!() +} + #[inline] pub(crate) fn make_forward_url(protocol: &str, subject: &str) -> String { let namespace = *OWUI_NAMESPACE; @@ -125,9 +260,6 @@ mod tests { let port = "8080"; let expected_url = format!("{protocol}://u{subject}-openwebui.{namespace}.svc.cluster.local:{port}"); - assert_eq!( - super::make_forward_url(protocol, subject), - expected_url - ); + assert_eq!(super::make_forward_url(protocol, subject), expected_url); } } diff --git a/src/web/route/portal/group_admin/mod.rs b/src/web/route/portal/group_admin/mod.rs index e0e59903..57b10f07 100644 --- a/src/web/route/portal/group_admin/mod.rs +++ b/src/web/route/portal/group_admin/mod.rs @@ -132,7 +132,7 @@ pub(super) async fn group( use crate::config::CONFIG; ctx.insert("openwebui", &owui_cookie.subject); - ctx.insert("owui_url", &CONFIG.openweb_url); + ctx.insert("owui_url", &CONFIG.owui.url); } // add notebook tab if user has a notebook subscription diff --git a/src/web/route/portal/system_admin/mod.rs b/src/web/route/portal/system_admin/mod.rs index 9fed4aaa..c2916a26 100644 --- a/src/web/route/portal/system_admin/mod.rs +++ b/src/web/route/portal/system_admin/mod.rs @@ -137,7 +137,7 @@ pub(super) async fn system( use crate::config::CONFIG; ctx.insert("openwebui", &owui_cookie.subject); - ctx.insert("owui_url", &CONFIG.openweb_url); + ctx.insert("owui_url", &CONFIG.owui.url); } // add notebook tab if user has a notebook subscription diff --git a/src/web/route/portal/user_htmx.rs b/src/web/route/portal/user_htmx.rs index cd236d54..5937e0ae 100644 --- a/src/web/route/portal/user_htmx.rs +++ b/src/web/route/portal/user_htmx.rs @@ -94,7 +94,7 @@ impl<'p> Profile<'p> { use crate::config::CONFIG; context.insert("openwebui", &owui_cookie.subject); - context.insert("owui_url", &CONFIG.openweb_url); + context.insert("owui_url", &CONFIG.owui.url); } #[cfg(feature = "notebook")] From 0ee04773d3536aa7ce698d86c7792e4c4a465475 Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Wed, 25 Feb 2026 13:33:49 -0500 Subject: [PATCH 06/12] updating persist for owui --- Cargo.lock | 109 +++++++++--------- Cargo.toml | 8 +- config/openwebui.toml | 5 +- src/config/mod.rs | 8 +- src/db/models.rs | 1 - src/db/mongo.rs | 1 + src/logger/mod.rs | 38 +++---- src/web/route/auth/mod.rs | 1 + src/web/route/openwebui/mod.rs | 137 +++++++++++++++++++---- src/web/route/portal/system_admin/mod.rs | 2 +- templates/components/owui/owui.html | 20 ++-- templates/components/owui/poll.html | 7 ++ templates/components/owui/ready.html | 16 +++ templates/components/owui/start.html | 65 +++++++++++ 14 files changed, 302 insertions(+), 116 deletions(-) create mode 100644 templates/components/owui/poll.html create mode 100644 templates/components/owui/ready.html create mode 100644 templates/components/owui/start.html diff --git a/Cargo.lock b/Cargo.lock index aa52733c..d216a68f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,9 +44,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.11.2" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7926860314cbe2fb5d1f13731e387ab43bd32bca224e82e6e2db85de0a3dba49" +checksum = "f860ee6746d0c5b682147b2f7f8ef036d4f92fe518251a3a35ffa3650eafdf0e" dependencies = [ "actix-codec", "actix-rt", @@ -94,9 +94,9 @@ dependencies = [ [[package]] name = "actix-router" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13d324164c51f63867b57e73ba5936ea151b8a41a1d23d1031eeb9f70d0236f8" +checksum = "14f8c75c51892f18d9c46150c5ac7beb81c95f78c8b83a634d49f4ca32551fe7" dependencies = [ "bytestring", "cfg-if", @@ -175,9 +175,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.12.1" +version = "4.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1654a77ba142e37f049637a3e5685f864514af11fcbc51cb51eb6596afe5b8d6" +checksum = "ff87453bc3b56e9b2b23c1cc0b1be8797184accf51d2abe0f8a33ec275d316bf" dependencies = [ "actix-codec", "actix-http", @@ -246,16 +246,18 @@ dependencies = [ [[package]] name = "actix-ws" -version = "0.3.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12d4f2fbee3ef7a22fa6cb0e416b962237a167ed0419f22d4e451da2d7f082f8" +checksum = "decf53c3cdd63dd6f289980b430238f9a2f6d19f8bce8e418272e08d3da43f0f" dependencies = [ "actix-codec", "actix-http", "actix-web", "bytestring", "futures-core", + "futures-sink", "tokio", + "tokio-util", ] [[package]] @@ -318,9 +320,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.101" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "arcstr" @@ -399,9 +401,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.15.4" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b7b6141e96a8c160799cc2d5adecd5cbbe5054cb8c7c4af53da0f83bb7ad256" +checksum = "d9a7b350e3bb1767102698302bc37256cbd48422809984b98d292c40e2579aa9" dependencies = [ "aws-lc-sys", "zeroize", @@ -601,9 +603,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bytes" @@ -663,9 +665,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "js-sys", @@ -1017,9 +1019,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.6" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", "serde_core", @@ -2077,9 +2079,9 @@ checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "jiff" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c867c356cc096b33f4981825ab281ecba3db0acefe60329f044c1789d94c6543" +checksum = "b3e3d65f018c6ae946ab16e80944b97096ed73c35b221d1c478a6c81d8f57940" dependencies = [ "jiff-static", "log", @@ -2090,9 +2092,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7946b4325269738f270bb55b3c19ab5c5040525f83fd625259422a9d25d9be5" +checksum = "a17c2b211d863c7fde02cbea8a3c1a439b98e109286554f2860bdded7ff83818" dependencies = [ "proc-macro2", "quote", @@ -2133,9 +2135,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.85" +version = "0.3.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +checksum = "f4eacb0641a310445a4c513f2a5e23e19952e269c6a38887254d5f837a305506" dependencies = [ "once_cell", "wasm-bindgen", @@ -3270,9 +3272,9 @@ checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" [[package]] name = "redis" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e969d1d702793536d5fda739a82b88ad7cbe7d04f8386ee8cd16ad3eff4854a5" +checksum = "dbe7f6e08ce1c6a9b21684e643926f6fc3b683bc006cb89afd72a5e0eb16e3a2" dependencies = [ "arcstr", "bytes", @@ -3352,9 +3354,9 @@ checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "reqwest" @@ -3526,9 +3528,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.36" +version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ "aws-lc-rs", "log", @@ -3709,9 +3711,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.6.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ "bitflags", "core-foundation 0.10.1", @@ -3722,9 +3724,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.16.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321c8673b092a9a42605034a9879d73cb79101ed5fd117bc9a597b89b4e9e61a" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -4082,9 +4084,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.116" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -4362,6 +4364,7 @@ dependencies = [ "futures-core", "futures-io", "futures-sink", + "futures-util", "pin-project-lite", "slab", "tokio", @@ -4369,9 +4372,9 @@ dependencies = [ [[package]] name = "toml" -version = "1.0.2+spec-1.1.0" +version = "1.0.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1dfefef6a142e93f346b64c160934eb13b5594b84ab378133ac6815cb2bd57f" +checksum = "c7614eaf19ad818347db24addfa201729cf2a9b6fdfd9eb0ab870fcacc606c0c" dependencies = [ "indexmap 2.13.0", "serde_core", @@ -4670,11 +4673,11 @@ dependencies = [ [[package]] name = "uuid" -version = "1.20.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee48d38b119b0cd71fe4141b30f5ba9c7c5d9f4e7a3a8b4a674e4b6ef789976f" +checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" dependencies = [ - "getrandom 0.3.4", + "getrandom 0.4.1", "js-sys", "serde_core", "wasm-bindgen", @@ -4749,9 +4752,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.108" +version = "0.2.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +checksum = "05d7d0fce354c88b7982aec4400b3e7fcf723c32737cef571bd165f7613557ee" dependencies = [ "cfg-if", "once_cell", @@ -4762,9 +4765,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.58" +version = "0.4.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +checksum = "ee85afca410ac4abba5b584b12e77ea225db6ee5471d0aebaae0861166f9378a" dependencies = [ "cfg-if", "futures-util", @@ -4776,9 +4779,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.108" +version = "0.2.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +checksum = "55839b71ba921e4f75b674cb16f843f4b1f3b26ddfcb3454de1cf65cc021ec0f" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4786,9 +4789,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.108" +version = "0.2.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +checksum = "caf2e969c2d60ff52e7e98b7392ff1588bffdd1ccd4769eba27222fd3d621571" dependencies = [ "bumpalo", "proc-macro2", @@ -4799,9 +4802,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.108" +version = "0.2.112" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +checksum = "0861f0dcdf46ea819407495634953cdcc8a8c7215ab799a7a7ce366be71c7b30" dependencies = [ "unicode-ident", ] @@ -4855,9 +4858,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.85" +version = "0.3.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +checksum = "10053fbf9a374174094915bbce141e87a6bf32ecd9a002980db4b638405e8962" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/Cargo.toml b/Cargo.toml index 0d8510d5..f30dfc4a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ time = { version = "0.3.36", features = ["serde"] } parking_lot = "~0.12" num-bigint = "~0.4" # Web deps -actix-web = { version = "~4.12", features = ["rustls-0_23", "cookies"] } +actix-web = { version = "~4.13", features = ["rustls-0_23", "cookies"] } actix-web-httpauth = "0.8" actix-files = "0.6.6" tera = { version = "1.20.0", features= ["builtins"] } @@ -43,7 +43,7 @@ reqwest = { version = "0.13", features = ["stream", "json"] } url = "2.5.0" toml = "1.0.1" urlencoding = "2.1.3" -actix-ws = "0.3.0" +actix-ws = "0.4.0" tokio-tungstenite = { version = "0.28", features = ["url", "rustls-tls-native-roots"] } # Auth deps rust-argon2 = "~3.0" @@ -65,7 +65,7 @@ regex = "~1.12" thiserror = "2" # DB mongodb = "=3.5" -redis = { version = "=1.0.3", features = ["tokio-comp", "num-bigint"] } +redis = { version = "=1.0.4", features = ["tokio-comp", "num-bigint"] } #macro utils = { path = "utils" } # Kubernetes @@ -78,7 +78,7 @@ mimalloc = "~0.1" # security base64 = "~0.22.1" rand = "~0.10" -uuid = { version = "~1.20", features = ["v4"] } +uuid = { version = "~1.21", features = ["v4"] } [dev-dependencies] jsonwebkey = { version = "~0.4", features = ["jwt-convert"] } diff --git a/config/openwebui.toml b/config/openwebui.toml index 444225ad..0e549504 100644 --- a/config/openwebui.toml +++ b/config/openwebui.toml @@ -1,7 +1,7 @@ [openwebui] namespace = "openwebui" service_port = 8080 -openweb_url = "oweb.open.accelerate.science" +url = "oweb.open.accelerate.science" [openwebui.image] registry = "quay.io" @@ -13,6 +13,7 @@ pull_policy = "Always" size = "5Gi" storage_class = "gp3" -[openwebui.env] +[[openwebui.env]] MOLVIEWER_URL = "moleviewer.open.accelerate.science" +[[openwebui.env]] WEBUI_SECRET = "1GOKv7uv358t82Km2iPrd4hXNuwFlDwNlg72l9sOyLI6EK" diff --git a/src/config/mod.rs b/src/config/mod.rs index 31bd24d2..a674db89 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -166,7 +166,7 @@ pub fn init_once() -> Configuration { let (config_location_str, database_location_str) = if cfg!(debug_assertions) { ( - "config/configurations_sample.toml", + "config/configurations.toml", "config/database_sample.toml", ) } else { @@ -289,9 +289,9 @@ pub fn init_once() -> Configuration { .iter() .map(|item| { let item = item.as_table().unwrap(); - let name = item["name"].as_str().unwrap().to_string(); - let value = item["value"].as_str().unwrap().to_string(); - (name, value) + let name = item.keys().next().unwrap(); + let value = item.values().next().unwrap(); + (name.to_string(), value.to_string()) }) .collect(); diff --git a/src/db/models.rs b/src/db/models.rs index dbc72482..7ee844fb 100644 --- a/src/db/models.rs +++ b/src/db/models.rs @@ -97,7 +97,6 @@ pub struct NotebookInfo { pub struct OwuiInfo { pub start_time: Option, pub last_active: Option, - pub persist_pvc: bool, } #[derive(Debug, Deserialize, Serialize)] diff --git a/src/db/mongo.rs b/src/db/mongo.rs index 699d6eac..52cb9e09 100644 --- a/src/db/mongo.rs +++ b/src/db/mongo.rs @@ -442,6 +442,7 @@ mod tests { user_type: UserType::SystemAdmin, token: None, notebook: None, + owui: None, created_at: time, updated_at: time, last_updated_by: "choi.mina@gmail.com".to_string(), diff --git a/src/logger/mod.rs b/src/logger/mod.rs index cb14fb68..aace6b46 100644 --- a/src/logger/mod.rs +++ b/src/logger/mod.rs @@ -26,25 +26,25 @@ pub fn start_logger(level: LevelFilter, _client: Client, _tx: Sender<()>) { .with_filter(level), ); - #[cfg(feature = "observe")] - let ts = { - use crate::config::CONFIG; - - if let Some((ref api_key, ref endpoint)) = CONFIG.observability_cred { - use crate::db::mongo::DBCONN; - - let writer = observability::Observe::new(api_key, endpoint, _client) - .expect("Failed to create observability for logger"); - let observe_layer = observability::ObserveEvents::new( - DBCONN.get().expect("DB connection not initialized"), - _tx, - ); - - ts.with(writer.wrap_layer(level)).with(observe_layer) - } else { - panic!("Observability credentials are not set in the configuration") - } - }; + // #[cfg(feature = "observe")] + // let ts = { + // use crate::config::CONFIG; + // + // if let Some((ref api_key, ref endpoint)) = CONFIG.observability_cred { + // use crate::db::mongo::DBCONN; + // + // let writer = observability::Observe::new(api_key, endpoint, _client) + // .expect("Failed to create observability for logger"); + // let observe_layer = observability::ObserveEvents::new( + // DBCONN.get().expect("DB connection not initialized"), + // _tx, + // ); + // + // ts.with(writer.wrap_layer(level)).with(observe_layer) + // } else { + // panic!("Observability credentials are not set in the configuration") + // } + // }; ts.init() } diff --git a/src/web/route/auth/mod.rs b/src/web/route/auth/mod.rs index 3d01c9bc..fd6cedd8 100644 --- a/src/web/route/auth/mod.rs +++ b/src/web/route/auth/mod.rs @@ -181,6 +181,7 @@ async fn code_to_response( user_type: UserType::User, token: None, notebook: None, + owui: None, created_at: time, updated_at: time, last_updated_by: email, diff --git a/src/web/route/openwebui/mod.rs b/src/web/route/openwebui/mod.rs index ae6212ed..ddab6375 100644 --- a/src/web/route/openwebui/mod.rs +++ b/src/web/route/openwebui/mod.rs @@ -1,14 +1,17 @@ use std::{borrow::Cow, collections::HashSet, marker::PhantomData, str::FromStr, sync::LazyLock}; use actix_web::{ - HttpRequest, HttpResponse, + HttpRequest, HttpResponse, delete, dev::PeerAddr, get, - http::Method, + http::{Method, header::ContentType}, + post, web::{self, ReqData}, }; +use k8s_openapi::api::core::v1::PersistentVolumeClaim; use kube::api::ObjectMeta; use mongodb::bson::doc; +use tera::{Context, Tera}; use tracing::instrument; use url::Url; @@ -16,14 +19,14 @@ use crate::{ config::CONFIG, db::{ Database, - models::{OWUICookie, OwuiInfo, USER, User}, + models::{BridgeCookie, OWUICookie, OwuiInfo, USER, User}, mongo::DB, }, errors::{BridgeError, Result}, kube::{Env, Image, KubeAPI, OpenWebUI, Owui, Persistence}, web::{ bson, - helper::{self, forwarding}, + helper::{self, forwarding, observability_post}, }, }; @@ -113,14 +116,14 @@ async fn openwebui_forward( .await } +#[post("create")] async fn create_owui( req: HttpRequest, - payload: web::Payload, - method: Method, - peer_addr: Option, owui_cookie: Option>, + bcookie: Option>, db: web::Data<&DB>, - client: web::Data, + data: web::Data, + ctx: web::Data, ) -> Result { if let Some(owui_cookie) = owui_cookie { let subject = &owui_cookie.into_inner().subject; @@ -149,11 +152,11 @@ async fn create_owui( ))); } - let persist = req - .uri() - .query() - .map(|q| q.contains("persist=true")) - .unwrap_or(false); + // let persist = req + // .uri() + // .query() + // .map(|q| q.contains("persist=true")) + // .unwrap_or(false); // create instance let owui = Owui { @@ -164,7 +167,7 @@ async fn create_owui( }, spec: OpenWebUI { replica: 1, // TODO: this needs to be removed from the operator.., for now set to 1 - retain_pvc: persist, + retain_pvc: true, service_port: CONFIG.owui.service_port, image: Image { registry: Cow::from(&CONFIG.owui.registry), @@ -198,7 +201,7 @@ async fn create_owui( // update DB with instance information let current_time = time::OffsetDateTime::now_utc(); - let r = db + let _r = db .update( doc! { "_id": subject, @@ -209,7 +212,6 @@ async fn create_owui( "owui": bson(OwuiInfo{ start_time: Some(current_time), last_active: None, - persist_pvc: persist, })?, "last_updated_by": &user.sub, }, @@ -217,9 +219,16 @@ async fn create_owui( USER, PhantomData::, ) - .await; + .await?; - // return + if let Some(bc) = bcookie { + observability_post("owui instance has been created", &bc); + } + + let context = data.render("components/owui/poll.html", &ctx)?; + return Ok(HttpResponse::Ok() + .content_type(ContentType::form_url_encoded()) + .body(context)); } helper::log_with_level!( Err(BridgeError::Forbidden( @@ -230,12 +239,96 @@ async fn create_owui( ) } -async fn delete_owui() -> Result { - todo!() +#[delete("delete")] +async fn delete_owui( + req: HttpRequest, + // payload: web::Payload, + // method: Method, + // peer_addr: Option, + owui_cookie: Option>, + bcookie: Option>, + db: web::Data<&DB>, + // data: web::Data, + // ctx: web::Data, +) -> Result { + if let Some(owui_cookie) = owui_cookie { + let subject = &owui_cookie.into_inner().subject; + let name = format!("u{}-openwebui", subject); + let pvc_name = format!("owui1-{}-openwebui-0", subject); + + let persist_pvc = req.query_string().contains("save"); + + helper::log_with_level!( + KubeAPI::::delete(&name, &CONFIG.owui.namespace).await, + error + )?; + + if !persist_pvc { + // don't stop due to error here so we can remove the rest + let _ = helper::log_with_level!( + KubeAPI::::delete(&pvc_name, &CONFIG.owui.namespace).await, + error + ); + } + + let current_time = time::OffsetDateTime::now_utc(); + let _r = db + .update( + doc! { + "_id": subject, + }, + doc! { + "$set": doc! { + "updated_at": bson(current_time)?, + "owui": null, + }, + }, + USER, + PhantomData::, + ) + .await?; + + if let Some(bc) = bcookie { + observability_post("owui instance has been deleted", &bc); + } + } + helper::log_with_level!( + Err(BridgeError::Forbidden( + "User does not have access to OWUI... middleware should have prevented this" + .to_string() + )), + error + ) } -async fn status_owui() -> Result { - todo!() +#[get("status")] +async fn status_owui( + owui_cookie: Option>, + data: web::Data, + ctx: web::Data, + client: web::Data, +) -> Result { + if let Some(owui_cookie) = owui_cookie { + let subject = &owui_cookie.into_inner().subject; + let url = make_forward_url("http", subject); + + if !client.get(url).send().await?.status().is_success() { + return Ok(HttpResponse::ServiceUnavailable().finish()); + } + + let content = data.render("components/owui/ready.html", &ctx)?; + + return Ok(HttpResponse::Ok() + .content_type(ContentType::form_url_encoded()) + .body(content)); + } + helper::log_with_level!( + Err(BridgeError::Forbidden( + "User does not have access to OWUI... middleware should have prevented this" + .to_string() + )), + error + ) } #[inline] diff --git a/src/web/route/portal/system_admin/mod.rs b/src/web/route/portal/system_admin/mod.rs index c2916a26..2b971fd4 100644 --- a/src/web/route/portal/system_admin/mod.rs +++ b/src/web/route/portal/system_admin/mod.rs @@ -136,7 +136,7 @@ pub(super) async fn system( if let Some(owui_cookie) = oc { use crate::config::CONFIG; - ctx.insert("openwebui", &owui_cookie.subject); + ctx.insert("owui_subject", &owui_cookie.subject); ctx.insert("owui_url", &CONFIG.owui.url); } diff --git a/templates/components/owui/owui.html b/templates/components/owui/owui.html index 2cce013f..dc20e981 100644 --- a/templates/components/owui/owui.html +++ b/templates/components/owui/owui.html @@ -3,16 +3,16 @@ hx-ext='response-targets'>

Your Open Web UI

-

You currently have a owui running.

- + {% if owui.start_time == "None" %} + {# No owui up #} + {% include 'components/owui/start.html' %} + {% else %} + {% if owui.status == "Ready" %} + {% include 'components/owui/ready.html' %} + {% else %} + {% include 'components/owui/poll.html' %} + {% endif %} + {% endif %}
diff --git a/templates/components/owui/poll.html b/templates/components/owui/poll.html new file mode 100644 index 00000000..72c1d418 --- /dev/null +++ b/templates/components/owui/poll.html @@ -0,0 +1,7 @@ +
+

Your instance is starting please wait...

+
+
+
+
diff --git a/templates/components/owui/ready.html b/templates/components/owui/ready.html new file mode 100644 index 00000000..15767ef7 --- /dev/null +++ b/templates/components/owui/ready.html @@ -0,0 +1,16 @@ +

You currently have an instance running.

+ diff --git a/templates/components/owui/start.html b/templates/components/owui/start.html new file mode 100644 index 00000000..8d44c61d --- /dev/null +++ b/templates/components/owui/start.html @@ -0,0 +1,65 @@ +{% set launch_icon = '' %} + +

You currently do not have an instance running.

+ From a475b099163c41e8217263266ea63d3d7fdf272d Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Thu, 26 Feb 2026 10:21:53 -0500 Subject: [PATCH 07/12] system admin complete --- config/openwebui.toml | 4 +- src/db/models.rs | 7 ++ src/kube/openwebui/mod.rs | 20 ++-- src/web/mod.rs | 2 + src/web/route/openwebui/mod.rs | 112 ++++++++++++++++++++--- src/web/route/portal/helper.rs | 55 +++++++++++ src/web/route/portal/system_admin/mod.rs | 6 ++ templates/components/owui/owui.html | 2 +- templates/components/owui/poll.html | 2 +- templates/components/owui/ready.html | 12 ++- templates/components/owui/start.html | 4 +- templates/pages/nav_base.html | 4 +- templates/pages/portal_user.html | 2 +- 13 files changed, 197 insertions(+), 35 deletions(-) diff --git a/config/openwebui.toml b/config/openwebui.toml index 0e549504..1ac428c5 100644 --- a/config/openwebui.toml +++ b/config/openwebui.toml @@ -10,10 +10,10 @@ tag = "latest" pull_policy = "Always" [openwebui.persistence] -size = "5Gi" +size = "2Gi" storage_class = "gp3" [[openwebui.env]] MOLVIEWER_URL = "moleviewer.open.accelerate.science" [[openwebui.env]] -WEBUI_SECRET = "1GOKv7uv358t82Km2iPrd4hXNuwFlDwNlg72l9sOyLI6EK" +WEBUI_SECRET_KEY = "idontcarewhatthisisbecuasethisisrequiredforsomereason" diff --git a/src/db/models.rs b/src/db/models.rs index 7ee844fb..a1601c65 100644 --- a/src/db/models.rs +++ b/src/db/models.rs @@ -99,6 +99,13 @@ pub struct OwuiInfo { pub last_active: Option, } +#[derive(Debug, Deserialize, Serialize)] +pub struct UserOwui { + pub name: String, + pub start_time: String, + pub status: String, +} + #[derive(Debug, Deserialize, Serialize)] pub struct UserNotebook { pub name: String, diff --git a/src/kube/openwebui/mod.rs b/src/kube/openwebui/mod.rs index 963bc35c..52e1ea59 100644 --- a/src/kube/openwebui/mod.rs +++ b/src/kube/openwebui/mod.rs @@ -52,8 +52,10 @@ pub struct Env { mod test { use std::borrow::Cow; - #[test] - fn test_deserialize_owui() { + use crate::kube::KubeAPI; + + #[tokio::test] + async fn test_deserialize_owui() { let owui = super::Owui { spec: super::OpenWebUI { replica: 1, @@ -91,12 +93,12 @@ mod test { Ok(json) => println!("Successfully serialized OpenWebUI to JSON:\n{}", json), Err(e) => panic!("Failed to serialize OpenWebUI to JSON: {}", e), } - // rustls::crypto::ring::default_provider() - // .install_default() - // .expect("Cannot install default provider with ring"); - // - // crate::kube::init_once().await; - // let k = KubeAPI::new(owui); - // k.create("openwebui").await.unwrap(); + rustls::crypto::ring::default_provider() + .install_default() + .expect("Cannot install default provider with ring"); + + crate::kube::init_once().await; + let k = KubeAPI::new(owui); + k.create("openwebui").await.unwrap(); } } diff --git a/src/web/mod.rs b/src/web/mod.rs index 58592897..07f72684 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -193,6 +193,8 @@ pub async fn start_server(with_tls: bool) -> Result<()> { .configure(route::foo::config_foo); #[cfg(feature = "mcp")] let scope = scope.configure(route::mcp::config_mcp); + #[cfg(feature = "openwebui")] + let scope = scope.configure(route::openwebui::config_openwebui_manage); scope }) }); diff --git a/src/web/route/openwebui/mod.rs b/src/web/route/openwebui/mod.rs index ddab6375..952e8d13 100644 --- a/src/web/route/openwebui/mod.rs +++ b/src/web/route/openwebui/mod.rs @@ -1,4 +1,4 @@ -use std::{borrow::Cow, collections::HashSet, marker::PhantomData, str::FromStr, sync::LazyLock}; +use std::{borrow::Cow, collections::HashSet, marker::PhantomData, str::FromStr, sync::LazyLock, time::Duration}; use actix_web::{ HttpRequest, HttpResponse, delete, @@ -9,28 +9,30 @@ use actix_web::{ web::{self, ReqData}, }; use k8s_openapi::api::core::v1::PersistentVolumeClaim; -use kube::api::ObjectMeta; +use kube::{api::ObjectMeta, runtime::wait::delete}; use mongodb::bson::doc; use tera::{Context, Tera}; -use tracing::instrument; +use tracing::{instrument, warn}; use url::Url; use crate::{ config::CONFIG, db::{ Database, - models::{BridgeCookie, OWUICookie, OwuiInfo, USER, User}, - mongo::DB, + models::{BridgeCookie, OWUICookie, OwuiInfo, USER, User, UserOwui}, + mongo::{DB, ObjectID}, }, errors::{BridgeError, Result}, kube::{Env, Image, KubeAPI, OpenWebUI, Owui, Persistence}, web::{ + bridge_middleware::{CookieCheck, Htmx}, bson, helper::{self, forwarding, observability_post}, }, }; const OWUI_PORT: &str = "8080"; +const PVC_DELETE_ATTEMPT: u8 = 9; pub static OWUI_NAMESPACE: LazyLock<&str> = LazyLock::new(|| &CONFIG.owui.namespace); static WHITELIST_ENDPOINTS: LazyLock> = LazyLock::new(|| { @@ -116,7 +118,7 @@ async fn openwebui_forward( .await } -#[post("create")] +#[post("/create")] async fn create_owui( req: HttpRequest, owui_cookie: Option>, @@ -128,11 +130,12 @@ async fn create_owui( if let Some(owui_cookie) = owui_cookie { let subject = &owui_cookie.into_inner().subject; let name = format!("u{}-openwebui", subject); + let pvc_name = format!("owui1-u{}-openwebui-0", subject); let user: User = helper::log_with_level!( db.find( doc! { - "_id": subject, + "_id": ObjectID::new(subject).into_inner(), }, USER, ) @@ -152,6 +155,40 @@ async fn create_owui( ))); } + if req.query_string().contains("clear") { + helper::log_with_level!( + KubeAPI::::delete(&pvc_name, &CONFIG.owui.namespace).await, + error + )?; + + // PVC takes time to delete... loop and check it is gone + loop { + let mut loop_cnt = 0; + if KubeAPI::::check_pvc_exists( + &pvc_name, + &CONFIG.owui.namespace, + ) + .await? + { + tokio::time::sleep(Duration::from_secs(2)).await; + loop_cnt += 1; + } else { + break; + } + + if loop_cnt > PVC_DELETE_ATTEMPT { + let apx_time_elapsed = PVC_DELETE_ATTEMPT * loop_cnt; + warn!( + "PVC {} not deleted after {} seconds", + pvc_name, apx_time_elapsed + ); + return Err(BridgeError::GeneralError( + "PVC not deleted after extended period of time".to_string(), + )); + } + } + } + // let persist = req // .uri() // .query() @@ -184,8 +221,8 @@ async fn create_owui( .env .iter() .map(|kv| Env { - name: Cow::from(&kv.0), - value: Cow::from(&kv.1), + name: Cow::from(kv.0.trim_matches('"')), + value: Cow::from(kv.1.trim_matches('"')), }) .collect(), }, @@ -204,7 +241,7 @@ async fn create_owui( let _r = db .update( doc! { - "_id": subject, + "_id": ObjectID::new(subject).into_inner(), }, doc! { "$set": doc! { @@ -248,16 +285,22 @@ async fn delete_owui( owui_cookie: Option>, bcookie: Option>, db: web::Data<&DB>, - // data: web::Data, - // ctx: web::Data, + data: web::Data, + ctx: web::Data, ) -> Result { if let Some(owui_cookie) = owui_cookie { let subject = &owui_cookie.into_inner().subject; let name = format!("u{}-openwebui", subject); - let pvc_name = format!("owui1-{}-openwebui-0", subject); + let pvc_name = format!("owui1-u{}-openwebui-0", subject); + + let mut ctx = (**ctx).clone(); let persist_pvc = req.query_string().contains("save"); + if persist_pvc { + ctx.insert("pvc_exists_owui", &persist_pvc); + } + helper::log_with_level!( KubeAPI::::delete(&name, &CONFIG.owui.namespace).await, error @@ -275,7 +318,7 @@ async fn delete_owui( let _r = db .update( doc! { - "_id": subject, + "_id": ObjectID::new(subject).into_inner(), }, doc! { "$set": doc! { @@ -291,6 +334,13 @@ async fn delete_owui( if let Some(bc) = bcookie { observability_post("owui instance has been deleted", &bc); } + + ctx.insert("cooloff", &true); + let context = data.render("components/owui/start.html", &ctx)?; + + return Ok(HttpResponse::Ok() + .content_type(ContentType::form_url_encoded()) + .body(context)); } helper::log_with_level!( Err(BridgeError::Forbidden( @@ -316,6 +366,10 @@ async fn status_owui( return Ok(HttpResponse::ServiceUnavailable().finish()); } + let mut ctx = (**ctx).clone(); + + ctx.insert("owui_subject", subject); + ctx.insert("owui_url", &CONFIG.owui.url); let content = data.render("components/owui/ready.html", &ctx)?; return Ok(HttpResponse::Ok() @@ -331,9 +385,28 @@ async fn status_owui( ) } +impl From<&User> for UserOwui { + fn from(value: &User) -> Self { + Self { + start_time: value + .owui + .as_ref() + .map(|v| v.start_time.unwrap_or(time::OffsetDateTime::now_utc())) + .map(|v| v.to_string()) + .unwrap_or_default(), + name: value.sub.to_owned(), + status: "Pending".to_string(), + } + } +} + #[inline] pub(crate) fn make_forward_url(protocol: &str, subject: &str) -> String { let namespace = *OWUI_NAMESPACE; + // if in dev mode + if cfg!(debug_assertions) { + return format!("{protocol}://0.0.0.0:{OWUI_PORT}"); + } format!("{protocol}://u{subject}-openwebui.{namespace}.svc.cluster.local:{OWUI_PORT}") } @@ -342,6 +415,17 @@ pub fn config_openwebui(cfg: &mut web::ServiceConfig) { .default_service(web::to(openwebui_forward)); } +pub fn config_openwebui_manage(cfg: &mut web::ServiceConfig) { + cfg.service( + web::scope("/owui_manage/hx") + .wrap(CookieCheck) + .wrap(Htmx) + .service(create_owui) + .service(delete_owui) + .service(status_owui), + ); +} + #[cfg(test)] mod tests { #[test] diff --git a/src/web/route/portal/helper.rs b/src/web/route/portal/helper.rs index d4ac0903..bba05879 100644 --- a/src/web/route/portal/helper.rs +++ b/src/web/route/portal/helper.rs @@ -3,10 +3,14 @@ use std::{any::Any, ops::Deref}; #[cfg(feature = "notebook")] use actix_web::cookie::{Cookie, SameSite}; use actix_web::web::ReqData; +#[cfg(feature = "openwebui")] +use k8s_openapi::api::core::v1::PersistentVolumeClaim; use mongodb::bson::doc; #[cfg(feature = "notebook")] use tera::Context; +#[cfg(feature = "openwebui")] +use crate::{config::CONFIG, db::models::UserOwui, kube::Owui, web::route::health::status}; use crate::{ db::{ Database, @@ -84,6 +88,57 @@ where }) } +#[cfg(feature = "openwebui")] +pub(super) async fn owui_bookkeeping(user: &User) -> (Option, bool) { + let id = user._id.to_string(); + let name = format!("u{}-openwebui", &id); + let pod_name = format!("u{}-openwebui-0", id); + let pvc_name = format!("owui1-u{}-openwebui-0", id); + + let pvc_exists = + KubeAPI::::check_pvc_exists(&pvc_name, &CONFIG.owui.namespace) + .await + .unwrap_or_default(); + + match KubeAPI::::get_crds(&CONFIG.owui.namespace).await { + Ok(list) => { + // find the Owui that match name with metaname + if !list + .iter() + .any(|owui| owui.metadata.name.as_ref().unwrap_or(&"".to_string()) == &name) + { + return (None, pvc_exists); + } + } + Err(e) => return (None, pvc_exists), + } + + match KubeAPI::::check_pod_running(&pod_name, &CONFIG.owui.namespace).await { + Ok(running) => { + let state = if running { + "Ready".to_string() + } else { + "Pending".to_string() + }; + + ( + Some(UserOwui { + name, + start_time: user + .owui + .as_ref() + .map(|v| v.start_time.unwrap_or(time::OffsetDateTime::now_utc())) + .map(|v| v.to_string()) + .unwrap_or_default(), + status: state, + }), + pvc_exists, + ) + } + Err(e) => (None, pvc_exists), + } +} + #[cfg(feature = "notebook")] /// This is a helper function that takes care of the notebook setup for all users /// Is the user does not have access to notebooks, None is returned diff --git a/src/web/route/portal/system_admin/mod.rs b/src/web/route/portal/system_admin/mod.rs index 2b971fd4..7a75c15b 100644 --- a/src/web/route/portal/system_admin/mod.rs +++ b/src/web/route/portal/system_admin/mod.rs @@ -135,9 +135,15 @@ pub(super) async fn system( #[cfg(feature = "openwebui")] if let Some(owui_cookie) = oc { use crate::config::CONFIG; + use crate::web::route::portal::helper::owui_bookkeeping; + + let (owui, pvc_exists) = owui_bookkeeping(&user).await; + println!("OWUI BOOKKEEPING RESULT: {owui:?}"); ctx.insert("owui_subject", &owui_cookie.subject); ctx.insert("owui_url", &CONFIG.owui.url); + ctx.insert("pvc_exists_owui", &pvc_exists); + ctx.insert("owui", &owui); } // add notebook tab if user has a notebook subscription diff --git a/templates/components/owui/owui.html b/templates/components/owui/owui.html index dc20e981..8e120af8 100644 --- a/templates/components/owui/owui.html +++ b/templates/components/owui/owui.html @@ -3,7 +3,7 @@ hx-ext='response-targets'>

Your Open Web UI

- {% if owui.start_time == "None" %} + {% if not owui %} {# No owui up #} {% include 'components/owui/start.html' %} {% else %} diff --git a/templates/components/owui/poll.html b/templates/components/owui/poll.html index 72c1d418..ca3a7d0e 100644 --- a/templates/components/owui/poll.html +++ b/templates/components/owui/poll.html @@ -1,4 +1,4 @@ -

Your instance is starting please wait...

diff --git a/templates/components/owui/ready.html b/templates/components/owui/ready.html index 15767ef7..75953b4d 100644 --- a/templates/components/owui/ready.html +++ b/templates/components/owui/ready.html @@ -2,15 +2,21 @@ diff --git a/templates/components/owui/start.html b/templates/components/owui/start.html index 8d44c61d..9764badc 100644 --- a/templates/components/owui/start.html +++ b/templates/components/owui/start.html @@ -31,7 +31,7 @@ {% endif %} {# @@ -45,7 +45,7 @@ #} {{ launch_icon | safe }}Create instance - {% if pvc_exists %} + {% if pvc_exists_owui %} {% endif %} - {% if openwebui %} + {% if owui_subject %}
Notebook {% endif %} - {% if openwebui %} + {% if owui_subject %} Open Web UI {% endif %} {% if user_type == "system" %} diff --git a/templates/pages/portal_user.html b/templates/pages/portal_user.html index 7c256c71..85a0316c 100644 --- a/templates/pages/portal_user.html +++ b/templates/pages/portal_user.html @@ -25,7 +25,7 @@
{% endif %} -{% if openwebui %} +{% if owui_subject %} From b23dd0301c289584ed8fc8423296fe2f26687f08 Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Tue, 24 Mar 2026 19:57:12 -0400 Subject: [PATCH 08/12] wip fin --- Dockerfile | 2 +- src/config/mod.rs | 2 +- src/logger/mod.rs | 38 ++++++++++++------------ src/web/route/openwebui/mod.rs | 2 +- src/web/route/portal/group_admin/mod.rs | 7 ++++- src/web/route/portal/helper.rs | 6 ++-- src/web/route/portal/system_admin/mod.rs | 1 - src/web/route/portal/user_htmx.rs | 7 ++++- 8 files changed, 37 insertions(+), 28 deletions(-) diff --git a/Dockerfile b/Dockerfile index 038aae06..6b0cdb4e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Stage 1 build -FROM rust:1.92.0 AS builder +FROM rust:1.94.0 AS builder WORKDIR /app diff --git a/src/config/mod.rs b/src/config/mod.rs index a674db89..ddf1265d 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -166,7 +166,7 @@ pub fn init_once() -> Configuration { let (config_location_str, database_location_str) = if cfg!(debug_assertions) { ( - "config/configurations.toml", + "config/configurations_sample.toml", "config/database_sample.toml", ) } else { diff --git a/src/logger/mod.rs b/src/logger/mod.rs index aace6b46..cb14fb68 100644 --- a/src/logger/mod.rs +++ b/src/logger/mod.rs @@ -26,25 +26,25 @@ pub fn start_logger(level: LevelFilter, _client: Client, _tx: Sender<()>) { .with_filter(level), ); - // #[cfg(feature = "observe")] - // let ts = { - // use crate::config::CONFIG; - // - // if let Some((ref api_key, ref endpoint)) = CONFIG.observability_cred { - // use crate::db::mongo::DBCONN; - // - // let writer = observability::Observe::new(api_key, endpoint, _client) - // .expect("Failed to create observability for logger"); - // let observe_layer = observability::ObserveEvents::new( - // DBCONN.get().expect("DB connection not initialized"), - // _tx, - // ); - // - // ts.with(writer.wrap_layer(level)).with(observe_layer) - // } else { - // panic!("Observability credentials are not set in the configuration") - // } - // }; + #[cfg(feature = "observe")] + let ts = { + use crate::config::CONFIG; + + if let Some((ref api_key, ref endpoint)) = CONFIG.observability_cred { + use crate::db::mongo::DBCONN; + + let writer = observability::Observe::new(api_key, endpoint, _client) + .expect("Failed to create observability for logger"); + let observe_layer = observability::ObserveEvents::new( + DBCONN.get().expect("DB connection not initialized"), + _tx, + ); + + ts.with(writer.wrap_layer(level)).with(observe_layer) + } else { + panic!("Observability credentials are not set in the configuration") + } + }; ts.init() } diff --git a/src/web/route/openwebui/mod.rs b/src/web/route/openwebui/mod.rs index 952e8d13..8091be53 100644 --- a/src/web/route/openwebui/mod.rs +++ b/src/web/route/openwebui/mod.rs @@ -9,7 +9,7 @@ use actix_web::{ web::{self, ReqData}, }; use k8s_openapi::api::core::v1::PersistentVolumeClaim; -use kube::{api::ObjectMeta, runtime::wait::delete}; +use kube::api::ObjectMeta; use mongodb::bson::doc; use tera::{Context, Tera}; use tracing::{instrument, warn}; diff --git a/src/web/route/portal/group_admin/mod.rs b/src/web/route/portal/group_admin/mod.rs index 57b10f07..e8dbd411 100644 --- a/src/web/route/portal/group_admin/mod.rs +++ b/src/web/route/portal/group_admin/mod.rs @@ -130,9 +130,14 @@ pub(super) async fn group( #[cfg(feature = "openwebui")] if let Some(owui_cookie) = oc { use crate::config::CONFIG; + use crate::web::route::portal::helper::owui_bookkeeping; - ctx.insert("openwebui", &owui_cookie.subject); + let (owui, pvc_exists) = owui_bookkeeping(&user).await; + + ctx.insert("owui_subject", &owui_cookie.subject); ctx.insert("owui_url", &CONFIG.owui.url); + ctx.insert("pvc_exists_owui", &pvc_exists); + ctx.insert("owui", &owui); } // add notebook tab if user has a notebook subscription diff --git a/src/web/route/portal/helper.rs b/src/web/route/portal/helper.rs index bba05879..240234e9 100644 --- a/src/web/route/portal/helper.rs +++ b/src/web/route/portal/helper.rs @@ -10,7 +10,7 @@ use mongodb::bson::doc; use tera::Context; #[cfg(feature = "openwebui")] -use crate::{config::CONFIG, db::models::UserOwui, kube::Owui, web::route::health::status}; +use crate::{config::CONFIG, db::models::UserOwui, kube::Owui}; use crate::{ db::{ Database, @@ -110,7 +110,7 @@ pub(super) async fn owui_bookkeeping(user: &User) -> (Option, bool) { return (None, pvc_exists); } } - Err(e) => return (None, pvc_exists), + Err(_e) => return (None, pvc_exists), } match KubeAPI::::check_pod_running(&pod_name, &CONFIG.owui.namespace).await { @@ -135,7 +135,7 @@ pub(super) async fn owui_bookkeeping(user: &User) -> (Option, bool) { pvc_exists, ) } - Err(e) => (None, pvc_exists), + Err(_e) => (None, pvc_exists), } } diff --git a/src/web/route/portal/system_admin/mod.rs b/src/web/route/portal/system_admin/mod.rs index 7a75c15b..e33082dd 100644 --- a/src/web/route/portal/system_admin/mod.rs +++ b/src/web/route/portal/system_admin/mod.rs @@ -138,7 +138,6 @@ pub(super) async fn system( use crate::web::route::portal::helper::owui_bookkeeping; let (owui, pvc_exists) = owui_bookkeeping(&user).await; - println!("OWUI BOOKKEEPING RESULT: {owui:?}"); ctx.insert("owui_subject", &owui_cookie.subject); ctx.insert("owui_url", &CONFIG.owui.url); diff --git a/src/web/route/portal/user_htmx.rs b/src/web/route/portal/user_htmx.rs index 5937e0ae..0a71b204 100644 --- a/src/web/route/portal/user_htmx.rs +++ b/src/web/route/portal/user_htmx.rs @@ -92,9 +92,14 @@ impl<'p> Profile<'p> { #[cfg(feature = "openwebui")] if let Some(owui_cookie) = oc { use crate::config::CONFIG; + use crate::web::route::portal::helper::owui_bookkeeping; - context.insert("openwebui", &owui_cookie.subject); + let (owui, pvc_exists) = owui_bookkeeping(self.user).await; + + context.insert("owui_subject", &owui_cookie.subject); context.insert("owui_url", &CONFIG.owui.url); + context.insert("pvc_exists_owui", &pvc_exists); + context.insert("owui", &owui); } #[cfg(feature = "notebook")] From 9b0d0dc4358892aa4fe6bec00b9b971f03fb36d7 Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Thu, 26 Mar 2026 18:22:26 -0400 Subject: [PATCH 09/12] session error fix with notebooks --- src/web/route/auth/mod.rs | 2 +- src/web/route/notebook/mod.rs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/web/route/auth/mod.rs b/src/web/route/auth/mod.rs index fd6cedd8..e47a7e23 100644 --- a/src/web/route/auth/mod.rs +++ b/src/web/route/auth/mod.rs @@ -236,7 +236,7 @@ async fn code_to_response( // TODO: look into doing session management that stores a dynamic key into the cookie let cookie = Cookie::build(COOKIE_NAME, content) .same_site(SameSite::Strict) - .expires(time::OffsetDateTime::now_utc() + time::Duration::days(1)) + .max_age(time::Duration::days(1)) .domain(&CONFIG.bridge_url) .path("/") .http_only(true) diff --git a/src/web/route/notebook/mod.rs b/src/web/route/notebook/mod.rs index 42ad276c..56c63a34 100644 --- a/src/web/route/notebook/mod.rs +++ b/src/web/route/notebook/mod.rs @@ -371,6 +371,7 @@ async fn notebook_create( let bridge_cookie = Cookie::build(COOKIE_NAME, bridge_cookie_json) .path("/") .same_site(SameSite::Strict) + .domain(&CONFIG.bridge_url) .secure(true) .http_only(true) .max_age(time::Duration::days(1)) From 68196e6c507a83dd60edf6e918c54b59ec268eef Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Tue, 21 Apr 2026 00:02:29 -0400 Subject: [PATCH 10/12] chemchat removal to resources --- .vimspector.json | 12 +- Cargo.lock | 821 +++++++++--------- Cargo.toml | 15 +- Dockerfile | 6 +- config/configurations_sample.toml | 5 +- config/services_sample.toml | 17 + justfile | 14 +- src/config/mod.rs | 41 +- .../security_cache_header.rs | 20 +- src/web/mod.rs | 12 - src/web/route/chemchat/mod.rs | 68 -- src/web/route/mod.rs | 2 - 12 files changed, 489 insertions(+), 544 deletions(-) delete mode 100644 src/web/route/chemchat/mod.rs diff --git a/.vimspector.json b/.vimspector.json index c91c46db..87755af6 100644 --- a/.vimspector.json +++ b/.vimspector.json @@ -4,7 +4,17 @@ "adapter": "CodeLLDB", "configuration": { "request": "launch", - "program": "./target/debug/${fileDirname}" + "program": "${workspaceFolder}/target/debug/${projectFolderBasename}" + } + }, + "attach": { + "adapter": "CodeLLDB", + "filetypes": [ "rust", "c", "cpp", "jai" ], + "configuration": { + "request": "attach", + "program": "${workspaceRoot}/${fileBasenameNoExtension}", + "PID": "${PID}", + "sourceLanguages": [ "rust" ] } } } diff --git a/Cargo.lock b/Cargo.lock index d216a68f..76e1afb6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -44,9 +44,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.12.0" +version = "3.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f860ee6746d0c5b682147b2f7f8ef036d4f92fe518251a3a35ffa3650eafdf0e" +checksum = "93acb4a42f64936f9b8cae4a433b237599dd6eb6ed06124eb67132ef8cc90662" dependencies = [ "actix-codec", "actix-rt", @@ -73,8 +73,8 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.2", - "sha1", + "rand 0.10.1", + "sha1 0.11.0", "smallvec", "tokio", "tokio-util", @@ -211,7 +211,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.6.2", + "socket2 0.6.3", "time", "tracing", "url", @@ -354,6 +354,17 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + [[package]] name = "async-stream" version = "0.3.6" @@ -401,9 +412,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.16.0" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a7b350e3bb1767102698302bc37256cbd48422809984b98d292c40e2579aa9" +checksum = "0ec6fb3fe69024a75fa7e1bfb48aa6cf59706a101658ea01bfd33b2b248a038f" dependencies = [ "aws-lc-sys", "zeroize", @@ -411,9 +422,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.37.1" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" +checksum = "f50037ee5e1e41e7b8f9d161680a725bd1626cb6f8c7e901f91f942850852fe7" dependencies = [ "cc", "cmake", @@ -458,9 +469,9 @@ checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] name = "bitvec" @@ -494,6 +505,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +dependencies = [ + "hybrid-array", +] + [[package]] name = "bridge" version = "0.1.0" @@ -518,7 +538,7 @@ dependencies = [ "p256", "parking_lot", "pin-project", - "rand 0.10.0", + "rand 0.10.1", "redis", "regex", "reqwest 0.13.2", @@ -530,7 +550,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sha2", + "sha2 0.11.0", "tera", "thiserror 2.0.18", "time", @@ -580,10 +600,10 @@ dependencies = [ "getrandom 0.2.17", "getrandom 0.3.4", "hex", - "indexmap 2.13.0", + "indexmap 2.14.0", "js-sys", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "serde", "serde_bytes", "serde_json", @@ -624,9 +644,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.56" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "jobserver", @@ -660,7 +680,7 @@ checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "rand_core 0.10.0", + "rand_core 0.10.1", ] [[package]] @@ -701,9 +721,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] @@ -737,6 +757,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "const-random" version = "0.1.18" @@ -904,6 +930,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" +dependencies = [ + "hybrid-array", +] + [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -913,7 +948,7 @@ dependencies = [ "cfg-if", "cpufeatures 0.2.17", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", "rustc_version", "subtle", @@ -931,38 +966,14 @@ dependencies = [ "syn", ] -[[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]] name = "darling" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "darling_core 0.23.0", - "darling_macro 0.23.0", -] - -[[package]] -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", + "darling_core", + "darling_macro", ] [[package]] @@ -978,24 +989,13 @@ dependencies = [ "syn", ] -[[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", -] - [[package]] name = "darling_macro" version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core 0.23.0", + "darling_core", "quote", "syn", ] @@ -1012,7 +1012,7 @@ version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" dependencies = [ - "const-oid", + "const-oid 0.9.6", "pem-rfc7468", "zeroize", ] @@ -1040,9 +1040,9 @@ dependencies = [ [[package]] name = "derive-where" -version = "1.6.0" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" +checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" dependencies = [ "proc-macro2", "quote", @@ -1084,12 +1084,23 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", + "block-buffer 0.10.4", + "const-oid 0.9.6", + "crypto-common 0.1.6", "subtle", ] +[[package]] +name = "digest" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" +dependencies = [ + "block-buffer 0.12.0", + "const-oid 0.10.2", + "crypto-common 0.2.1", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -1120,7 +1131,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -1146,7 +1157,7 @@ dependencies = [ "curve25519-dalek", "ed25519", "serde", - "sha2", + "sha2 0.10.9", "subtle", "zeroize", ] @@ -1178,7 +1189,7 @@ dependencies = [ "base16ct", "base64ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -1273,9 +1284,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "ff" @@ -1484,21 +1495,21 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", - "r-efi", - "rand_core 0.10.0", + "r-efi 6.0.0", + "rand_core 0.10.1", "wasip2", "wasip3", ] @@ -1562,7 +1573,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.13.0", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -1581,7 +1592,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.4.0", - "indexmap 2.13.0", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -1614,6 +1625,12 @@ dependencies = [ "foldhash 0.2.0", ] +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + [[package]] name = "heck" version = "0.5.0" @@ -1642,7 +1659,7 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.9.2", + "rand 0.9.4", "ring", "thiserror 2.0.18", "tinyvec", @@ -1664,7 +1681,7 @@ dependencies = [ "moka", "once_cell", "parking_lot", - "rand 0.9.2", + "rand 0.9.4", "resolv-conf", "smallvec", "thiserror 2.0.18", @@ -1687,7 +1704,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -1772,11 +1789,20 @@ dependencies = [ "libm", ] +[[package]] +name = "hybrid-array" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +dependencies = [ + "typenum", +] + [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -1788,7 +1814,6 @@ dependencies = [ "httparse", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -1796,9 +1821,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http 1.4.0", "hyper", @@ -1806,7 +1831,6 @@ dependencies = [ "log", "rustls", "rustls-native-certs", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -1843,7 +1867,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.2", + "socket2 0.6.3", "system-configuration", "tokio", "tower-service", @@ -1877,12 +1901,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1890,9 +1915,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1903,9 +1928,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1917,15 +1942,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1937,15 +1962,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -2024,39 +2049,40 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", "serde", "serde_core", ] [[package]] name = "ipconfig" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" dependencies = [ - "socket2 0.5.10", + "socket2 0.6.3", "widestring", - "windows-sys 0.48.0", - "winreg", + "windows-registry", + "windows-result", + "windows-sys 0.61.2", ] [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ "memchr", "serde", @@ -2073,15 +2099,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.21" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3e3d65f018c6ae946ab16e80944b97096ed73c35b221d1c478a6c81d8f57940" +checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" dependencies = [ "jiff-static", "log", @@ -2092,9 +2118,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.21" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17c2b211d863c7fde02cbea8a3c1a439b98e109286554f2860bdded7ff83818" +checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" dependencies = [ "proc-macro2", "quote", @@ -2110,7 +2136,7 @@ dependencies = [ "cesu8", "cfg-if", "combine", - "jni-sys", + "jni-sys 0.3.1", "log", "thiserror 1.0.69", "walkdir", @@ -2119,9 +2145,31 @@ dependencies = [ [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] [[package]] name = "jobserver" @@ -2135,10 +2183,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.89" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4eacb0641a310445a4c513f2a5e23e19952e269c6a38887254d5f837a305506" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] @@ -2209,20 +2259,20 @@ dependencies = [ "p256", "p384", "pem", - "rand 0.8.5", + "rand 0.8.6", "rsa", "serde", "serde_json", - "sha2", + "sha2 0.10.9", "signature", "simple_asn1", ] [[package]] name = "k8s-openapi" -version = "0.27.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05a6d6f3611ad1d21732adbd7a2e921f598af6c92d71ae6e2620da4b67ee1f0d" +checksum = "51b326f5219dd55872a72c1b6ddd1b830b8334996c667449c29391d657d78d5e" dependencies = [ "base64 0.22.1", "jiff", @@ -2232,9 +2282,9 @@ dependencies = [ [[package]] name = "kube" -version = "3.0.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f96b537b4c4f61fc183594edbecbbefa3037e403feac0701bb24e6eff78e0034" +checksum = "acc5a6a69da2975ed9925d56b5dcfc9cc739b66f37add06785b7c9f6d1e88741" dependencies = [ "k8s-openapi", "kube-client", @@ -2245,9 +2295,9 @@ dependencies = [ [[package]] name = "kube-client" -version = "3.0.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af97b8b696eb737e5694f087c498ca725b172c2a5bc3a6916328d160225537ee" +checksum = "0fcaf2d1f1a91e1805d4cd82e8333c022767ae8ffd65909bbef6802733a7dd40" dependencies = [ "base64 0.22.1", "bytes", @@ -2280,9 +2330,9 @@ dependencies = [ [[package]] name = "kube-core" -version = "3.0.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aeade7d2e9f165f96b3c1749ff01a8e2dc7ea954bd333bcfcecc37d5226bdd" +checksum = "f126d2db7a8b532ec1d839ece2a71e2485dc3bbca6cc3c3f929becaa810e719e" dependencies = [ "derive_more", "form_urlencoded", @@ -2299,11 +2349,11 @@ dependencies = [ [[package]] name = "kube-derive" -version = "3.0.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c98f59f4e68864624a0b993a1cc2424439ab7238eaede5c299e89943e2a093ff" +checksum = "d6b9b97e121fce957f9cafc6da534abc4276983ab03190b76c09361e2df849fa" dependencies = [ - "darling 0.23.0", + "darling", "proc-macro2", "quote", "serde", @@ -2313,9 +2363,9 @@ dependencies = [ [[package]] name = "kube-runtime" -version = "3.0.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc158473d6d86ec22692874bd5ddccf07474eab5c6bb41f226c522e945da5244" +checksum = "c072737075826ee74d3e615e80334e41e617ca3d14fb46ef7cdfda822d6f15f2" dependencies = [ "ahash", "async-broadcast", @@ -2361,9 +2411,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.182" +version = "0.2.185" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" +checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" [[package]] name = "libm" @@ -2373,19 +2423,18 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libmimalloc-sys" -version = "0.1.44" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870" +checksum = "bc89deee4af0429081d2a518c0431ae068222a5a262a3bc6ff4d8535ec2e02fe" dependencies = [ "cc", - "libc", ] [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "local-channel" @@ -2480,7 +2529,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "digest", + "digest 0.10.7", ] [[package]] @@ -2491,9 +2540,9 @@ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "mimalloc" -version = "0.1.48" +version = "0.1.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8" +checksum = "aca3c01a711f395b4257b81674c0e90e8dd1f1e62c4b7db45f684cc7a4fcb18a" dependencies = [ "libmimalloc-sys", ] @@ -2526,9 +2575,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "log", @@ -2538,9 +2587,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.13" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac832c50ced444ef6be0767a008b02c106a909ba79d1d830501e94b96f6b7e" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" dependencies = [ "crossbeam-channel", "crossbeam-epoch", @@ -2573,9 +2622,9 @@ checksum = "224484c5d09285a7b8cb0a0c117e847ebd14cb6e4470ecf68cdb89c503b0edb9" [[package]] name = "mongodb" -version = "3.5.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "803dd859e8afa084c255a8effd8000ff86f7c8076a50cd6d8c99e8f3496f75c2" +checksum = "1ef2c933617431ad0246fb5b43c425ebdae18c7f7259c87de0726d93b0e7e91b" dependencies = [ "base64 0.22.1", "bitflags", @@ -2595,16 +2644,16 @@ dependencies = [ "mongodb-internal-macros", "pbkdf2", "percent-encoding", - "rand 0.9.2", + "rand 0.9.4", "rustc_version_runtime", "rustls", "rustversion", "serde", "serde_bytes", "serde_with", - "sha1", - "sha2", - "socket2 0.6.2", + "sha1 0.10.6", + "sha2 0.10.9", + "socket2 0.6.3", "stringprep", "strsim", "take_mut", @@ -2619,9 +2668,9 @@ dependencies = [ [[package]] name = "mongodb-internal-macros" -version = "3.5.1" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973ef3dd3dbc6f6e65bbdecfd9ec5e781b9e7493b0f369a7c62e35d8e5ae2c8" +checksum = "9e5758dc828eb2d02ec30563cba365609d56ddd833190b192beaee2b475a7bb3" dependencies = [ "macro_magic", "proc-macro2", @@ -2659,16 +2708,16 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "smallvec", "zeroize", ] [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-integer" @@ -2710,21 +2759,21 @@ dependencies = [ "chrono", "getrandom 0.2.17", "http 1.4.0", - "rand 0.8.5", + "rand 0.8.6", "reqwest 0.12.28", "serde", "serde_json", "serde_path_to_error", - "sha2", + "sha2 0.10.9", "thiserror 1.0.69", "url", ] [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" dependencies = [ "critical-section", "portable-atomic", @@ -2747,7 +2796,7 @@ dependencies = [ "oauth2", "p256", "p384", - "rand 0.8.5", + "rand 0.8.6", "rsa", "serde", "serde-value", @@ -2755,7 +2804,7 @@ dependencies = [ "serde_path_to_error", "serde_plain", "serde_with", - "sha2", + "sha2 0.10.9", "subtle", "thiserror 1.0.69", "url", @@ -2763,9 +2812,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.75" +version = "0.10.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +checksum = "f38c4372413cdaaf3cc79dd92d29d7d9f5ab09b51b10dded508fb90bb70b9222" dependencies = [ "bitflags", "cfg-if", @@ -2795,9 +2844,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.111" +version = "0.9.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "13ce1245cd07fcc4cfdb438f7507b0c7e4f3849a69fd84d52374c66d83741bb6" dependencies = [ "cc", "libc", @@ -2823,7 +2872,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -2835,7 +2884,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "primeorder", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -2882,7 +2931,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -2950,7 +2999,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89815c69d36021a140146f26659a81d6c2afa33d216d736dd4be5381a7362220" dependencies = [ "pest", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -2979,7 +3028,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -2993,18 +3042,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", @@ -3013,15 +3062,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pkcs1" @@ -3046,9 +3089,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "portable-atomic" @@ -3058,18 +3101,18 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a9db96d7fa8782dd8c15ce32ffe8680bbd1e978a43bf51a34d39483540495f5" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -3130,7 +3173,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "socket2 0.6.2", + "socket2 0.6.3", "thiserror 2.0.18", "tokio", "tracing", @@ -3139,15 +3182,15 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" dependencies = [ "aws-lc-rs", "bytes", "getrandom 0.3.4", "lru-slab", - "rand 0.9.2", + "rand 0.9.4", "ring", "rustc-hash", "rustls", @@ -3168,16 +3211,16 @@ dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.2", + "socket2 0.6.3", "tracing", "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -3188,6 +3231,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "radium" version = "0.7.0" @@ -3196,9 +3245,9 @@ checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -3207,9 +3256,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -3217,13 +3266,13 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ "chacha20", - "getrandom 0.4.1", - "rand_core 0.10.0", + "getrandom 0.4.2", + "rand_core 0.10.1", ] [[package]] @@ -3266,17 +3315,18 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "redis" -version = "1.0.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe7f6e08ce1c6a9b21684e643926f6fc3b683bc006cb89afd72a5e0eb16e3a2" +checksum = "f44e94c96d8870a387d88ce3de3fdd608cbfc0705f03cb343cdde91509d3e49a" dependencies = [ "arcstr", + "async-lock", "bytes", "cfg-if", "combine", @@ -3287,7 +3337,7 @@ dependencies = [ "pin-project-lite", "ryu", "sha1_smol", - "socket2 0.6.2", + "socket2 0.6.3", "tokio", "tokio-util", "url", @@ -3475,8 +3525,8 @@ version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" dependencies = [ - "const-oid", - "digest", + "const-oid 0.9.6", + "digest 0.10.7", "num-bigint-dig", "num-integer", "num-traits", @@ -3503,9 +3553,9 @@ dependencies = [ [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc_version" @@ -3528,9 +3578,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21" dependencies = [ "aws-lc-rs", "log", @@ -3602,9 +3652,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.9" +version = "0.103.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" +checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" dependencies = [ "aws-lc-rs", "ring", @@ -3635,9 +3685,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.28" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" dependencies = [ "windows-sys 0.61.2", ] @@ -3734,9 +3784,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -3805,7 +3855,7 @@ version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "itoa", "memchr", "serde", @@ -3835,9 +3885,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.4" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" dependencies = [ "serde_core", ] @@ -3856,15 +3906,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.16.1" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.13.0", + "indexmap 2.14.0", "schemars 0.9.0", "schemars 1.2.1", "serde_core", @@ -3875,11 +3925,11 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.16.1" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" dependencies = [ - "darling 0.21.3", + "darling", "proc-macro2", "quote", "syn", @@ -3891,7 +3941,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "itoa", "ryu", "serde", @@ -3916,7 +3966,18 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures 0.2.17", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha1" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.2", ] [[package]] @@ -3933,7 +3994,18 @@ checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", "cpufeatures 0.2.17", - "digest", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.2", ] [[package]] @@ -3967,15 +4039,15 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "simple_asn1" @@ -4029,12 +4101,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -4166,7 +4238,7 @@ dependencies = [ "percent-encoding", "pest", "pest_derive", - "rand 0.8.5", + "rand 0.8.6", "regex", "serde", "serde_json", @@ -4265,9 +4337,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -4275,9 +4347,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -4290,9 +4362,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.49.0" +version = "1.52.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" dependencies = [ "bytes", "libc", @@ -4300,16 +4372,16 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.2", + "socket2 0.6.3", "tokio-macros", "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -4340,9 +4412,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25a406cddcc431a75d3d9afc6a7c0f7428d4891dd973e4d54c56b46127bf857" +checksum = "8f72a05e828585856dacd553fba484c242c46e391fb0e58917c942ee9202915c" dependencies = [ "futures-util", "log", @@ -4372,11 +4444,11 @@ dependencies = [ [[package]] name = "toml" -version = "1.0.3+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7614eaf19ad818347db24addfa201729cf2a9b6fdfd9eb0ab870fcacc606c0c" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "serde_core", "serde_spanned", "toml_datetime", @@ -4387,27 +4459,27 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.0.6+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" +checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" [[package]] name = "tower" @@ -4505,9 +4577,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -4525,22 +4597,21 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" -version = "0.28.0" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8628dcc84e5a09eb3d8423d6cb682965dea9133204e8fb3efee74c2a0c259442" +checksum = "6c01152af293afb9c7c2a57e4b559c5620b421f6d133261c60dd2d0cdb38e6b8" dependencies = [ "bytes", "data-encoding", "http 1.4.0", "httparse", "log", - "rand 0.9.2", + "rand 0.9.4", "rustls", "rustls-pki-types", - "sha1", + "sha1 0.10.6", "thiserror 2.0.18", "url", - "utf-8", ] [[package]] @@ -4565,9 +4636,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "ucd-trie" @@ -4610,9 +4681,9 @@ checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-xid" @@ -4651,12 +4722,6 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -4673,11 +4738,11 @@ dependencies = [ [[package]] name = "uuid" -version = "1.21.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ - "getrandom 0.4.1", + "getrandom 0.4.2", "js-sys", "serde_core", "wasm-bindgen", @@ -4734,11 +4799,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -4747,14 +4812,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.112" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d7d0fce354c88b7982aec4400b3e7fcf723c32737cef571bd165f7613557ee" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" dependencies = [ "cfg-if", "once_cell", @@ -4765,23 +4830,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.62" +version = "0.4.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee85afca410ac4abba5b584b12e77ea225db6ee5471d0aebaae0861166f9378a" +checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" dependencies = [ - "cfg-if", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.112" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55839b71ba921e4f75b674cb16f843f4b1f3b26ddfcb3454de1cf65cc021ec0f" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4789,9 +4850,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.112" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf2e969c2d60ff52e7e98b7392ff1588bffdd1ccd4769eba27222fd3d621571" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" dependencies = [ "bumpalo", "proc-macro2", @@ -4802,9 +4863,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.112" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0861f0dcdf46ea819407495634953cdcc8a8c7215ab799a7a7ce366be71c7b30" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" dependencies = [ "unicode-ident", ] @@ -4826,7 +4887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ "anyhow", - "indexmap 2.13.0", + "indexmap 2.14.0", "wasm-encoder", "wasmparser", ] @@ -4852,15 +4913,15 @@ checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ "bitflags", "hashbrown 0.15.5", - "indexmap 2.13.0", + "indexmap 2.14.0", "semver", ] [[package]] name = "web-sys" -version = "0.3.89" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10053fbf9a374174094915bbce141e87a6bf32ecd9a002980db4b638405e8962" +checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" dependencies = [ "js-sys", "wasm-bindgen", @@ -4878,18 +4939,18 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" dependencies = [ "rustls-pki-types", ] [[package]] name = "webpki-roots" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" dependencies = [ "rustls-pki-types", ] @@ -4988,15 +5049,6 @@ dependencies = [ "windows-targets 0.42.2", ] -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -5039,21 +5091,6 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -5093,12 +5130,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -5117,12 +5148,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -5141,12 +5166,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -5177,12 +5196,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -5201,12 +5214,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -5225,12 +5232,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -5249,12 +5250,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -5269,19 +5264,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" - -[[package]] -name = "winreg" -version = "0.50.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" [[package]] name = "wit-bindgen" @@ -5292,6 +5277,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -5311,7 +5302,7 @@ checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", "heck", - "indexmap 2.13.0", + "indexmap 2.14.0", "prettyplease", "syn", "wasm-metadata", @@ -5342,7 +5333,7 @@ checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", "bitflags", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "serde", "serde_derive", @@ -5361,7 +5352,7 @@ checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "semver", "serde", @@ -5373,9 +5364,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "wyz" @@ -5403,9 +5394,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -5414,9 +5405,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -5426,18 +5417,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.39" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.39" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -5446,18 +5437,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -5487,9 +5478,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -5498,9 +5489,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -5509,9 +5500,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index f30dfc4a..9ed97ac1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,11 +15,10 @@ kubernetes = ["dep:kube", "dep:k8s-openapi", "dep:schemars", "dep:either"] notebook = ["kubernetes"] openwebui = ["kubernetes"] lifecycle = ["notebook"] -chemchat = [] observe = [] mcp = [] moleviewer = [] -full = ["notebook", "lifecycle", "observe", "mcp", "openwebui", "chemchat"] +full = ["notebook", "lifecycle", "observe", "mcp", "openwebui"] [dependencies] # Async dep @@ -44,10 +43,10 @@ url = "2.5.0" toml = "1.0.1" urlencoding = "2.1.3" actix-ws = "0.4.0" -tokio-tungstenite = { version = "0.28", features = ["url", "rustls-tls-native-roots"] } +tokio-tungstenite = { version = "0.29", features = ["url", "rustls-tls-native-roots"] } # Auth deps rust-argon2 = "~3.0" -sha2 = "~0.10" +sha2 = "~0.11.0" jsonwebtoken = { version = "=10.3.0", features = ["use_pem", "rust_crypto"] } openssl = "~0.10" tokio-rustls = "0.26" @@ -64,12 +63,12 @@ regex = "~1.12" # Error handling thiserror = "2" # DB -mongodb = "=3.5" -redis = { version = "=1.0.4", features = ["tokio-comp", "num-bigint"] } +mongodb = "=3.6" +redis = { version = "=1.2.0", features = ["tokio-comp", "num-bigint"] } #macro utils = { path = "utils" } # Kubernetes -kube = { version = "~3.0", features = ["runtime", "derive"], optional = true } +kube = { version = "~3.1", features = ["runtime", "derive"], optional = true } k8s-openapi = { version = "0.27", features = ["latest"], optional = true } schemars = { version = "1.0", optional = true } either = { version = "1.13.0", optional = true } @@ -78,7 +77,7 @@ mimalloc = "~0.1" # security base64 = "~0.22.1" rand = "~0.10" -uuid = { version = "~1.21", features = ["v4"] } +uuid = { version = "~1.23", features = ["v4"] } [dev-dependencies] jsonwebkey = { version = "~0.4", features = ["jwt-convert"] } diff --git a/Dockerfile b/Dockerfile index 6b0cdb4e..eae64b11 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Stage 1 build -FROM rust:1.94.0 AS builder +FROM rust:1.95.0 AS builder WORKDIR /app @@ -10,7 +10,6 @@ ARG LIFECYCLE=false ARG OBSERVE=false ARG MCP=false ARG OWUI=false -ARG CHEMCHAT=false RUN <, pub observability_cred: Option<(String, String)>, - #[cfg(feature = "chemchat")] - pub chemchat_url: String, - #[cfg(feature = "chemchat")] - pub chemchat_internal_url: String, #[cfg(feature = "openwebui")] pub owui: OwuiConfig, #[cfg(feature = "openwebui")] @@ -50,6 +46,7 @@ pub struct Configuration { #[cfg(feature = "openwebui")] pub moleviewer_internal_url: String, pub bridge_url: String, + pub custom_resource_csp: HashMap, } #[cfg(feature = "openwebui")] @@ -254,17 +251,6 @@ pub fn init_once() -> Configuration { ) .unwrap(); - #[cfg(feature = "chemchat")] - let (chemchat_url, chemchat_internal_url) = { - ( - app_conf["chemchat_url"].as_str().unwrap().to_string(), - app_conf["chemchat_internal_url"] - .as_str() - .unwrap() - .to_string(), - ) - }; - let bridge_url = app_conf["bridge_url"].as_str().unwrap().to_string(); #[cfg(feature = "openwebui")] @@ -312,6 +298,13 @@ pub fn init_once() -> Configuration { } }; + let custom_resource_csp = conf_table["custom_resource_csp"] + .as_table() + .unwrap() + .into_iter() + .map(|s| (s.0.clone(), s.1.as_str().unwrap().into())) + .collect(); + Configuration { encoder, decoder, @@ -330,16 +323,14 @@ pub fn init_once() -> Configuration { company, oidc: oidc_map, observability_cred, - #[cfg(feature = "chemchat")] - chemchat_url, - #[cfg(feature = "chemchat")] - chemchat_internal_url, + #[cfg(feature = "openwebui")] owui, #[cfg(feature = "openwebui")] moleviewer_url, #[cfg(feature = "openwebui")] moleviewer_internal_url, bridge_url, + custom_resource_csp, } } @@ -399,4 +390,16 @@ mod tests { assert!(!cred.1.is_empty()); assert!(cred.1.len() > 10); } + + #[test] + fn test_skip_csp_path() { + let config = init_once(); + let map = &config.custom_resource_csp; + + let scp = map.get("foo").unwrap(); + assert_eq!(scp, "bar"); + + let scp = map.get("baz").unwrap(); + assert_eq!(scp, "zap"); + } } diff --git a/src/web/bridge_middleware/security_cache_header.rs b/src/web/bridge_middleware/security_cache_header.rs index 044b253b..ae3ea72e 100644 --- a/src/web/bridge_middleware/security_cache_header.rs +++ b/src/web/bridge_middleware/security_cache_header.rs @@ -7,6 +7,8 @@ use actix_web::{ }; use futures::future::LocalBoxFuture; +use crate::config::CONFIG; + pub struct SecurityCacheHeader; impl Transform for SecurityCacheHeader @@ -43,17 +45,23 @@ where forward_ready!(service); fn call(&self, req: ServiceRequest) -> Self::Future { + let path = req.path(); + let crc = &CONFIG.custom_resource_csp; + // TODO: This is not the most robust way of doing this... improve this in later iterations + let custom_csp = crc.iter().find(|&v| path.contains(v.0)); + // add csp header let response = self.service.call(req); Box::pin(async move { let mut res = response.await?; let header = res.headers_mut(); - header.insert( - header::CONTENT_SECURITY_POLICY, - HeaderValue::from_str( - "default-src 'self'; img-src *; style-src 'self'; script-src 'self';", - )?, - ); + + let csp = match custom_csp { + Some(m) => m.1, + None => "default-src 'self'; img-src *; style-src 'self'; script-src 'self';", + }; + + header.insert(header::CONTENT_SECURITY_POLICY, HeaderValue::from_str(csp)?); header.insert(CACHE_CONTROL, HeaderValue::from_str("no-cache")?); // add HSTS header header.insert( diff --git a/src/web/mod.rs b/src/web/mod.rs index 07f72684..de429c02 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -163,18 +163,6 @@ pub async fn start_server(with_tls: bool) -> Result<()> { // todo!(); // } - #[cfg(feature = "chemchat")] - let app = { - use self::bridge_middleware::CookieCheck; - - app.service( - web::scope("") - .guard(guard::Host(&CONFIG.chemchat_url)) - .wrap(CookieCheck) - .configure(route::chemchat::config_chemchat), - ) - }; - let app = app.service(actix_files::Files::new("/static", "static")); #[cfg(feature = "notebook")] diff --git a/src/web/route/chemchat/mod.rs b/src/web/route/chemchat/mod.rs deleted file mode 100644 index fa250f53..00000000 --- a/src/web/route/chemchat/mod.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::str::FromStr; - -use actix_web::{ - HttpRequest, HttpResponse, - dev::PeerAddr, - http::Method, - web::{self, ReqData}, -}; -use tracing::instrument; -use url::Url; - -use crate::{ - config::CONFIG, - db::models::BridgeCookie, - errors::{BridgeError, Result}, - web::{ - bridge_middleware::ResourceCookieCheck, - helper::{self, forwarding}, - }, -}; - -use super::resource::resource_http; - -// todo: move this to config -const CHEMCHAT_NAME: &str = "main-api"; - -#[instrument(skip(payload))] -async fn chemchat_forward( - req: HttpRequest, - payload: web::Payload, - method: Method, - peer_addr: Option, - bridge_cookie: Option>, - client: web::Data, -) -> Result { - bridge_cookie - .as_ref() - .and_then(|bc| bc.resources.as_ref()) - .filter(|resources| resources.iter().any(|r| r == CHEMCHAT_NAME)) - .ok_or_else(|| BridgeError::Unauthorized("Access denied to chemchat".to_string()))?; - - let mut url = Url::from_str(&CONFIG.chemchat_internal_url)?; - let path = req.path(); - url.set_path(path); - url.set_query(req.uri().query()); - - helper::forwarding::forward( - req, - payload, - method, - peer_addr, - client, - url, - forwarding::Config { - ..Default::default() - }, - ) - .await -} - -pub fn config_chemchat(cfg: &mut web::ServiceConfig) { - cfg.service( - web::scope("/resource") - .wrap(ResourceCookieCheck) - .default_service(web::to(resource_http)), - ); - cfg.service(web::scope("").default_service(web::to(chemchat_forward))); -} diff --git a/src/web/route/mod.rs b/src/web/route/mod.rs index f1b33649..473a2bea 100644 --- a/src/web/route/mod.rs +++ b/src/web/route/mod.rs @@ -20,8 +20,6 @@ pub mod mcp; pub mod notebook; #[cfg(feature = "openwebui")] pub mod openwebui; -#[cfg(feature = "chemchat")] -pub mod chemchat; pub mod portal; pub mod proxy; pub mod resource; From a990333a043dcb5d763d83e9f1f42623dc518b9e Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Wed, 22 Apr 2026 13:59:37 -0400 Subject: [PATCH 11/12] update dep --- Cargo.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 76e1afb6..e974dd3f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2423,9 +2423,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libmimalloc-sys" -version = "0.1.46" +version = "0.1.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc89deee4af0429081d2a518c0431ae068222a5a262a3bc6ff4d8535ec2e02fe" +checksum = "2d1eacfa31c33ec25e873c136ba5669f00f9866d0688bea7be4d3f7e43067df6" dependencies = [ "cc", ] @@ -2540,9 +2540,9 @@ checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "mimalloc" -version = "0.1.49" +version = "0.1.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aca3c01a711f395b4257b81674c0e90e8dd1f1e62c4b7db45f684cc7a4fcb18a" +checksum = "b3627c4272df786b9260cabaa46aec1d59c93ede723d4c3ef646c503816b0640" dependencies = [ "libmimalloc-sys", ] @@ -3652,9 +3652,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.12" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", @@ -5264,9 +5264,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" [[package]] name = "wit-bindgen" From ae8ff5eefa4f73ce357b31f8a6b791154ea2a551 Mon Sep 17 00:00:00 2001 From: Daniel Choi Date: Wed, 29 Apr 2026 00:45:23 -0400 Subject: [PATCH 12/12] unit test fix --- src/kube/openwebui/mod.rs | 16 +++++++--------- src/web/route/openwebui/mod.rs | 6 +++--- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/kube/openwebui/mod.rs b/src/kube/openwebui/mod.rs index 52e1ea59..d98dc740 100644 --- a/src/kube/openwebui/mod.rs +++ b/src/kube/openwebui/mod.rs @@ -1,5 +1,3 @@ -#![allow(dead_code)] - use std::borrow::Cow; use kube::CustomResource; @@ -52,7 +50,7 @@ pub struct Env { mod test { use std::borrow::Cow; - use crate::kube::KubeAPI; + // use crate::kube::KubeAPI; #[tokio::test] async fn test_deserialize_owui() { @@ -93,12 +91,12 @@ mod test { Ok(json) => println!("Successfully serialized OpenWebUI to JSON:\n{}", json), Err(e) => panic!("Failed to serialize OpenWebUI to JSON: {}", e), } - rustls::crypto::ring::default_provider() - .install_default() - .expect("Cannot install default provider with ring"); + // rustls::crypto::ring::default_provider() + // .install_default() + // .expect("Cannot install default provider with ring"); - crate::kube::init_once().await; - let k = KubeAPI::new(owui); - k.create("openwebui").await.unwrap(); + // crate::kube::init_once().await; + // let k = KubeAPI::new(owui); + // k.create("openwebui").await.unwrap(); } } diff --git a/src/web/route/openwebui/mod.rs b/src/web/route/openwebui/mod.rs index 8091be53..facd661a 100644 --- a/src/web/route/openwebui/mod.rs +++ b/src/web/route/openwebui/mod.rs @@ -404,9 +404,9 @@ impl From<&User> for UserOwui { pub(crate) fn make_forward_url(protocol: &str, subject: &str) -> String { let namespace = *OWUI_NAMESPACE; // if in dev mode - if cfg!(debug_assertions) { - return format!("{protocol}://0.0.0.0:{OWUI_PORT}"); - } + // if cfg!(debug_assertions) { + // return format!("{protocol}://0.0.0.0:{OWUI_PORT}"); + // } format!("{protocol}://u{subject}-openwebui.{namespace}.svc.cluster.local:{OWUI_PORT}") }