use crate::access_manager::{
AccessManager, AgentPermissions, ApprovalStatus, PendingApproval, PermissionUpdate,
};
use crate::audit_trail::{AuditAction, AuditEntry, AuditTrail};
use crate::auth::AuthManager;
use crate::state_store::StateStore;
use std::sync::Arc;
pub struct SecurityApi {
pub(crate) auth_manager: Arc<parking_lot::Mutex<AuthManager>>,
pub(crate) audit_trail: Arc<AuditTrail>,
pub(crate) access_manager: Arc<parking_lot::Mutex<AccessManager>>,
pub(crate) state_store: Arc<StateStore>,
}
impl SecurityApi {
pub fn new(
auth_manager: Arc<parking_lot::Mutex<AuthManager>>,
audit_trail: Arc<AuditTrail>,
access_manager: Arc<parking_lot::Mutex<AccessManager>>,
state_store: Arc<StateStore>,
) -> Self {
Self {
auth_manager,
audit_trail,
access_manager,
state_store,
}
}
pub fn audit(&self, actor: &str, action: AuditAction, resource: &str) -> String {
self.audit_trail
.append(actor.to_string(), action, resource.to_string())
}
pub fn verify_chain(&self) -> anyhow::Result<bool> {
self.audit_trail
.verify()
.map_err(|e| anyhow::anyhow!("audit verify failed: {:?}", e))
}
pub fn query_audit(&self, from_seq: u64, to_seq: u64) -> Vec<AuditEntry> {
self.audit_trail.entries(from_seq, to_seq)
}
pub fn query_audit_by_agent(&self, agent_id: &str) -> Vec<AuditEntry> {
self.audit_trail.by_agent(agent_id)
}
pub fn audit_count(&self) -> usize {
self.audit_trail.len()
}
pub fn flush(&self, git: &crate::git_layer::GitLayer) -> anyhow::Result<()> {
self.audit_trail.flush(&self.state_store)?;
if git.is_enabled() {
let _ = git.commit_file("audit", "audit trail flush");
}
Ok(())
}
pub fn validate_token(&self, token: &str) -> bool {
self.auth_manager.lock().validate(token)
}
pub fn get_audit_log(&self) -> Vec<crate::access_manager::AuditEntry> {
self.access_manager.lock().audit_log().to_vec()
}
pub fn get_permissions(&self, agent: &str) -> Option<AgentPermissions> {
self.access_manager.lock().get_permissions(agent).cloned()
}
pub fn ensure_permissions(&self, agent: &str) -> AgentPermissions {
self.access_manager
.lock()
.get_or_create_permissions(agent)
.clone()
}
pub fn update_permissions(&self, agent: &str, update: PermissionUpdate) -> anyhow::Result<()> {
self.access_manager.lock().update_permissions(agent, update)
}
pub fn log_action(&self, agent_name: &str, action: &str, resource: &str) {
let mut am = self.access_manager.lock();
am.log_access(agent_name, action, resource, true, None);
}
pub fn list_approvals(&self) -> Vec<(PendingApproval, ApprovalStatus)> {
self.access_manager
.lock()
.rbac_manager()
.all_approvals()
.to_vec()
}
pub fn approve(&self, id: uuid::Uuid) -> bool {
self.access_manager.lock().rbac_manager_mut().approve(id)
}
pub fn reject(&self, id: uuid::Uuid) -> bool {
self.access_manager.lock().rbac_manager_mut().reject(id)
}
}