use crate::AccessMode;
use crate::FilesystemPolicy;
use crate::FilesystemRule;
use crate::NetworkPolicy;
use crate::PathSelector;
use crate::PolicyError;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SandboxPolicy {
filesystem: FilesystemPolicy,
network: NetworkPolicy,
}
impl SandboxPolicy {
pub const fn new(filesystem: FilesystemPolicy, network: NetworkPolicy) -> Self {
Self {
filesystem,
network,
}
}
pub fn read_only() -> Self {
Self::new(
FilesystemPolicy::restricted([
FilesystemRule::new(PathSelector::root(), AccessMode::Read),
FilesystemRule::new(PathSelector::minimal(), AccessMode::Read),
FilesystemRule::new(PathSelector::workspace_root(), AccessMode::Read),
FilesystemRule::new(PathSelector::tmpdir(), AccessMode::Read),
FilesystemRule::new(PathSelector::slash_tmp(), AccessMode::Read),
]),
NetworkPolicy::disabled(),
)
}
pub fn workspace() -> Self {
Self::new(
FilesystemPolicy::restricted([
FilesystemRule::new(PathSelector::root(), AccessMode::Read),
FilesystemRule::new(PathSelector::minimal(), AccessMode::Read),
FilesystemRule::new(PathSelector::workspace_root(), AccessMode::Write),
FilesystemRule::new(PathSelector::tmpdir(), AccessMode::Write),
FilesystemRule::new(PathSelector::slash_tmp(), AccessMode::Write),
]),
NetworkPolicy::disabled(),
)
}
pub const fn full_access() -> Self {
Self::new(
FilesystemPolicy::unrestricted(),
NetworkPolicy::unrestricted(),
)
}
pub const fn filesystem(&self) -> &FilesystemPolicy {
&self.filesystem
}
pub const fn network(&self) -> &NetworkPolicy {
&self.network
}
pub fn validate(&self) -> Result<(), PolicyError> {
self.filesystem.validate()?;
self.network.validate()?;
Ok(())
}
pub fn normalized(&self) -> Result<Self, PolicyError> {
Ok(Self::new(
self.filesystem.normalized()?,
self.network.normalized()?,
))
}
}