feat: Add Meowlnir invite interception support

Co-authored-by: Jade Ellis <jade@ellis.link>
This commit is contained in:
timedout
2026-01-05 01:19:11 +00:00
committed by Jade Ellis
parent a83c1f1513
commit 0956779802
8 changed files with 265 additions and 77 deletions
+25 -1
View File
@@ -1,8 +1,11 @@
use axum::extract::State;
use axum_client_ip::InsecureClientIp;
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},
trace,
};
use futures::FutureExt;
use ruma::{
@@ -12,6 +15,7 @@ use ruma::{
invite_permission_config::FilterLevel,
room::member::{MembershipState, RoomMemberEventContent},
},
meowlnir_antispam::user_may_invite,
};
use service::Services;
@@ -124,6 +128,26 @@ pub(crate) async fn invite_helper(
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) {
let (pdu, pdu_json, invite_room_state) = {
let state_lock = services.rooms.state.mutex.lock(room_id).await;
+18 -1
View File
@@ -2,7 +2,9 @@ use axum::extract::State;
use axum_client_ip::InsecureClientIp;
use base64::{Engine as _, engine::general_purpose};
use conduwuit::{
Err, Error, PduEvent, Result, err,
Err, Error, PduEvent, Result,
config::Antispam,
err,
matrix::{Event, event::gen_event_id},
utils::{self, hash::sha256},
warn,
@@ -11,6 +13,7 @@ use ruma::{
CanonicalJsonValue, OwnedUserId, UserId,
api::{client::error::ErrorKind, federation::membership::create_invite},
events::room::member::{MembershipState, RoomMemberEventContent},
meowlnir_antispam::user_may_invite,
serde::JsonObject,
};
@@ -148,6 +151,20 @@ pub(crate) async fn create_invite_route(
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 event: JsonObject = serde_json::from_str(body.event.get())