1mod avc;
9mod index;
10mod permissions;
11
12pub use avc::{
13 AccessCacheStorage, AccessQueryArgs, CacheStats, ConcurrentAccessCache, DEFAULT_SHARED_SIZE,
14 PerThreadCache, QueryCacheCapacity,
15};
16pub(crate) use avc::{AccessVectorCache, Query};
17pub(crate) use index::PolicyIndex;
18pub use permissions::*;
19
20use crate::policy::{AccessDecision, AccessVector, ClassId, XpermsBitmap};
21use std::num::NonZeroU32;
22
23#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
25pub enum ObjectClass {
26 Kernel(KernelClass),
28 ClassId(ClassId),
31}
32
33impl From<ClassId> for ObjectClass {
34 fn from(id: ClassId) -> Self {
35 Self::ClassId(id)
36 }
37}
38
39impl<T: Into<KernelClass>> From<T> for ObjectClass {
40 fn from(class: T) -> Self {
41 Self::Kernel(class.into())
42 }
43}
44
45#[derive(Clone, Copy, Debug, PartialEq, Eq)]
47pub struct KernelAccessDecision {
48 pub allow: AccessVector,
49 pub audit: AccessVector,
50 pub flags: u32,
51 pub todo_bug: Option<NonZeroU32>,
52}
53
54#[derive(Clone, Copy, PartialEq, Debug)]
56pub(crate) struct KernelXpermsAccessDecision {
57 pub allow: XpermsBitmap,
59 pub audit: XpermsBitmap,
61 pub permissive: bool,
63 pub has_todo: bool,
65}
66
67pub(crate) trait AccessVectorComputer {
70 fn access_decision_to_kernel_access_decision(
77 &self,
78 class: KernelClass,
79 access_decision: AccessDecision,
80 ) -> KernelAccessDecision;
81}
82
83#[cfg(test)]
84mod tests {
85 use super::*;
86
87 #[test]
88 fn object_class_permissions() {
89 let test_class_id = ClassId::for_test(20);
90 assert_eq!(ObjectClass::ClassId(test_class_id), test_class_id.into());
91 for variant in ProcessPermission::PERMISSIONS {
92 assert_eq!(KernelClass::Process, variant.class());
93 assert_eq!("process", variant.class().name());
94 assert_eq!(ObjectClass::Kernel(KernelClass::Process), variant.class().into());
95 }
96 }
97}