From ce44c6e4e796af5e6ce6b506671fe960f12366a4 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Wed, 5 Feb 2025 08:54:39 +0200 Subject: [PATCH] chore(base): don't show timeline verification requests as last messages --- crates/matrix-sdk-base/src/latest_event.rs | 37 ++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/crates/matrix-sdk-base/src/latest_event.rs b/crates/matrix-sdk-base/src/latest_event.rs index 92fc77a82..c9bfdbcf4 100644 --- a/crates/matrix-sdk-base/src/latest_event.rs +++ b/crates/matrix-sdk-base/src/latest_event.rs @@ -10,7 +10,7 @@ use ruma::{ relation::RelationType, room::{ member::{MembershipState, SyncRoomMemberEvent}, - message::SyncRoomMessageEvent, + message::{MessageType, SyncRoomMessageEvent}, power_levels::RoomPowerLevels, }, sticker::SyncStickerEvent, @@ -67,8 +67,13 @@ pub fn is_suitable_for_latest_event<'a>( match event { // Suitable - we have an m.room.message that was not redacted or edited AnySyncTimelineEvent::MessageLike(AnySyncMessageLikeEvent::RoomMessage(message)) => { - // Check if this is a replacement for another message. If it is, ignore it if let Some(original_message) = message.as_original() { + // Don't show incoming verification requests + if let MessageType::VerificationRequest(_) = original_message.content.msgtype { + return PossibleLatestEvent::NoUnsupportedMessageLikeType; + } + + // Check if this is a replacement for another message. If it is, ignore it let is_replacement = original_message.content.relates_to.as_ref().is_some_and(|relates_to| { if let Some(relation_type) = relates_to.rel_type() { @@ -589,6 +594,34 @@ mod tests { ); } + #[cfg(feature = "e2e-encryption")] + #[test] + fn test_verification_requests_are_unsuitable() { + use ruma::{device_id, events::room::message::KeyVerificationRequestEventContent, user_id}; + + let event = AnySyncTimelineEvent::MessageLike(AnySyncMessageLikeEvent::RoomMessage( + SyncRoomMessageEvent::Original(OriginalSyncMessageLikeEvent { + content: RoomMessageEventContent::new(MessageType::VerificationRequest( + KeyVerificationRequestEventContent::new( + "body".to_owned(), + vec![], + device_id!("device_id").to_owned(), + user_id!("@user_id:example.com").to_owned(), + ), + )), + event_id: owned_event_id!("$1"), + sender: owned_user_id!("@a:b.c"), + origin_server_ts: MilliSecondsSinceUnixEpoch(UInt::new(123).unwrap()), + unsigned: MessageLikeUnsigned::new(), + }), + )); + + assert_let!( + PossibleLatestEvent::NoUnsupportedMessageLikeType = + is_suitable_for_latest_event(&event, None) + ); + } + #[test] fn test_deserialize_latest_event() { #[derive(Debug, serde::Serialize, serde::Deserialize)]