use teec_protocol::CaAuthInfo;
use crate::error::{Error, Result};
pub use teec_protocol::path_to_uuid;
pub fn check_ca_path_whitelist(ca_auth_info: Option<&CaAuthInfo>, allowed_paths: &[&str]) -> Result<()> {
let info = ca_auth_info.ok_or(Error::AccessDenied)?;
for path in allowed_paths {
if path_to_uuid(path) == info.ca_uuid {
return Ok(());
}
}
Err(Error::AccessDenied)
}
pub fn check_ca_verified(ca_auth_info: Option<&CaAuthInfo>) -> Result<()> {
let info = ca_auth_info.ok_or(Error::AccessDenied)?;
if !info.verified {
return Err(Error::AccessDenied);
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
const KNOWN_PATH: &str = "/usr/bin/test";
const KNOWN_UUID: &str = "f2d62525-c975-5075-8bfd-ea1a7c98adc3";
#[test]
fn whitelist_accepts_matching_verified_ca() {
let info = CaAuthInfo {
ca_uuid: KNOWN_UUID.to_string(),
verified: true,
};
assert!(check_ca_path_whitelist(Some(&info), &[KNOWN_PATH]).is_ok());
}
#[test]
fn whitelist_rejects_wrong_uuid() {
let info = CaAuthInfo {
ca_uuid: "00000000-0000-0000-0000-000000000000".to_string(),
verified: true,
};
assert_eq!(
check_ca_path_whitelist(Some(&info), &[KNOWN_PATH]),
Err(Error::AccessDenied)
);
}
#[test]
fn whitelist_accepts_unverified_if_path_matches() {
let info = CaAuthInfo {
ca_uuid: KNOWN_UUID.to_string(),
verified: false,
};
assert!(check_ca_path_whitelist(Some(&info), &[KNOWN_PATH]).is_ok());
}
#[test]
fn verified_rejects_unverified() {
let info = CaAuthInfo {
ca_uuid: KNOWN_UUID.to_string(),
verified: false,
};
assert_eq!(check_ca_verified(Some(&info)), Err(Error::AccessDenied));
}
#[test]
fn verified_accepts_verified() {
let info = CaAuthInfo {
ca_uuid: KNOWN_UUID.to_string(),
verified: true,
};
assert!(check_ca_verified(Some(&info)).is_ok());
}
#[test]
fn verified_rejects_none() {
assert_eq!(check_ca_verified(None), Err(Error::AccessDenied));
}
#[test]
fn whitelist_rejects_none_auth() {
assert_eq!(
check_ca_path_whitelist(None, &[KNOWN_PATH]),
Err(Error::AccessDenied)
);
}
#[test]
fn whitelist_rejects_empty_list() {
let info = CaAuthInfo {
ca_uuid: KNOWN_UUID.to_string(),
verified: true,
};
assert_eq!(
check_ca_path_whitelist(Some(&info), &[]),
Err(Error::AccessDenied)
);
}
}