cageforge_policy_compose/
lowering.rs1use std::num::NonZeroUsize;
12
13use cageforge_policy::{
14 DomainMode, DomainRule, FilesystemMode, FilesystemPolicy, FilesystemRule, LocalIpcRule,
15 LocalNetworkAccess, NetworkMode, NetworkPolicy, UnixSocketMode, UnixSocketRule,
16};
17
18#[derive(Debug, Clone, Copy)]
24pub struct EffectiveFilesystemLowering<'a> {
25 layers: [&'a FilesystemPolicy; 2],
26 glob_scan_max_depth: Option<NonZeroUsize>,
27}
28
29#[derive(Debug, Clone, Copy)]
31pub struct EffectiveFilesystemLayer<'a> {
32 policy: &'a FilesystemPolicy,
33}
34
35#[derive(Debug, Clone, Copy)]
41pub struct EffectiveNetworkLowering<'a> {
42 layers: [&'a NetworkPolicy; 2],
43}
44
45#[derive(Debug, Clone, Copy)]
47pub struct EffectiveNetworkLayer<'a> {
48 policy: &'a NetworkPolicy,
49}
50
51impl<'a> EffectiveFilesystemLowering<'a> {
52 pub(crate) fn new(
53 requested: &'a FilesystemPolicy,
54 ceiling: &'a FilesystemPolicy,
55 glob_scan_max_depth: Option<NonZeroUsize>,
56 ) -> Self {
57 Self {
58 layers: [requested, ceiling],
59 glob_scan_max_depth,
60 }
61 }
62
63 pub fn layers(&self) -> impl ExactSizeIterator<Item = EffectiveFilesystemLayer<'a>> + '_ {
71 self.layers.into_iter().map(EffectiveFilesystemLayer::new)
72 }
73
74 pub const fn glob_scan_max_depth(&self) -> Option<NonZeroUsize> {
76 self.glob_scan_max_depth
77 }
78}
79
80impl<'a> EffectiveFilesystemLayer<'a> {
81 fn new(policy: &'a FilesystemPolicy) -> Self {
82 Self { policy }
83 }
84
85 pub const fn mode(&self) -> FilesystemMode {
87 self.policy.mode()
88 }
89
90 pub fn entries(&self) -> &[FilesystemRule] {
92 self.policy.entries()
93 }
94
95 pub const fn glob_scan_max_depth(&self) -> Option<NonZeroUsize> {
97 self.policy.glob_scan_max_depth()
98 }
99
100 pub fn protected_relative_paths(&self) -> &[std::path::PathBuf] {
102 self.policy.protected_relative_paths()
103 }
104}
105
106impl<'a> EffectiveNetworkLowering<'a> {
107 pub(crate) fn new(requested: &'a NetworkPolicy, ceiling: &'a NetworkPolicy) -> Self {
108 Self {
109 layers: [requested, ceiling],
110 }
111 }
112
113 pub fn layers(&self) -> impl ExactSizeIterator<Item = EffectiveNetworkLayer<'a>> + '_ {
115 self.layers.into_iter().map(EffectiveNetworkLayer::new)
116 }
117}
118
119impl<'a> EffectiveNetworkLayer<'a> {
120 fn new(policy: &'a NetworkPolicy) -> Self {
121 Self { policy }
122 }
123
124 pub const fn mode(&self) -> NetworkMode {
126 self.policy.mode()
127 }
128
129 pub const fn domain_mode(&self) -> DomainMode {
131 self.policy.domain_mode()
132 }
133
134 pub const fn unix_socket_mode(&self) -> UnixSocketMode {
136 self.policy.unix_socket_mode()
137 }
138
139 pub const fn local_network_access(&self) -> LocalNetworkAccess {
141 self.policy.local_network_access()
142 }
143
144 pub fn domains(&self) -> &[DomainRule] {
146 self.policy.domains()
147 }
148
149 pub fn unix_sockets(&self) -> &[UnixSocketRule] {
151 self.policy.unix_sockets()
152 }
153
154 pub fn local_ipc(&self) -> &[LocalIpcRule] {
156 self.policy.local_ipc()
157 }
158}