1use bitflags::bitflags;
2
3bitflags! {
4 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
9 pub struct Capabilities: u64 {
10 const CHOWN = 1 << 0;
12 const DAC_OVERRIDE = 1 << 1;
14 const DAC_READ_SEARCH = 1 << 2;
16 const FOWNER = 1 << 3;
18 const FSETID = 1 << 4;
20 const KILL = 1 << 5;
22 const SETGID = 1 << 6;
24 const SETUID = 1 << 7;
26 const SETPCAP = 1 << 8;
28 const LINUX_IMMUTABLE = 1 << 9;
30 const NET_BIND_SERVICE = 1 << 10;
32 const NET_BROADCAST = 1 << 11;
34 const NET_ADMIN = 1 << 12;
36 const NET_RAW = 1 << 13;
38 const IPC_LOCK = 1 << 14;
40 const IPC_OWNER = 1 << 15;
42 const SYS_MODULE = 1 << 16;
44 const SYS_RAWIO = 1 << 17;
46 const SYS_CHROOT = 1 << 18;
48 const SYS_PTRACE = 1 << 19;
50 const SYS_PACCT = 1 << 20;
52 const SYS_ADMIN = 1 << 21;
54 const SYS_BOOT = 1 << 22;
56 const SYS_NICE = 1 << 23;
58 const SYS_RESOURCE = 1 << 24;
60 const SYS_TIME = 1 << 25;
62 const SYS_TTY_CONFIG = 1 << 26;
64 const MKNOD = 1 << 27;
66 const LEASE = 1 << 28;
68 const AUDIT_WRITE = 1 << 29;
70 const AUDIT_CONTROL = 1 << 30;
72 const SETFCAP = 1 << 31;
74 const MAC_OVERRIDE = 1 << 32;
76 const MAC_ADMIN = 1 << 33;
78 const SYSLOG = 1 << 34;
80 const WAKE_ALARM = 1 << 35;
82 const BLOCK_SUSPEND = 1 << 36;
84 const AUDIT_READ = 1 << 37;
86 const PERFMON = 1 << 38;
88 const BPF = 1 << 39;
90 const CHECKPOINT_RESTORE = 1 << 40;
92 }
93}
94
95impl Capabilities {
96 pub const fn full() -> Self {
98 Self::all()
99 }
100
101 pub const fn empty_set() -> Self {
103 Self::empty()
104 }
105}
106
107#[derive(Clone, Copy, Debug)]
116pub struct CapabilitySet {
117 pub effective: Capabilities,
119 pub permitted: Capabilities,
121 pub inheritable: Capabilities,
123 pub bounding: Capabilities,
125 pub ambient: Capabilities,
127}
128
129impl CapabilitySet {
130 pub const fn full() -> Self {
132 Self {
133 effective: Capabilities::full(),
134 permitted: Capabilities::full(),
135 inheritable: Capabilities::full(),
136 bounding: Capabilities::full(),
137 ambient: Capabilities::full(),
138 }
139 }
140
141 pub const fn empty() -> Self {
143 Self {
144 effective: Capabilities::empty_set(),
145 permitted: Capabilities::empty_set(),
146 inheritable: Capabilities::empty_set(),
147 bounding: Capabilities::empty_set(),
148 ambient: Capabilities::empty_set(),
149 }
150 }
151
152 pub fn has(&self, cap: Capabilities) -> bool {
154 self.effective.contains(cap)
156 }
157
158 pub fn has_all(&self, caps: Capabilities) -> bool {
160 self.effective.contains(caps)
161 }
162
163 pub fn add(&mut self, cap: Capabilities) {
165 self.effective.insert(cap);
166 self.permitted.insert(cap);
167 }
168
169 pub fn remove(&mut self, cap: Capabilities) {
171 self.effective.remove(cap);
172 }
173}
174
175pub const CAP_CHOWN: u32 = 0;
177pub const CAP_DAC_OVERRIDE: u32 = 1;
178pub const CAP_DAC_READ_SEARCH: u32 = 2;
179pub const CAP_FOWNER: u32 = 3;
180pub const CAP_FSETID: u32 = 4;
181pub const CAP_KILL: u32 = 5;
182pub const CAP_SETGID: u32 = 6;
183pub const CAP_SETUID: u32 = 7;
184pub const CAP_SETPCAP: u32 = 8;
185pub const CAP_LINUX_IMMUTABLE: u32 = 9;
186pub const CAP_NET_BIND_SERVICE: u32 = 10;
187pub const CAP_NET_BROADCAST: u32 = 11;
188pub const CAP_NET_ADMIN: u32 = 12;
189pub const CAP_NET_RAW: u32 = 13;
190pub const CAP_IPC_LOCK: u32 = 14;
191pub const CAP_IPC_OWNER: u32 = 15;
192pub const CAP_SYS_MODULE: u32 = 16;
193pub const CAP_SYS_RAWIO: u32 = 17;
194pub const CAP_SYS_CHROOT: u32 = 18;
195pub const CAP_SYS_PTRACE: u32 = 19;
196pub const CAP_SYS_PACCT: u32 = 20;
197pub const CAP_SYS_ADMIN: u32 = 21;
198pub const CAP_SYS_BOOT: u32 = 22;
199pub const CAP_SYS_NICE: u32 = 23;
200pub const CAP_SYS_RESOURCE: u32 = 24;
201pub const CAP_SYS_TIME: u32 = 25;
202pub const CAP_SYS_TTY_CONFIG: u32 = 26;
203pub const CAP_MKNOD: u32 = 27;
204pub const CAP_LEASE: u32 = 28;
205pub const CAP_AUDIT_WRITE: u32 = 29;
206pub const CAP_AUDIT_CONTROL: u32 = 30;
207pub const CAP_SETFCAP: u32 = 31;
208pub const CAP_MAC_OVERRIDE: u32 = 32;
209pub const CAP_MAC_ADMIN: u32 = 33;
210pub const CAP_SYSLOG: u32 = 34;
211pub const CAP_WAKE_ALARM: u32 = 35;
212pub const CAP_BLOCK_SUSPEND: u32 = 36;
213pub const CAP_AUDIT_READ: u32 = 37;
214pub const CAP_PERFMON: u32 = 38;
215pub const CAP_BPF: u32 = 39;
216pub const CAP_CHECKPOINT_RESTORE: u32 = 40;
217pub const CAP_LAST_CAP: u32 = CAP_CHECKPOINT_RESTORE;
218
219pub fn capability_from_u32(cap_index: u32) -> Option<Capabilities> {
221 if cap_index > CAP_LAST_CAP {
222 return None;
223 }
224 Some(Capabilities::from_bits_truncate(1u64 << cap_index))
225}