diff --git a/src/cmd/acl.rs b/src/cmd/acl.rs index 527cd4a18de4fc7e43985f6a71fd3b08b008c670..405b0e9c3eaf9785748278cbb665e5844f78c083 100644 --- a/src/cmd/acl.rs +++ b/src/cmd/acl.rs @@ -7,6 +7,7 @@ use std::{process::abort, result::Result}; #[allow(dead_code)] #[derive(Clone)] pub enum CmdAcl { + Any, RoomOnly(String), AdminOnly, List(Vec<CmdAcl>), @@ -68,6 +69,7 @@ impl CmdAdminRegister { impl fmt::Display for CmdAcl { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { + CmdAcl::Any => write!(f, "Any"), CmdAcl::AdminOnly => write!(f, "AdminOnly"), CmdAcl::RoomOnly(room) => write!(f, "Room{}", room), CmdAcl::List(vec) => { @@ -97,6 +99,7 @@ impl CmdAcl { user_id: &UserId, ) -> Result<(), String> { return match acls { + CmdAcl::Any => Ok(()), CmdAcl::AdminOnly => bool_to_result!( cmd_admin_register.is_admin(user_id.clone()), (), @@ -107,25 +110,37 @@ impl CmdAcl { (), "Not permited in this room".to_string() ), - CmdAcl::List(acl_list) => match acl_list - .iter() - .map(|acl| CmdAcl::action_permited(cmd_admin_register, acl, room, user_id)) - .filter(|acl_res| acl_res.is_err()) - .map(|acl_res| acl_res.clone().unwrap_err()) - .reduce(|err1, err2| err1 + ", " + &err2) - { - Some(err) => Err(err), - None => Ok(()), - }, + CmdAcl::List(acl_list) => { + if acl_list.iter().any(|acl| match acl { + CmdAcl::Any => true, + _ => false, + }) { + Ok(()) + } else { + match acl_list + .iter() + .map(|acl| CmdAcl::action_permited(cmd_admin_register, acl, room, user_id)) + .filter(|acl_res| acl_res.is_err()) + .map(|acl_res| acl_res.clone().unwrap_err()) + .reduce(|err1, err2| err1 + ", " + &err2) + { + Some(err) => Err(err), + None => Ok(()), + } + } + } }; } fn from_string_item(string: &str) -> CmdAcl { - if string.to_uppercase() == "ADMINONLY" { + let upper = string.to_uppercase(); + if upper == "ADMINONLY" { CmdAcl::AdminOnly - } else if string.to_uppercase().starts_with("ROOM!") { + } else if upper.starts_with("ROOM!") { let room = (&string[4..]).to_string(); CmdAcl::RoomOnly(room) + } else if upper == "ANY" { + CmdAcl::Any } else { error!("Unknown ACL: {}", string); abort();