feat: added functions to remove, add and lsit acls (with filtering)

This commit is contained in:
NinekoTheCat 2023-12-24 16:39:25 +01:00
parent f1d725c842
commit 13e497936f
No known key found for this signature in database
GPG key ID: 700DB3F678A4AB66
3 changed files with 52 additions and 5 deletions

View file

@ -1,3 +1,5 @@
use std::collections::HashSet;
use serde::{Serialize, Deserialize};
use url::Host;
@ -10,14 +12,17 @@ pub trait Data: Send + Sync {
fn add_acl(&self, acl: AclDatabaseEntry) -> crate::Result<()>;
/// remove a given Acl entry from the database
fn remove_acl(&self,host: Host<String>) -> crate::Result<()>;
/// list all acls
fn get_all_acls(&self) -> HashSet<AclDatabaseEntry>;
}
#[derive(Serialize,Deserialize, Debug, Clone, Copy)]
#[derive(Serialize,Deserialize, Debug, Clone, Copy, Hash, Eq, PartialEq)]
pub enum AclMode{
Block,
Allow
}
#[derive(Serialize,Deserialize, Debug, Clone)]
#[derive(Serialize,Deserialize, Debug, Clone, Hash, Eq,PartialEq)]
pub struct AclDatabaseEntry {
pub(crate) mode: AclMode,

View file

@ -1,6 +1,6 @@
use std::sync::Arc;
use std::{sync::Arc, collections::HashSet};
use ruma::ServerName;
use tracing::{warn, debug, error};
@ -16,6 +16,20 @@ pub struct Service {
}
impl Service {
pub fn list_acls(&self, filter: Option<AclMode>) -> Vec<AclDatabaseEntry> {
let set = self.db.get_all_acls();
match filter {
Some(filter) => set.into_iter().filter(|it| it.mode == filter).collect(),
None => set.into_iter().collect(),
}
}
pub fn remove_acl(&self, host: Host) -> crate::Result<()> {
self.db.remove_acl(host)
}
pub fn add_acl(&self, host: Host, mode: AclMode) -> crate::Result<()> {
self.db.add_acl(AclDatabaseEntry { mode: mode, hostname: host })
}
/// same as federation_with_allowed however it can work with the fedi_dest type
pub fn is_federation_with_allowed_fedi_dest(&self,fedi_dest: &FedDest) -> bool {
let hostname = if let Ok(name) = Host::parse(&fedi_dest.hostname()) {