fix: fix kick and ban events over federation
Fix the scenario where a MembershipState change event was not sent to the server of a user kicked/banned from a room on a Conduit instance if there were not any other users from that server in the room.
@@ -1957,12 +1957,24 @@ impl Rooms {
// where events in the current room state do not exist
self.set_room_state(room_id, statehashid)?;
- let servers = self
+ let mut servers: HashSet<Box<ServerName>> = self
.room_servers(room_id)
.filter_map(|r| r.ok())
- .filter(|server| &**server != db.globals.server_name());
+ .filter(|server| &**server != db.globals.server_name())
+ .collect();
+
+ // In case we are kicking or banning a user, we need to inform their server of the change
+ if pdu.kind == EventType::RoomMember {
+ if let Some(state_key_uid) = &pdu
+ .state_key
+ .as_ref()
+ .and_then(|state_key| UserId::parse(state_key.as_str()).ok())
+ {
+ servers.insert(Box::from(state_key_uid.server_name()));
+ }
+ }
- db.sending.send_pdu(servers, &pdu_id)?;
+ db.sending.send_pdu(servers.into_iter(), &pdu_id)?;
for appservice in db.appservice.all()? {
if self.appservice_in_room(room_id, &appservice, db)? {
