summaryrefslogtreecommitdiff
path: root/runtime/ops/fs.rs
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/ops/fs.rs')
-rw-r--r--runtime/ops/fs.rs244
1 files changed, 103 insertions, 141 deletions
diff --git a/runtime/ops/fs.rs b/runtime/ops/fs.rs
index 12665ab04..87bb090c3 100644
--- a/runtime/ops/fs.rs
+++ b/runtime/ops/fs.rs
@@ -3,18 +3,17 @@
use super::io::StdFileResource;
use super::utils::into_string;
use crate::fs_util::canonicalize_path;
-use crate::permissions::Permissions;
+use crate::permissions::PermissionsContainer;
use deno_core::error::custom_error;
use deno_core::error::type_error;
use deno_core::error::AnyError;
use deno_core::op;
use deno_core::CancelFuture;
use deno_core::CancelHandle;
-use deno_core::ZeroCopyBuf;
-
use deno_core::Extension;
use deno_core::OpState;
use deno_core::ResourceId;
+use deno_core::ZeroCopyBuf;
use deno_crypto::rand::thread_rng;
use deno_crypto::rand::Rng;
use log::debug;
@@ -144,11 +143,11 @@ fn open_helper(
let _ = mode; // avoid unused warning
}
- let permissions = state.borrow_mut::<Permissions>();
+ let permissions = state.borrow_mut::<PermissionsContainer>();
match options {
None => {
- permissions.read.check(&path, Some(api_name))?;
+ permissions.check_read(&path, api_name)?;
open_options
.read(true)
.create(false)
@@ -159,11 +158,11 @@ fn open_helper(
}
Some(options) => {
if options.read {
- permissions.read.check(&path, Some(api_name))?;
+ permissions.check_read(&path, api_name)?;
}
if options.write || options.append {
- permissions.write.check(&path, Some(api_name))?;
+ permissions.check_write(&path, api_name)?;
}
open_options
@@ -540,9 +539,8 @@ fn op_umask(state: &mut OpState, mask: Option<u32>) -> Result<u32, AnyError> {
fn op_chdir(state: &mut OpState, directory: String) -> Result<(), AnyError> {
let d = PathBuf::from(&directory);
state
- .borrow_mut::<Permissions>()
- .read
- .check(&d, Some("Deno.chdir()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_read(&d, "Deno.chdir()")?;
set_current_dir(&d).map_err(|err| {
Error::new(err.kind(), format!("{}, chdir '{}'", err, directory))
})?;
@@ -562,9 +560,8 @@ fn op_mkdir_sync(state: &mut OpState, args: MkdirArgs) -> Result<(), AnyError> {
let path = Path::new(&args.path).to_path_buf();
let mode = args.mode.unwrap_or(0o777) & 0o777;
state
- .borrow_mut::<Permissions>()
- .write
- .check(&path, Some("Deno.mkdirSync()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(&path, "Deno.mkdirSync()")?;
debug!("op_mkdir {} {:o} {}", path.display(), mode, args.recursive);
let mut builder = std::fs::DirBuilder::new();
builder.recursive(args.recursive);
@@ -590,9 +587,8 @@ async fn op_mkdir_async(
{
let mut state = state.borrow_mut();
state
- .borrow_mut::<Permissions>()
- .write
- .check(&path, Some("Deno.mkdir()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(&path, "Deno.mkdir()")?;
}
tokio::task::spawn_blocking(move || {
@@ -623,9 +619,8 @@ fn op_chmod_sync(
let mode = mode & 0o777;
state
- .borrow_mut::<Permissions>()
- .write
- .check(path, Some("Deno.chmodSync()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(path, "Deno.chmodSync()")?;
raw_chmod(path, mode)
}
@@ -641,9 +636,8 @@ async fn op_chmod_async(
{
let mut state = state.borrow_mut();
state
- .borrow_mut::<Permissions>()
- .write
- .check(&path, Some("Deno.chmod()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(&path, "Deno.chmod()")?;
}
tokio::task::spawn_blocking(move || raw_chmod(&path, mode))
@@ -680,9 +674,8 @@ fn op_chown_sync(
) -> Result<(), AnyError> {
let path = Path::new(&path).to_path_buf();
state
- .borrow_mut::<Permissions>()
- .write
- .check(&path, Some("Deno.chownSync()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(&path, "Deno.chownSync()")?;
#[cfg(unix)]
{
use crate::errors::get_nix_error_class;
@@ -716,9 +709,8 @@ async fn op_chown_async(
{
let mut state = state.borrow_mut();
state
- .borrow_mut::<Permissions>()
- .write
- .check(&path, Some("Deno.chown()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(&path, "Deno.chown()")?;
}
tokio::task::spawn_blocking(move || {
@@ -753,9 +745,8 @@ fn op_remove_sync(
let path = PathBuf::from(&path);
state
- .borrow_mut::<Permissions>()
- .write
- .check(&path, Some("Deno.removeSync()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(&path, "Deno.removeSync()")?;
#[cfg(not(unix))]
use std::os::windows::prelude::MetadataExt;
@@ -802,9 +793,8 @@ async fn op_remove_async(
{
let mut state = state.borrow_mut();
state
- .borrow_mut::<Permissions>()
- .write
- .check(&path, Some("Deno.remove()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(&path, "Deno.remove()")?;
}
tokio::task::spawn_blocking(move || {
@@ -854,13 +844,9 @@ fn op_copy_file_sync(
let from_path = PathBuf::from(&from);
let to_path = PathBuf::from(&to);
- let permissions = state.borrow_mut::<Permissions>();
- permissions
- .read
- .check(&from_path, Some("Deno.copyFileSync()"))?;
- permissions
- .write
- .check(&to_path, Some("Deno.copyFileSync()"))?;
+ let permissions = state.borrow_mut::<PermissionsContainer>();
+ permissions.check_read(&from_path, "Deno.copyFileSync()")?;
+ permissions.check_write(&to_path, "Deno.copyFileSync()")?;
// On *nix, Rust reports non-existent `from` as ErrorKind::InvalidInput
// See https://github.com/rust-lang/rust/issues/54800
@@ -955,9 +941,9 @@ async fn op_copy_file_async(
{
let mut state = state.borrow_mut();
- let permissions = state.borrow_mut::<Permissions>();
- permissions.read.check(&from, Some("Deno.copyFile()"))?;
- permissions.write.check(&to, Some("Deno.copyFile()"))?;
+ let permissions = state.borrow_mut::<PermissionsContainer>();
+ permissions.check_read(&from, "Deno.copyFile()")?;
+ permissions.check_write(&to, "Deno.copyFile()")?;
}
tokio::task::spawn_blocking(move || {
@@ -1116,9 +1102,8 @@ fn op_stat_sync(
) -> Result<(), AnyError> {
let path = PathBuf::from(&path);
state
- .borrow_mut::<Permissions>()
- .read
- .check(&path, Some("Deno.statSync()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_read(&path, "Deno.statSync()")?;
let err_mapper = |err: Error| {
Error::new(err.kind(), format!("{}, stat '{}'", err, path.display()))
};
@@ -1145,9 +1130,8 @@ async fn op_stat_async(
{
let mut state = state.borrow_mut();
state
- .borrow_mut::<Permissions>()
- .read
- .check(&path, Some("Deno.stat()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_read(&path, "Deno.stat()")?;
}
tokio::task::spawn_blocking(move || {
@@ -1173,10 +1157,10 @@ fn op_realpath_sync(
) -> Result<String, AnyError> {
let path = PathBuf::from(&path);
- let permissions = state.borrow_mut::<Permissions>();
- permissions.read.check(&path, Some("Deno.realPathSync()"))?;
+ let permissions = state.borrow_mut::<PermissionsContainer>();
+ permissions.check_read(&path, "Deno.realPathSync()")?;
if path.is_relative() {
- permissions.read.check_blind(
+ permissions.check_read_blind(
&current_dir()?,
"CWD",
"Deno.realPathSync()",
@@ -1200,10 +1184,10 @@ async fn op_realpath_async(
{
let mut state = state.borrow_mut();
- let permissions = state.borrow_mut::<Permissions>();
- permissions.read.check(&path, Some("Deno.realPath()"))?;
+ let permissions = state.borrow_mut::<PermissionsContainer>();
+ permissions.check_read(&path, "Deno.realPath()")?;
if path.is_relative() {
- permissions.read.check_blind(
+ permissions.check_read_blind(
&current_dir()?,
"CWD",
"Deno.realPath()",
@@ -1240,9 +1224,8 @@ fn op_read_dir_sync(
let path = PathBuf::from(&path);
state
- .borrow_mut::<Permissions>()
- .read
- .check(&path, Some("Deno.readDirSync()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_read(&path, "Deno.readDirSync()")?;
debug!("op_read_dir_sync {}", path.display());
let err_mapper = |err: Error| {
@@ -1284,9 +1267,8 @@ async fn op_read_dir_async(
{
let mut state = state.borrow_mut();
state
- .borrow_mut::<Permissions>()
- .read
- .check(&path, Some("Deno.readDir()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_read(&path, "Deno.readDir()")?;
}
tokio::task::spawn_blocking(move || {
debug!("op_read_dir_async {}", path.display());
@@ -1332,16 +1314,10 @@ fn op_rename_sync(
let oldpath = PathBuf::from(&oldpath);
let newpath = PathBuf::from(&newpath);
- let permissions = state.borrow_mut::<Permissions>();
- permissions
- .read
- .check(&oldpath, Some("Deno.renameSync()"))?;
- permissions
- .write
- .check(&oldpath, Some("Deno.renameSync()"))?;
- permissions
- .write
- .check(&newpath, Some("Deno.renameSync()"))?;
+ let permissions = state.borrow_mut::<PermissionsContainer>();
+ permissions.check_read(&oldpath, "Deno.renameSync()")?;
+ permissions.check_write(&oldpath, "Deno.renameSync()")?;
+ permissions.check_write(&newpath, "Deno.renameSync()")?;
let err_mapper = |err: Error| {
Error::new(
@@ -1368,10 +1344,10 @@ async fn op_rename_async(
let newpath = PathBuf::from(&newpath);
{
let mut state = state.borrow_mut();
- let permissions = state.borrow_mut::<Permissions>();
- permissions.read.check(&oldpath, Some("Deno.rename()"))?;
- permissions.write.check(&oldpath, Some("Deno.rename()"))?;
- permissions.write.check(&newpath, Some("Deno.rename()"))?;
+ let permissions = state.borrow_mut::<PermissionsContainer>();
+ permissions.check_read(&oldpath, "Deno.rename()")?;
+ permissions.check_write(&oldpath, "Deno.rename()")?;
+ permissions.check_write(&newpath, "Deno.rename()")?;
}
tokio::task::spawn_blocking(move || {
let err_mapper = |err: Error| {
@@ -1401,11 +1377,11 @@ fn op_link_sync(
let oldpath = PathBuf::from(&oldpath);
let newpath = PathBuf::from(&newpath);
- let permissions = state.borrow_mut::<Permissions>();
- permissions.read.check(&oldpath, Some("Deno.linkSync()"))?;
- permissions.write.check(&oldpath, Some("Deno.linkSync()"))?;
- permissions.read.check(&newpath, Some("Deno.linkSync()"))?;
- permissions.write.check(&newpath, Some("Deno.linkSync()"))?;
+ let permissions = state.borrow_mut::<PermissionsContainer>();
+ permissions.check_read(&oldpath, "Deno.linkSync()")?;
+ permissions.check_write(&oldpath, "Deno.linkSync()")?;
+ permissions.check_read(&newpath, "Deno.linkSync()")?;
+ permissions.check_write(&newpath, "Deno.linkSync()")?;
let err_mapper = |err: Error| {
Error::new(
@@ -1433,11 +1409,11 @@ async fn op_link_async(
{
let mut state = state.borrow_mut();
- let permissions = state.borrow_mut::<Permissions>();
- permissions.read.check(&oldpath, Some("Deno.link()"))?;
- permissions.write.check(&oldpath, Some("Deno.link()"))?;
- permissions.read.check(&newpath, Some("Deno.link()"))?;
- permissions.write.check(&newpath, Some("Deno.link()"))?;
+ let permissions = state.borrow_mut::<PermissionsContainer>();
+ permissions.check_read(&oldpath, "Deno.link()")?;
+ permissions.check_write(&oldpath, "Deno.link()")?;
+ permissions.check_read(&newpath, "Deno.link()")?;
+ permissions.check_write(&newpath, "Deno.link()")?;
}
tokio::task::spawn_blocking(move || {
@@ -1470,13 +1446,11 @@ fn op_symlink_sync(
let newpath = PathBuf::from(&newpath);
state
- .borrow_mut::<Permissions>()
- .write
- .check_all(Some("Deno.symlinkSync()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write_all("Deno.symlinkSync()")?;
state
- .borrow_mut::<Permissions>()
- .read
- .check_all(Some("Deno.symlinkSync()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_read_all("Deno.symlinkSync()")?;
let err_mapper = |err: Error| {
Error::new(
@@ -1536,13 +1510,11 @@ async fn op_symlink_async(
{
let mut state = state.borrow_mut();
state
- .borrow_mut::<Permissions>()
- .write
- .check_all(Some("Deno.symlink()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write_all("Deno.symlink()")?;
state
- .borrow_mut::<Permissions>()
- .read
- .check_all(Some("Deno.symlink()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_read_all("Deno.symlink()")?;
}
tokio::task::spawn_blocking(move || {
@@ -1602,9 +1574,8 @@ fn op_read_link_sync(
let path = PathBuf::from(&path);
state
- .borrow_mut::<Permissions>()
- .read
- .check(&path, Some("Deno.readLink()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_read(&path, "Deno.readLink()")?;
debug!("op_read_link_value {}", path.display());
let err_mapper = |err: Error| {
@@ -1629,9 +1600,8 @@ async fn op_read_link_async(
{
let mut state = state.borrow_mut();
state
- .borrow_mut::<Permissions>()
- .read
- .check(&path, Some("Deno.readLink()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_read(&path, "Deno.readLink()")?;
}
tokio::task::spawn_blocking(move || {
debug!("op_read_link_async {}", path.display());
@@ -1688,9 +1658,8 @@ fn op_truncate_sync(
let path = PathBuf::from(&path);
state
- .borrow_mut::<Permissions>()
- .write
- .check(&path, Some("Deno.truncateSync()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(&path, "Deno.truncateSync()")?;
debug!("op_truncate_sync {} {}", path.display(), len);
let err_mapper = |err: Error| {
@@ -1718,9 +1687,8 @@ async fn op_truncate_async(
{
let mut state = state.borrow_mut();
state
- .borrow_mut::<Permissions>()
- .write
- .check(&path, Some("Deno.truncate()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(&path, "Deno.truncate()")?;
}
tokio::task::spawn_blocking(move || {
debug!("op_truncate_async {} {}", path.display(), len);
@@ -1803,9 +1771,9 @@ fn op_make_temp_dir_sync(
let prefix = args.prefix.map(String::from);
let suffix = args.suffix.map(String::from);
- state.borrow_mut::<Permissions>().write.check(
+ state.borrow_mut::<PermissionsContainer>().check_write(
dir.clone().unwrap_or_else(temp_dir).as_path(),
- Some("Deno.makeTempDirSync()"),
+ "Deno.makeTempDirSync()",
)?;
// TODO(piscisaureus): use byte vector for paths, not a string.
@@ -1833,9 +1801,9 @@ async fn op_make_temp_dir_async(
let suffix = args.suffix.map(String::from);
{
let mut state = state.borrow_mut();
- state.borrow_mut::<Permissions>().write.check(
+ state.borrow_mut::<PermissionsContainer>().check_write(
dir.clone().unwrap_or_else(temp_dir).as_path(),
- Some("Deno.makeTempDir()"),
+ "Deno.makeTempDir()",
)?;
}
tokio::task::spawn_blocking(move || {
@@ -1866,9 +1834,9 @@ fn op_make_temp_file_sync(
let prefix = args.prefix.map(String::from);
let suffix = args.suffix.map(String::from);
- state.borrow_mut::<Permissions>().write.check(
+ state.borrow_mut::<PermissionsContainer>().check_write(
dir.clone().unwrap_or_else(temp_dir).as_path(),
- Some("Deno.makeTempFileSync()"),
+ "Deno.makeTempFileSync()",
)?;
// TODO(piscisaureus): use byte vector for paths, not a string.
@@ -1896,9 +1864,9 @@ async fn op_make_temp_file_async(
let suffix = args.suffix.map(String::from);
{
let mut state = state.borrow_mut();
- state.borrow_mut::<Permissions>().write.check(
+ state.borrow_mut::<PermissionsContainer>().check_write(
dir.clone().unwrap_or_else(temp_dir).as_path(),
- Some("Deno.makeTempFile()"),
+ "Deno.makeTempFile()",
)?;
}
tokio::task::spawn_blocking(move || {
@@ -1973,9 +1941,8 @@ fn op_utime_sync(
let mtime = filetime::FileTime::from_unix_time(mtime_secs, mtime_nanos);
state
- .borrow_mut::<Permissions>()
- .write
- .check(&path, Some("Deno.utime()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(&path, "Deno.utime()")?;
filetime::set_file_times(&path, atime, mtime).map_err(|err| {
Error::new(err.kind(), format!("{}, utime '{}'", err, path.display()))
})?;
@@ -1997,9 +1964,8 @@ async fn op_utime_async(
state
.borrow_mut()
- .borrow_mut::<Permissions>()
- .write
- .check(&path, Some("Deno.utime()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_write(&path, "Deno.utime()")?;
tokio::task::spawn_blocking(move || {
filetime::set_file_times(&path, atime, mtime).map_err(|err| {
@@ -2014,11 +1980,9 @@ async fn op_utime_async(
#[op]
fn op_cwd(state: &mut OpState) -> Result<String, AnyError> {
let path = current_dir()?;
- state.borrow_mut::<Permissions>().read.check_blind(
- &path,
- "CWD",
- "Deno.cwd()",
- )?;
+ state
+ .borrow_mut::<PermissionsContainer>()
+ .check_read_blind(&path, "CWD", "Deno.cwd()")?;
let path_str = into_string(path.into_os_string())?;
Ok(path_str)
}
@@ -2028,9 +1992,10 @@ fn op_readfile_sync(
state: &mut OpState,
path: String,
) -> Result<ZeroCopyBuf, AnyError> {
- let permissions = state.borrow_mut::<Permissions>();
let path = Path::new(&path);
- permissions.read.check(path, Some("Deno.readFileSync()"))?;
+ state
+ .borrow_mut::<PermissionsContainer>()
+ .check_read(path, "Deno.readFileSync()")?;
Ok(std::fs::read(path)?.into())
}
@@ -2039,11 +2004,10 @@ fn op_readfile_text_sync(
state: &mut OpState,
path: String,
) -> Result<String, AnyError> {
- let permissions = state.borrow_mut::<Permissions>();
let path = Path::new(&path);
- permissions
- .read
- .check(path, Some("Deno.readTextFileSync()"))?;
+ state
+ .borrow_mut::<PermissionsContainer>()
+ .check_read(path, "Deno.readTextFileSync()")?;
Ok(string_from_utf8_lossy(std::fs::read(path)?))
}
@@ -2057,9 +2021,8 @@ async fn op_readfile_async(
let path = Path::new(&path);
let mut state = state.borrow_mut();
state
- .borrow_mut::<Permissions>()
- .read
- .check(path, Some("Deno.readFile()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_read(path, "Deno.readFile()")?;
}
let fut = tokio::task::spawn_blocking(move || {
let path = Path::new(&path);
@@ -2087,9 +2050,8 @@ async fn op_readfile_text_async(
let path = Path::new(&path);
let mut state = state.borrow_mut();
state
- .borrow_mut::<Permissions>()
- .read
- .check(path, Some("Deno.readTextFile()"))?;
+ .borrow_mut::<PermissionsContainer>()
+ .check_read(path, "Deno.readTextFile()")?;
}
let fut = tokio::task::spawn_blocking(move || {
let path = Path::new(&path);