conduwuit/src/database/key_value/acl.rs

77 lines
2.2 KiB
Rust
Raw Normal View History

use std::collections::HashSet;
2023-12-24 11:03:02 +01:00
use tracing::warn;
use url::Host;
2023-12-24 11:03:02 +01:00
2023-12-24 19:25:51 +01:00
use crate::{
service::acl::{AclDatabaseEntry, AclMode, Data},
KeyValueDatabase,
};
2023-12-24 11:03:02 +01:00
impl Data for KeyValueDatabase {
2023-12-24 19:25:51 +01:00
fn check_acl(&self, host: &Host<String>) -> crate::Result<Option<AclMode>> {
2023-12-24 11:03:02 +01:00
let thing = self.acl_list.get(host.to_string().as_bytes())?;
2023-12-24 19:25:51 +01:00
if let Some(thing) = thing {
match thing.first() {
2023-12-24 11:03:02 +01:00
Some(0x1) => Ok(Some(AclMode::Allow)),
Some(0x0) => Ok(Some(AclMode::Block)),
Some(invalid) => {
2023-12-24 19:25:51 +01:00
warn!(
"found invalid value for mode byte in value {}, probably db corruption",
invalid
);
2023-12-24 11:03:02 +01:00
Ok(None)
}
None => Ok(None),
}
2023-12-24 19:25:51 +01:00
} else {
2023-12-24 11:03:02 +01:00
Ok(None)
2023-12-24 19:25:51 +01:00
}
2023-12-24 11:03:02 +01:00
}
fn add_acl(&self, acl: AclDatabaseEntry) -> crate::Result<()> {
2023-12-24 19:25:51 +01:00
self.acl_list.insert(
acl.hostname.to_string().as_bytes(),
match acl.mode {
AclMode::Block => &[0x0],
AclMode::Allow => &[0x1],
},
)
2023-12-24 11:03:02 +01:00
}
2023-12-24 19:25:51 +01:00
fn remove_acl(&self, host: Host<String>) -> crate::Result<()> {
2023-12-24 11:03:02 +01:00
self.acl_list.remove(host.to_string().as_bytes())
}
fn get_all_acls(&self) -> HashSet<AclDatabaseEntry> {
let mut set = HashSet::new();
2023-12-24 19:25:51 +01:00
self.acl_list.iter().for_each(|it| {
let Ok(key) = String::from_utf8(it.0) else {
return;
};
let Ok(parsed_host) = Host::parse(&key) else {
warn!("failed to parse host {}", key);
return;
};
let mode = match it.1.first() {
Some(0x1) => AclMode::Allow,
Some(0x0) => AclMode::Block,
Some(invalid) => {
2023-12-24 19:25:51 +01:00
warn!(
"found invalid value for mode byte in value {}, probably db corruption",
invalid
);
return;
}
None => return,
};
2023-12-24 19:25:51 +01:00
set.insert(AclDatabaseEntry {
2023-12-24 20:21:40 +01:00
mode,
2023-12-24 19:25:51 +01:00
hostname: parsed_host,
});
});
set
}
2023-12-24 19:25:51 +01:00
}