diff --git a/src/admin/debug/commands.rs b/src/admin/debug/commands.rs index cbe52473..3a7d3544 100644 --- a/src/admin/debug/commands.rs +++ b/src/admin/debug/commands.rs @@ -1,5 +1,6 @@ use std::{ collections::{BTreeMap, HashMap}, + fmt::Write, sync::{Arc, Mutex}, time::Instant, }; @@ -605,6 +606,50 @@ pub(super) async fn force_set_room_state_from_server( )) } +pub(super) async fn get_signing_keys( + _body: Vec<&str>, server_name: Option>, _cached: bool, +) -> Result { + let server_name = server_name.unwrap_or_else(|| services().server.config.server_name.clone().into()); + let signing_keys = services().globals.signing_keys_for(&server_name)?; + + Ok(RoomMessageEventContent::notice_markdown(format!( + "```rs\n{signing_keys:#?}\n```" + ))) +} + +#[allow(dead_code)] +pub(super) async fn get_verify_keys( + _body: Vec<&str>, server_name: Option>, cached: bool, +) -> Result { + let server_name = server_name.unwrap_or_else(|| services().server.config.server_name.clone().into()); + let mut out = String::new(); + + if cached { + writeln!(out, "| Key ID | VerifyKey |")?; + writeln!(out, "| --- | --- |")?; + for (key_id, verify_key) in services().globals.verify_keys_for(&server_name)? { + writeln!(out, "| {key_id} | {verify_key:?} |")?; + } + + return Ok(RoomMessageEventContent::notice_markdown(out)); + } + + let signature_ids: Vec = Vec::new(); + let keys = services() + .rooms + .event_handler + .fetch_signing_keys_for_server(&server_name, signature_ids) + .await?; + + writeln!(out, "| Key ID | Public Key |")?; + writeln!(out, "| --- | --- |")?; + for (key_id, key) in keys { + writeln!(out, "| {key_id} | {key} |")?; + } + + Ok(RoomMessageEventContent::notice_markdown(out)) +} + pub(super) async fn resolve_true_destination( _body: Vec<&str>, server_name: Box, no_cache: bool, ) -> Result { diff --git a/src/admin/debug/mod.rs b/src/admin/debug/mod.rs index 7d6cafa7..41527cf5 100644 --- a/src/admin/debug/mod.rs +++ b/src/admin/debug/mod.rs @@ -76,6 +76,14 @@ pub(super) enum DebugCommand { room_id: OwnedRoomOrAliasId, }, + /// - Get and display signing keys from local cache or remote server. + GetSigningKeys { + server_name: Option>, + + #[arg(short, long)] + cached: bool, + }, + /// - Sends a federation request to the remote server's /// `/_matrix/federation/v1/version` endpoint and measures the latency it /// took for the server to respond @@ -177,6 +185,10 @@ pub(super) async fn process(command: DebugCommand, body: Vec<&str>) -> Result echo(body, message).await?, + DebugCommand::GetSigningKeys { + server_name, + cached, + } => get_signing_keys(body, server_name, cached).await?, DebugCommand::GetAuthChain { event_id, } => get_auth_chain(body, event_id).await?,