use crate::contract::capability::{Enforcement, EvidenceClaim, SupportVerdict};
use crate::contract::support::{RequirementKind, SupportMatrix};
use std::collections::BTreeMap;
#[must_use]
pub fn support_matrix() -> SupportMatrix {
let mut best = BTreeMap::new();
insert(
&mut best,
RequirementKind::LaunchWorkload,
Enforcement::Enforced,
&[EvidenceClaim::TerminalOutcome],
);
insert(
&mut best,
RequirementKind::CaptureStreams,
Enforcement::Enforced,
&[EvidenceClaim::CapturedStreams],
);
insert(
&mut best,
RequirementKind::Filesystem,
Enforcement::Mediated,
&[
EvidenceClaim::DeniedAttempts,
EvidenceClaim::FilesystemDelta,
],
);
insert(
&mut best,
RequirementKind::NetworkDenyAll,
Enforcement::Mediated,
&[EvidenceClaim::DeniedAttempts],
);
insert(
&mut best,
RequirementKind::NetworkAllowList,
Enforcement::Unsupported,
&[],
);
insert(
&mut best,
RequirementKind::Environment,
Enforcement::Enforced,
&[EvidenceClaim::MechanismAttestation],
);
insert(
&mut best,
RequirementKind::InheritedFdsNone,
Enforcement::Enforced,
&[EvidenceClaim::MechanismAttestation],
);
insert(
&mut best,
RequirementKind::InheritedFdsOnly,
Enforcement::Enforced,
&[EvidenceClaim::MechanismAttestation],
);
insert(
&mut best,
RequirementKind::TempRoot,
Enforcement::Enforced,
&[EvidenceClaim::MechanismAttestation],
);
insert(
&mut best,
RequirementKind::ExposePath,
Enforcement::Unsupported,
&[],
);
insert(
&mut best,
RequirementKind::CommitArtifact,
Enforcement::Enforced,
&[EvidenceClaim::ArtifactLineage],
);
insert(
&mut best,
RequirementKind::DiscardArtifact,
Enforcement::Enforced,
&[EvidenceClaim::ArtifactLineage],
);
insert(
&mut best,
RequirementKind::ListOutputs,
Enforcement::Enforced,
&[EvidenceClaim::ArtifactLineage],
);
insert(
&mut best,
RequirementKind::Kill,
Enforcement::Mediated,
&[EvidenceClaim::TerminalOutcome],
);
insert(
&mut best,
RequirementKind::ChildSpawnDenyNewTasks,
Enforcement::Unsupported,
&[],
);
insert(
&mut best,
RequirementKind::ChildSpawnAllowThreads,
Enforcement::Unsupported,
&[],
);
insert(
&mut best,
RequirementKind::ChildSpawnAllowDescendants,
Enforcement::Unsupported,
&[],
);
SupportMatrix::from_best_case(best)
}
fn insert(
table: &mut BTreeMap<RequirementKind, SupportVerdict>,
kind: RequirementKind,
enforcement: Enforcement,
evidence: &[EvidenceClaim],
) {
table.insert(
kind,
SupportVerdict::new(enforcement, evidence.iter().copied().collect()),
);
}
#[cfg(all(feature = "backend-macos", target_os = "macos"))]
mod backend_impl;
#[cfg(all(feature = "backend-macos", target_os = "macos"))]
pub use backend_impl::MacosBackend;
#[cfg(all(feature = "backend-macos", target_os = "macos"))]
pub(crate) mod sys;
#[cfg(test)]
mod tests {
use super::support_matrix;
use crate::contract::capability::Enforcement;
use crate::contract::support::RequirementKind;
#[test]
fn mount_and_allow_list_are_unsupported() {
let m = support_matrix();
assert_eq!(
m.best_case_for(RequirementKind::ExposePath).enforcement,
Enforcement::Unsupported
);
assert_eq!(
m.best_case_for(RequirementKind::NetworkAllowList)
.enforcement,
Enforcement::Unsupported
);
}
#[test]
fn filesystem_and_kill_are_mediated_not_enforced() {
let m = support_matrix();
assert_eq!(
m.best_case_for(RequirementKind::Filesystem).enforcement,
Enforcement::Mediated
);
assert_eq!(
m.best_case_for(RequirementKind::Kill).enforcement,
Enforcement::Mediated
);
}
}