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::{AccessVector, ClassId, XpermsBitmap};
21use fuchsia_rcu::RcuDroppable;
22use std::num::NonZeroU32;
23
24#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, RcuDroppable)]
26pub enum ObjectClass {
27 Kernel(KernelClass),
29 ClassId(ClassId),
32}
33
34impl From<ClassId> for ObjectClass {
35 fn from(id: ClassId) -> Self {
36 Self::ClassId(id)
37 }
38}
39
40impl<T: Into<KernelClass>> From<T> for ObjectClass {
41 fn from(class: T) -> Self {
42 Self::Kernel(class.into())
43 }
44}
45
46#[derive(Clone, Copy, Debug, PartialEq, Eq)]
48pub struct KernelAccessDecision {
49 pub allow: AccessVector,
50 pub audit: AccessVector,
51 pub flags: u32,
52 pub todo_bug: Option<NonZeroU32>,
53}
54
55#[derive(Clone, Copy, PartialEq, Debug)]
57pub(crate) struct KernelXpermsAccessDecision {
58 pub allow: XpermsBitmap,
60 pub audit: XpermsBitmap,
62 pub permissive: bool,
64 pub has_todo: bool,
66}
67
68#[cfg(test)]
69mod tests {
70 use super::*;
71
72 #[test]
73 fn object_class_permissions() {
74 let test_class_id = ClassId::for_test(20);
75 assert_eq!(ObjectClass::ClassId(test_class_id), test_class_id.into());
76 for variant in KernelClass::Process.permissions() {
77 assert_eq!(KernelClass::Process, variant.class());
78 assert_eq!("process", variant.class().name());
79 assert_eq!(ObjectClass::Kernel(KernelClass::Process), variant.class().into());
80 }
81 }
82
83 #[test]
84 fn kernel_class_from_name() {
85 assert_eq!(KernelClass::from_name("process"), Some(KernelClass::Process));
86 assert_eq!(KernelClass::from_name("file"), Some(KernelClass::File));
87 assert_eq!(KernelClass::from_name("socket"), Some(KernelClass::Socket));
88 assert_eq!(KernelClass::from_name("non_existent_class"), None);
89 }
90}