use super::LinuxBackend;
use crate::contract::capability::{Capability, EnvPolicy};
use crate::contract::plan::{BoundaryPlan, BoundaryRequirement};
use crate::contract::report::ObservedFact;
use crate::contract::secret::lower_env;
type LoweredEnv = (Vec<(String, String)>, Vec<ObservedFact>);
pub(super) fn lower_environment(
backend: &LinuxBackend,
plan: &BoundaryPlan,
mut observed: Vec<ObservedFact>,
) -> Result<LoweredEnv, Vec<ObservedFact>> {
let policy = environment_policy(plan);
match lower_env(&policy, backend.secret_resolver.as_ref()) {
Ok(envp) => Ok((envp, observed)),
Err(error) => {
observed.push(ObservedFact {
kind: "environment_lowering_failed".to_string(),
detail: format!("refusing to launch: {error}"),
});
Err(observed)
}
}
}
fn environment_policy(plan: &BoundaryPlan) -> EnvPolicy {
plan.admitted
.iter()
.find_map(|a| match &a.requirement {
BoundaryRequirement::Capability(Capability::Environment { policy }) => {
Some(policy.clone())
}
BoundaryRequirement::Capability(_) | BoundaryRequirement::HostControl(_) => None,
})
.unwrap_or_else(|| EnvPolicy::Exact(Vec::new()))
}