2023-12-24 16:39:25 +01:00
|
|
|
use std::collections::HashSet;
|
|
|
|
|
|
2023-12-24 11:03:02 +01:00
|
|
|
use tracing::warn;
|
2023-12-24 16:39:25 +01:00
|
|
|
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())
|
|
|
|
|
}
|
2023-12-24 16:39:25 +01:00
|
|
|
|
|
|
|
|
fn get_all_acls(&self) -> HashSet<AclDatabaseEntry> {
|
|
|
|
|
let mut set = HashSet::new();
|
2023-12-24 19:25:51 +01:00
|
|
|
|
2023-12-24 16:39:25 +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
|
|
|
|
|
);
|
2023-12-24 16:39:25 +01:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
None => return,
|
|
|
|
|
};
|
2023-12-24 19:25:51 +01:00
|
|
|
set.insert(AclDatabaseEntry {
|
|
|
|
|
mode: mode,
|
|
|
|
|
hostname: parsed_host,
|
|
|
|
|
});
|
2023-12-24 16:39:25 +01:00
|
|
|
});
|
|
|
|
|
set
|
|
|
|
|
}
|
2023-12-24 19:25:51 +01:00
|
|
|
}
|