palisade-errors 2.0.0

Security-conscious error handling with operational security principles
use palisade_errors::AgentError;
use std::error::Error;
use std::path::{Path, PathBuf};

fn main() -> Result<(), Box<dyn Error>> {
    let path = temp_log_path();
    let err = AgentError::new(
        611,
        "Audit operation failed",
        "encrypted append-only log write failed after permission change",
        "/var/log/palisade/forensics.log",
    );

    err.log(&path)?;
    println!("wrote encrypted record to {}", path.display());

    cleanup_log(&path);
    Ok(())
}

fn temp_log_path() -> PathBuf {
    std::env::temp_dir().join(format!(
        "palisade_errors_example_{}_{}.log",
        std::process::id(),
        "encrypted"
    ))
}

fn cleanup_log(path: &Path) {
    #[cfg(unix)]
    {
        use std::os::unix::fs::PermissionsExt;
        if let Ok(metadata) = std::fs::metadata(path) {
            let mut permissions = metadata.permissions();
            permissions.set_mode(0o600);
            let _ = std::fs::set_permissions(path, permissions);
        }
    }
    let _ = std::fs::remove_file(path);
}