use std::num::NonZeroUsize;
use cageforge_policy::{
DomainMode, DomainRule, FilesystemMode, FilesystemPolicy, FilesystemRule, LocalIpcRule,
LocalNetworkAccess, NetworkMode, NetworkPolicy, UnixSocketMode, UnixSocketRule,
};
#[derive(Debug, Clone, Copy)]
pub struct EffectiveFilesystemLowering<'a> {
layers: [&'a FilesystemPolicy; 2],
glob_scan_max_depth: Option<NonZeroUsize>,
}
#[derive(Debug, Clone, Copy)]
pub struct EffectiveFilesystemLayer<'a> {
policy: &'a FilesystemPolicy,
}
#[derive(Debug, Clone, Copy)]
pub struct EffectiveNetworkLowering<'a> {
layers: [&'a NetworkPolicy; 2],
}
#[derive(Debug, Clone, Copy)]
pub struct EffectiveNetworkLayer<'a> {
policy: &'a NetworkPolicy,
}
impl<'a> EffectiveFilesystemLowering<'a> {
pub(crate) fn new(
requested: &'a FilesystemPolicy,
ceiling: &'a FilesystemPolicy,
glob_scan_max_depth: Option<NonZeroUsize>,
) -> Self {
Self {
layers: [requested, ceiling],
glob_scan_max_depth,
}
}
pub fn layers(&self) -> impl ExactSizeIterator<Item = EffectiveFilesystemLayer<'a>> + '_ {
self.layers.into_iter().map(EffectiveFilesystemLayer::new)
}
pub const fn glob_scan_max_depth(&self) -> Option<NonZeroUsize> {
self.glob_scan_max_depth
}
}
impl<'a> EffectiveFilesystemLayer<'a> {
fn new(policy: &'a FilesystemPolicy) -> Self {
Self { policy }
}
pub const fn mode(&self) -> FilesystemMode {
self.policy.mode()
}
pub fn entries(&self) -> &[FilesystemRule] {
self.policy.entries()
}
pub const fn glob_scan_max_depth(&self) -> Option<NonZeroUsize> {
self.policy.glob_scan_max_depth()
}
pub fn protected_relative_paths(&self) -> &[std::path::PathBuf] {
self.policy.protected_relative_paths()
}
}
impl<'a> EffectiveNetworkLowering<'a> {
pub(crate) fn new(requested: &'a NetworkPolicy, ceiling: &'a NetworkPolicy) -> Self {
Self {
layers: [requested, ceiling],
}
}
pub fn layers(&self) -> impl ExactSizeIterator<Item = EffectiveNetworkLayer<'a>> + '_ {
self.layers.into_iter().map(EffectiveNetworkLayer::new)
}
}
impl<'a> EffectiveNetworkLayer<'a> {
fn new(policy: &'a NetworkPolicy) -> Self {
Self { policy }
}
pub const fn mode(&self) -> NetworkMode {
self.policy.mode()
}
pub const fn domain_mode(&self) -> DomainMode {
self.policy.domain_mode()
}
pub const fn unix_socket_mode(&self) -> UnixSocketMode {
self.policy.unix_socket_mode()
}
pub const fn local_network_access(&self) -> LocalNetworkAccess {
self.policy.local_network_access()
}
pub fn domains(&self) -> &[DomainRule] {
self.policy.domains()
}
pub fn unix_sockets(&self) -> &[UnixSocketRule] {
self.policy.unix_sockets()
}
pub fn local_ipc(&self) -> &[LocalIpcRule] {
self.policy.local_ipc()
}
}