From c988c2b387449a2017562d1fa5b97c88c06f9682 Mon Sep 17 00:00:00 2001 From: Jade Ellis Date: Mon, 16 Mar 2026 16:48:53 +0000 Subject: [PATCH 01/36] chore: Release --- Cargo.lock | 22 +++++++++++----------- Cargo.toml | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b8ed8116..8e025f70 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -905,7 +905,7 @@ dependencies = [ [[package]] name = "conduwuit" -version = "0.5.6" +version = "0.5.7-alpha.1" dependencies = [ "clap", "conduwuit_admin", @@ -937,7 +937,7 @@ dependencies = [ [[package]] name = "conduwuit_admin" -version = "0.5.6" +version = "0.5.7-alpha.1" dependencies = [ "clap", "conduwuit_api", @@ -958,7 +958,7 @@ dependencies = [ [[package]] name = "conduwuit_api" -version = "0.5.6" +version = "0.5.7-alpha.1" dependencies = [ "async-trait", "axum", @@ -990,14 +990,14 @@ dependencies = [ [[package]] name = "conduwuit_build_metadata" -version = "0.5.6" +version = "0.5.7-alpha.1" dependencies = [ "built", ] [[package]] name = "conduwuit_core" -version = "0.5.6" +version = "0.5.7-alpha.1" dependencies = [ "argon2", "arrayvec", @@ -1059,7 +1059,7 @@ dependencies = [ [[package]] name = "conduwuit_database" -version = "0.5.6" +version = "0.5.7-alpha.1" dependencies = [ "async-channel", "conduwuit_core", @@ -1077,7 +1077,7 @@ dependencies = [ [[package]] name = "conduwuit_macros" -version = "0.5.6" +version = "0.5.7-alpha.1" dependencies = [ "itertools 0.14.0", "proc-macro2", @@ -1087,7 +1087,7 @@ dependencies = [ [[package]] name = "conduwuit_router" -version = "0.5.6" +version = "0.5.7-alpha.1" dependencies = [ "axum", "axum-client-ip", @@ -1121,7 +1121,7 @@ dependencies = [ [[package]] name = "conduwuit_service" -version = "0.5.6" +version = "0.5.7-alpha.1" dependencies = [ "askama", "async-trait", @@ -1163,7 +1163,7 @@ dependencies = [ [[package]] name = "conduwuit_web" -version = "0.5.6" +version = "0.5.7-alpha.1" dependencies = [ "askama", "axum", @@ -6538,7 +6538,7 @@ dependencies = [ [[package]] name = "xtask" -version = "0.5.6" +version = "0.5.7-alpha.1" dependencies = [ "askama", "cargo_metadata", diff --git a/Cargo.toml b/Cargo.toml index 5c34525f..694c8018 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ license = "Apache-2.0" # See also `rust-toolchain.toml` readme = "README.md" repository = "https://forgejo.ellis.link/continuwuation/continuwuity" -version = "0.5.6" +version = "0.5.7-alpha.1" [workspace.metadata.crane] name = "conduwuit" From 3356b60e97eb7e177dafe561418719881fb01484 Mon Sep 17 00:00:00 2001 From: Jade Ellis Date: Mon, 16 Mar 2026 18:13:26 +0000 Subject: [PATCH 02/36] chore: Remove git.nexy7574.co.uk mirror This mirror seems to have some issues preventing regsync from working. --- .forgejo/regsync/regsync.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.forgejo/regsync/regsync.yml b/.forgejo/regsync/regsync.yml index cd4ac094..4862c604 100644 --- a/.forgejo/regsync/regsync.yml +++ b/.forgejo/regsync/regsync.yml @@ -62,10 +62,6 @@ sync: target: registry.gitlab.com/continuwuity/continuwuity type: repository <<: *tags-main - - source: *source - target: git.nexy7574.co.uk/mirrored/continuwuity - type: repository - <<: *tags-releases - source: *source target: ghcr.io/continuwuity/continuwuity type: repository From acef746d267577b8f445c16a0e9d7df585c1ff41 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 9 Mar 2026 13:01:56 +0000 Subject: [PATCH 03/36] fix(deps): Update rust crate recaptcha-verify to 0.2.0 --- Cargo.lock | 4 ++-- src/service/Cargo.toml | 2 +- src/service/uiaa/mod.rs | 17 ++++------------- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8e025f70..26552c03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4156,9 +4156,9 @@ dependencies = [ [[package]] name = "recaptcha-verify" -version = "0.1.6" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d694033c2b0abdbb8893edfb367f16270e790be4a67e618206d811dbe4efee4" +checksum = "409bf11a93fe93093f3c0254aab67576524f1e0524692615b5b63091dbc88a79" dependencies = [ "reqwest", "serde", diff --git a/src/service/Cargo.toml b/src/service/Cargo.toml index 8591496b..4d164e1b 100644 --- a/src/service/Cargo.toml +++ b/src/service/Cargo.toml @@ -121,7 +121,7 @@ webpage.workspace = true webpage.optional = true blurhash.workspace = true blurhash.optional = true -recaptcha-verify = { version = "0.1.5", default-features = false } +recaptcha-verify = { version = "0.2.0", default-features = false } yansi.workspace = true [target.'cfg(all(unix, target_os = "linux"))'.dependencies] diff --git a/src/service/uiaa/mod.rs b/src/service/uiaa/mod.rs index 7c15a919..4a224675 100644 --- a/src/service/uiaa/mod.rs +++ b/src/service/uiaa/mod.rs @@ -181,20 +181,11 @@ pub async fn try_auth( uiaainfo.completed.push(AuthType::Password); }, | AuthData::ReCaptcha(r) => { - if self.services.config.recaptcha_private_site_key.is_none() { + let Some(ref private_site_key) = self.services.config.recaptcha_private_site_key + else { return Err!(Request(Forbidden("ReCaptcha is not configured."))); - } - match recaptcha_verify::verify( - self.services - .config - .recaptcha_private_site_key - .as_ref() - .unwrap(), - r.response.as_str(), - None, - ) - .await - { + }; + match recaptcha_verify::verify_v3(private_site_key, r.response.as_str(), None).await { | Ok(()) => { uiaainfo.completed.push(AuthType::ReCaptcha); }, From f0f53dfada3e7c8590ec3dbcd3bb4f227b23335b Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Wed, 18 Mar 2026 05:05:56 +0000 Subject: [PATCH 04/36] chore(deps): lock file maintenance --- Cargo.lock | 138 ++++++++++++++++++++++------------------------ flake.lock | 36 ++++++------ package-lock.json | 61 ++++++++++---------- 3 files changed, 117 insertions(+), 118 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 26552c03..51116a70 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -94,9 +94,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anyhow" @@ -221,7 +221,7 @@ dependencies = [ "serde", "serde_derive", "unicode-ident", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -750,9 +750,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.56" +version = "1.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", "jobserver", @@ -823,9 +823,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", "clap_derive", @@ -833,9 +833,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstyle", "clap_lex", @@ -843,9 +843,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.55" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" +checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" dependencies = [ "heck", "proc-macro2", @@ -855,9 +855,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "cmake" @@ -2561,9 +2561,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.9" +version = "0.25.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", "byteorder-lite", @@ -2579,8 +2579,8 @@ dependencies = [ "rayon", "rgb", "tiff", - "zune-core 0.5.1", - "zune-jpeg 0.5.12", + "zune-core", + "zune-jpeg", ] [[package]] @@ -2866,9 +2866,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.24" +version = "1.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4735e9cbde5aac84a5ce588f6b23a90b9b0b528f6c5a8db8a4aff300463a0839" +checksum = "d52f4c29e2a68ac30c9087e1b772dc9f44a2b66ed44edf2266cf2be9b03dafc1" dependencies = [ "cc", "pkg-config", @@ -3115,9 +3115,9 @@ dependencies = [ [[package]] name = "moxcms" -version = "0.7.11" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" dependencies = [ "num-traits", "pxfm", @@ -3478,9 +3478,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" dependencies = [ "critical-section", "portable-atomic", @@ -3828,7 +3828,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.4+spec-1.1.0", + "toml_edit 0.25.5+spec-1.1.0", ] [[package]] @@ -3966,9 +3966,9 @@ 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 = [ "bytes", "getrandom 0.3.4", @@ -4121,9 +4121,9 @@ dependencies = [ [[package]] name = "ravif" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef69c1990ceef18a116855938e74793a5f7496ee907562bd0857b6ac734ab285" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" dependencies = [ "avif-serialize", "imgref", @@ -4654,9 +4654,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", ] @@ -5301,16 +5301,16 @@ dependencies = [ [[package]] name = "tiff" -version = "0.10.3" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" dependencies = [ "fax", "flate2", "half", "quick-error", "weezl", - "zune-jpeg 0.4.21", + "zune-jpeg", ] [[package]] @@ -5384,9 +5384,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", ] @@ -5495,7 +5495,7 @@ dependencies = [ "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "toml_writer", - "winnow", + "winnow 0.7.15", ] [[package]] @@ -5518,9 +5518,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.0+spec-1.1.0" +version = "1.0.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" dependencies = [ "serde_core", ] @@ -5536,28 +5536,28 @@ dependencies = [ "serde_spanned 0.6.9", "toml_datetime 0.6.11", "toml_write", - "winnow", + "winnow 0.7.15", ] [[package]] name = "toml_edit" -version = "0.25.4+spec-1.1.0" +version = "0.25.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" dependencies = [ "indexmap", - "toml_datetime 1.0.0+spec-1.1.0", + "toml_datetime 1.0.1+spec-1.1.0", "toml_parser", - "winnow", + "winnow 1.0.0", ] [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.0.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" dependencies = [ - "winnow", + "winnow 1.0.0", ] [[package]] @@ -5568,9 +5568,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" -version = "1.0.6+spec-1.1.0" +version = "1.0.7+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" +checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" [[package]] name = "tonic" @@ -5750,9 +5750,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 = [ "matchers", "nu-ansi-term", @@ -6404,6 +6404,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" @@ -6584,18 +6593,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.41" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96e13bc581734df6250836c59a5f44f3c57db9f9acb9dc8e3eaabdaf6170254d" +checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.41" +version = "0.8.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3545ea9e86d12ab9bba9fcd99b54c1556fd3199007def5a03c375623d05fac1c" +checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" dependencies = [ "proc-macro2", "quote", @@ -6696,12 +6705,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "zune-core" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" - [[package]] name = "zune-core" version = "0.5.1" @@ -6719,18 +6722,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.21" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +checksum = "ec5f41c76397b7da451efd19915684f727d7e1d516384ca6bd0ec43ec94de23c" dependencies = [ - "zune-core 0.4.12", -] - -[[package]] -name = "zune-jpeg" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "410e9ecef634c709e3831c2cfdb8d9c32164fae1c67496d5b68fff728eec37fe" -dependencies = [ - "zune-core 0.5.1", + "zune-core", ] diff --git a/flake.lock b/flake.lock index 6fe13570..7e14ef30 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "advisory-db": { "flake": false, "locked": { - "lastModified": 1772776993, - "narHash": "sha256-CpBa+UpogN0Xn1gMmgqQrzKGee+E8TCkgHar8/w6CRk=", + "lastModified": 1773786698, + "narHash": "sha256-o/J7ZculgwSs1L4H4UFlFZENOXTJzq1X0n71x6oNNvY=", "owner": "rustsec", "repo": "advisory-db", - "rev": "b3472341e37cbd4b8c27b052b2abb34792f4d3c4", + "rev": "99e9de91bb8b61f06ef234ff84e11f758ecd5384", "type": "github" }, "original": { @@ -18,11 +18,11 @@ }, "crane": { "locked": { - "lastModified": 1772560058, - "narHash": "sha256-NuVKdMBJldwUXgghYpzIWJdfeB7ccsu1CC7B+NfSoZ8=", + "lastModified": 1773189535, + "narHash": "sha256-E1G/Or6MWeP+L6mpQ0iTFLpzSzlpGrITfU2220Gq47g=", "owner": "ipetkov", "repo": "crane", - "rev": "db590d9286ed5ce22017541e36132eab4e8b3045", + "rev": "6fa2fb4cf4a89ba49fc9dd5a3eb6cde99d388269", "type": "github" }, "original": { @@ -39,11 +39,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1772953398, - "narHash": "sha256-fTTHCaEvPLzWyZFxPud/G9HM3pNYmW/64Kj58hdH4+k=", + "lastModified": 1773732206, + "narHash": "sha256-HKibxaUXyWd4Hs+ZUnwo6XslvaFqFqJh66uL9tphU4Q=", "owner": "nix-community", "repo": "fenix", - "rev": "fc4863887d98fd879cf5f11af1d23d44d9bdd8ae", + "rev": "0aa13c1b54063a8d8679b28a5cd357ba98f4a56b", "type": "github" }, "original": { @@ -89,11 +89,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1772773019, - "narHash": "sha256-E1bxHxNKfDoQUuvriG71+f+s/NT0qWkImXsYZNFFfCs=", + "lastModified": 1773734432, + "narHash": "sha256-IF5ppUWh6gHGHYDbtVUyhwy/i7D261P7fWD1bPefOsw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "aca4d95fce4914b3892661bcb80b8087293536c6", + "rev": "cda48547b432e8d3b18b4180ba07473762ec8558", "type": "github" }, "original": { @@ -132,11 +132,11 @@ "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1772877513, - "narHash": "sha256-RcRGv2Bng5I9y75XwFX7oK2l6mLH1dtbTTG9U8qun0c=", + "lastModified": 1773697963, + "narHash": "sha256-xdKI77It9PM6eNrCcDZsnP4SKulZwk8VkDgBRVMnCb8=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "a1b86d600f88be98643e5dd61d6ed26eda17c09e", + "rev": "2993637174252ff60a582fd1f55b9ab52c39db6d", "type": "github" }, "original": { @@ -153,11 +153,11 @@ ] }, "locked": { - "lastModified": 1772660329, - "narHash": "sha256-IjU1FxYqm+VDe5qIOxoW+pISBlGvVApRjiw/Y/ttJzY=", + "lastModified": 1773297127, + "narHash": "sha256-6E/yhXP7Oy/NbXtf1ktzmU8SdVqJQ09HC/48ebEGBpk=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "3710e0e1218041bbad640352a0440114b1e10428", + "rev": "71b125cd05fbfd78cab3e070b73544abe24c5016", "type": "github" }, "original": { diff --git a/package-lock.json b/package-lock.json index 82a8fc54..a7983e00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,21 +16,21 @@ } }, "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.0.tgz", + "integrity": "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.1.0", + "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.0.tgz", + "integrity": "sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==", "dev": true, "license": "MIT", "optional": true, @@ -39,9 +39,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", "dev": true, "license": "MIT", "optional": true, @@ -144,17 +144,22 @@ } }, "node_modules/@rsbuild/plugin-react": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@rsbuild/plugin-react/-/plugin-react-1.4.5.tgz", - "integrity": "sha512-eS2sXCedgGA/7bLu8yVtn48eE/GyPbXx4Q7OcutB01IQ1D2y8WSMBys4nwfrecy19utvw4NPn4gYDy52316+vg==", + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@rsbuild/plugin-react/-/plugin-react-1.4.6.tgz", + "integrity": "sha512-LAT6xHlEyZKA0VjF/ph5d50iyG+WSmBx+7g98HNZUwb94VeeTMZFB8qVptTkbIRMss3BNKOXmHOu71Lhsh9oEw==", "dev": true, "license": "MIT", "dependencies": { - "@rspack/plugin-react-refresh": "^1.6.0", + "@rspack/plugin-react-refresh": "^1.6.1", "react-refresh": "^0.18.0" }, "peerDependencies": { "@rsbuild/core": "^1.0.0 || ^2.0.0-0" + }, + "peerDependenciesMeta": { + "@rsbuild/core": { + "optional": true + } } }, "node_modules/@rspack/binding": { @@ -695,13 +700,13 @@ "license": "ISC" }, "node_modules/@unhead/react": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@unhead/react/-/react-2.1.10.tgz", - "integrity": "sha512-z9IzzkaCI1GyiBwVRMt4dGc2mOvsj9drbAdXGMy6DWpu9FwTR37ZTmAi7UeCVyIkpVdIaNalz7vkbvGG8afFng==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/@unhead/react/-/react-2.1.12.tgz", + "integrity": "sha512-1xXFrxyw29f+kScXfEb0GxjlgtnHxoYau0qpW9k8sgWhQUNnE5gNaH3u+rNhd5IqhyvbdDRJpQ25zoz0HIyGaw==", "dev": true, "license": "MIT", "dependencies": { - "unhead": "2.1.10" + "unhead": "2.1.12" }, "funding": { "url": "https://github.com/sponsors/harlan-zw" @@ -1573,9 +1578,9 @@ } }, "node_modules/hookable": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.0.1.tgz", - "integrity": "sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.0.tgz", + "integrity": "sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw==", "dev": true, "license": "MIT" }, @@ -2978,14 +2983,14 @@ "license": "MIT" }, "node_modules/oniguruma-to-es": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", - "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.5.tgz", + "integrity": "sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==", "dev": true, "license": "MIT", "dependencies": { "oniguruma-parser": "^0.12.1", - "regex": "^6.0.1", + "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, @@ -3720,9 +3725,9 @@ } }, "node_modules/unhead": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/unhead/-/unhead-2.1.10.tgz", - "integrity": "sha512-We8l9uNF8zz6U8lfQaVG70+R/QBfQx1oPIgXin4BtZnK2IQpz6yazQ0qjMNVBDw2ADgF2ea58BtvSK+XX5AS7g==", + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/unhead/-/unhead-2.1.12.tgz", + "integrity": "sha512-iTHdWD9ztTunOErtfUFk6Wr11BxvzumcYJ0CzaSCBUOEtg+DUZ9+gnE99i8QkLFT2q1rZD48BYYGXpOZVDLYkA==", "dev": true, "license": "MIT", "dependencies": { From 951501964191f65f1184441d38d599d3aab4ba70 Mon Sep 17 00:00:00 2001 From: Ginger Date: Wed, 18 Mar 2026 10:57:50 -0400 Subject: [PATCH 05/36] fix: Allow cognitive_complexity on two particularly large functions --- src/core/matrix/state_res/event_auth.rs | 1 + src/core/matrix/state_res/mod.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/core/matrix/state_res/event_auth.rs b/src/core/matrix/state_res/event_auth.rs index 24f03162..60e40d4f 100644 --- a/src/core/matrix/state_res/event_auth.rs +++ b/src/core/matrix/state_res/event_auth.rs @@ -1224,6 +1224,7 @@ fn can_send_event(event: &impl Event, ple: Option<&impl Event>, user_level: Int) } /// Confirm that the event sender has the required power levels. +#[allow(clippy::cognitive_complexity)] fn check_power_levels( room_version: &RoomVersion, power_event: &impl Event, diff --git a/src/core/matrix/state_res/mod.rs b/src/core/matrix/state_res/mod.rs index 8370bc65..bb6a274f 100644 --- a/src/core/matrix/state_res/mod.rs +++ b/src/core/matrix/state_res/mod.rs @@ -75,6 +75,7 @@ type Result = crate::Result; /// event is part of the same room. //#[tracing::instrument(level = "debug", skip(state_sets, auth_chain_sets, //#[tracing::instrument(level event_fetch))] +#[allow(clippy::cognitive_complexity)] pub async fn resolve<'a, Pdu, Sets, SetIter, Hasher, Fetch, FetchFut, Exists, ExistsFut>( room_version: &RoomVersionId, state_sets: Sets, From 3d50af09437083fa2420aa8100f98f9c056affb7 Mon Sep 17 00:00:00 2001 From: Ginger Date: Sat, 28 Feb 2026 20:32:46 -0500 Subject: [PATCH 06/36] refactor: Split web code into multiple files, improve static resource loading --- Cargo.lock | 76 ++++++++++++++++++ src/web/Cargo.toml | 5 ++ src/web/askama.toml | 2 + src/web/build.rs | 1 + src/web/mod.rs | 77 ++++++------------- src/web/pages/index.rs | 29 +++++++ src/web/pages/mod.rs | 2 + src/web/pages/resources.rs | 9 +++ src/web/pages/resources/logo.svg | 43 +++++++++++ .../index.css => pages/resources/style.css} | 0 src/web/{ => pages}/templates/_layout.html.j2 | 14 ++-- src/web/{ => pages}/templates/error.html.j2 | 0 src/web/{ => pages}/templates/index.html.j2 | 0 src/web/templates/logo.svg | 1 - 14 files changed, 194 insertions(+), 65 deletions(-) create mode 100644 src/web/askama.toml create mode 100644 src/web/build.rs create mode 100644 src/web/pages/index.rs create mode 100644 src/web/pages/mod.rs create mode 100644 src/web/pages/resources.rs create mode 100644 src/web/pages/resources/logo.svg rename src/web/{css/index.css => pages/resources/style.css} (100%) rename src/web/{ => pages}/templates/_layout.html.j2 (61%) rename src/web/{ => pages}/templates/error.html.j2 (100%) rename src/web/{ => pages}/templates/index.html.j2 (100%) delete mode 120000 src/web/templates/logo.svg diff --git a/Cargo.lock b/Cargo.lock index 51116a70..112224ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1170,8 +1170,10 @@ dependencies = [ "conduwuit_build_metadata", "conduwuit_service", "futures", + "memory-serve", "rand 0.10.0", "thiserror 2.0.18", + "tower-http", "tracing", ] @@ -3027,6 +3029,22 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "memory-serve" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b5bbad2035f57b1e95f66da606832edd935b47d82312e38e1ccffbcfb8a427" +dependencies = [ + "axum", + "brotli", + "flate2", + "mime_guess", + "sha256", + "tracing", + "urlencoding", + "walkdir", +] + [[package]] name = "meowlnir-antispam" version = "0.1.0" @@ -3043,6 +3061,16 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minicbor" version = "2.2.1" @@ -4632,6 +4660,15 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "sanitize-filename" version = "0.6.0" @@ -4993,6 +5030,19 @@ dependencies = [ "digest", ] +[[package]] +name = "sha256" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f880fc8562bdeb709793f00eb42a2ad0e672c4f883bbe59122b926eca935c8f6" +dependencies = [ + "async-trait", + "bytes", + "hex", + "sha2", + "tokio", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -5673,6 +5723,7 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -5894,6 +5945,12 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf-8" version = "0.7.6" @@ -5947,6 +6004,16 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -6161,6 +6228,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/src/web/Cargo.toml b/src/web/Cargo.toml index 84de46da..be8c7ec7 100644 --- a/src/web/Cargo.toml +++ b/src/web/Cargo.toml @@ -26,6 +26,11 @@ futures.workspace = true tracing.workspace = true rand.workspace = true thiserror.workspace = true +tower-http.workspace = true +memory-serve = "2.1.0" + +[build-dependencies] +memory-serve = "2.1.0" [lints] workspace = true diff --git a/src/web/askama.toml b/src/web/askama.toml new file mode 100644 index 00000000..56cb707e --- /dev/null +++ b/src/web/askama.toml @@ -0,0 +1,2 @@ +[general] +dirs = ["pages/templates"] diff --git a/src/web/build.rs b/src/web/build.rs new file mode 100644 index 00000000..bd97b8d5 --- /dev/null +++ b/src/web/build.rs @@ -0,0 +1 @@ +fn main() { memory_serve::load_directory("./pages/resources"); } diff --git a/src/web/mod.rs b/src/web/mod.rs index 25da1139..a0b2ae05 100644 --- a/src/web/mod.rs +++ b/src/web/mod.rs @@ -1,52 +1,15 @@ use askama::Template; use axum::{ Router, - extract::State, - http::{StatusCode, header}, + http::{HeaderValue, StatusCode, header}, response::{Html, IntoResponse, Response}, - routing::get, }; -use conduwuit_build_metadata::{GIT_REMOTE_COMMIT_URL, GIT_REMOTE_WEB_URL, version_tag}; use conduwuit_service::state; +use tower_http::set_header::SetResponseHeaderLayer; -pub fn build() -> Router { - Router::::new() - .route("/", get(index_handler)) - .route("/_continuwuity/logo.svg", get(logo_handler)) -} +mod pages; -async fn index_handler( - State(services): State, -) -> Result { - #[derive(Debug, Template)] - #[template(path = "index.html.j2")] - struct Index<'a> { - nonce: &'a str, - server_name: &'a str, - first_run: bool, - } - let nonce = rand::random::().to_string(); - - let template = Index { - nonce: &nonce, - server_name: services.config.server_name.as_str(), - first_run: services.firstrun.is_first_run(), - }; - Ok(( - [( - header::CONTENT_SECURITY_POLICY, - format!("default-src 'nonce-{nonce}'; img-src 'self';"), - )], - Html(template.render()?), - )) -} - -async fn logo_handler() -> impl IntoResponse { - ( - [(header::CONTENT_TYPE, "image/svg+xml")], - include_str!("templates/logo.svg").to_owned(), - ) -} +type State = state::State; #[derive(Debug, thiserror::Error)] enum WebError { @@ -58,29 +21,33 @@ impl IntoResponse for WebError { fn into_response(self) -> Response { #[derive(Debug, Template)] #[template(path = "error.html.j2")] - struct Error<'a> { - nonce: &'a str, + struct Error { err: WebError, } - let nonce = rand::random::().to_string(); - let status = match &self { | Self::Render(_) => StatusCode::INTERNAL_SERVER_ERROR, }; - let tmpl = Error { nonce: &nonce, err: self }; + + let tmpl = Error { err: self }; + if let Ok(body) = tmpl.render() { - ( - status, - [( - header::CONTENT_SECURITY_POLICY, - format!("default-src 'none' 'nonce-{nonce}';"), - )], - Html(body), - ) - .into_response() + (status, Html(body)).into_response() } else { (status, "Something went wrong").into_response() } } } + +pub fn build() -> Router { + #[allow(clippy::wildcard_imports)] + use pages::*; + + Router::new() + .merge(index::build()) + .merge(resources::build()) + .layer(SetResponseHeaderLayer::if_not_present( + header::CONTENT_SECURITY_POLICY, + HeaderValue::from_static("default-src 'self'"), + )) +} diff --git a/src/web/pages/index.rs b/src/web/pages/index.rs new file mode 100644 index 00000000..467888a6 --- /dev/null +++ b/src/web/pages/index.rs @@ -0,0 +1,29 @@ +use askama::Template; +use axum::{ + Router, + extract::State, + response::{Html, IntoResponse}, + routing::get, +}; +use conduwuit_service::state; + +use crate::WebError; + +pub(crate) fn build() -> Router { Router::new().route("/", get(index_handler)) } + +async fn index_handler( + State(services): State, +) -> Result { + #[derive(Debug, Template)] + #[template(path = "index.html.j2")] + struct Index<'a> { + server_name: &'a str, + first_run: bool, + } + + let template = Index { + server_name: services.config.server_name.as_str(), + first_run: services.firstrun.is_first_run(), + }; + Ok(Html(template.render()?)) +} diff --git a/src/web/pages/mod.rs b/src/web/pages/mod.rs new file mode 100644 index 00000000..3cab2597 --- /dev/null +++ b/src/web/pages/mod.rs @@ -0,0 +1,2 @@ +pub(super) mod index; +pub(super) mod resources; diff --git a/src/web/pages/resources.rs b/src/web/pages/resources.rs new file mode 100644 index 00000000..b984bb57 --- /dev/null +++ b/src/web/pages/resources.rs @@ -0,0 +1,9 @@ +use axum::Router; + +pub(crate) fn build() -> Router { + Router::new().nest( + "/_continuwuity/resources/", + #[allow(unused_qualifications)] + memory_serve::load!().index_file(None).into_router(), + ) +} diff --git a/src/web/pages/resources/logo.svg b/src/web/pages/resources/logo.svg new file mode 100644 index 00000000..aca988a3 --- /dev/null +++ b/src/web/pages/resources/logo.svg @@ -0,0 +1,43 @@ + + + + diff --git a/src/web/css/index.css b/src/web/pages/resources/style.css similarity index 100% rename from src/web/css/index.css rename to src/web/pages/resources/style.css diff --git a/src/web/templates/_layout.html.j2 b/src/web/pages/templates/_layout.html.j2 similarity index 61% rename from src/web/templates/_layout.html.j2 rename to src/web/pages/templates/_layout.html.j2 index fbae50b5..891550a2 100644 --- a/src/web/templates/_layout.html.j2 +++ b/src/web/pages/templates/_layout.html.j2 @@ -6,22 +6,18 @@ {% block title %}Continuwuity{% endblock %} - - + +
{%~ block content %}{% endblock ~%}
{%~ block footer ~%}