Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

No prompts flag for non interactive environments. #1913

Merged
merged 8 commits into from
Mar 13, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/compiler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ fn lazy_start(parent_state: &Arc<IsolateState>) -> Resource {
allow_env: AtomicBool::new(false),
allow_net: AtomicBool::new(true),
allow_run: AtomicBool::new(false),
..Default::default()
};
let rid = cell.get_or_insert_with(|| {
let resource = workers::spawn(
Expand Down
5 changes: 5 additions & 0 deletions src/flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ pub struct DenoFlags {
pub allow_net: bool,
pub allow_env: bool,
pub allow_run: bool,
pub no_prompts: bool,
pub types: bool,
pub prefetch: bool,
pub info: bool,
Expand Down Expand Up @@ -108,6 +109,9 @@ fn set_recognized_flags(
flags.allow_read = true;
flags.allow_write = true;
}
if matches.opt_present("no-prompt") {
flags.no_prompts = true;
}
if matches.opt_present("types") {
flags.types = true;
}
Expand Down Expand Up @@ -149,6 +153,7 @@ pub fn set_flags(
opts.optflag("", "allow-env", "Allow environment access");
opts.optflag("", "allow-run", "Allow running subprocesses");
opts.optflag("A", "allow-all", "Allow all permissions");
opts.optflag("", "no-prompt", "Do not use prompts");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

--deny ?
#1580

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No prompt shouldn't be limited to permissions, so in that respect it's different than --deny. Either your there to answer for prompts or you aren't as a user.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What other prompts are there?

I don't understand the difference.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess for the time being it only affects permissions, but If we add any other prompts in the future it should be used to allow disabling those as well.

Copy link
Member

@ry ry Mar 12, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

--deny would be confusing when combined with, say, --allow-read

> deno  foo.ts --allow-read --deny

What is intended is: "run deno with foo.ts as the main script, allow fs read access, but do not prompt for permission"
But people might interpret this as: "run deno with foo.ts as the main script, allow fs read access, deny all access (overriding previous?)"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

--no-prompt is kinda long.... Can we quickly just throw out a few other suggestions?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No other suggestions it seems. I can't think of anything better...

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what about --no (as analogous to --yes e.g. of unix tools)

opts.optflag("", "recompile", "Force recompilation of TypeScript code");
opts.optflag("h", "help", "Print this message");
opts.optflag("D", "log-debug", "Log debug output");
Expand Down
4 changes: 4 additions & 0 deletions src/ops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1876,6 +1876,7 @@ mod tests {
allow_env: AtomicBool::new(true),
allow_net: AtomicBool::new(true),
allow_run: AtomicBool::new(true),
..Default::default()
};
let isolate = Isolate::new(
IsolateInit {
Expand Down Expand Up @@ -1921,6 +1922,7 @@ mod tests {
allow_env: AtomicBool::new(true),
allow_net: AtomicBool::new(true),
allow_run: AtomicBool::new(true),
..Default::default()
};
let isolate = Isolate::new(
IsolateInit {
Expand Down Expand Up @@ -1966,6 +1968,7 @@ mod tests {
allow_env: AtomicBool::new(true),
allow_net: AtomicBool::new(false),
allow_run: AtomicBool::new(true),
..Default::default()
};
let isolate = Isolate::new(
IsolateInit {
Expand Down Expand Up @@ -2011,6 +2014,7 @@ mod tests {
allow_env: AtomicBool::new(false),
allow_net: AtomicBool::new(true),
allow_run: AtomicBool::new(false),
..Default::default()
};
let isolate = Isolate::new(
IsolateInit {
Expand Down
28 changes: 22 additions & 6 deletions src/permissions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ pub struct DenoPermissions {
pub allow_net: AtomicBool,
pub allow_env: AtomicBool,
pub allow_run: AtomicBool,
pub no_prompts: AtomicBool,
}

impl DenoPermissions {
Expand All @@ -28,6 +29,7 @@ impl DenoPermissions {
allow_env: AtomicBool::new(flags.allow_env),
allow_net: AtomicBool::new(flags.allow_net),
allow_run: AtomicBool::new(flags.allow_run),
no_prompts: AtomicBool::new(flags.no_prompts),
}
}

Expand All @@ -36,7 +38,7 @@ impl DenoPermissions {
return Ok(());
};
// TODO get location (where access occurred)
let r = permission_prompt("access to run a subprocess");
let r = self.try_permissions_prompt("access to run a subprocess");
if r.is_ok() {
self.allow_run.store(true, Ordering::SeqCst);
}
Expand All @@ -48,7 +50,8 @@ impl DenoPermissions {
return Ok(());
};
// TODO get location (where access occurred)
let r = permission_prompt(&format!("read access to \"{}\"", filename));;
let r =
self.try_permissions_prompt(&format!("read access to \"{}\"", filename));;
if r.is_ok() {
self.allow_read.store(true, Ordering::SeqCst);
}
Expand All @@ -60,7 +63,8 @@ impl DenoPermissions {
return Ok(());
};
// TODO get location (where access occurred)
let r = permission_prompt(&format!("write access to \"{}\"", filename));;
let r =
self.try_permissions_prompt(&format!("write access to \"{}\"", filename));;
if r.is_ok() {
self.allow_write.store(true, Ordering::SeqCst);
}
Expand All @@ -72,8 +76,10 @@ impl DenoPermissions {
return Ok(());
};
// TODO get location (where access occurred)
let r =
permission_prompt(&format!("network access to \"{}\"", domain_name));
let r = self.try_permissions_prompt(&format!(
"network access to \"{}\"",
domain_name
));
if r.is_ok() {
self.allow_net.store(true, Ordering::SeqCst);
}
Expand All @@ -85,13 +91,22 @@ impl DenoPermissions {
return Ok(());
};
// TODO get location (where access occurred)
let r = permission_prompt(&"access to environment variables");
let r = self.try_permissions_prompt(&"access to environment variables");
if r.is_ok() {
self.allow_env.store(true, Ordering::SeqCst);
}
r
}

/// Try to present the user with a permission prompt
/// will error with permission_denied if no_prompts is enabled
fn try_permissions_prompt(&self, message: &str) -> DenoResult<()> {
if self.no_prompts.load(Ordering::SeqCst) {
return Err(permission_denied());
}
permission_prompt(message)
}

pub fn allows_run(&self) -> bool {
return self.allow_run.load(Ordering::SeqCst);
}
Expand Down Expand Up @@ -144,6 +159,7 @@ impl DenoPermissions {
allow_env: AtomicBool::new(false),
allow_net: AtomicBool::new(false),
allow_run: AtomicBool::new(false),
..Default::default()
}
}
}
Expand Down
35 changes: 34 additions & 1 deletion tools/permission_prompt_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ def run(self,
allow_write=False,
allow_net=False,
allow_env=False,
allow_run=False):
allow_run=False,
no_prompt=False):
"Returns (return_code, stdout, stderr)."
cmd = [self.deno_exe, PERMISSIONS_PROMPT_TEST_TS, arg]
if allow_read:
Expand All @@ -68,6 +69,8 @@ def run(self,
cmd.append("--allow-env")
if allow_run:
cmd.append("--allow-run")
if no_prompt:
cmd.append("--no-prompt")
return tty_capture(cmd, bytes_input)

def warm_up(self):
Expand All @@ -92,6 +95,11 @@ def test_read_no(self):
assert b'PermissionDenied: permission denied' in stderr
assert b'⚠️ Deno requests read access' in stderr

def test_read_no_prompt(self):
code, _stdout, stderr = self.run('needsRead', b'', no_prompt=True)
assert code == 1
assert b'PermissionDenied: permission denied' in stderr

def test_write_yes(self):
code, stdout, stderr = self.run('needsWrite', b'y\n')
assert code == 0
Expand All @@ -110,6 +118,11 @@ def test_write_no(self):
assert b'PermissionDenied: permission denied' in stderr
assert b'⚠️ Deno requests write access' in stderr

def test_write_no_prompt(self):
code, _stdout, stderr = self.run('needsWrite', b'', no_prompt=True)
assert code == 1
assert b'PermissionDenied: permission denied' in stderr

def test_env_yes(self):
code, stdout, stderr = self.run('needsEnv', b'y\n')
assert code == 0
Expand All @@ -128,6 +141,11 @@ def test_env_no(self):
assert b'PermissionDenied: permission denied' in stderr
assert b'⚠️ Deno requests access to environment' in stderr

def test_env_no_prompt(self):
code, _stdout, stderr = self.run('needsEnv', b'', no_prompt=True)
assert code == 1
assert b'PermissionDenied: permission denied' in stderr

def test_net_yes(self):
code, stdout, stderr = self.run('needsEnv', b'y\n')
assert code == 0
Expand All @@ -146,6 +164,11 @@ def test_net_no(self):
assert b'PermissionDenied: permission denied' in stderr
assert b'⚠️ Deno requests network access' in stderr

def test_net_no_prompt(self):
code, _stdout, stderr = self.run('needsNet', b'', no_prompt=True)
assert code == 1
assert b'PermissionDenied: permission denied' in stderr

def test_run_yes(self):
code, stdout, stderr = self.run('needsRun', b'y\n')
assert code == 0
Expand All @@ -164,25 +187,35 @@ def test_run_no(self):
assert b'PermissionDenied: permission denied' in stderr
assert b'⚠️ Deno requests access to run' in stderr

def test_run_no_prompt(self):
code, _stdout, stderr = self.run('needsRun', b'', no_prompt=True)
assert code == 1
assert b'PermissionDenied: permission denied' in stderr


def permission_prompt_test(deno_exe):
p = Prompt(deno_exe)
afinch7 marked this conversation as resolved.
Show resolved Hide resolved
p.warm_up()
p.test_read_yes()
p.test_read_arg()
p.test_read_no()
p.test_read_no_prompt()
p.test_write_yes()
p.test_write_arg()
p.test_write_no()
p.test_write_no_prompt()
p.test_env_yes()
p.test_env_arg()
p.test_env_no()
p.test_env_no_prompt()
p.test_net_yes()
p.test_net_arg()
p.test_net_no()
p.test_net_no_prompt()
p.test_run_yes()
p.test_run_arg()
p.test_run_no()
p.test_run_no_prompt()


def main():
Expand Down