Implement filtering invites if sender is ignored by receiver

This commit is contained in:
Devin Ragotzy 2020-07-27 20:48:51 -04:00
parent 100e3d6d6d
commit f2fab27d81
2 changed files with 61 additions and 0 deletions

View file

@ -7,6 +7,7 @@ use log::error;
use ruma::{
api::client::error::ErrorKind,
events::{
ignored_user_list,
room::{
join_rules, member,
power_levels::{self, PowerLevelsEventContent},
@ -255,6 +256,7 @@ impl Rooms {
&self,
pdu_builder: PduBuilder,
globals: &super::globals::Globals,
account_data: &super::account_data::AccountData,
) -> Result<EventId> {
let PduBuilder {
room_id,
@ -411,6 +413,43 @@ impl Rooms {
|| join_rules == join_rules::JoinRule::Public
}
} else if target_membership == member::MembershipState::Invite {
// we want to know if the sender is ignored by the receiver
let is_ignored = if let Ok(Some(ignored)) =
account_data.get::<ignored_user_list::IgnoredUserListEventContent>(
None, // we cannot use the provided room_id it's the invite room
&target_user_id, // receiver
EventType::IgnoredUserList,
) {
ignored.ignored_users.contains(&sender)
} else {
false
};
if is_ignored {
let mut event =
serde_json::from_value::<Raw<member::MemberEventContent>>(content)
.expect("from_value::<Raw<..>> cannot fail")
.deserialize()
.map_err(|_| {
Error::bad_database("Invalid member event in database.")
})?;
event.membership = member::MembershipState::Leave;
return self.append_pdu(
room_id,
target_user_id.clone(),
EventType::RoomMember,
serde_json::to_value(event)
.expect("event is valid, we just created it"),
None,
Some(target_user_id.to_string()),
None,
globals,
account_data,
);
}
if let Some(third_party_invite_json) = content.get("third_party_invite") {
if current_membership == member::MembershipState::Ban {
false