implement senders and not_senders filters on /messages

This commit is contained in:
Benjamin Lee 2024-05-02 18:53:18 -07:00
parent 0e2694a6c4
commit 75523fa3e0
No known key found for this signature in database
GPG key ID: FB9624E2885D55A4

View file

@ -16,7 +16,7 @@ use std::{collections::HashSet, hash::Hash};
use ruma::{ use ruma::{
api::client::filter::{RoomEventFilter, UrlFilter}, api::client::filter::{RoomEventFilter, UrlFilter},
RoomId, RoomId, UserId,
}; };
use crate::{Error, PduEvent}; use crate::{Error, PduEvent};
@ -85,6 +85,7 @@ impl<'a, T: ?Sized + Hash + PartialEq + Eq> AllowDenyList<'a, T> {
pub(crate) struct CompiledRoomEventFilter<'a> { pub(crate) struct CompiledRoomEventFilter<'a> {
rooms: AllowDenyList<'a, RoomId>, rooms: AllowDenyList<'a, RoomId>,
senders: AllowDenyList<'a, UserId>,
url_filter: Option<UrlFilter>, url_filter: Option<UrlFilter>,
} }
@ -99,6 +100,10 @@ impl<'a> TryFrom<&'a RoomEventFilter> for CompiledRoomEventFilter<'a> {
source.rooms.as_deref(), source.rooms.as_deref(),
&source.not_rooms, &source.not_rooms,
), ),
senders: AllowDenyList::from_slices(
source.senders.as_deref(),
&source.not_senders,
),
url_filter: source.url_filter, url_filter: source.url_filter,
}) })
} }
@ -118,14 +123,15 @@ impl CompiledRoomEventFilter<'_> {
/// Returns `true` if a PDU event is allowed by the filter. /// Returns `true` if a PDU event is allowed by the filter.
/// ///
/// This tests against the `url_filter` field. /// This tests against the `senders`, `not_senders`, and `url_filter`
/// fields.
/// ///
/// This does *not* check whether the event's room is allowed. It is /// This does *not* check whether the event's room is allowed. It is
/// expected that callers have already filtered out rejected rooms using /// expected that callers have already filtered out rejected rooms using
/// [`CompiledRoomEventFilter::room_allowed`] and /// [`CompiledRoomEventFilter::room_allowed`] and
/// [`CompiledRoomFilter::rooms`]. /// [`CompiledRoomFilter::rooms`].
pub(crate) fn pdu_event_allowed(&self, pdu: &PduEvent) -> bool { pub(crate) fn pdu_event_allowed(&self, pdu: &PduEvent) -> bool {
self.allowed_by_url_filter(pdu) self.senders.allowed(&pdu.sender) && self.allowed_by_url_filter(pdu)
} }
fn allowed_by_url_filter(&self, pdu: &PduEvent) -> bool { fn allowed_by_url_filter(&self, pdu: &PduEvent) -> bool {