diff --git a/src/cmd/acl.rs b/src/cmd/acl.rs index 49aa25c25c52095276c9391b3d42645fb8b5a789..dee722842ce30a35aed69b346967350111c6df00 100644 --- a/src/cmd/acl.rs +++ b/src/cmd/acl.rs @@ -36,35 +36,47 @@ impl CmdAdminRegister { None => return Err("Is not an admin".to_string()), } } + + #[allow(dead_code)] + pub fn from_vec(admins_vec: Vec<UserId>) -> CmdAdminRegister { + CmdAdminRegister { admins: admins_vec } + } } -#[allow(dead_code)] -pub fn action_permited( - cmd_admin_register: &CmdAdminRegister, - acls: &CmdAcl, - room: &Room, - user_id: &UserId, -) -> Result<(), String> { - return match acls { - CmdAcl::AdminOnly => bool_to_result!( - cmd_admin_register.is_admin(user_id.clone()), - (), - "Is not an admin".to_string() - ), - CmdAcl::RoomOnly(room_id) => bool_to_result!( - room.room_id() == room_id, - (), - "Not permited in this room".to_string() - ), - CmdAcl::List(acl_list) => match acl_list - .iter() - .map(|acl| 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(()), - }, - }; +impl CmdAcl { + #[allow(dead_code)] + pub fn action_permited( + cmd_admin_register: &CmdAdminRegister, + acls: &CmdAcl, + room: &Room, + user_id: &UserId, + ) -> Result<(), String> { + return match acls { + CmdAcl::AdminOnly => bool_to_result!( + cmd_admin_register.is_admin(user_id.clone()), + (), + "Is not an admin".to_string() + ), + CmdAcl::RoomOnly(room_id) => bool_to_result!( + room.room_id() == room_id, + (), + "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(()), + }, + }; + } + + #[allow(dead_code)] + pub fn from_string(string: String) -> CmdAcl { + CmdAcl::AdminOnly + } } diff --git a/src/cmd/package.rs b/src/cmd/package.rs index 2f2b1cde32917b2d06b1ad7c524ef32928a4b6f2..cbb5115a70d61fbe29e50b03439a1838976c83d5 100644 --- a/src/cmd/package.rs +++ b/src/cmd/package.rs @@ -1,9 +1,11 @@ use crate::cmd::{ - acl::{action_permited, CmdAcl, CmdAdminRegister}, + acl::{CmdAcl, CmdAdminRegister}, cmd::Cmd, }; +use ini::Properties as IniSection; use log::{error, info, warn}; use matrix_sdk::{room::Room, ruma::UserId}; +use std::convert::TryFrom; pub struct CmdPackage { name: String, @@ -16,7 +18,7 @@ pub struct CmdPackage { impl CmdPackage { #[allow(dead_code)] pub fn handle(&self, room: &Room, user_id: &UserId, user_cmd: Vec<String>) -> String { - match action_permited(&self.admin_register, &self.acl, room, user_id) { + match CmdAcl::action_permited(&self.admin_register, &self.acl, room, user_id) { Err(string) => "Action not permited: ".to_string() + &string, Ok(()) => match user_cmd.split_first() { None => "No command was passed".to_string(), @@ -31,4 +33,21 @@ impl CmdPackage { }, } } + + #[allow(dead_code)] + pub fn from_config(section: IniSection, commands: Vec<Cmd>) -> CmdPackage { + CmdPackage { + name: section.get("name").unwrap().to_string(), + acl: CmdAcl::from_string(section.get("acl").unwrap().to_string()), + admin_register: CmdAdminRegister::from_vec( + section + .get("admins") + .unwrap() + .split(",") + .map(|x| UserId::try_from(x).unwrap()) + .collect::<Vec<UserId>>(), + ), + commands: commands, + } + } }