From fb66356154f3c125ab20925a5552702f7d27a47b Mon Sep 17 00:00:00 2001 From: Ginger Date: Wed, 5 Nov 2025 14:29:03 -0500 Subject: [PATCH] fix(sync/v3): Fix invite filtering for federated invites --- src/api/server/invite.rs | 2 +- src/service/rooms/state_cache/update.rs | 37 ++++++++++++------------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/api/server/invite.rs b/src/api/server/invite.rs index 6d9b08ea..ef2c8541 100644 --- a/src/api/server/invite.rs +++ b/src/api/server/invite.rs @@ -139,7 +139,7 @@ pub(crate) async fn create_invite_route( Some(invite_state), body.via.clone(), ) - .await; + .await?; services .rooms diff --git a/src/service/rooms/state_cache/update.rs b/src/service/rooms/state_cache/update.rs index 9fb2f29a..f08ff4a0 100644 --- a/src/service/rooms/state_cache/update.rs +++ b/src/service/rooms/state_cache/update.rs @@ -118,27 +118,11 @@ pub async fn update_membership( self.mark_as_joined(user_id, room_id); }, | MembershipState::Invite => { - // return an error for blocked invites. ignored invites aren't handled here - // since the recipient's membership should still be changed to `invite`. - // they're filtered out in the individual /sync handlers - let sender = pdu.sender(); - if matches!( - self.services - .users - .invite_filter_level(sender, user_id) - .await, - FilterLevel::Block - ) { - return Err!(Request(InviteBlocked( - "{user_id} has blocked invites from {sender}." - ))); - } - // TODO: make sure that passing None for `last_state` is correct behavior. // the call from `append_pdu` used to use `services.state.summary_stripped` // to fill that parameter. - self.mark_as_invited(user_id, room_id, sender, None, None) - .await; + self.mark_as_invited(user_id, room_id, pdu.sender(), None, None) + .await?; }, | MembershipState::Leave | MembershipState::Ban => { self.mark_as_left(user_id, room_id, Some(pdu.clone())).await; @@ -352,7 +336,20 @@ pub async fn mark_as_invited( sender_user: &UserId, last_state: Option>>, invite_via: Option>, -) { +) -> Result<()> { + // return an error for blocked invites. ignored invites aren't handled here + // since the recipient's membership should still be changed to `invite`. + // they're filtered out in the individual /sync handlers + if matches!( + self.services + .users + .invite_filter_level(sender_user, user_id) + .await, + FilterLevel::Block + ) { + return Err!(Request(InviteBlocked("{user_id} has blocked invites from {sender_user}."))); + } + let roomuser_id = (room_id, user_id); let roomuser_id = serialize_key(roomuser_id).expect("failed to serialize roomuser_id"); @@ -381,4 +378,6 @@ pub async fn mark_as_invited( if let Some(servers) = invite_via.filter(is_not_empty!()) { self.add_servers_invite_via(room_id, servers).await; } + + Ok(()) }