summaryrefslogtreecommitdiff
path: root/runtime/permissions.rs
diff options
context:
space:
mode:
authorYusuke Tanaka <yusuktan@maguro.dev>2020-12-30 03:34:35 +0900
committerGitHub <noreply@github.com>2020-12-29 19:34:35 +0100
commitd5f3a749eb9b86ed24378a3ee39ee443c374da53 (patch)
treebedbacd5f0b08f647b825bcd83e1d84798ce9a39 /runtime/permissions.rs
parent090ca4d3a73cf8538418a2a19d373a6860e8c59a (diff)
refactor(cli/flags): change allow_read/write/net types from bool to Option<Vec<T>> (#8896)
This PR refactors "cli/flags.rs" and "runtime/permissions.rs" so that "allow_read", "allow_write" and "allow_net" themselves have allowlists, instead of storing them in additional fields.
Diffstat (limited to 'runtime/permissions.rs')
-rw-r--r--runtime/permissions.rs75
1 files changed, 43 insertions, 32 deletions
diff --git a/runtime/permissions.rs b/runtime/permissions.rs
index df957aa01..5ccfea279 100644
--- a/runtime/permissions.rs
+++ b/runtime/permissions.rs
@@ -78,56 +78,67 @@ pub struct Permissions {
pub hrtime: PermissionState,
}
-fn resolve_fs_allowlist(allowlist: &[PathBuf]) -> HashSet<PathBuf> {
- allowlist
- .iter()
- .map(|raw_path| resolve_from_cwd(Path::new(&raw_path)).unwrap())
- .collect()
+fn resolve_fs_allowlist(allow: &Option<Vec<PathBuf>>) -> HashSet<PathBuf> {
+ if let Some(v) = allow {
+ v.iter()
+ .map(|raw_path| resolve_from_cwd(Path::new(&raw_path)).unwrap())
+ .collect()
+ } else {
+ HashSet::new()
+ }
}
#[derive(Clone, Debug, PartialEq, Default)]
pub struct PermissionsOptions {
pub allow_env: bool,
pub allow_hrtime: bool,
- pub allow_net: bool,
+ pub allow_net: Option<Vec<String>>,
pub allow_plugin: bool,
- pub allow_read: bool,
+ pub allow_read: Option<Vec<PathBuf>>,
pub allow_run: bool,
- pub allow_write: bool,
- pub net_allowlist: Vec<String>,
- pub read_allowlist: Vec<PathBuf>,
- pub write_allowlist: Vec<PathBuf>,
+ pub allow_write: Option<Vec<PathBuf>>,
}
impl Permissions {
pub fn from_options(opts: &PermissionsOptions) -> Self {
- fn state_from_flag_bool(flag: bool) -> PermissionState {
+ fn global_state_from_flag_bool(flag: bool) -> PermissionState {
if flag {
PermissionState::Granted
} else {
PermissionState::Prompt
}
}
+ fn global_state_from_option<T>(flag: &Option<Vec<T>>) -> PermissionState {
+ if matches!(flag, Some(v) if v.is_empty()) {
+ PermissionState::Granted
+ } else {
+ PermissionState::Prompt
+ }
+ }
Self {
read: UnaryPermission::<PathBuf> {
- global_state: state_from_flag_bool(opts.allow_read),
- granted_list: resolve_fs_allowlist(&opts.read_allowlist),
+ global_state: global_state_from_option(&opts.allow_read),
+ granted_list: resolve_fs_allowlist(&opts.allow_read),
..Default::default()
},
write: UnaryPermission::<PathBuf> {
- global_state: state_from_flag_bool(opts.allow_write),
- granted_list: resolve_fs_allowlist(&opts.write_allowlist),
+ global_state: global_state_from_option(&opts.allow_write),
+ granted_list: resolve_fs_allowlist(&opts.allow_write),
..Default::default()
},
net: UnaryPermission::<String> {
- global_state: state_from_flag_bool(opts.allow_net),
- granted_list: opts.net_allowlist.iter().cloned().collect(),
+ global_state: global_state_from_option(&opts.allow_net),
+ granted_list: opts
+ .allow_net
+ .as_ref()
+ .map(|v| v.iter().cloned().collect())
+ .unwrap_or_else(HashSet::new),
..Default::default()
},
- env: state_from_flag_bool(opts.allow_env),
- run: state_from_flag_bool(opts.allow_run),
- plugin: state_from_flag_bool(opts.allow_plugin),
- hrtime: state_from_flag_bool(opts.allow_hrtime),
+ env: global_state_from_flag_bool(opts.allow_env),
+ run: global_state_from_flag_bool(opts.allow_run),
+ plugin: global_state_from_flag_bool(opts.allow_plugin),
+ hrtime: global_state_from_flag_bool(opts.allow_hrtime),
}
}
@@ -707,8 +718,8 @@ mod tests {
];
let perms = Permissions::from_options(&PermissionsOptions {
- read_allowlist: allowlist.clone(),
- write_allowlist: allowlist,
+ allow_read: Some(allowlist.clone()),
+ allow_write: Some(allowlist),
..Default::default()
});
@@ -762,14 +773,14 @@ mod tests {
#[test]
fn test_check_net() {
let perms = Permissions::from_options(&PermissionsOptions {
- net_allowlist: svec![
+ allow_net: Some(svec![
"localhost",
"deno.land",
"github.com:3000",
"127.0.0.1",
"172.16.0.2:8000",
"www.github.com:443"
- ],
+ ]),
..Default::default()
});
@@ -853,8 +864,8 @@ mod tests {
vec![PathBuf::from("/a")]
};
let perms = Permissions::from_options(&PermissionsOptions {
- read_allowlist,
- net_allowlist: svec!["localhost"],
+ allow_read: Some(read_allowlist),
+ allow_net: Some(svec!["localhost"]),
..Default::default()
});
@@ -967,12 +978,12 @@ mod tests {
let perms2 = Permissions {
read: UnaryPermission {
global_state: PermissionState::Prompt,
- granted_list: resolve_fs_allowlist(&[PathBuf::from("/foo")]),
+ granted_list: resolve_fs_allowlist(&Some(vec![PathBuf::from("/foo")])),
..Default::default()
},
write: UnaryPermission {
global_state: PermissionState::Prompt,
- granted_list: resolve_fs_allowlist(&[PathBuf::from("/foo")]),
+ granted_list: resolve_fs_allowlist(&Some(vec![PathBuf::from("/foo")])),
..Default::default()
},
net: UnaryPermission {
@@ -1073,12 +1084,12 @@ mod tests {
let mut perms = Permissions {
read: UnaryPermission {
global_state: PermissionState::Prompt,
- granted_list: resolve_fs_allowlist(&[PathBuf::from("/foo")]),
+ granted_list: resolve_fs_allowlist(&Some(vec![PathBuf::from("/foo")])),
..Default::default()
},
write: UnaryPermission {
global_state: PermissionState::Prompt,
- granted_list: resolve_fs_allowlist(&[PathBuf::from("/foo")]),
+ granted_list: resolve_fs_allowlist(&Some(vec![PathBuf::from("/foo")])),
..Default::default()
},
net: UnaryPermission {