pub mod attestation;
pub mod auth;
pub mod encryption;
pub mod identity;
pub mod sandbox;
pub use attestation::{AttestationValidator, Capability, CapabilityAttestation};
pub use auth::{AuthChallenge, AuthResponse, AuthToken, Authenticator};
pub use encryption::{EncryptedSnapshot, EncryptionKey, StateEncryptor};
pub use identity::{AgentIdentity, IdentityProvider, PublicIdentity};
pub use sandbox::{SandboxConfig, SandboxExecutor, SandboxViolation};
use crate::CellError;
#[derive(Debug, Clone)]
pub struct SecurityContext {
pub identity: AgentIdentity,
pub auth_token: Option<AuthToken>,
pub capabilities: Vec<Capability>,
pub sandbox_config: SandboxConfig,
}
impl SecurityContext {
pub fn new(identity: AgentIdentity) -> Self {
Self {
identity,
auth_token: None,
capabilities: Vec::new(),
sandbox_config: SandboxConfig::default(),
}
}
pub fn set_auth_token(&mut self, token: AuthToken) {
self.auth_token = Some(token);
}
pub fn grant_capability(&mut self, capability: Capability) {
if !self.capabilities.contains(&capability) {
self.capabilities.push(capability);
}
}
pub fn has_capability(&self, capability: &Capability) -> bool {
self.capabilities.contains(capability)
}
pub fn verify_token(&self) -> Result<bool, CellError> {
match &self.auth_token {
Some(token) => token.verify(),
None => Ok(false),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_security_context_creation() {
let identity = AgentIdentity::generate();
let context = SecurityContext::new(identity);
assert!(context.auth_token.is_none());
assert!(context.capabilities.is_empty());
}
#[test]
fn test_security_context_grant_capability() {
let identity = AgentIdentity::generate();
let mut context = SecurityContext::new(identity);
let cap = Capability::Network;
context.grant_capability(cap.clone());
assert!(context.has_capability(&cap));
}
#[test]
fn test_security_context_duplicate_capability() {
let identity = AgentIdentity::generate();
let mut context = SecurityContext::new(identity);
let cap = Capability::Network;
context.grant_capability(cap.clone());
context.grant_capability(cap.clone());
assert_eq!(context.capabilities.len(), 1);
}
}