summaryrefslogtreecommitdiff
path: root/src/permissions.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/permissions.rs')
-rw-r--r--src/permissions.rs86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/permissions.rs b/src/permissions.rs
new file mode 100644
index 000000000..aeeb7df9a
--- /dev/null
+++ b/src/permissions.rs
@@ -0,0 +1,86 @@
+extern crate atty;
+
+use flags::DenoFlags;
+
+use errors::permission_denied;
+use errors::DenoResult;
+use std::io;
+
+#[derive(Debug, Default, PartialEq)]
+pub struct DenoPermissions {
+ pub allow_write: bool,
+ pub allow_net: bool,
+ pub allow_env: bool,
+}
+
+impl DenoPermissions {
+ pub fn new(flags: &DenoFlags) -> DenoPermissions {
+ DenoPermissions {
+ allow_write: flags.allow_write,
+ allow_env: flags.allow_env,
+ allow_net: flags.allow_net,
+ }
+ }
+
+ pub fn check_write(&mut self, filename: &str) -> DenoResult<()> {
+ if self.allow_write {
+ return Ok(());
+ };
+ // TODO get location (where access occurred)
+ let r = permission_prompt(format!(
+ "Deno requests write access to \"{}\".",
+ filename
+ ));;
+ if r.is_ok() {
+ self.allow_write = true;
+ }
+ r
+ }
+
+ pub fn check_net(&mut self, domain_name: &str) -> DenoResult<()> {
+ if self.allow_net {
+ return Ok(());
+ };
+ // TODO get location (where access occurred)
+ let r = permission_prompt(format!(
+ "Deno requests network access to \"{}\".",
+ domain_name
+ ));
+ if r.is_ok() {
+ self.allow_net = true;
+ }
+ r
+ }
+
+ pub fn check_env(&mut self) -> DenoResult<()> {
+ if self.allow_env {
+ return Ok(());
+ };
+ // TODO get location (where access occurred)
+ let r = permission_prompt(
+ "Deno requests access to environment variables.".to_string(),
+ );
+ if r.is_ok() {
+ self.allow_env = true;
+ }
+ r
+ }
+}
+
+fn permission_prompt(message: String) -> DenoResult<()> {
+ if !atty::is(atty::Stream::Stdin) || !atty::is(atty::Stream::Stderr) {
+ return Err(permission_denied());
+ };
+ // print to stderr so that if deno is > to a file this is still displayed.
+ eprint!("{} Grant? [yN] ", message);
+ let mut input = String::new();
+ let stdin = io::stdin();
+ let _nread = stdin.read_line(&mut input)?;
+ let ch = input.chars().next().unwrap();
+ let is_yes = ch == 'y' || ch == 'Y';
+ if is_yes {
+ Ok(())
+ } else {
+ Err(permission_denied())
+ }
+}