use sim_kernel::{CapabilityName, Cx, Error, Result};
pub fn fs_read() -> CapabilityName {
CapabilityName::new("fs/read")
}
pub fn fs_write() -> CapabilityName {
CapabilityName::new("fs/write")
}
pub fn find() -> CapabilityName {
CapabilityName::new("find")
}
pub fn edit() -> CapabilityName {
CapabilityName::new("edit")
}
pub fn exec() -> CapabilityName {
CapabilityName::new("exec")
}
pub fn net_http() -> CapabilityName {
CapabilityName::new("net/http")
}
pub fn fs_read_aliases() -> &'static [&'static str] {
&["table.fs.read", "stream.file.read", "file-read"]
}
pub fn fs_write_aliases() -> &'static [&'static str] {
&[
"table.fs.write",
"table.fs.mkdir",
"table.fs.rmdir",
"stream.file.write",
"file-write",
]
}
pub fn exec_aliases() -> &'static [&'static str] {
&["host.process"]
}
pub fn net_http_aliases() -> &'static [&'static str] {
&["net.http", "net-connect", "network"]
}
pub fn granted_capability_or_alias(
cx: &Cx,
canonical: CapabilityName,
aliases: &[&'static str],
) -> Result<CapabilityName> {
if cx.capabilities().contains(&canonical) {
return Ok(canonical);
}
for alias in aliases {
let alias = CapabilityName::new(*alias);
if cx.capabilities().contains(&alias) {
return Ok(alias);
}
}
Err(Error::CapabilityDenied {
capability: canonical,
})
}
pub fn require_with_aliases(
cx: &Cx,
canonical: CapabilityName,
aliases: &[&'static str],
) -> Result<()> {
granted_capability_or_alias(cx, canonical, aliases).map(|_| ())
}