use serde::Serialize;
use crate::state::Probe;
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct ResolvedSubject {
pub uid: u32,
pub gid: u32,
pub groups: Vec<u32>,
pub capabilities: Probe<u64>,
}
impl ResolvedSubject {
#[must_use]
pub fn in_group(&self, gid: u32) -> bool {
self.gid == gid || self.groups.contains(&gid)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn in_group_matches_primary_gid() {
let subject = ResolvedSubject {
uid: 1000,
gid: 1000,
groups: vec![],
capabilities: Probe::Unknown,
};
assert!(subject.in_group(1000));
}
#[test]
fn in_group_matches_supplementary_group() {
let subject = ResolvedSubject {
uid: 1000,
gid: 1000,
groups: vec![33, 44],
capabilities: Probe::Unknown,
};
assert!(subject.in_group(33));
}
#[test]
fn in_group_returns_false_for_nonmember() {
let subject = ResolvedSubject {
uid: 1000,
gid: 1000,
groups: vec![33],
capabilities: Probe::Unknown,
};
assert!(!subject.in_group(999));
}
}