use capsec::prelude::*;
use std::io::Write;
fn load_config(path: &str, cap: &impl CapProvider<FsRead>) -> Result<String, CapSecError> {
capsec::fs::read_to_string(path, cap)
}
fn save_result(path: &str, data: &str, cap: &impl CapProvider<FsWrite>) -> Result<(), CapSecError> {
capsec::fs::write(path, data.as_bytes(), cap)
}
fn send_report(
addr: &str,
data: &str,
cap: &impl CapProvider<NetConnect>,
) -> Result<(), CapSecError> {
let mut stream = capsec::net::tcp_connect(addr, cap)?;
stream.write_all(data.as_bytes())?;
Ok(())
}
fn run_cleanup(dir: &str, cap: &impl CapProvider<Spawn>) -> Result<(), CapSecError> {
let output = capsec::process::run("rm", &["-rf", dir], cap)?;
if !output.status.success() {
eprintln!("cleanup failed");
}
Ok(())
}
fn process_data(input: &str) -> String {
input.to_uppercase()
}
#[capsec::main]
fn main(root: CapRoot) -> Result<(), Box<dyn std::error::Error>> {
let fs_read = root.fs_read();
let fs_write = root.fs_write();
let net_cap = root.net_connect();
let spawn_cap = root.spawn();
let config = load_config("/etc/app/config.toml", &fs_read)?;
let result = process_data(&config);
save_result("/tmp/result.txt", &result, &fs_write)?;
send_report("telemetry.example.com:8080", &result, &net_cap)?;
run_cleanup("/tmp/scratch", &spawn_cap)?;
Ok(())
}