mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
feat: Add Meowlnir invite interception support
Co-authored-by: Jade Ellis <jade@ellis.link>
This commit is contained in:
Generated
+22
-11
@@ -2982,6 +2982,16 @@ version = "2.7.6"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
|
checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "meowlnir-antispam"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
|
dependencies = [
|
||||||
|
"ruma-common",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mime"
|
name = "mime"
|
||||||
version = "0.3.17"
|
version = "0.3.17"
|
||||||
@@ -4065,11 +4075,12 @@ checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma"
|
name = "ruma"
|
||||||
version = "0.10.1"
|
version = "0.10.1"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=27abe0dcd33fd4056efc94bab3582646b31b6ce9#27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assign",
|
"assign",
|
||||||
"js_int",
|
"js_int",
|
||||||
"js_option",
|
"js_option",
|
||||||
|
"meowlnir-antispam",
|
||||||
"ruma-appservice-api",
|
"ruma-appservice-api",
|
||||||
"ruma-client-api",
|
"ruma-client-api",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
@@ -4085,7 +4096,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-appservice-api"
|
name = "ruma-appservice-api"
|
||||||
version = "0.10.0"
|
version = "0.10.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=27abe0dcd33fd4056efc94bab3582646b31b6ce9#27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
@@ -4097,7 +4108,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-client-api"
|
name = "ruma-client-api"
|
||||||
version = "0.18.0"
|
version = "0.18.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=27abe0dcd33fd4056efc94bab3582646b31b6ce9#27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"as_variant",
|
"as_variant",
|
||||||
"assign",
|
"assign",
|
||||||
@@ -4120,7 +4131,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-common"
|
name = "ruma-common"
|
||||||
version = "0.13.0"
|
version = "0.13.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=27abe0dcd33fd4056efc94bab3582646b31b6ce9#27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"as_variant",
|
"as_variant",
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
@@ -4152,7 +4163,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-events"
|
name = "ruma-events"
|
||||||
version = "0.28.1"
|
version = "0.28.1"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=27abe0dcd33fd4056efc94bab3582646b31b6ce9#27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"as_variant",
|
"as_variant",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
@@ -4177,7 +4188,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-federation-api"
|
name = "ruma-federation-api"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=27abe0dcd33fd4056efc94bab3582646b31b6ce9#27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"headers",
|
"headers",
|
||||||
@@ -4199,7 +4210,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-identifiers-validation"
|
name = "ruma-identifiers-validation"
|
||||||
version = "0.9.5"
|
version = "0.9.5"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=27abe0dcd33fd4056efc94bab3582646b31b6ce9#27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"thiserror 2.0.17",
|
"thiserror 2.0.17",
|
||||||
@@ -4208,7 +4219,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-identity-service-api"
|
name = "ruma-identity-service-api"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=27abe0dcd33fd4056efc94bab3582646b31b6ce9#27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
@@ -4218,7 +4229,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-macros"
|
name = "ruma-macros"
|
||||||
version = "0.13.0"
|
version = "0.13.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=27abe0dcd33fd4056efc94bab3582646b31b6ce9#27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"proc-macro-crate",
|
"proc-macro-crate",
|
||||||
@@ -4233,7 +4244,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-push-gateway-api"
|
name = "ruma-push-gateway-api"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=27abe0dcd33fd4056efc94bab3582646b31b6ce9#27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
@@ -4245,7 +4256,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-signatures"
|
name = "ruma-signatures"
|
||||||
version = "0.15.0"
|
version = "0.15.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=27abe0dcd33fd4056efc94bab3582646b31b6ce9#27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=377d801fa035480b772c640b430097c1ec0ddb16#377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"ed25519-dalek",
|
"ed25519-dalek",
|
||||||
|
|||||||
+62
-62
@@ -33,11 +33,11 @@ features = ["serde"]
|
|||||||
[workspace.dependencies.smallvec]
|
[workspace.dependencies.smallvec]
|
||||||
version = "1.14.0"
|
version = "1.14.0"
|
||||||
features = [
|
features = [
|
||||||
"const_generics",
|
"const_generics",
|
||||||
"const_new",
|
"const_new",
|
||||||
"serde",
|
"serde",
|
||||||
"union",
|
"union",
|
||||||
"write",
|
"write",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies.smallstr]
|
[workspace.dependencies.smallstr]
|
||||||
@@ -96,13 +96,13 @@ version = "1.11.1"
|
|||||||
version = "0.7.9"
|
version = "0.7.9"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"form",
|
"form",
|
||||||
"http1",
|
"http1",
|
||||||
"http2",
|
"http2",
|
||||||
"json",
|
"json",
|
||||||
"matched-path",
|
"matched-path",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies.axum-extra]
|
[workspace.dependencies.axum-extra]
|
||||||
@@ -149,10 +149,10 @@ features = ["aws_lc_rs"]
|
|||||||
version = "0.12.15"
|
version = "0.12.15"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"rustls-tls-native-roots",
|
"rustls-tls-native-roots",
|
||||||
"socks",
|
"socks",
|
||||||
"hickory-dns",
|
"hickory-dns",
|
||||||
"http2",
|
"http2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies.serde]
|
[workspace.dependencies.serde]
|
||||||
@@ -188,18 +188,18 @@ default-features = false
|
|||||||
version = "0.25.5"
|
version = "0.25.5"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"jpeg",
|
"jpeg",
|
||||||
"png",
|
"png",
|
||||||
"gif",
|
"gif",
|
||||||
"webp",
|
"webp",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies.blurhash]
|
[workspace.dependencies.blurhash]
|
||||||
version = "0.2.3"
|
version = "0.2.3"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"fast-linear-to-srgb",
|
"fast-linear-to-srgb",
|
||||||
"image",
|
"image",
|
||||||
]
|
]
|
||||||
|
|
||||||
# logging
|
# logging
|
||||||
@@ -229,13 +229,13 @@ default-features = false
|
|||||||
version = "4.5.35"
|
version = "4.5.35"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"derive",
|
"derive",
|
||||||
"env",
|
"env",
|
||||||
"error-context",
|
"error-context",
|
||||||
"help",
|
"help",
|
||||||
"std",
|
"std",
|
||||||
"string",
|
"string",
|
||||||
"usage",
|
"usage",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies.futures]
|
[workspace.dependencies.futures]
|
||||||
@@ -247,15 +247,15 @@ features = ["std", "async-await"]
|
|||||||
version = "1.44.2"
|
version = "1.44.2"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"fs",
|
"fs",
|
||||||
"net",
|
"net",
|
||||||
"macros",
|
"macros",
|
||||||
"sync",
|
"sync",
|
||||||
"signal",
|
"signal",
|
||||||
"time",
|
"time",
|
||||||
"rt-multi-thread",
|
"rt-multi-thread",
|
||||||
"io-util",
|
"io-util",
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies.tokio-metrics]
|
[workspace.dependencies.tokio-metrics]
|
||||||
@@ -280,18 +280,18 @@ default-features = false
|
|||||||
version = "1.6.0"
|
version = "1.6.0"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"server",
|
"server",
|
||||||
"http1",
|
"http1",
|
||||||
"http2",
|
"http2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies.hyper-util]
|
[workspace.dependencies.hyper-util]
|
||||||
version = "=0.1.17"
|
version = "=0.1.17"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"server-auto",
|
"server-auto",
|
||||||
"server-graceful",
|
"server-graceful",
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
# to support multiple variations of setting a config option
|
# to support multiple variations of setting a config option
|
||||||
@@ -310,9 +310,9 @@ features = ["env", "toml"]
|
|||||||
version = "0.25.1"
|
version = "0.25.1"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"serde",
|
"serde",
|
||||||
"system-config",
|
"system-config",
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
|
|
||||||
# Used for conduwuit::Error type
|
# Used for conduwuit::Error type
|
||||||
@@ -351,7 +351,7 @@ version = "0.1.2"
|
|||||||
# Used for matrix spec type definitions and helpers
|
# Used for matrix spec type definitions and helpers
|
||||||
[workspace.dependencies.ruma]
|
[workspace.dependencies.ruma]
|
||||||
git = "https://forgejo.ellis.link/continuwuation/ruwuma"
|
git = "https://forgejo.ellis.link/continuwuation/ruwuma"
|
||||||
rev = "27abe0dcd33fd4056efc94bab3582646b31b6ce9"
|
rev = "377d801fa035480b772c640b430097c1ec0ddb16"
|
||||||
features = [
|
features = [
|
||||||
"compat",
|
"compat",
|
||||||
"rand",
|
"rand",
|
||||||
@@ -381,13 +381,13 @@ features = [
|
|||||||
"unstable-msc4095",
|
"unstable-msc4095",
|
||||||
"unstable-msc4121",
|
"unstable-msc4121",
|
||||||
"unstable-msc4125",
|
"unstable-msc4125",
|
||||||
"unstable-msc4155",
|
"unstable-msc4155",
|
||||||
"unstable-msc4186",
|
"unstable-msc4186",
|
||||||
"unstable-msc4203", # sending to-device events to appservices
|
"unstable-msc4203", # sending to-device events to appservices
|
||||||
"unstable-msc4210", # remove legacy mentions
|
"unstable-msc4210", # remove legacy mentions
|
||||||
"unstable-extensible-events",
|
"unstable-extensible-events",
|
||||||
"unstable-pdu",
|
"unstable-pdu",
|
||||||
"unstable-msc4155"
|
"unstable-msc4155"
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies.rust-rocksdb]
|
[workspace.dependencies.rust-rocksdb]
|
||||||
@@ -395,11 +395,11 @@ git = "https://forgejo.ellis.link/continuwuation/rust-rocksdb-zaidoon1"
|
|||||||
rev = "61d9d23872197e9ace4a477f2617d5c9f50ecb23"
|
rev = "61d9d23872197e9ace4a477f2617d5c9f50ecb23"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"multi-threaded-cf",
|
"multi-threaded-cf",
|
||||||
"mt_static",
|
"mt_static",
|
||||||
"lz4",
|
"lz4",
|
||||||
"zstd",
|
"zstd",
|
||||||
"bzip2",
|
"bzip2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies.sha2]
|
[workspace.dependencies.sha2]
|
||||||
@@ -458,16 +458,16 @@ git = "https://forgejo.ellis.link/continuwuation/jemallocator"
|
|||||||
rev = "82af58d6a13ddd5dcdc7d4e91eae3b63292995b8"
|
rev = "82af58d6a13ddd5dcdc7d4e91eae3b63292995b8"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"background_threads_runtime_support",
|
"background_threads_runtime_support",
|
||||||
"unprefixed_malloc_on_supported_platforms",
|
"unprefixed_malloc_on_supported_platforms",
|
||||||
]
|
]
|
||||||
[workspace.dependencies.tikv-jemallocator]
|
[workspace.dependencies.tikv-jemallocator]
|
||||||
git = "https://forgejo.ellis.link/continuwuation/jemallocator"
|
git = "https://forgejo.ellis.link/continuwuation/jemallocator"
|
||||||
rev = "82af58d6a13ddd5dcdc7d4e91eae3b63292995b8"
|
rev = "82af58d6a13ddd5dcdc7d4e91eae3b63292995b8"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"background_threads_runtime_support",
|
"background_threads_runtime_support",
|
||||||
"unprefixed_malloc_on_supported_platforms",
|
"unprefixed_malloc_on_supported_platforms",
|
||||||
]
|
]
|
||||||
[workspace.dependencies.tikv-jemalloc-ctl]
|
[workspace.dependencies.tikv-jemalloc-ctl]
|
||||||
git = "https://forgejo.ellis.link/continuwuation/jemallocator"
|
git = "https://forgejo.ellis.link/continuwuation/jemallocator"
|
||||||
@@ -491,9 +491,9 @@ default-features = false
|
|||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"static",
|
"static",
|
||||||
"gcc",
|
"gcc",
|
||||||
"light",
|
"light",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.dependencies.rustyline-async]
|
[workspace.dependencies.rustyline-async]
|
||||||
|
|||||||
@@ -1757,6 +1757,10 @@
|
|||||||
#
|
#
|
||||||
#ldap = false
|
#ldap = false
|
||||||
|
|
||||||
|
# Configuration for antispam support
|
||||||
|
#
|
||||||
|
#antispam = false
|
||||||
|
|
||||||
[global.tls]
|
[global.tls]
|
||||||
|
|
||||||
# Path to a valid TLS certificate file.
|
# Path to a valid TLS certificate file.
|
||||||
@@ -1923,3 +1927,20 @@
|
|||||||
# example: "(objectClass=conduwuitAdmin)" or "(uid={username})"
|
# example: "(objectClass=conduwuitAdmin)" or "(uid={username})"
|
||||||
#
|
#
|
||||||
#admin_filter = ""
|
#admin_filter = ""
|
||||||
|
|
||||||
|
[global.antispam.meowlnir]
|
||||||
|
|
||||||
|
# The base URL on which to contact meowlnir (before /_meowlnir/antispam).
|
||||||
|
#
|
||||||
|
# Example: "http://127.0.0.1:29339"
|
||||||
|
#
|
||||||
|
#base_url =
|
||||||
|
|
||||||
|
# The authentication secret defined in antispam->secret. Required for
|
||||||
|
# continuwuity to talk to Meowlnir.
|
||||||
|
#
|
||||||
|
#secret =
|
||||||
|
|
||||||
|
# The management room for which to send requests
|
||||||
|
#
|
||||||
|
#management_room =
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
use axum::extract::State;
|
use axum::extract::State;
|
||||||
use axum_client_ip::InsecureClientIp;
|
use axum_client_ip::InsecureClientIp;
|
||||||
use conduwuit::{
|
use conduwuit::{
|
||||||
Err, Result, debug_error, err, info,
|
Err, Result,
|
||||||
|
config::Antispam,
|
||||||
|
debug_error, err, info,
|
||||||
matrix::{event::gen_event_id_canonical_json, pdu::PduBuilder},
|
matrix::{event::gen_event_id_canonical_json, pdu::PduBuilder},
|
||||||
|
trace,
|
||||||
};
|
};
|
||||||
use futures::FutureExt;
|
use futures::FutureExt;
|
||||||
use ruma::{
|
use ruma::{
|
||||||
@@ -12,6 +15,7 @@ use ruma::{
|
|||||||
invite_permission_config::FilterLevel,
|
invite_permission_config::FilterLevel,
|
||||||
room::member::{MembershipState, RoomMemberEventContent},
|
room::member::{MembershipState, RoomMemberEventContent},
|
||||||
},
|
},
|
||||||
|
meowlnir_antispam::user_may_invite,
|
||||||
};
|
};
|
||||||
use service::Services;
|
use service::Services;
|
||||||
|
|
||||||
@@ -124,6 +128,26 @@ pub(crate) async fn invite_helper(
|
|||||||
return Err!(Request(Forbidden("Invites are not allowed on this server.")));
|
return Err!(Request(Forbidden("Invites are not allowed on this server.")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trace!("maybe ask meowlnir");
|
||||||
|
if let Some(Antispam { meowlnir: Some(cfg) }) = &services.config.antispam {
|
||||||
|
trace!("asking meowlnir");
|
||||||
|
services
|
||||||
|
.sending
|
||||||
|
.send_meowlnir_antispam_request(
|
||||||
|
cfg,
|
||||||
|
user_may_invite::v1::Request::new(
|
||||||
|
cfg.management_room.clone(),
|
||||||
|
sender_user.to_owned(),
|
||||||
|
recipient_user.to_owned(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.inspect(|_| trace!("meowlnir :D"))
|
||||||
|
.inspect_err(|e| debug_error!("meowlnir sad: {e}"))?;
|
||||||
|
} else {
|
||||||
|
trace!("no meowlnir configured");
|
||||||
|
}
|
||||||
|
|
||||||
if !services.globals.user_is_local(recipient_user) {
|
if !services.globals.user_is_local(recipient_user) {
|
||||||
let (pdu, pdu_json, invite_room_state) = {
|
let (pdu, pdu_json, invite_room_state) = {
|
||||||
let state_lock = services.rooms.state.mutex.lock(room_id).await;
|
let state_lock = services.rooms.state.mutex.lock(room_id).await;
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ use axum::extract::State;
|
|||||||
use axum_client_ip::InsecureClientIp;
|
use axum_client_ip::InsecureClientIp;
|
||||||
use base64::{Engine as _, engine::general_purpose};
|
use base64::{Engine as _, engine::general_purpose};
|
||||||
use conduwuit::{
|
use conduwuit::{
|
||||||
Err, Error, PduEvent, Result, err,
|
Err, Error, PduEvent, Result,
|
||||||
|
config::Antispam,
|
||||||
|
err,
|
||||||
matrix::{Event, event::gen_event_id},
|
matrix::{Event, event::gen_event_id},
|
||||||
utils::{self, hash::sha256},
|
utils::{self, hash::sha256},
|
||||||
warn,
|
warn,
|
||||||
@@ -11,6 +13,7 @@ use ruma::{
|
|||||||
CanonicalJsonValue, OwnedUserId, UserId,
|
CanonicalJsonValue, OwnedUserId, UserId,
|
||||||
api::{client::error::ErrorKind, federation::membership::create_invite},
|
api::{client::error::ErrorKind, federation::membership::create_invite},
|
||||||
events::room::member::{MembershipState, RoomMemberEventContent},
|
events::room::member::{MembershipState, RoomMemberEventContent},
|
||||||
|
meowlnir_antispam::user_may_invite,
|
||||||
serde::JsonObject,
|
serde::JsonObject,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -148,6 +151,20 @@ pub(crate) async fn create_invite_route(
|
|||||||
return Err!(Request(Forbidden("This server does not allow room invites.")));
|
return Err!(Request(Forbidden("This server does not allow room invites.")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(Antispam { meowlnir: Some(cfg) }) = &services.config.antispam {
|
||||||
|
services
|
||||||
|
.sending
|
||||||
|
.send_meowlnir_antispam_request(
|
||||||
|
cfg,
|
||||||
|
user_may_invite::v1::Request::new(
|
||||||
|
cfg.management_room.clone(),
|
||||||
|
sender_user.to_owned(),
|
||||||
|
recipient_user.clone(),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
|
|
||||||
let mut invite_state = body.invite_room_state.clone();
|
let mut invite_state = body.invite_room_state.clone();
|
||||||
|
|
||||||
let mut event: JsonObject = serde_json::from_str(body.event.get())
|
let mut event: JsonObject = serde_json::from_str(body.event.get())
|
||||||
|
|||||||
+29
-1
@@ -18,7 +18,7 @@ use figment::providers::{Env, Format, Toml};
|
|||||||
pub use figment::{Figment, value::Value as FigmentValue};
|
pub use figment::{Figment, value::Value as FigmentValue};
|
||||||
use regex::RegexSet;
|
use regex::RegexSet;
|
||||||
use ruma::{
|
use ruma::{
|
||||||
OwnedRoomOrAliasId, OwnedServerName, OwnedUserId, RoomVersionId,
|
OwnedRoomId, OwnedRoomOrAliasId, OwnedServerName, OwnedUserId, RoomVersionId,
|
||||||
api::client::discovery::discover_support::ContactRole,
|
api::client::discovery::discover_support::ContactRole,
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, de::IgnoredAny};
|
use serde::{Deserialize, de::IgnoredAny};
|
||||||
@@ -2024,6 +2024,10 @@ pub struct Config {
|
|||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub ldap: LdapConfig,
|
pub ldap: LdapConfig,
|
||||||
|
|
||||||
|
/// Configuration for antispam support
|
||||||
|
#[serde(default)]
|
||||||
|
pub antispam: Option<Antispam>,
|
||||||
|
|
||||||
// external structure; separate section
|
// external structure; separate section
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub blurhashing: BlurhashConfig,
|
pub blurhashing: BlurhashConfig,
|
||||||
@@ -2240,6 +2244,30 @@ struct ListeningAddr {
|
|||||||
addrs: Either<IpAddr, Vec<IpAddr>>,
|
addrs: Either<IpAddr, Vec<IpAddr>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Deserialize)]
|
||||||
|
pub struct Antispam {
|
||||||
|
pub meowlnir: Option<MeowlnirConfig>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Deserialize)]
|
||||||
|
#[config_example_generator(
|
||||||
|
filename = "conduwuit-example.toml",
|
||||||
|
section = "global.antispam.meowlnir"
|
||||||
|
)]
|
||||||
|
pub struct MeowlnirConfig {
|
||||||
|
/// The base URL on which to contact meowlnir (before /_meowlnir/antispam).
|
||||||
|
///
|
||||||
|
/// Example: "http://127.0.0.1:29339"
|
||||||
|
pub base_url: Url,
|
||||||
|
|
||||||
|
/// The authentication secret defined in antispam->secret. Required for
|
||||||
|
/// continuwuity to talk to Meowlnir.
|
||||||
|
pub secret: String,
|
||||||
|
|
||||||
|
/// The management room for which to send requests
|
||||||
|
pub management_room: OwnedRoomId,
|
||||||
|
}
|
||||||
|
|
||||||
const DEPRECATED_KEYS: &[&str; 9] = &[
|
const DEPRECATED_KEYS: &[&str; 9] = &[
|
||||||
"cache_capacity",
|
"cache_capacity",
|
||||||
"conduit_cache_capacity_modifier",
|
"conduit_cache_capacity_modifier",
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
use std::{fmt::Debug, mem};
|
||||||
|
|
||||||
|
use bytes::BytesMut;
|
||||||
|
use conduwuit::{Err, Result, config::MeowlnirConfig, debug_error, err, utils, warn};
|
||||||
|
use reqwest::Client;
|
||||||
|
use ruma::api::{IncomingResponse, MatrixVersion, OutgoingRequest, SendAccessToken};
|
||||||
|
|
||||||
|
/// Sends a request to an antispam service
|
||||||
|
pub(crate) async fn send_meowlnir_request<T>(
|
||||||
|
client: &Client,
|
||||||
|
config: &MeowlnirConfig,
|
||||||
|
request: T,
|
||||||
|
) -> Result<Option<T::IncomingResponse>>
|
||||||
|
where
|
||||||
|
T: OutgoingRequest + Debug + Send,
|
||||||
|
{
|
||||||
|
const VERSIONS: [MatrixVersion; 1] = [MatrixVersion::V1_15];
|
||||||
|
if config.secret.is_empty() {
|
||||||
|
return Ok(None);
|
||||||
|
}
|
||||||
|
let secret = config.secret.as_str();
|
||||||
|
let http_request = request
|
||||||
|
.try_into_http_request::<BytesMut>(
|
||||||
|
config.base_url.as_str(),
|
||||||
|
SendAccessToken::Always(secret),
|
||||||
|
&VERSIONS,
|
||||||
|
)?
|
||||||
|
.map(BytesMut::freeze);
|
||||||
|
let reqwest_request = reqwest::Request::try_from(http_request)?;
|
||||||
|
|
||||||
|
let mut response = client.execute(reqwest_request).await.map_err(|e| {
|
||||||
|
warn!("Could not send request to antispam: {e:?}");
|
||||||
|
e
|
||||||
|
})?;
|
||||||
|
|
||||||
|
// reqwest::Response -> http::Response conversion
|
||||||
|
let status = response.status();
|
||||||
|
let mut http_response_builder = http::Response::builder()
|
||||||
|
.status(status)
|
||||||
|
.version(response.version());
|
||||||
|
mem::swap(
|
||||||
|
response.headers_mut(),
|
||||||
|
http_response_builder
|
||||||
|
.headers_mut()
|
||||||
|
.expect("http::response::Builder is usable"),
|
||||||
|
);
|
||||||
|
|
||||||
|
let body = response.bytes().await?; // TODO: handle timeout
|
||||||
|
|
||||||
|
if !status.is_success() {
|
||||||
|
debug_error!("Antispam response bytes: {:?}", utils::string_from_bytes(&body));
|
||||||
|
return match status {
|
||||||
|
| http::StatusCode::FORBIDDEN =>
|
||||||
|
Err!(Request(Forbidden("Request was rejected by antispam service.",))),
|
||||||
|
| _ => Err!(BadServerResponse(warn!(
|
||||||
|
"Antispam returned unsuccessful HTTP response {status}",
|
||||||
|
))),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
let response = T::IncomingResponse::try_from_http_response(
|
||||||
|
http_response_builder
|
||||||
|
.body(body)
|
||||||
|
.expect("reqwest body is valid http body"),
|
||||||
|
);
|
||||||
|
|
||||||
|
response.map(Some).map_err(|e| {
|
||||||
|
err!(BadServerResponse(warn!(
|
||||||
|
"Antispam returned invalid/malformed response bytes: {e}",
|
||||||
|
)))
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
mod antispam;
|
||||||
mod appservice;
|
mod appservice;
|
||||||
mod data;
|
mod data;
|
||||||
mod dest;
|
mod dest;
|
||||||
@@ -12,7 +13,9 @@ use std::{
|
|||||||
|
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use conduwuit::{
|
use conduwuit::{
|
||||||
Result, Server, debug, debug_warn, err, error,
|
Result, Server,
|
||||||
|
config::MeowlnirConfig,
|
||||||
|
debug, debug_warn, err, error,
|
||||||
smallvec::SmallVec,
|
smallvec::SmallVec,
|
||||||
utils::{ReadyExt, TryReadyExt, available_parallelism, math::usize_from_u64_truncated},
|
utils::{ReadyExt, TryReadyExt, available_parallelism, math::usize_from_u64_truncated},
|
||||||
warn,
|
warn,
|
||||||
@@ -334,6 +337,18 @@ impl Service {
|
|||||||
appservice::send_request(client, registration, request).await
|
appservice::send_request(client, registration, request).await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sends a request to the chosen antispam configuration
|
||||||
|
pub async fn send_meowlnir_antispam_request<T>(
|
||||||
|
&self,
|
||||||
|
config: &MeowlnirConfig,
|
||||||
|
request: T,
|
||||||
|
) -> Result<Option<T::IncomingResponse>>
|
||||||
|
where
|
||||||
|
T: OutgoingRequest + Debug + Send,
|
||||||
|
{
|
||||||
|
antispam::send_meowlnir_request(&self.services.client.appservice, config, request).await
|
||||||
|
}
|
||||||
|
|
||||||
/// Clean up queued sending event data
|
/// Clean up queued sending event data
|
||||||
///
|
///
|
||||||
/// Used after we remove an appservice registration or a user deletes a push
|
/// Used after we remove an appservice registration or a user deletes a push
|
||||||
|
|||||||
Reference in New Issue
Block a user