use platform::linux::seccomp::Filter;
use platform::unix::process::Process;
use profile::{self, AddressPattern, OperationSupport, OperationSupportLevel, Profile};
use sandbox::{ChildSandboxMethods, Command, SandboxMethods};
use std::io;
pub mod misc;
pub mod namespace;
pub mod seccomp;
#[allow(missing_copy_implementations)]
#[derive(Clone, Debug)]
pub struct Operation;
impl OperationSupport for profile::Operation {
fn support(&self) -> OperationSupportLevel {
match *self {
profile::Operation::FileReadAll(_) |
profile::Operation::NetworkOutbound(AddressPattern::All) => {
OperationSupportLevel::CanBeAllowed
}
profile::Operation::FileReadMetadata(_) |
profile::Operation::NetworkOutbound(AddressPattern::Tcp(_)) |
profile::Operation::NetworkOutbound(AddressPattern::LocalSocket(_)) => {
OperationSupportLevel::CannotBeAllowedPrecisely
}
profile::Operation::SystemInfoRead |
profile::Operation::PlatformSpecific(_) => OperationSupportLevel::NeverAllowed,
}
}
}
pub struct Sandbox {
profile: Profile,
}
impl Sandbox {
pub fn new(profile: Profile) -> Sandbox {
Sandbox {
profile: profile,
}
}
#[cfg(dump_bpf_sockets)]
fn dump_filter(&self) {
let filter = Filter::new(&self.profile);
filter.dump();
}
#[cfg(not(dump_bpf_sockets))]
fn dump_filter(&self) {}
}
impl SandboxMethods for Sandbox {
fn profile(&self) -> &Profile {
&self.profile
}
fn start(&self, command: &mut Command) -> io::Result<Process> {
self.dump_filter();
namespace::start(&self.profile, command)
}
}
pub struct ChildSandbox {
profile: Profile,
}
impl ChildSandbox {
pub fn new(profile: Profile) -> ChildSandbox {
ChildSandbox {
profile: profile,
}
}
}
impl ChildSandboxMethods for ChildSandbox {
fn activate(&self) -> Result<(),()> {
if namespace::activate(&self.profile).is_err() {
return Err(())
}
if misc::activate().is_err() {
return Err(())
}
match Filter::new(&self.profile).activate() {
Ok(_) => Ok(()),
Err(_) => Err(()),
}
}
}