Files
continuwuity/src/admin/federation/commands.rs
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

124 lines
2.9 KiB
Rust
Raw Normal View History

2024-05-23 01:27:04 -04:00
use std::fmt::Write;
2024-04-20 19:55:14 -04:00
use conduwuit::{Err, Result};
2024-08-08 17:18:30 +00:00
use futures::StreamExt;
use ruma::{OwnedRoomId, OwnedServerName, OwnedUserId};
2024-04-20 19:55:14 -04:00
use crate::{admin_command, get_room_info};
2024-04-20 19:55:14 -04:00
2024-07-27 00:11:41 +00:00
#[admin_command]
pub(super) async fn disable_room(&self, room_id: OwnedRoomId) -> Result {
self.bail_restricted()?;
2024-08-08 17:18:30 +00:00
self.services.rooms.metadata.disable_room(&room_id, true);
self.write_str("Room disabled.").await
2024-04-20 19:55:14 -04:00
}
2024-07-27 00:11:41 +00:00
#[admin_command]
pub(super) async fn enable_room(&self, room_id: OwnedRoomId) -> Result {
self.bail_restricted()?;
2024-08-08 17:18:30 +00:00
self.services.rooms.metadata.disable_room(&room_id, false);
self.write_str("Room enabled.").await
2024-04-20 19:55:14 -04:00
}
2024-07-27 00:11:41 +00:00
#[admin_command]
pub(super) async fn incoming_federation(&self) -> Result {
let msg = {
let map = self
.services
.rooms
.event_handler
.federation_handletime
2025-07-19 22:20:26 +01:00
.read();
let mut msg = format!("Handling {} incoming pdus:\n", map.len());
for (r, (e, i)) in map.iter() {
let elapsed = i.elapsed();
writeln!(msg, "{} {}: {}m{}s", r, e, elapsed.as_secs() / 60, elapsed.as_secs() % 60)?;
}
msg
};
2024-07-04 03:26:19 +00:00
self.write_str(&msg).await
2024-04-20 19:55:14 -04:00
}
2024-07-27 00:11:41 +00:00
#[admin_command]
pub(super) async fn fetch_support_well_known(&self, server_name: OwnedServerName) -> Result {
2024-07-27 00:11:41 +00:00
let response = self
.services
2024-04-20 19:55:14 -04:00
.client
.default
.get(format!("https://{server_name}/.well-known/matrix/support"))
.send()
.await?;
let text = response.text().await?;
if text.is_empty() {
return Err!("Response text/body is empty.");
2024-04-20 19:55:14 -04:00
}
if text.len() > 1500 {
return Err!(
2024-04-20 19:55:14 -04:00
"Response text/body is over 1500 characters, assuming no support well-known.",
);
2024-04-20 19:55:14 -04:00
}
let json: serde_json::Value = match serde_json::from_str(&text) {
| Ok(json) => json,
| Err(_) => {
return Err!("Response text/body is not valid JSON.",);
2024-04-20 19:55:14 -04:00
},
};
let pretty_json: String = match serde_json::to_string_pretty(&json) {
| Ok(json) => json,
| Err(_) => {
return Err!("Response text/body is not valid JSON.",);
2024-04-20 19:55:14 -04:00
},
};
self.write_str(&format!("Got JSON response:\n\n```json\n{pretty_json}\n```"))
.await
2024-04-20 19:55:14 -04:00
}
2024-07-27 00:11:41 +00:00
#[admin_command]
pub(super) async fn remote_user_in_rooms(&self, user_id: OwnedUserId) -> Result {
2025-01-25 23:41:39 +00:00
if user_id.server_name() == self.services.server.name {
return Err!(
"User belongs to our server, please use `list-joined-rooms` user admin command \
instead.",
);
}
2024-08-08 17:18:30 +00:00
if !self.services.users.exists(&user_id).await {
return Err!("Remote user does not exist in our database.",);
}
2024-07-27 00:11:41 +00:00
let mut rooms: Vec<(OwnedRoomId, u64, String)> = self
.services
.rooms
.state_cache
.rooms_joined(&user_id)
2024-08-08 17:18:30 +00:00
.then(|room_id| get_room_info(self.services, room_id))
.collect()
.await;
if rooms.is_empty() {
return Err!("User is not in any rooms.");
}
rooms.sort_by_key(|r| r.1);
rooms.reverse();
let num = rooms.len();
let body = rooms
.iter()
.map(|(id, members, name)| format!("{id} | Members: {members} | Name: {name}"))
.collect::<Vec<_>>()
.join("\n");
self.write_str(&format!("Rooms {user_id} shares with us ({num}):\n```\n{body}\n```",))
.await
}