labadoor-csv: Initial commit

This commit is contained in:
George Kaklamanos 2021-11-30 15:57:30 +02:00
parent aaf9b4b33b
commit b8ec7ed5c6
No known key found for this signature in database
GPG key ID: 95E488F0473F734D
3 changed files with 89 additions and 0 deletions

View file

@ -3,4 +3,5 @@ members = [
"labadoor-matrix",
"labadoor-gpio",
"labadoor-telegram",
"labadoor-csv",
]

10
labadoor-csv/Cargo.toml Normal file
View file

@ -0,0 +1,10 @@
[package]
name = "labadoor-csv"
version = "0.1.0"
edition = "2021"
license = "AGPL-3.0-or-later"
[dependencies]
csv = "1.1.6"
serde = "1.0.130"
serde_derive = "1.0.130"

78
labadoor-csv/src/main.rs Normal file
View file

@ -0,0 +1,78 @@
use serde_derive::Deserialize;
#[derive(Deserialize, Debug)]
struct ACLEntry {
username: String,
resource: String,
}
#[derive(Deserialize, Debug)]
struct AuthMethod {
username: String,
method: String,
identifier: String,
}
#[derive(Deserialize, Debug)]
struct ResourceShortcuts {
username: String,
resource: String,
id: i8,
}
fn get_username(method: String, identifier: String) -> Result<String, ()> {
let mut ret = Err(());
let file = std::fs::File::open("./auth_methods.csv").unwrap();
let mut reader = csv::Reader::from_reader(file);
for result in reader.deserialize() {
let m: AuthMethod = result.unwrap();
if m.method == method && m.identifier == identifier {
ret = Ok(m.username);
break;
}
}
return ret;
}
fn get_resource_name(username: String, id: i8) -> Result<String, ()> {
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;
}
}
return ret;
}
fn auth_user(username: String, resource: String) -> Result<(), ()> {
let mut ret = Err(());
let file = std::fs::File::open("./acl_entries.csv").unwrap();
let mut reader = csv::Reader::from_reader(file);
for result in reader.deserialize() {
let e: ACLEntry = result.unwrap();
if e.username == username && e.resource == resource {
ret = Ok(());
break;
}
}
return ret;
}
fn main() {
let args: Vec<String> = std::env::args().collect();
let method = String::from(&args[1]);
let identifier = String::from(&args[2]);
let resource_shortcut = args[3].parse::<i8>().unwrap();
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!");
}
}
}
}