paas-server 0.13.0

PEP Authorization API Service
Documentation
use crate::auth::core::AuthInfo;
use chrono::{DateTime, Utc};
use libpep::factors::PseudonymizationDomain;
use serde::Deserialize;
use serde::Serialize;

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Permission {
    pub usergroups: Vec<String>,
    pub start: Option<DateTime<Utc>>,
    pub end: Option<DateTime<Utc>>,
    pub from: Vec<PseudonymizationDomain>,
    pub to: Vec<PseudonymizationDomain>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct AccessRules {
    pub allow: Vec<Permission>,
}
impl AccessRules {
    pub fn load(file_path: &str) -> Self {
        let file = std::fs::read_to_string(file_path).expect("Failed to read access rules file");
        serde_yml::from_str(&file).expect("Failed to parse access rules file")
    }
    fn get_currently_valid_permissions(&self) -> Vec<&Permission> {
        self.allow
            .iter()
            .filter(|permission| {
                if let Some(start) = permission.start {
                    if start > Utc::now() {
                        return false;
                    }
                }
                if let Some(end) = permission.end {
                    if end < Utc::now() {
                        return false;
                    }
                }
                true
            })
            .collect()
    }
    pub fn has_access(
        &self,
        authentication_info: &AuthInfo,
        from: &PseudonymizationDomain,
        to: &PseudonymizationDomain,
    ) -> bool {
        for permission in self.get_currently_valid_permissions() {
            if permission
                .usergroups
                .iter()
                .any(|group| authentication_info.groups.contains(group))
                && permission.from.iter().any(|context| context == from)
                && permission.to.iter().any(|context| context == to)
            {
                return true;
            }
        }
        false
    }
}