From b915692ae123752fb2102eb7c65a120bdcd3f1cb Mon Sep 17 00:00:00 2001 From: timedout Date: Fri, 10 Jul 2026 16:32:38 +0100 Subject: [PATCH] fix: Remove broken federated invite revoke handling It turns out it never worked in the first place :D --- .../event_handler/handle_incoming_pdu.rs | 93 +------------------ src/service/rooms/event_handler/mod.rs | 4 +- 2 files changed, 4 insertions(+), 93 deletions(-) diff --git a/src/service/rooms/event_handler/handle_incoming_pdu.rs b/src/service/rooms/event_handler/handle_incoming_pdu.rs index 86be9c44b..b5343d825 100644 --- a/src/service/rooms/event_handler/handle_incoming_pdu.rs +++ b/src/service/rooms/event_handler/handle_incoming_pdu.rs @@ -4,83 +4,18 @@ }; use conduwuit::{ - Err, Event, PduEvent, Result, debug, debug_error, debug_info, debug_warn, defer, err, error, - info, matrix::PartialPdu, result::DebugInspect, trace, utils::time::jitter, warn, + Err, Event, Result, debug, debug_error, debug_warn, defer, err, error, info, + matrix::PartialPdu, result::DebugInspect, trace, utils::time::jitter, warn, }; use futures::{ FutureExt, StreamExt, future::{OptionFuture, try_join4}, }; -use ruma::{ - CanonicalJsonValue, EventId, OwnedUserId, RoomId, ServerName, UserId, - events::{ - TimelineEventType, - room::member::{MembershipState, RoomMemberEventContent}, - }, -}; +use ruma::{CanonicalJsonValue, EventId, OwnedUserId, RoomId, ServerName, UserId}; use tokio::sync::mpsc; use crate::rooms::timeline::{RawPduId, pdu_fits}; -async fn should_rescind_invite( - services: &crate::rooms::event_handler::Services, - content: &mut BTreeMap, - sender: &UserId, - room_id: &RoomId, -) -> Result> { - // We insert a bogus event ID since we can't actually calculate the right one - content.insert("event_id".to_owned(), CanonicalJsonValue::String("$rescind".to_owned())); - let pdu_event = serde_json::from_value::( - serde_json::to_value(&content).expect("CanonicalJsonObj is a valid JsonValue"), - ) - .map_err(|e| err!("invalid PDU: {e}"))?; - - if pdu_event.room_id().is_none_or(|r| r != room_id) - && pdu_event.sender() != sender - && pdu_event.event_type() != &TimelineEventType::RoomMember - && pdu_event.state_key().is_none_or(|v| v == sender.as_str()) - { - return Ok(None); - } - - let target_user_id = UserId::parse(pdu_event.state_key().unwrap())?; - if pdu_event - .get_content::()? - .membership - != MembershipState::Leave - { - return Ok(None); // Not a leave event - } - - // Does the target user have a pending invite? - let Ok(pending_invite_state) = services - .state_cache - .invite_state(&target_user_id, room_id) - .await - else { - return Ok(None); // No pending invite, so nothing to rescind - }; - for event in pending_invite_state { - if event - .get_field::("type")? - .is_some_and(|t| t == "m.room.member") - || event - .get_field::("state_key")? - .is_some_and(|s| s == *target_user_id) - || event - .get_field::("sender")? - .is_some_and(|s| s == *sender) - || event - .get_field::("content")? - .is_some_and(|c| c.membership == MembershipState::Invite) - { - return Ok(Some(pdu_event)); - } - } - - Ok(None) -} - impl super::Service { /// When receiving an event one needs to: /// 0. Check the server is in the room @@ -183,28 +118,6 @@ pub async fn handle_incoming_pdu<'a>( .server_in_room(self.services.globals.server_name(), room_id) .await { - // Is this a federated invite rescind? - // copied from https://github.com/element-hq/synapse/blob/7e4588a/synapse/handlers/federation_event.py#L255-L300 - if value.get("type").and_then(|t| t.as_str()) == Some("m.room.member") { - if let Some(pdu) = - should_rescind_invite(&self.services, &mut value.clone(), &sender, room_id) - .await? - { - debug_info!( - "Invite to {room_id} appears to have been rescinded by {sender}, \ - marking as left" - ); - - self.services - .state_cache - .mark_as_left(&sender, room_id, Some(pdu)) - .await; - - self.services.sync.wake(&sender).await; - - return Ok(None); - } - } info!( %origin, %room_id, diff --git a/src/service/rooms/event_handler/mod.rs b/src/service/rooms/event_handler/mod.rs index 1367a2331..9275d1c89 100644 --- a/src/service/rooms/event_handler/mod.rs +++ b/src/service/rooms/event_handler/mod.rs @@ -24,7 +24,7 @@ }; use tokio::sync::{Notify, mpsc}; -use crate::{Dep, globals, rooms, sending, server_keys, sync}; +use crate::{Dep, globals, rooms, sending, server_keys}; pub struct Service { pub mutex_federation: RoomMutexMap, pub federation_handletime: SyncRwLock, @@ -47,7 +47,6 @@ struct Services { state_cache: Dep, state_accessor: Dep, state_compressor: Dep, - sync: Dep, timeline: Dep, server: Arc, } @@ -78,7 +77,6 @@ fn build(args: crate::Args<'_>) -> Result> { .depend::("rooms::state_accessor"), state_compressor: args .depend::("rooms::state_compressor"), - sync: args.depend::("sync"), timeline: args.depend::("rooms::timeline"), server: args.server.clone(), },