summaryrefslogtreecommitdiff
path: root/src/ops.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ops.rs')
-rw-r--r--src/ops.rs100
1 files changed, 51 insertions, 49 deletions
diff --git a/src/ops.rs b/src/ops.rs
index 37cbd6826..b7a20a46e 100644
--- a/src/ops.rs
+++ b/src/ops.rs
@@ -1,6 +1,5 @@
// Copyright 2018 the Deno authors. All rights reserved. MIT license.
use errors;
-use errors::permission_denied;
use errors::{DenoError, DenoResult, ErrorKind};
use fs as deno_fs;
use http_util;
@@ -333,11 +332,9 @@ fn op_set_env(
let inner = base.inner_as_set_env().unwrap();
let key = inner.key().unwrap();
let value = inner.value().unwrap();
-
- if !state.flags.allow_env {
- return odd_future(permission_denied());
+ if let Err(e) = state.check_env() {
+ return odd_future(e);
}
-
std::env::set_var(key, value);
ok_future(empty_buf())
}
@@ -350,8 +347,8 @@ fn op_env(
assert_eq!(data.len(), 0);
let cmd_id = base.cmd_id();
- if !state.flags.allow_env {
- return odd_future(permission_denied());
+ if let Err(e) = state.check_env() {
+ return odd_future(e);
}
let builder = &mut FlatBufferBuilder::new();
@@ -399,8 +396,9 @@ fn op_fetch_req(
let id = inner.id();
let url = inner.url().unwrap();
- if !state.flags.allow_net {
- return odd_future(permission_denied());
+ // FIXME use domain (or use this inside check_net)
+ if let Err(e) = state.check_net(url) {
+ return odd_future(e);
}
let url = url.parse::<hyper::Uri>().unwrap();
@@ -513,8 +511,9 @@ fn op_make_temp_dir(
let inner = base.inner_as_make_temp_dir().unwrap();
let cmd_id = base.cmd_id();
- if !state.flags.allow_write {
- return odd_future(permission_denied());
+ // FIXME
+ if let Err(e) = state.check_write("make_temp") {
+ return odd_future(e);
}
let dir = inner.dir().map(PathBuf::from);
@@ -562,10 +561,9 @@ fn op_mkdir(
let mode = inner.mode();
let path = String::from(inner.path().unwrap());
- if !state.flags.allow_write {
- return odd_future(permission_denied());
+ if let Err(e) = state.check_write(&path) {
+ return odd_future(e);
}
-
blocking!(base.sync(), || {
debug!("op_mkdir {}", path);
deno_fs::mkdir(Path::new(&path), mode)?;
@@ -583,8 +581,8 @@ fn op_chmod(
let _mode = inner.mode();
let path = String::from(inner.path().unwrap());
- if !state.flags.allow_write {
- return odd_future(permission_denied());
+ if let Err(e) = state.check_write(&path) {
+ return odd_future(e);
}
blocking!(base.sync(), || {
@@ -766,11 +764,14 @@ fn op_remove(
) -> Box<Op> {
assert_eq!(data.len(), 0);
let inner = base.inner_as_remove().unwrap();
- let path = PathBuf::from(inner.path().unwrap());
+ let path_ = inner.path().unwrap();
+ let path = PathBuf::from(path_);
let recursive = inner.recursive();
- if !state.flags.allow_write {
- return odd_future(permission_denied());
+
+ if let Err(e) = state.check_write(path.to_str().unwrap()) {
+ return odd_future(e);
}
+
blocking!(base.sync(), || {
debug!("op_remove {}", path.display());
let metadata = fs::metadata(&path)?;
@@ -831,10 +832,11 @@ fn op_copy_file(
assert_eq!(data.len(), 0);
let inner = base.inner_as_copy_file().unwrap();
let from = PathBuf::from(inner.from().unwrap());
- let to = PathBuf::from(inner.to().unwrap());
+ let to_ = inner.to().unwrap();
+ let to = PathBuf::from(to_);
- if !state.flags.allow_write {
- return odd_future(permission_denied());
+ if let Err(e) = state.check_write(&to_) {
+ return odd_future(e);
}
debug!("op_copy_file {} {}", from.display(), to.display());
@@ -1015,14 +1017,13 @@ fn op_write_file(
data: &'static mut [u8],
) -> Box<Op> {
let inner = base.inner_as_write_file().unwrap();
-
- if !state.flags.allow_write {
- return odd_future(permission_denied());
- }
-
let filename = String::from(inner.filename().unwrap());
let perm = inner.perm();
+ if let Err(e) = state.check_write(&filename) {
+ return odd_future(e);
+ }
+
blocking!(base.sync(), || -> OpResult {
debug!("op_write_file {} {}", filename, data.len());
deno_fs::write_file(Path::new(&filename), data, perm)?;
@@ -1036,12 +1037,13 @@ fn op_rename(
data: &'static mut [u8],
) -> Box<Op> {
assert_eq!(data.len(), 0);
- if !state.flags.allow_write {
- return odd_future(permission_denied());
- }
let inner = base.inner_as_rename().unwrap();
let oldpath = PathBuf::from(inner.oldpath().unwrap());
- let newpath = PathBuf::from(inner.newpath().unwrap());
+ let newpath_ = inner.newpath().unwrap();
+ let newpath = PathBuf::from(newpath_);
+ if let Err(e) = state.check_write(&newpath_) {
+ return odd_future(e);
+ }
blocking!(base.sync(), || -> OpResult {
debug!("op_rename {} {}", oldpath.display(), newpath.display());
fs::rename(&oldpath, &newpath)?;
@@ -1055,8 +1057,13 @@ fn op_symlink(
data: &'static mut [u8],
) -> Box<Op> {
assert_eq!(data.len(), 0);
- if !state.flags.allow_write {
- return odd_future(permission_denied());
+ let inner = base.inner_as_symlink().unwrap();
+ let oldname = PathBuf::from(inner.oldname().unwrap());
+ let newname_ = inner.newname().unwrap();
+ let newname = PathBuf::from(newname_);
+
+ if let Err(e) = state.check_write(&newname_) {
+ return odd_future(e);
}
// TODO Use type for Windows.
if cfg!(windows) {
@@ -1065,10 +1072,6 @@ fn op_symlink(
"Not implemented".to_string(),
));
}
-
- let inner = base.inner_as_symlink().unwrap();
- let oldname = PathBuf::from(inner.oldname().unwrap());
- let newname = PathBuf::from(inner.newname().unwrap());
blocking!(base.sync(), || -> OpResult {
debug!("op_symlink {} {}", oldname.display(), newname.display());
#[cfg(any(unix))]
@@ -1118,13 +1121,14 @@ fn op_truncate(
) -> Box<Op> {
assert_eq!(data.len(), 0);
- if !state.flags.allow_write {
- return odd_future(permission_denied());
- }
-
let inner = base.inner_as_truncate().unwrap();
let filename = String::from(inner.name().unwrap());
let len = inner.len();
+
+ if let Err(e) = state.check_write(&filename) {
+ return odd_future(e);
+ }
+
blocking!(base.sync(), || {
debug!("op_truncate {} {}", filename, len);
let f = fs::OpenOptions::new().write(true).open(&filename)?;
@@ -1139,8 +1143,8 @@ fn op_listen(
data: &'static mut [u8],
) -> Box<Op> {
assert_eq!(data.len(), 0);
- if !state.flags.allow_net {
- return odd_future(permission_denied());
+ if let Err(e) = state.check_net("listen") {
+ return odd_future(e);
}
let cmd_id = base.cmd_id();
@@ -1205,10 +1209,9 @@ fn op_accept(
data: &'static mut [u8],
) -> Box<Op> {
assert_eq!(data.len(), 0);
- if !state.flags.allow_net {
- return odd_future(permission_denied());
+ if let Err(e) = state.check_net("accept") {
+ return odd_future(e);
}
-
let cmd_id = base.cmd_id();
let inner = base.inner_as_accept().unwrap();
let server_rid = inner.rid();
@@ -1232,10 +1235,9 @@ fn op_dial(
data: &'static mut [u8],
) -> Box<Op> {
assert_eq!(data.len(), 0);
- if !state.flags.allow_net {
- return odd_future(permission_denied());
+ if let Err(e) = state.check_net("dial") {
+ return odd_future(e);
}
-
let cmd_id = base.cmd_id();
let inner = base.inner_as_dial().unwrap();
let network = inner.network().unwrap();