use crate::atom::Atom;
use crate::native::{Capability, CapabilitySet};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct CapabilityOperation {
pub module: Atom,
pub function: Atom,
pub arity: u8,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CapabilityAuditEvent {
pub pid: u64,
pub capability: Capability,
pub operation: CapabilityOperation,
pub granted: bool,
pub process_capabilities: CapabilitySet,
}
pub trait CapabilityAuditSink: Send + Sync {
fn record(&self, event: CapabilityAuditEvent);
}
pub trait ViolationHandler: Send + Sync {
fn on_violation(&self, event: CapabilityAuditEvent);
}
#[derive(Debug, Default, Clone, Copy)]
pub struct StderrViolationHandler;
impl ViolationHandler for StderrViolationHandler {
fn on_violation(&self, event: CapabilityAuditEvent) {
eprintln!(
"capability violation: pid={} operation={:?}:{:?}/{} required={:?} process_capabilities={:?}",
event.pid,
event.operation.module,
event.operation.function,
event.operation.arity,
event.capability,
event.process_capabilities,
);
}
}