From 5e6dbaa27f5e08556422ee6b756efdc318654fd7 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sun, 27 Oct 2024 01:48:57 +0000 Subject: [PATCH] apply room event filter to messages endpoint (#596) Signed-off-by: Jason Volk --- src/api/client/message.rs | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/src/api/client/message.rs b/src/api/client/message.rs index 578b675b..094daa30 100644 --- a/src/api/client/message.rs +++ b/src/api/client/message.rs @@ -9,13 +9,13 @@ use conduit::{ use futures::{FutureExt, StreamExt}; use ruma::{ api::client::{ - filter::{RoomEventFilter, UrlFilter}, + filter::RoomEventFilter, message::{get_message_events, send_message_event}, }, events::{MessageLikeEventType, StateEventType, TimelineEventType::*}, UserId, }; -use serde_json::{from_str, Value}; +use serde_json::from_str; use service::rooms::timeline::PdusIterItem; use crate::{ @@ -151,7 +151,7 @@ pub(crate) async fn get_message_events_route( .timeline .pdus_after(sender_user, room_id, from) .await? - .ready_filter_map(|item| contains_url_filter(item, filter)) + .ready_filter_map(|item| event_filter(item, filter)) .filter_map(|item| visibility_filter(&services, item, sender_user)) .ready_take_while(|(count, _)| Some(*count) != to) // Stop at `to` .take(limit) @@ -225,7 +225,7 @@ pub(crate) async fn get_message_events_route( .timeline .pdus_until(sender_user, room_id, from) .await? - .ready_filter_map(|item| contains_url_filter(item, filter)) + .ready_filter_map(|item| event_filter(item, filter)) .filter_map(|(count, pdu)| async move { // list of safe and common non-state events to ignore if matches!( @@ -329,19 +329,7 @@ async fn visibility_filter(services: &Services, item: PdusIterItem, user_id: &Us .then_some(item) } -fn contains_url_filter(item: PdusIterItem, filter: &RoomEventFilter) -> Option { +fn event_filter(item: PdusIterItem, filter: &RoomEventFilter) -> Option { let (_, pdu) = &item; - - if filter.url_filter.is_none() { - return Some(item); - } - - let content: Value = from_str(pdu.content.get()).unwrap(); - let res = match filter.url_filter { - Some(UrlFilter::EventsWithoutUrl) => !content["url"].is_string(), - Some(UrlFilter::EventsWithUrl) => content["url"].is_string(), - None => true, - }; - - res.then_some(item) + pdu.matches(filter).then_some(item) }