nebulous 0.1.86

A globally distributed container orchestrator
Documentation
use crate::config::CONFIG;
use crate::entities::namespaces;
use anyhow::Result;
use sea_orm::{ColumnTrait, DatabaseConnection, EntityTrait, QueryFilter};
use tracing::{debug, error};

pub async fn auth_ns(
    db_pool: &DatabaseConnection,
    owner_ids: &Vec<String>,
    namespace: &str,
) -> Result<String> {
    debug!("Authorizing namespace: {:?}", namespace);
    let namespace_entity = match namespaces::Entity::find()
        .filter(namespaces::Column::Name.eq(namespace))
        .one(db_pool)
        .await?
    {
        Some(namespace) => namespace,
        None => {
            error!("Namespace {} not found", namespace);
            return Err(anyhow::anyhow!("Namespace not found"));
        }
    };
    debug!("Namespace found: {:?}", namespace_entity);

    if namespace == "root" {
        debug!("Namespace is root");
        let root_owner = CONFIG.root_owner.clone();
        if !owner_ids.contains(&root_owner) {
            error!("User not authorized to access root namespace");
            return Err(anyhow::anyhow!("User not authorized to access namespace"));
        }
        debug!("User is authorized to access root namespace");
    }

    if !owner_ids.contains(&namespace_entity.owner) {
        error!("User not authorized to access namespace");
        return Err(anyhow::anyhow!("User not authorized to access namespace"));
    }
    debug!("User is authorized to access namespace");
    Ok(namespace_entity.owner)
}