feat: report local users getting banned

This commit is contained in:
avdb13 2024-08-04 14:48:10 +02:00
parent 14afa1357e
commit f03b6cde29
2 changed files with 36 additions and 9 deletions

View file

@ -202,3 +202,5 @@ This will be the first release of Grapevine since it was forked from Conduit
the logs. the logs.
13. Support building nix packages without IFD 13. Support building nix packages without IFD
([!73](https://gitlab.computer.surgery/matrix/grapevine-fork/-/merge_requests/73)) ([!73](https://gitlab.computer.surgery/matrix/grapevine-fork/-/merge_requests/73))
14. Report local users getting banned in the server logs and admin room.
([!65](https://gitlab.computer.surgery/matrix/grapevine-fork/-/merge_requests/65))

View file

@ -14,7 +14,8 @@ use ruma::{
push_rules::PushRulesEvent, push_rules::PushRulesEvent,
room::{ room::{
create::RoomCreateEventContent, encrypted::Relation, create::RoomCreateEventContent, encrypted::Relation,
member::MembershipState, power_levels::RoomPowerLevelsEventContent, member::MembershipState, message::RoomMessageEventContent,
power_levels::RoomPowerLevelsEventContent,
redaction::RoomRedactionEventContent, redaction::RoomRedactionEventContent,
}, },
GlobalAccountDataEventType, StateEventType, TimelineEventType, GlobalAccountDataEventType, StateEventType, TimelineEventType,
@ -448,20 +449,21 @@ impl Service {
#[derive(Deserialize)] #[derive(Deserialize)]
struct ExtractMembership { struct ExtractMembership {
membership: MembershipState, membership: MembershipState,
reason: Option<String>,
} }
// if the state_key fails // if the state_key fails
let target_user_id = UserId::parse(state_key.clone()) let target_user_id = UserId::parse(state_key.clone())
.expect("This state_key was previously validated"); .expect("This state_key was previously validated");
let content = serde_json::from_str::<ExtractMembership>( let ExtractMembership {
pdu.content.get(), membership,
) reason,
.map_err(|_| { } = serde_json::from_str(pdu.content.get()).map_err(
Error::bad_database("Invalid content in pdu.") |_| Error::bad_database("Invalid content in pdu."),
})?; )?;
let invite_state = match content.membership { let invite_state = match membership {
MembershipState::Invite => { MembershipState::Invite => {
let state = services() let state = services()
.rooms .rooms
@ -472,13 +474,36 @@ impl Service {
_ => None, _ => None,
}; };
if membership == MembershipState::Ban {
let (room, user) = (&pdu.room_id, &target_user_id);
info!(
%user,
%room,
reason,
"User has been banned from room"
);
let reason = match reason.filter(|s| !s.is_empty()) {
Some(s) => format!(": {s}"),
None => String::new(),
};
services().admin.send_message(
RoomMessageEventContent::notice_plain(format!(
"User {user} has been banned from room \
{room}{reason}",
)),
);
}
// Update our membership info, we do this here incase a user // Update our membership info, we do this here incase a user
// is invited and immediately leaves we // is invited and immediately leaves we
// need the DB to record the invite event for auth // need the DB to record the invite event for auth
services().rooms.state_cache.update_membership( services().rooms.state_cache.update_membership(
&pdu.room_id, &pdu.room_id,
&target_user_id, &target_user_id,
content.membership, membership,
&pdu.sender, &pdu.sender,
invite_state, invite_state,
true, true,