use crate::config::ipc_security::AuthorizationConfig;
use crate::dashboard::error::DashboardError;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum IpcRiskAction {
Read,
WriteChild,
Destructive,
}
impl IpcRiskAction {
pub fn classify(method: &str) -> Self {
match method {
"hello" | "state" | "events.subscribe" | "logs.tail" => Self::Read,
"command.restart_child"
| "command.pause_child"
| "command.resume_child"
| "command.quarantine_child"
| "command.add_child" => Self::WriteChild,
"command.remove_child" | "command.shutdown_tree" => Self::Destructive,
_ => Self::WriteChild, }
}
}
pub fn verify_authorization(
method: &str,
peer_uid: u32,
config: &AuthorizationConfig,
) -> Result<(), DashboardError> {
if !config.enabled {
return Ok(());
}
let risk = IpcRiskAction::classify(method);
match risk {
IpcRiskAction::Read => Ok(()),
IpcRiskAction::WriteChild | IpcRiskAction::Destructive => {
if config.allowed_uids.is_empty() {
return Err(DashboardError::authz_not_configured());
}
if !config.allowed_uids.contains(&peer_uid) {
return Err(DashboardError::authz_denied(method));
}
Ok(())
}
}
}