From 1c0ead033924dbdf09aca5544816286a9afc0a50 Mon Sep 17 00:00:00 2001 From: Benjamin Lee Date: Mon, 3 Jun 2024 11:13:18 -0700 Subject: [PATCH] implement (not_)rooms filter on /context --- src/api/client_server/context.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/api/client_server/context.rs b/src/api/client_server/context.rs index 989b1c66..2c5b7cfc 100644 --- a/src/api/client_server/context.rs +++ b/src/api/client_server/context.rs @@ -9,7 +9,9 @@ use ruma::{ }; use tracing::error; -use crate::{services, Ar, Error, Ra, Result}; +use crate::{ + services, utils::filter::CompiledRoomEventFilter, Ar, Error, Ra, Result, +}; /// # `GET /_matrix/client/r0/rooms/{roomId}/context` /// @@ -26,6 +28,13 @@ pub(crate) async fn get_context_route( let sender_device = body.sender_device.as_ref().expect("user is authenticated"); + let Ok(filter) = CompiledRoomEventFilter::try_from(&body.filter) else { + return Err(Error::BadRequest( + ErrorKind::InvalidParam, + "invalid 'filter' parameter", + )); + }; + let (lazy_load_enabled, lazy_load_send_redundant) = match &body.filter.lazy_load_options { LazyLoadOptions::Enabled { @@ -74,6 +83,24 @@ pub(crate) async fn get_context_route( let base_event = base_event.to_room_event(); + if !filter.room_allowed(&body.room_id) { + // The spec states that + // + // > The filter is only applied to events_before, events_after, and + // > state. It is not applied to the event itself. + // + // so we need to fetch the event before we can early-return after + // testing the room filter. + return Ok(Ra(get_context::v3::Response { + start: None, + end: None, + events_before: vec![], + event: Some(base_event), + events_after: vec![], + state: vec![], + })); + } + let events_before: Vec<_> = services() .rooms .timeline