From 94271e9e4334060ce70b988f680bb8852e507878 Mon Sep 17 00:00:00 2001 From: Jacob Taylor Date: Tue, 12 May 2026 17:55:35 -0700 Subject: [PATCH] feat: Delete blurhash --- Cargo.lock | 413 ---------------------------- Cargo.toml | 11 +- changelog.d/+fe90cdea.removal.md | 1 + conduwuit-example.toml | 18 -- engage.toml | 2 +- src/api/client/account/mod.rs | 2 - src/api/client/media.rs | 13 +- src/api/client/membership/invite.rs | 1 - src/api/client/membership/knock.rs | 2 - src/api/client/profile.rs | 19 +- src/api/client/room/create.rs | 1 - src/api/client/room/upgrade.rs | 1 - src/core/config/mod.rs | 39 --- src/database/maps.rs | 2 +- src/main/Cargo.toml | 4 - src/service/Cargo.toml | 6 - src/service/media/blurhash.rs | 179 ------------ src/service/media/mod.rs | 1 - src/service/rooms/membership/mod.rs | 2 - src/service/users/mod.rs | 17 -- 20 files changed, 9 insertions(+), 725 deletions(-) create mode 100644 changelog.d/+fe90cdea.removal.md delete mode 100644 src/service/media/blurhash.rs diff --git a/Cargo.lock b/Cargo.lock index 327c9f560..1503d02af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -39,24 +39,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "aligned" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" -dependencies = [ - "as-slice", -] - -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -119,12 +101,6 @@ version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" -[[package]] -name = "arbitrary" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" - [[package]] name = "arc-swap" version = "1.9.1" @@ -134,17 +110,6 @@ dependencies = [ "rustversion", ] -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "argon2" version = "0.5.3" @@ -172,15 +137,6 @@ dependencies = [ "serde", ] -[[package]] -name = "as-slice" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" -dependencies = [ - "stable_deref_trait", -] - [[package]] name = "as_variant" version = "1.3.0" @@ -301,49 +257,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "av-scenechange" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" -dependencies = [ - "aligned", - "anyhow", - "arg_enum_proc_macro", - "arrayvec", - "log", - "num-rational", - "num-traits", - "pastey", - "rayon", - "thiserror", - "v_frame", - "y4m", -] - -[[package]] -name = "av1-grain" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom 8.0.0", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375082f007bd67184fb9c0374614b29f9aaa604ec301635f72338bb65386a53d" -dependencies = [ - "arrayvec", -] - [[package]] name = "aws-lc-rs" version = "1.16.3" @@ -552,27 +465,12 @@ dependencies = [ "syn", ] -[[package]] -name = "bit_field" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" - [[package]] name = "bitflags" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" -[[package]] -name = "bitstream-io" -version = "4.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" -dependencies = [ - "no_std_io2", -] - [[package]] name = "blake2" version = "0.10.6" @@ -609,15 +507,6 @@ dependencies = [ "objc2", ] -[[package]] -name = "blurhash" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79769241dcd44edf79a732545e8b5cec84c247ac060f5252cd51885d093a8fc" -dependencies = [ - "image", -] - [[package]] name = "brotli" version = "8.0.2" @@ -1167,7 +1056,6 @@ dependencies = [ "assign", "async-trait", "base64 0.22.1", - "blurhash", "bytes", "conduwuit_core", "conduwuit_database", @@ -1505,12 +1393,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - [[package]] name = "crypto-common" version = "0.1.7" @@ -1827,26 +1709,6 @@ dependencies = [ "syn", ] -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -1882,33 +1744,12 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "exr" -version = "1.74.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4300e043a56aa2cb633c01af81ca8f699a321879a7854d3896a0ba89056363be" -dependencies = [ - "bit_field", - "half", - "lebe", - "miniz_oxide", - "rayon-core", - "smallvec", - "zune-inflate", -] - [[package]] name = "fastrand" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" -[[package]] -name = "fax" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" - [[package]] name = "fdeflate" version = "0.3.7" @@ -2258,17 +2099,6 @@ dependencies = [ "tokio-util", ] -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", -] - [[package]] name = "hardened_malloc-rs" version = "0.1.2+12" @@ -2704,17 +2534,11 @@ dependencies = [ "bytemuck", "byteorder-lite", "color_quant", - "exr", "gif", "image-webp", "moxcms", "num-traits", "png", - "qoi", - "ravif", - "rayon", - "rgb", - "tiff", "zune-core", "zune-jpeg", ] @@ -2729,12 +2553,6 @@ dependencies = [ "quick-error", ] -[[package]] -name = "imgref" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40fac9d56ed6437b198fddba683305e8e2d651aa42647f00f5ae542e7f5c94a2" - [[package]] name = "indexmap" version = "2.14.0" @@ -2753,17 +2571,6 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" -[[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "ipaddress" version = "0.1.3" @@ -2965,12 +2772,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" -[[package]] -name = "lebe" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" - [[package]] name = "lettre" version = "0.11.21" @@ -3007,16 +2808,6 @@ version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" -[[package]] -name = "libfuzzer-sys" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12a681b7dd8ce12bff52488013ba614b869148d54dd79836ab85aafdd53f08d" -dependencies = [ - "arbitrary", - "cc", -] - [[package]] name = "libloading" version = "0.8.9" @@ -3109,15 +2900,6 @@ dependencies = [ "futures-sink", ] -[[package]] -name = "loop9" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] - [[package]] name = "lru-cache" version = "0.1.2" @@ -3196,16 +2978,6 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - [[package]] name = "memchr" version = "2.8.0" @@ -3354,15 +3126,6 @@ dependencies = [ "libc", ] -[[package]] -name = "no_std_io2" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b51ed7824b6e07d354605f4abb3d9d300350701299da96642ee084f5ce631550" -dependencies = [ - "memchr", -] - [[package]] name = "nohash-hasher" version = "0.2.0" @@ -3394,12 +3157,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - [[package]] name = "nu-ansi-term" version = "0.50.3" @@ -3448,17 +3205,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "num-integer" version = "0.1.46" @@ -3833,12 +3579,6 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" -[[package]] -name = "pastey" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" - [[package]] name = "pear" version = "0.2.9" @@ -4070,25 +3810,6 @@ dependencies = [ "yansi", ] -[[package]] -name = "profiling" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" -dependencies = [ - "profiling-procmacros", -] - -[[package]] -name = "profiling-procmacros" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" -dependencies = [ - "quote", - "syn", -] - [[package]] name = "prost" version = "0.14.3" @@ -4145,15 +3866,6 @@ version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" -[[package]] -name = "qoi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" -dependencies = [ - "bytemuck", -] - [[package]] name = "quick-error" version = "2.0.1" @@ -4308,76 +4020,6 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" -[[package]] -name = "rav1e" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" -dependencies = [ - "aligned-vec", - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av-scenechange", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools 0.14.0", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "paste", - "profiling", - "rand 0.9.4", - "rand_chacha", - "simd_helpers", - "thiserror", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", -] - -[[package]] -name = "rayon" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - [[package]] name = "recaptcha-verify" version = "0.2.0" @@ -4518,12 +4160,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e061d1b48cb8d38042de4ae0a7a6401009d6143dc80d2e2d6f31f0bdd6470c7" -[[package]] -name = "rgb" -version = "0.8.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" - [[package]] name = "ring" version = "0.17.14" @@ -5384,15 +5020,6 @@ dependencies = [ "simdutf8", ] -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - [[package]] name = "simdutf8" version = "0.1.5" @@ -5611,20 +5238,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "tiff" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" -dependencies = [ - "fax", - "flate2", - "half", - "quick-error", - "weezl", - "zune-jpeg", -] - [[package]] name = "tikv-jemalloc-ctl" version = "0.6.1" @@ -6279,17 +5892,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "v_frame" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - [[package]] name = "validator" version = "0.20.0" @@ -6904,12 +6506,6 @@ dependencies = [ "conduwuit_admin", ] -[[package]] -name = "y4m" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" - [[package]] name = "yansi" version = "1.0.1" @@ -7059,15 +6655,6 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] - [[package]] name = "zune-jpeg" version = "0.5.15" diff --git a/Cargo.toml b/Cargo.toml index b9f763c8b..7781b70ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -180,7 +180,7 @@ version = "0.5.3" features = ["alloc", "rand"] default-features = false -# Used to generate thumbnails for images & blurhashes +# Used to generate thumbnails for images [workspace.dependencies.image] version = "0.25.5" default-features = false @@ -191,14 +191,6 @@ features = [ "webp", ] -[workspace.dependencies.blurhash] -version = "0.2.3" -default-features = false -features = [ - "fast-linear-to-srgb", - "image", -] - # logging [workspace.dependencies.log] version = "0.4.27" @@ -364,7 +356,6 @@ features = [ "ring-compat", "compat-upload-signatures", "compat-optional-txn-pdus", - "unstable-msc2448", "unstable-msc2666", "unstable-msc2867", "unstable-msc2870", diff --git a/changelog.d/+fe90cdea.removal.md b/changelog.d/+fe90cdea.removal.md new file mode 100644 index 000000000..585e2cbe2 --- /dev/null +++ b/changelog.d/+fe90cdea.removal.md @@ -0,0 +1 @@ +Support for server-side blurhashing (part of MSC2448) has been removed. diff --git a/conduwuit-example.toml b/conduwuit-example.toml index 86a587f66..665af1a86 100644 --- a/conduwuit-example.toml +++ b/conduwuit-example.toml @@ -1870,24 +1870,6 @@ # #support_pgp_key = -[global.blurhashing] - -# blurhashing x component, 4 is recommended by https://blurha.sh/ -# -#components_x = 4 - -# blurhashing y component, 3 is recommended by https://blurha.sh/ -# -#components_y = 3 - -# Max raw size that the server will blurhash, this is the size of the -# image after converting it to raw data, it should be higher than the -# upload limit but not too high. The higher it is the higher the -# potential load will be for clients requesting blurhashes. The default -# is 33.55MB. Setting it to 0 disables blurhashing. -# -#blurhash_max_raw_size = 33554432 - [global.matrix_rtc] # A list of MatrixRTC foci (transports) which will be served via the diff --git a/engage.toml b/engage.toml index 92e9d3991..58ddb9ac3 100644 --- a/engage.toml +++ b/engage.toml @@ -146,7 +146,7 @@ cargo clippy \ --locked \ --profile test \ --no-default-features \ - --features=console,systemd,element_hacks,direct_tls,perf_measurements,brotli_compression,blurhashing \ + --features=console,systemd,element_hacks,direct_tls,perf_measurements,brotli_compression \ --color=always \ -- \ -D warnings diff --git a/src/api/client/account/mod.rs b/src/api/client/account/mod.rs index 877b57df0..e4c6baf62 100644 --- a/src/api/client/account/mod.rs +++ b/src/api/client/account/mod.rs @@ -329,8 +329,6 @@ pub(crate) async fn check_registration_token_validity( /// Runs through all the deactivation steps: /// /// - Mark as deactivated -/// - Removing display name -/// - Removing avatar URL and blurhash /// - Removing all profile data /// - Leaving all rooms (and forgets all of them) pub async fn full_user_deactivate( diff --git a/src/api/client/media.rs b/src/api/client/media.rs index 181093e69..e193f55b1 100644 --- a/src/api/client/media.rs +++ b/src/api/client/media.rs @@ -21,7 +21,6 @@ }, media::create_content, }, - assign, }; use service::media::mxc::Mxc; @@ -76,17 +75,7 @@ pub(crate) async fn create_content_route( return Err!(Request(Unknown("Failed to save uploaded media"))); } - let blurhash = body.generate_blurhash.then(|| { - services - .media - .create_blurhash(&body.file, content_type, filename) - .ok() - .flatten() - }); - - Ok(assign!(create_content::v3::Response::new(mxc.to_string().into()), { - blurhash: blurhash.flatten(), - })) + Ok(create_content::v3::Response::new(mxc.to_string().into())) } /// # `GET /_matrix/client/v1/media/thumbnail/{serverName}/{mediaId}` diff --git a/src/api/client/membership/invite.rs b/src/api/client/membership/invite.rs index 3f7acf6b5..509327281 100644 --- a/src/api/client/membership/invite.rs +++ b/src/api/client/membership/invite.rs @@ -247,7 +247,6 @@ pub(crate) async fn invite_helper( let mut content = RoomMemberEventContent::new(MembershipState::Invite); content.displayname = services.users.displayname(recipient_user).await.ok(); content.avatar_url = services.users.avatar_url(recipient_user).await.ok(); - content.blurhash = services.users.blurhash(recipient_user).await.ok(); content.is_direct = Some(is_direct); content.reason = reason; diff --git a/src/api/client/membership/knock.rs b/src/api/client/membership/knock.rs index c0d9d9b3d..3035b93f8 100644 --- a/src/api/client/membership/knock.rs +++ b/src/api/client/membership/knock.rs @@ -343,7 +343,6 @@ async fn knock_room_helper_local( let mut content = RoomMemberEventContent::new(MembershipState::Knock); content.displayname = services.users.displayname(sender_user).await.ok(); content.avatar_url = services.users.avatar_url(sender_user).await.ok(); - content.blurhash = services.users.blurhash(sender_user).await.ok(); content.reason.clone_from(&reason.clone()); // Try normal knock first @@ -527,7 +526,6 @@ async fn knock_room_helper_remote( let mut knock_content = RoomMemberEventContent::new(MembershipState::Knock); knock_content.displayname = services.users.displayname(sender_user).await.ok(); knock_content.avatar_url = services.users.avatar_url(sender_user).await.ok(); - knock_content.blurhash = services.users.blurhash(sender_user).await.ok(); knock_content.reason = reason; knock_event_stub.insert( diff --git a/src/api/client/profile.rs b/src/api/client/profile.rs index 6320b1308..1b389cee6 100644 --- a/src/api/client/profile.rs +++ b/src/api/client/profile.rs @@ -23,8 +23,7 @@ /// # `GET /_matrix/client/v3/profile/{userId}` /// -/// Returns the displayname, avatar_url, blurhash, and custom profile fields of -/// the user. +/// Returns the user's profile information. /// /// - If user is on another server and we do not have a local copy already, /// fetch profile over federation. @@ -322,19 +321,9 @@ async fn set_profile_field( services.users.set_avatar_url(user_id, None); }, | other => - if other.field_name().as_str() == "blurhash" { - if let Some(Value::String(blurhash)) = other.value() { - services.users.set_blurhash(user_id, Some(blurhash)); - } else { - services.users.set_blurhash(user_id, None); - } - } else { - services.users.set_profile_key( - user_id, - other.field_name().as_str(), - other.value(), - ); - }, + services + .users + .set_profile_key(user_id, other.field_name().as_str(), other.value()), } // If the user is local and changed their displayname or avatar_url, update it diff --git a/src/api/client/room/create.rs b/src/api/client/room/create.rs index bc9aa2d19..6718103e8 100644 --- a/src/api/client/room/create.rs +++ b/src/api/client/room/create.rs @@ -288,7 +288,6 @@ pub(crate) async fn create_room_route( let mut join_event = RoomMemberEventContent::new(MembershipState::Join); join_event.displayname = services.users.displayname(sender_user).await.ok(); join_event.avatar_url = services.users.avatar_url(sender_user).await.ok(); - join_event.blurhash = services.users.blurhash(sender_user).await.ok(); join_event.is_direct = Some(body.is_direct); debug_info!("Joining {sender_user} to room {room_id}"); diff --git a/src/api/client/room/upgrade.rs b/src/api/client/room/upgrade.rs index 8aa66baae..fc9d6c5d0 100644 --- a/src/api/client/room/upgrade.rs +++ b/src/api/client/room/upgrade.rs @@ -271,7 +271,6 @@ pub(crate) async fn upgrade_room_route( &assign!(RoomMemberEventContent::new(MembershipState::Join), { displayname: services.users.displayname(sender_user).await.ok(), avatar_url: services.users.avatar_url(sender_user).await.ok(), - blurhash: services.users.blurhash(sender_user).await.ok(), }), ), sender_user, diff --git a/src/core/config/mod.rs b/src/core/config/mod.rs index b0d27450b..c96e0f2b5 100644 --- a/src/core/config/mod.rs +++ b/src/core/config/mod.rs @@ -2121,10 +2121,6 @@ pub struct Config { #[serde(default)] pub antispam: Option, - /// display: nested - #[serde(default)] - pub blurhashing: BlurhashConfig, - /// Configuration for MatrixRTC (MSC4143) transport discovery. /// display: nested #[serde(default)] @@ -2200,31 +2196,6 @@ pub struct WellKnownConfig { pub support_pgp_key: Option, } -#[derive(Clone, Copy, Debug, Deserialize, Default)] -#[allow(rustdoc::broken_intra_doc_links, rustdoc::bare_urls)] -#[config_example_generator(filename = "conduwuit-example.toml", section = "global.blurhashing")] -pub struct BlurhashConfig { - /// blurhashing x component, 4 is recommended by https://blurha.sh/ - /// - /// default: 4 - #[serde(default = "default_blurhash_x_component")] - pub components_x: u32, - /// blurhashing y component, 3 is recommended by https://blurha.sh/ - /// - /// default: 3 - #[serde(default = "default_blurhash_y_component")] - pub components_y: u32, - /// Max raw size that the server will blurhash, this is the size of the - /// image after converting it to raw data, it should be higher than the - /// upload limit but not too high. The higher it is the higher the - /// potential load will be for clients requesting blurhashes. The default - /// is 33.55MB. Setting it to 0 disables blurhashing. - /// - /// default: 33554432 - #[serde(default = "default_blurhash_max_raw_size")] - pub blurhash_max_raw_size: u64, -} - #[derive(Clone, Debug, Deserialize, Default)] #[config_example_generator(filename = "conduwuit-example.toml", section = "global.matrix_rtc")] pub struct MatrixRtcConfig { @@ -2832,13 +2803,3 @@ fn default_client_response_timeout() -> u64 { 120 } fn default_client_shutdown_timeout() -> u64 { 15 } fn default_sender_shutdown_timeout() -> u64 { 5 } - -// blurhashing defaults recommended by https://blurha.sh/ -// 2^25 -pub(super) fn default_blurhash_max_raw_size() -> u64 { 33_554_432 } - -pub(super) fn default_blurhash_x_component() -> u32 { 4 } - -pub(super) fn default_blurhash_y_component() -> u32 { 3 } - -// end recommended & blurhashing defaults diff --git a/src/database/maps.rs b/src/database/maps.rs index 320272549..0a9ef8b75 100644 --- a/src/database/maps.rs +++ b/src/database/maps.rs @@ -397,7 +397,7 @@ pub(super) fn open_list(db: &Arc, maps: &[Descriptor]) -> Result { }, Descriptor { name: "userid_blurhash", - ..descriptor::RANDOM_SMALL + ..descriptor::DROPPED }, Descriptor { name: "userid_dehydrateddevice", diff --git a/src/main/Cargo.toml b/src/main/Cargo.toml index 3a98c9eb5..fafaef6d8 100644 --- a/src/main/Cargo.toml +++ b/src/main/Cargo.toml @@ -47,7 +47,6 @@ default = [ "bindgen-runtime", # replace with bindgen-static on alpine ] standard = [ - "blurhashing", "brotli_compression", "element_hacks", "gzip_compression", @@ -71,9 +70,6 @@ full = [ "tokio_console", ] -blurhashing = [ - "conduwuit-service/blurhashing", -] brotli_compression = [ "conduwuit-api/brotli_compression", "conduwuit-core/brotli_compression", diff --git a/src/service/Cargo.toml b/src/service/Cargo.toml index 899e8c48d..e302ff6c9 100644 --- a/src/service/Cargo.toml +++ b/src/service/Cargo.toml @@ -16,10 +16,6 @@ crate-type = [ ] [features] -blurhashing = [ - "dep:image", - "dep:blurhash", -] brotli_compression = [ "conduwuit-core/brotli_compression", "reqwest/brotli", @@ -119,8 +115,6 @@ tracing.workspace = true url.workspace = true webpage.workspace = true webpage.optional = true -blurhash.workspace = true -blurhash.optional = true recaptcha-verify = { version = "0.2.0", default-features = false } reqwest_recaptcha = { package = "reqwest", version = "0.12.28", default-features = false, features = ["rustls-tls-native-roots-no-provider"] } # As long as recaptcha-verify's reqwest is outdated yansi.workspace = true diff --git a/src/service/media/blurhash.rs b/src/service/media/blurhash.rs deleted file mode 100644 index 91e00228c..000000000 --- a/src/service/media/blurhash.rs +++ /dev/null @@ -1,179 +0,0 @@ -#[cfg(feature = "blurhashing")] -use conduwuit::config::BlurhashConfig as CoreBlurhashConfig; -use conduwuit::{Result, implement}; - -use super::Service; - -#[implement(Service)] -#[cfg(not(feature = "blurhashing"))] -pub fn create_blurhash( - &self, - _file: &[u8], - _content_type: Option<&str>, - _file_name: Option<&str>, -) -> Result> { - conduwuit::debug_warn!("blurhashing on upload support was not compiled"); - - Ok(None) -} - -#[implement(Service)] -#[cfg(feature = "blurhashing")] -pub fn create_blurhash( - &self, - file: &[u8], - content_type: Option<&str>, - file_name: Option<&str>, -) -> Result> { - let config = BlurhashConfig::from(self.services.server.config.blurhashing); - - // since 0 means disabled blurhashing, skipped blurhashing - if config.size_limit == 0 { - return Ok(None); - } - - get_blurhash_from_request(file, content_type, file_name, config) - .map_err(|e| conduwuit::err!(debug_error!("blurhashing error: {e}"))) - .map(Some) -} - -/// Returns the blurhash or a blurhash error which implements Display. -#[tracing::instrument( - name = "blurhash", - level = "debug", - skip(data), - fields( - bytes = data.len(), - ), -)] -#[cfg(feature = "blurhashing")] -fn get_blurhash_from_request( - data: &[u8], - mime: Option<&str>, - filename: Option<&str>, - config: BlurhashConfig, -) -> Result { - // Get format image is supposed to be in - let format = get_format_from_data_mime_and_filename(data, mime, filename)?; - - // Get the image reader for said image format - let decoder = get_image_decoder_with_format_and_data(format, data)?; - - // Check image size makes sense before unpacking whole image - if is_image_above_size_limit(&decoder, config) { - return Err(BlurhashingError::ImageTooLarge); - } - - let image = image::DynamicImage::from_decoder(decoder)?; - - blurhash_an_image(&image, config) -} - -/// Gets the Image Format value from the data,mime, and filename -/// It first checks if the mime is a valid image format -/// Then it checks if the filename has a format, otherwise just guess based on -/// the binary data Assumes that mime and filename extension won't be for a -/// different file format than file. -#[cfg(feature = "blurhashing")] -fn get_format_from_data_mime_and_filename( - data: &[u8], - mime: Option<&str>, - filename: Option<&str>, -) -> Result { - let extension = filename - .map(std::path::Path::new) - .and_then(std::path::Path::extension) - .map(std::ffi::OsStr::to_string_lossy); - - mime.or(extension.as_deref()) - .and_then(image::ImageFormat::from_mime_type) - .map_or_else(|| image::guess_format(data).map_err(Into::into), Ok) -} - -#[cfg(feature = "blurhashing")] -fn get_image_decoder_with_format_and_data( - image_format: image::ImageFormat, - data: &[u8], -) -> Result, BlurhashingError> { - let mut image_reader = image::ImageReader::new(std::io::Cursor::new(data)); - image_reader.set_format(image_format); - Ok(Box::new(image_reader.into_decoder()?)) -} - -#[cfg(feature = "blurhashing")] -fn is_image_above_size_limit( - decoder: &T, - blurhash_config: BlurhashConfig, -) -> bool { - decoder.total_bytes() >= blurhash_config.size_limit -} - -#[cfg(feature = "blurhashing")] -#[tracing::instrument(name = "encode", level = "debug", skip_all)] -#[inline] -fn blurhash_an_image( - image: &image::DynamicImage, - blurhash_config: BlurhashConfig, -) -> Result { - Ok(blurhash::encode_image( - blurhash_config.components_x, - blurhash_config.components_y, - &image.to_rgba8(), - )?) -} - -#[derive(Clone, Copy, Debug)] -pub struct BlurhashConfig { - pub components_x: u32, - pub components_y: u32, - - /// size limit in bytes - pub size_limit: u64, -} - -#[cfg(feature = "blurhashing")] -impl From for BlurhashConfig { - fn from(value: CoreBlurhashConfig) -> Self { - Self { - components_x: value.components_x, - components_y: value.components_y, - size_limit: value.blurhash_max_raw_size, - } - } -} - -#[derive(Debug)] -#[cfg(feature = "blurhashing")] -pub enum BlurhashingError { - HashingLibError(Box), - #[cfg(feature = "blurhashing")] - ImageError(Box), - ImageTooLarge, -} - -#[cfg(feature = "blurhashing")] -impl From for BlurhashingError { - fn from(value: image::ImageError) -> Self { Self::ImageError(Box::new(value)) } -} - -#[cfg(feature = "blurhashing")] -impl From for BlurhashingError { - fn from(value: blurhash::Error) -> Self { Self::HashingLibError(Box::new(value)) } -} - -#[cfg(feature = "blurhashing")] -impl std::fmt::Display for BlurhashingError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "Blurhash Error:")?; - match &self { - | Self::ImageTooLarge => write!(f, "Image was too large to blurhash")?, - | Self::HashingLibError(e) => - write!(f, "There was an error with the blurhashing library => {e}")?, - #[cfg(feature = "blurhashing")] - | Self::ImageError(e) => - write!(f, "There was an error with the image loading library => {e}")?, - } - - Ok(()) - } -} diff --git a/src/service/media/mod.rs b/src/service/media/mod.rs index 3b0689df5..46ee21a75 100644 --- a/src/service/media/mod.rs +++ b/src/service/media/mod.rs @@ -1,4 +1,3 @@ -pub mod blurhash; mod data; pub(super) mod migrations; pub mod mxc; diff --git a/src/service/rooms/membership/mod.rs b/src/service/rooms/membership/mod.rs index 39f4db04a..ff69e095e 100644 --- a/src/service/rooms/membership/mod.rs +++ b/src/service/rooms/membership/mod.rs @@ -242,7 +242,6 @@ async fn join_local_room( let mut content = RoomMemberEventContent::new(MembershipState::Join); content.displayname = self.services.users.displayname(sender_user).await.ok(); content.avatar_url = self.services.users.avatar_url(sender_user).await.ok(); - content.blurhash = self.services.users.blurhash(sender_user).await.ok(); content.reason.clone_from(&reason); content.join_authorized_via_users_server = auth_user; @@ -354,7 +353,6 @@ pub async fn join_remote_room( let mut join_content = RoomMemberEventContent::new(MembershipState::Join); join_content.displayname = self.services.users.displayname(sender_user).await.ok(); join_content.avatar_url = self.services.users.avatar_url(sender_user).await.ok(); - join_content.blurhash = self.services.users.blurhash(sender_user).await.ok(); join_content.reason = reason; join_content .join_authorized_via_users_server diff --git a/src/service/users/mod.rs b/src/service/users/mod.rs index 0214de4a0..c93b9e82a 100644 --- a/src/service/users/mod.rs +++ b/src/service/users/mod.rs @@ -109,7 +109,6 @@ struct Data { userdeviceid_token: Arc, userfilterid_filter: Arc, userid_avatarurl: Arc, - userid_blurhash: Arc, userid_dehydrateddevice: Arc, userid_devicelistversion: Arc, userid_displayname: Arc, @@ -155,7 +154,6 @@ fn build(args: crate::Args<'_>) -> Result> { userdeviceid_token: args.db["userdeviceid_token"].clone(), userfilterid_filter: args.db["userfilterid_filter"].clone(), userid_avatarurl: args.db["userid_avatarurl"].clone(), - userid_blurhash: args.db["userid_blurhash"].clone(), userid_dehydrateddevice: args.db["userid_dehydrateddevice"].clone(), userid_devicelistversion: args.db["userid_devicelistversion"].clone(), userid_displayname: args.db["userid_displayname"].clone(), @@ -727,20 +725,6 @@ pub fn set_avatar_url(&self, user_id: &UserId, avatar_url: Option) } } - /// Get the blurhash of a user. - pub async fn blurhash(&self, user_id: &UserId) -> Result { - self.db.userid_blurhash.get(user_id).await.deserialized() - } - - /// Sets a new avatar_url or removes it if avatar_url is None. - pub fn set_blurhash(&self, user_id: &UserId, blurhash: Option) { - if let Some(blurhash) = blurhash { - self.db.userid_blurhash.insert(user_id, blurhash); - } else { - self.db.userid_blurhash.remove(user_id); - } - } - /// Adds a new device to a user. pub async fn create_device( &self, @@ -1696,7 +1680,6 @@ pub fn set_profile_key( pub async fn clear_profile(&self, user_id: &UserId) { self.set_displayname(user_id, None); self.set_avatar_url(user_id, None); - self.set_blurhash(user_id, None); self.all_profile_keys(user_id) .ready_for_each(|(key, _)| self.set_profile_key(user_id, &key, None)) .await;