diff --git a/src/controller/access/dispatching.rs b/src/controller/access/dispatching.rs index 03ed3c4..53ac82d 100644 --- a/src/controller/access/dispatching.rs +++ b/src/controller/access/dispatching.rs @@ -13,7 +13,7 @@ pub async fn dispatch_controller( match handler { AccessControllerType::Help => {} _ => { - if !message_context.sender_can_manage_global_config()? { + if !message_context.sender_can_manage_global_config() { bot.messaging() .send_error_markdown_no_fail( message_context.room(), diff --git a/src/controller/access/help.rs b/src/controller/access/help.rs index 3b445b8..bdc760b 100644 --- a/src/controller/access/help.rs +++ b/src/controller/access/help.rs @@ -80,24 +80,21 @@ fn build_section_users( message.push_str(&strings::access::users_no_patterns()); } - let can_manage_global_config = message_context.sender_can_manage_global_config(); - if let Ok(can_manage_global_config) = can_manage_global_config { - if can_manage_global_config { - message.push_str("\n\n"); + if message_context.sender_can_manage_global_config() { + message.push_str("\n\n"); - message.push_str(strings::the_following_commands_are_available()); - message.push('\n'); + message.push_str(strings::the_following_commands_are_available()); + message.push('\n'); - message.push_str(&strings::help::access::users_command_get(command_prefix)); - message.push('\n'); + message.push_str(&strings::help::access::users_command_get(command_prefix)); + message.push('\n'); - message.push_str(&strings::help::access::users_command_set(command_prefix)); - message.push_str("\n\n"); + message.push_str(&strings::help::access::users_command_set(command_prefix)); + message.push_str("\n\n"); - message.push_str(&strings::help::access::example_user_patterns( - homeserver_name, - )); - } + message.push_str(&strings::help::access::example_user_patterns( + homeserver_name, + )); } message @@ -156,27 +153,24 @@ fn build_section_room_local_agent_managers( message.push_str(&strings::access::room_local_agent_managers_no_patterns()); } - let can_manage_global_config = message_context.sender_can_manage_global_config(); - if let Ok(can_manage_global_config) = can_manage_global_config { - if can_manage_global_config { - message.push_str("\n\n"); - message.push_str(strings::the_following_commands_are_available()); - message.push('\n'); + if message_context.sender_can_manage_global_config() { + message.push_str("\n\n"); + message.push_str(strings::the_following_commands_are_available()); + message.push('\n'); - message.push_str( - &strings::help::access::room_local_agent_managers_command_get(command_prefix), - ); - message.push('\n'); + message.push_str( + &strings::help::access::room_local_agent_managers_command_get(command_prefix), + ); + message.push('\n'); - message.push_str( - &strings::help::access::room_local_agent_managers_command_set(command_prefix), - ); - message.push_str("\n\n"); + message.push_str( + &strings::help::access::room_local_agent_managers_command_set(command_prefix), + ); + message.push_str("\n\n"); - message.push_str(&strings::help::access::example_user_patterns( - homeserver_name, - )); - } + message.push_str(&strings::help::access::example_user_patterns( + homeserver_name, + )); } message diff --git a/src/controller/agent/create/mod.rs b/src/controller/agent/create/mod.rs index ea382b1..d02e148 100644 --- a/src/controller/agent/create/mod.rs +++ b/src/controller/agent/create/mod.rs @@ -138,7 +138,7 @@ pub async fn handle_global( provider: &str, agent_id_prefixless: &str, ) -> anyhow::Result<()> { - if !message_context.sender_can_manage_global_config()? { + if !message_context.sender_can_manage_global_config() { bot.messaging() .send_error_markdown_no_fail( message_context.room(), diff --git a/src/controller/agent/delete/mod.rs b/src/controller/agent/delete/mod.rs index 59a807f..2c15a57 100644 --- a/src/controller/agent/delete/mod.rs +++ b/src/controller/agent/delete/mod.rs @@ -50,7 +50,7 @@ pub async fn handle( .await } PublicIdentifier::DynamicGlobal(_) => { - if !message_context.sender_can_manage_global_config()? { + if !message_context.sender_can_manage_global_config() { bot.messaging() .send_error_markdown_no_fail( message_context.room(), diff --git a/src/controller/agent/details/mod.rs b/src/controller/agent/details/mod.rs index d6a2515..fddf8cf 100644 --- a/src/controller/agent/details/mod.rs +++ b/src/controller/agent/details/mod.rs @@ -47,7 +47,7 @@ pub async fn handle( } } PublicIdentifier::DynamicGlobal(_) => { - if !message_context.sender_can_manage_global_config()? { + if !message_context.sender_can_manage_global_config() { bot.messaging() .send_error_markdown_no_fail( message_context.room(), diff --git a/src/controller/agent/help/mod.rs b/src/controller/agent/help/mod.rs index 022cd79..66032c7 100644 --- a/src/controller/agent/help/mod.rs +++ b/src/controller/agent/help/mod.rs @@ -39,7 +39,7 @@ pub async fn handle(bot: &Bot, message_context: &MessageContext) -> anyhow::Resu )); message.push('\n'); - if message_context.sender_can_manage_global_config()? { + if message_context.sender_can_manage_global_config() { message.push_str(&strings::help::agent::create_agent_global( bot.command_prefix(), )); diff --git a/src/controller/cfg/dispatching/mod.rs b/src/controller/cfg/dispatching/mod.rs index 1e54e50..c38b584 100644 --- a/src/controller/cfg/dispatching/mod.rs +++ b/src/controller/cfg/dispatching/mod.rs @@ -40,7 +40,7 @@ async fn dispatch_config_related_handler( bot: &Bot, ) -> anyhow::Result<()> { if let SettingsStorageSource::Global = config_type { - if !message_context.sender_can_manage_global_config()? { + if !message_context.sender_can_manage_global_config() { bot.messaging() .send_error_markdown_no_fail( message_context.room(), diff --git a/src/controller/help/mod.rs b/src/controller/help/mod.rs index d22f6a5..9db5e52 100644 --- a/src/controller/help/mod.rs +++ b/src/controller/help/mod.rs @@ -3,7 +3,7 @@ use mxlink::MessageResponseType; use crate::{entity::MessageContext, strings, Bot}; pub async fn handle(bot: &Bot, message_context: &MessageContext) -> anyhow::Result<()> { - let sender_can_manage_global_config = message_context.sender_can_manage_global_config()?; + let sender_can_manage_global_config = message_context.sender_can_manage_global_config(); let sender_can_manage_room_local_agents = message_context.sender_can_manage_room_local_agents()?; diff --git a/src/entity/message_context.rs b/src/entity/message_context.rs index 1964729..3ff0900 100644 --- a/src/entity/message_context.rs +++ b/src/entity/message_context.rs @@ -70,12 +70,12 @@ impl MessageContext { &self.thread_info } - pub fn sender_can_manage_global_config(&self) -> anyhow::Result { - Ok(self.trigger_event_info.sender_is_admin) + pub fn sender_can_manage_global_config(&self) -> bool { + self.trigger_event_info.sender_is_admin } - pub fn sender_can_manage_room_local_agents(&self) -> anyhow::Result { - Ok(self.sender_can_manage_global_config()? + pub fn sender_can_manage_room_local_agents(&self) -> mxidwc::Result { + Ok(self.sender_can_manage_global_config() || self.sender_is_allowed_room_local_agent_manager()?) } @@ -102,21 +102,8 @@ impl MessageContext { combined } - fn sender_is_allowed_room_local_agent_manager(&self) -> anyhow::Result { - match &self - .global_config() - .access - .room_local_agent_manager_patterns - { - None => Ok(false), - Some(patterns) => { - let allowed_regexes = mxidwc::parse_patterns_vector(patterns)?; - - Ok(mxidwc::match_user_id( - self.sender_id().as_str(), - &allowed_regexes, - )) - } - } + fn sender_is_allowed_room_local_agent_manager(&self) -> mxidwc::Result { + self.room_config_context() + .is_user_allowed_room_local_agent_manager(self.sender_id().clone()) } } diff --git a/src/entity/room_config_context.rs b/src/entity/room_config_context.rs index 0487e02..be45ce9 100644 --- a/src/entity/room_config_context.rs +++ b/src/entity/room_config_context.rs @@ -1,3 +1,5 @@ +use mxlink::matrix_sdk::ruma::OwnedUserId; + use super::globalconfig::GlobalConfig; use super::roomconfig::RoomConfig; @@ -180,4 +182,18 @@ impl RoomConfigContext { .clone() }) } + + pub fn is_user_allowed_room_local_agent_manager( + &self, + user_id: OwnedUserId, + ) -> mxidwc::Result { + match &self.global_config.access.room_local_agent_manager_patterns { + None => Ok(false), + Some(patterns) => { + let allowed_regexes = mxidwc::parse_patterns_vector(patterns)?; + + Ok(mxidwc::match_user_id(user_id.as_str(), &allowed_regexes)) + } + } + } }