From 3923654c94b2cfdb993fc5ba47b60db15390c278 Mon Sep 17 00:00:00 2001 From: George Kaklamanos Date: Mon, 20 Nov 2023 21:07:01 +0200 Subject: [PATCH] acl: Implement query functions --- labadoor-csv/src/lib.rs | 54 ++++++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/labadoor-csv/src/lib.rs b/labadoor-csv/src/lib.rs index b0cf1c8..482045c 100644 --- a/labadoor-csv/src/lib.rs +++ b/labadoor-csv/src/lib.rs @@ -5,18 +5,19 @@ pub struct CSV { pub path: String, } -fn get_resource_name(username: String, id: i8) -> Result { - let mut ret = Err(()); - let file = std::fs::File::open("./resource_shortcuts.csv").unwrap(); - let mut reader = csv::Reader::from_reader(file); - for result in reader.deserialize() { - let rs: ResourceShortcuts = result.unwrap(); - if rs.username == username && rs.id == id { - ret = Ok(rs.resource); - break; - } +impl CSV { + fn find Deserialize<'a> + PartialEq>(&self, needle: T, path: &str) -> Option { + let p = format!("{}/{}", self.path, path); + println!("{}", p); + let file = std::fs::File::open(p).unwrap(); + let mut reader = csv::Reader::from_reader(file); + reader + .deserialize() + .map(|x: Result| x.unwrap()) + .collect::>() + .into_iter() + .find(|x: &T| x == &needle) } - return ret; } impl ACL for CSV { @@ -49,11 +50,30 @@ impl ACL for CSV { todo!(); } - if let Ok(username) = get_username(method, identifier) { - if let Ok(resource_name) = get_resource_name(username.clone(), resource_shortcut) { - if auth_user(username, resource_name).is_ok() { - println!("Open Sesame!"); - } - } + /// Queries + fn get_username(&self, method: String, identifier: String) -> Option { + let needle = AuthMethod { + method: method, + identifier: identifier, + username: "".to_string(), + }; + let res = self.find::(needle, "auth_methods.csv").unwrap(); + Some(res.username) + } + fn get_resource(&self, username: String, id: i8) -> Option { + let needle = ResourceShortcuts { + username: username, + id: id, + resource: "".to_string(), + }; + let res = self + .find::(needle, "resource_shortcuts.csv") + .unwrap(); + Some(res.resource) + } + fn is_allowed(&self, username: String, resource: String) -> Option<()> { + let needle = ACLEntry { username, resource }; + self.find::(needle, "acl_entries.csv").unwrap(); + Some(()) } }