From 81a69f82d2cbee194bb1a2fedaa3262d710fe475 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Thu, 2 Oct 2025 11:28:25 +0200 Subject: [PATCH] feat(sdk): Accept invite for latest event if it targets the current user. --- .../src/latest_events/latest_event.rs | 64 +++++++++++++------ 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/crates/matrix-sdk/src/latest_events/latest_event.rs b/crates/matrix-sdk/src/latest_events/latest_event.rs index bda5608ec..2a9b63a9b 100644 --- a/crates/matrix-sdk/src/latest_events/latest_event.rs +++ b/crates/matrix-sdk/src/latest_events/latest_event.rs @@ -12,7 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -use std::{iter::once, ops::Not}; +use std::{ + iter::once, + ops::{Deref, Not}, +}; use eyeball::{AsyncLock, SharedObservable, Subscriber}; pub use matrix_sdk_base::latest_event::{ @@ -1015,8 +1018,16 @@ fn filter_any_sync_state_event( } MembershipState::Invite => { - // We can only decide whether the user is invited if the event isn't redacted. - matches!(member, SyncStateEvent::Original(_)) + // The current _is_ invited (not someone else). + match member { + // We can only decide whether the user is invited if the event isn't + // redacted. + SyncStateEvent::Original(state) => { + Some(state.state_key.deref()) == own_user_id + } + + _ => false, + } } _ => false, @@ -1278,6 +1289,38 @@ mod tests_latest_event_content { } } + #[test] + fn test_invite_state_event() { + use ruma::events::room::member::MembershipState; + + // The current user is receiving an invite. + assert_latest_event_content!( + event | event_factory | { + event_factory + .member(user_id!("@mnt_io:matrix.org")) + .membership(MembershipState::Invite) + .into_event() + } + is a candidate + ); + } + + #[test] + fn test_invite_state_event_for_someone_else() { + use ruma::events::room::member::MembershipState; + + // The current user sees an invite but for someone else. + assert_latest_event_content!( + event | event_factory | { + event_factory + .member(user_id!("@other_mnt_io:server.name")) + .membership(MembershipState::Invite) + .into_event() + } + is not a candidate + ); + } + #[test] fn test_room_message_verification_request() { use ruma::{OwnedDeviceId, events::room::message}; @@ -1298,21 +1341,6 @@ mod tests_latest_event_content { is not a candidate ); } - - #[test] - fn test_invite() { - use ruma::events::room::member::MembershipState; - - assert_latest_event_content!( - event | event_factory | { - event_factory - .member(user_id!("@mnt_io:matrix.org")) - .membership(MembershipState::Invite) - .into_event() - } - is a candidate - ); - } } #[cfg(test)]