From f1ab27d344043538694ab9a6b1a832e0c5cd966d Mon Sep 17 00:00:00 2001 From: timedout Date: Thu, 22 Jan 2026 13:58:20 +0000 Subject: [PATCH] feat: Return SENDER_IGNORED error for context and relations --- src/api/client/context.rs | 16 +++++++++++++--- src/api/client/relations.rs | 12 ++++++++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/api/client/context.rs b/src/api/client/context.rs index f9f5abff..51eba5d2 100644 --- a/src/api/client/context.rs +++ b/src/api/client/context.rs @@ -1,6 +1,6 @@ use axum::extract::State; use conduwuit::{ - Err, Event, Result, at, debug_warn, err, ref_at, + Err, Error, Event, Result, at, debug_warn, err, ref_at, utils::{ IterStream, future::TryExtExt, @@ -12,11 +12,18 @@ use futures::{ FutureExt, StreamExt, TryFutureExt, TryStreamExt, future::{OptionFuture, join, join3, try_join3}, }; -use ruma::{OwnedEventId, UserId, api::client::context::get_context, events::StateEventType}; +use ruma::{ + OwnedEventId, UserId, + api::client::{context::get_context, error::ErrorKind}, + events::StateEventType, +}; use crate::{ Ruma, - client::message::{event_filter, ignored_filter, lazy_loading_witness, visibility_filter}, + client::{ + is_ignored_pdu, + message::{event_filter, ignored_filter, lazy_loading_witness, visibility_filter}, + }, }; const LIMIT_MAX: usize = 100; @@ -78,6 +85,9 @@ pub(crate) async fn get_context_route( return Err!(Request(NotFound("Event not found."))); } + // Return M_SENDER_IGNORED if the sender of base_event is ignored (MSC4406) + is_ignored_pdu(&services, &base_pdu, sender_user).await?; + let base_count = base_id.pdu_count(); let base_event = ignored_filter(&services, (base_count, base_pdu), sender_user); diff --git a/src/api/client/relations.rs b/src/api/client/relations.rs index 35fb1149..0b32b9d0 100644 --- a/src/api/client/relations.rs +++ b/src/api/client/relations.rs @@ -1,6 +1,6 @@ use axum::extract::State; use conduwuit::{ - Err, Result, at, debug_warn, + Err, Result, at, debug_warn, err, matrix::{Event, event::RelationTypeEqual, pdu::PduCount}, utils::{IterStream, ReadyExt, result::FlatOk, stream::WidebandExt}, }; @@ -18,7 +18,7 @@ use ruma::{ events::{TimelineEventType, relation::RelationType}, }; -use crate::Ruma; +use crate::{Ruma, client::is_ignored_pdu}; /// # `GET /_matrix/client/r0/rooms/{roomId}/relations/{eventId}/{relType}/{eventType}` pub(crate) async fn get_relating_events_with_rel_type_and_event_type_route( @@ -118,6 +118,14 @@ async fn paginate_relations_with_filter( debug_warn!(req_evt = %target, %room_id, "Event relations requested by {sender_user} but is not allowed to see it, returning 404"); return Err!(Request(NotFound("Event not found."))); } + let target_pdu = services + .rooms + .timeline + .get_pdu(target) + .await + .map_err(|_| err!(Request(NotFound("Event not found."))))?; + // Return M_SENDER_IGNORED if the sender of base_event is ignored (MSC4406) + is_ignored_pdu(services, &target_pdu, sender_user).await?; let start: PduCount = from .map(str::parse)