mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2025-07-05 19:55:49 +02:00
fix: Room bans preventing federated leaves
Some checks failed
Documentation / Build and Deploy Documentation (push) Has been skipped
Checks / Prefligit / prefligit (push) Failing after 2s
Release Docker Image / define-variables (push) Failing after 1s
Release Docker Image / build-image (linux/amd64, release, linux-amd64, base) (push) Has been skipped
Release Docker Image / build-image (linux/arm64, release, linux-arm64, base) (push) Has been skipped
Release Docker Image / merge (push) Has been skipped
Checks / Rust / Format (push) Failing after 1s
Checks / Rust / Clippy (push) Failing after 29s
Checks / Rust / Cargo Test (push) Failing after 28s
Some checks failed
Documentation / Build and Deploy Documentation (push) Has been skipped
Checks / Prefligit / prefligit (push) Failing after 2s
Release Docker Image / define-variables (push) Failing after 1s
Release Docker Image / build-image (linux/amd64, release, linux-amd64, base) (push) Has been skipped
Release Docker Image / build-image (linux/arm64, release, linux-arm64, base) (push) Has been skipped
Release Docker Image / merge (push) Has been skipped
Checks / Rust / Format (push) Failing after 1s
Checks / Rust / Clippy (push) Failing after 29s
Checks / Rust / Cargo Test (push) Failing after 28s
Fixes the issue where room bans prevent federating leave events, resulting in local users being stuck in remote rooms
This commit is contained in:
parent
4f69da47c6
commit
b44791799c
1 changed files with 18 additions and 44 deletions
|
@ -1,7 +1,7 @@
|
||||||
use api::client::leave_room;
|
use api::client::leave_room;
|
||||||
use clap::Subcommand;
|
use clap::Subcommand;
|
||||||
use conduwuit::{
|
use conduwuit::{
|
||||||
Err, Result, debug,
|
Err, Result, debug, info,
|
||||||
utils::{IterStream, ReadyExt},
|
utils::{IterStream, ReadyExt},
|
||||||
warn,
|
warn,
|
||||||
};
|
};
|
||||||
|
@ -70,7 +70,6 @@ async fn ban_room(&self, room: OwnedRoomOrAliasId) -> Result {
|
||||||
};
|
};
|
||||||
|
|
||||||
debug!("Room specified is a room ID, banning room ID");
|
debug!("Room specified is a room ID, banning room ID");
|
||||||
self.services.rooms.metadata.ban_room(room_id, true);
|
|
||||||
|
|
||||||
room_id.to_owned()
|
room_id.to_owned()
|
||||||
} else if room.is_room_alias_id() {
|
} else if room.is_room_alias_id() {
|
||||||
|
@ -90,47 +89,25 @@ async fn ban_room(&self, room: OwnedRoomOrAliasId) -> Result {
|
||||||
locally, if not using get_alias_helper to fetch room ID remotely"
|
locally, if not using get_alias_helper to fetch room ID remotely"
|
||||||
);
|
);
|
||||||
|
|
||||||
let room_id = match self
|
match self
|
||||||
.services
|
.services
|
||||||
.rooms
|
.rooms
|
||||||
.alias
|
.alias
|
||||||
.resolve_local_alias(room_alias)
|
.resolve_alias(room_alias, None)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
| Ok(room_id) => room_id,
|
| Ok((room_id, servers)) => {
|
||||||
| _ => {
|
|
||||||
debug!(
|
debug!(
|
||||||
"We don't have this room alias to a room ID locally, attempting to fetch \
|
?room_id,
|
||||||
room ID over federation"
|
?servers,
|
||||||
|
"Got federation response fetching room ID for room {room}"
|
||||||
);
|
);
|
||||||
|
room_id
|
||||||
match self
|
|
||||||
.services
|
|
||||||
.rooms
|
|
||||||
.alias
|
|
||||||
.resolve_alias(room_alias, None)
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
| Ok((room_id, servers)) => {
|
|
||||||
debug!(
|
|
||||||
?room_id,
|
|
||||||
?servers,
|
|
||||||
"Got federation response fetching room ID for {room_id}"
|
|
||||||
);
|
|
||||||
room_id
|
|
||||||
},
|
|
||||||
| Err(e) => {
|
|
||||||
return Err!(
|
|
||||||
"Failed to resolve room alias {room_alias} to a room ID: {e}"
|
|
||||||
);
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
};
|
| Err(e) => {
|
||||||
|
return Err!("Failed to resolve room alias {room} to a room ID: {e}");
|
||||||
self.services.rooms.metadata.ban_room(&room_id, true);
|
},
|
||||||
|
}
|
||||||
room_id
|
|
||||||
} else {
|
} else {
|
||||||
return Err!(
|
return Err!(
|
||||||
"Room specified is not a room ID or room alias. Please note that this requires a \
|
"Room specified is not a room ID or room alias. Please note that this requires a \
|
||||||
|
@ -139,7 +116,7 @@ async fn ban_room(&self, room: OwnedRoomOrAliasId) -> Result {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
debug!("Making all users leave the room {room_id} and forgetting it");
|
info!("Making all users leave the room {room_id} and forgetting it");
|
||||||
let mut users = self
|
let mut users = self
|
||||||
.services
|
.services
|
||||||
.rooms
|
.rooms
|
||||||
|
@ -150,7 +127,7 @@ async fn ban_room(&self, room: OwnedRoomOrAliasId) -> Result {
|
||||||
.boxed();
|
.boxed();
|
||||||
|
|
||||||
while let Some(ref user_id) = users.next().await {
|
while let Some(ref user_id) = users.next().await {
|
||||||
debug!(
|
info!(
|
||||||
"Attempting leave for user {user_id} in room {room_id} (ignoring all errors, \
|
"Attempting leave for user {user_id} in room {room_id} (ignoring all errors, \
|
||||||
evicting admins too)",
|
evicting admins too)",
|
||||||
);
|
);
|
||||||
|
@ -177,10 +154,9 @@ async fn ban_room(&self, room: OwnedRoomOrAliasId) -> Result {
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
// unpublish from room directory
|
self.services.rooms.directory.set_not_public(&room_id); // remove from the room directory
|
||||||
self.services.rooms.directory.set_not_public(&room_id);
|
self.services.rooms.metadata.ban_room(&room_id, true); // prevent further joins
|
||||||
|
self.services.rooms.metadata.disable_room(&room_id, true); // disable federation
|
||||||
self.services.rooms.metadata.disable_room(&room_id, true);
|
|
||||||
|
|
||||||
self.write_str(
|
self.write_str(
|
||||||
"Room banned, removed all our local users, and disabled incoming federation with room.",
|
"Room banned, removed all our local users, and disabled incoming federation with room.",
|
||||||
|
@ -302,8 +278,6 @@ async fn ban_list_of_rooms(&self) -> Result {
|
||||||
}
|
}
|
||||||
|
|
||||||
for room_id in room_ids {
|
for room_id in room_ids {
|
||||||
self.services.rooms.metadata.ban_room(&room_id, true);
|
|
||||||
|
|
||||||
debug!("Banned {room_id} successfully");
|
debug!("Banned {room_id} successfully");
|
||||||
room_ban_count = room_ban_count.saturating_add(1);
|
room_ban_count = room_ban_count.saturating_add(1);
|
||||||
|
|
||||||
|
@ -346,9 +320,9 @@ async fn ban_list_of_rooms(&self) -> Result {
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
|
self.services.rooms.metadata.ban_room(&room_id, true);
|
||||||
// unpublish from room directory, ignore errors
|
// unpublish from room directory, ignore errors
|
||||||
self.services.rooms.directory.set_not_public(&room_id);
|
self.services.rooms.directory.set_not_public(&room_id);
|
||||||
|
|
||||||
self.services.rooms.metadata.disable_room(&room_id, true);
|
self.services.rooms.metadata.disable_room(&room_id, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue