sim_table_core/
capabilities.rs1use sim_kernel::{CapabilityName, Cx, Error, Result};
8
9pub fn fs_read() -> CapabilityName {
11 CapabilityName::new("fs/read")
12}
13
14pub fn fs_write() -> CapabilityName {
16 CapabilityName::new("fs/write")
17}
18
19pub fn find() -> CapabilityName {
21 CapabilityName::new("find")
22}
23
24pub fn edit() -> CapabilityName {
26 CapabilityName::new("edit")
27}
28
29pub fn exec() -> CapabilityName {
31 CapabilityName::new("exec")
32}
33
34pub fn net_http() -> CapabilityName {
36 CapabilityName::new("net/http")
37}
38
39pub fn fs_read_aliases() -> &'static [&'static str] {
41 &["table.fs.read", "stream.file.read", "file-read"]
42}
43
44pub fn fs_write_aliases() -> &'static [&'static str] {
46 &[
47 "table.fs.write",
48 "table.fs.mkdir",
49 "table.fs.rmdir",
50 "stream.file.write",
51 "file-write",
52 ]
53}
54
55pub fn exec_aliases() -> &'static [&'static str] {
57 &["host.process"]
58}
59
60pub fn net_http_aliases() -> &'static [&'static str] {
62 &["net.http", "net-connect", "network"]
63}
64
65pub fn granted_capability_or_alias(
70 cx: &Cx,
71 canonical: CapabilityName,
72 aliases: &[&'static str],
73) -> Result<CapabilityName> {
74 if cx.capabilities().contains(&canonical) {
75 return Ok(canonical);
76 }
77 for alias in aliases {
78 let alias = CapabilityName::new(*alias);
79 if cx.capabilities().contains(&alias) {
80 return Ok(alias);
81 }
82 }
83 Err(Error::CapabilityDenied {
84 capability: canonical,
85 })
86}
87
88pub fn require_with_aliases(
90 cx: &Cx,
91 canonical: CapabilityName,
92 aliases: &[&'static str],
93) -> Result<()> {
94 granted_capability_or_alias(cx, canonical, aliases).map(|_| ())
95}