use crate::capability::AccessMode;
use std::path::PathBuf;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DenialReason {
PolicyBlocked,
InsufficientAccess,
UserDenied,
RateLimited,
BackendError,
UnixSocketDenied,
}
#[derive(Debug, Clone)]
pub struct DenialRecord {
pub path: PathBuf,
pub access: AccessMode,
pub reason: DenialReason,
}
#[derive(Debug, Clone)]
pub struct IpcDenialRecord {
pub target: String,
pub operation: String,
pub reason: String,
pub suggested_flag: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SandboxViolation {
pub operation: String,
pub target: Option<String>,
}
#[must_use]
pub fn seatbelt_operation_to_access(operation: &str) -> Option<AccessMode> {
match operation {
"file-read-data" | "file-read-metadata" | "file-read-xattr" => Some(AccessMode::Read),
"file-write-data" | "file-write-create" | "file-write-unlink" | "file-write-flags"
| "file-write-mode" | "file-write-owner" | "file-write-times" | "file-write-xattr" => {
Some(AccessMode::Write)
}
_ => None,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn seatbelt_read_operations_map_to_read() {
assert_eq!(
seatbelt_operation_to_access("file-read-data"),
Some(AccessMode::Read)
);
assert_eq!(
seatbelt_operation_to_access("file-read-metadata"),
Some(AccessMode::Read)
);
}
#[test]
fn seatbelt_write_operations_map_to_write() {
assert_eq!(
seatbelt_operation_to_access("file-write-data"),
Some(AccessMode::Write)
);
assert_eq!(
seatbelt_operation_to_access("file-write-create"),
Some(AccessMode::Write)
);
}
#[test]
fn seatbelt_non_filesystem_operations_map_to_none() {
assert_eq!(seatbelt_operation_to_access("mach-lookup"), None);
assert_eq!(seatbelt_operation_to_access("signal"), None);
assert_eq!(seatbelt_operation_to_access("network-outbound"), None);
}
}