mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
Fix deno.open permission check (#1336)
This commit is contained in:
parent
40d6daf824
commit
2cb52cc4d1
4 changed files with 54 additions and 7 deletions
12
js/deno.ts
12
js/deno.ts
|
@ -4,7 +4,17 @@
|
||||||
/// <amd-module name="deno"/>
|
/// <amd-module name="deno"/>
|
||||||
export { env, exit } from "./os";
|
export { env, exit } from "./os";
|
||||||
export { chdir, cwd } from "./dir";
|
export { chdir, cwd } from "./dir";
|
||||||
export { File, open, stdin, stdout, stderr, read, write, close } from "./files";
|
export {
|
||||||
|
File,
|
||||||
|
open,
|
||||||
|
stdin,
|
||||||
|
stdout,
|
||||||
|
stderr,
|
||||||
|
read,
|
||||||
|
write,
|
||||||
|
close,
|
||||||
|
OpenMode
|
||||||
|
} from "./files";
|
||||||
export {
|
export {
|
||||||
copy,
|
copy,
|
||||||
toAsyncIterator,
|
toAsyncIterator,
|
||||||
|
|
|
@ -29,7 +29,7 @@ export const stdout = new File(1);
|
||||||
/** An instance of `File` for stderr. */
|
/** An instance of `File` for stderr. */
|
||||||
export const stderr = new File(2);
|
export const stderr = new File(2);
|
||||||
|
|
||||||
type OpenMode =
|
export type OpenMode =
|
||||||
/** Read-only. Default. Starts at beginning of file. */
|
/** Read-only. Default. Starts at beginning of file. */
|
||||||
| "r"
|
| "r"
|
||||||
/** Read-write. Start at beginning of file. */
|
/** Read-write. Start at beginning of file. */
|
||||||
|
|
|
@ -30,10 +30,26 @@ test(async function filesToAsyncIterator() {
|
||||||
assertEqual(totalSize, 12);
|
assertEqual(totalSize, 12);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testPerm({ write: false }, async function writePermFailure() {
|
||||||
|
const filename = "tests/hello.txt";
|
||||||
|
const writeModes: deno.OpenMode[] = ["r+", "w", "w+", "a", "a+", "x", "x+"];
|
||||||
|
for (const mode of writeModes) {
|
||||||
|
let err;
|
||||||
|
try {
|
||||||
|
await deno.open(filename, mode);
|
||||||
|
} catch (e) {
|
||||||
|
err = e;
|
||||||
|
}
|
||||||
|
assert(!!err);
|
||||||
|
assertEqual(err.kind, deno.ErrorKind.PermissionDenied);
|
||||||
|
assertEqual(err.name, "PermissionDenied");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
testPerm({ write: true }, async function createFile() {
|
testPerm({ write: true }, async function createFile() {
|
||||||
const tempDir = await deno.makeTempDir();
|
const tempDir = await deno.makeTempDir();
|
||||||
const filename = tempDir + "/test.txt";
|
const filename = tempDir + "/test.txt";
|
||||||
let f = await deno.open(filename, "w");
|
const f = await deno.open(filename, "w");
|
||||||
let fileInfo = deno.statSync(filename);
|
let fileInfo = deno.statSync(filename);
|
||||||
assert(fileInfo.isFile());
|
assert(fileInfo.isFile());
|
||||||
assert(fileInfo.len === 0);
|
assert(fileInfo.len === 0);
|
||||||
|
@ -88,7 +104,7 @@ testPerm({ write: true }, async function openModeWriteRead() {
|
||||||
const filename = tempDir + "hello.txt";
|
const filename = tempDir + "hello.txt";
|
||||||
const data = encoder.encode("Hello world!\n");
|
const data = encoder.encode("Hello world!\n");
|
||||||
|
|
||||||
let file = await deno.open(filename, "w+");
|
const file = await deno.open(filename, "w+");
|
||||||
// assert file was created
|
// assert file was created
|
||||||
let fileInfo = deno.statSync(filename);
|
let fileInfo = deno.statSync(filename);
|
||||||
assert(fileInfo.isFile());
|
assert(fileInfo.isFile());
|
||||||
|
|
27
src/ops.rs
27
src/ops.rs
|
@ -576,15 +576,15 @@ fn op_chmod(
|
||||||
}
|
}
|
||||||
|
|
||||||
fn op_open(
|
fn op_open(
|
||||||
_state: &IsolateState,
|
state: &IsolateState,
|
||||||
base: &msg::Base,
|
base: &msg::Base,
|
||||||
data: libdeno::deno_buf,
|
data: libdeno::deno_buf,
|
||||||
) -> Box<Op> {
|
) -> Box<Op> {
|
||||||
assert_eq!(data.len(), 0);
|
assert_eq!(data.len(), 0);
|
||||||
let cmd_id = base.cmd_id();
|
let cmd_id = base.cmd_id();
|
||||||
let inner = base.inner_as_open().unwrap();
|
let inner = base.inner_as_open().unwrap();
|
||||||
let filename = PathBuf::from(inner.filename().unwrap());
|
let filename_str = inner.filename().unwrap();
|
||||||
// let perm = inner.perm();
|
let filename = PathBuf::from(&filename_str);
|
||||||
let mode = inner.mode().unwrap();
|
let mode = inner.mode().unwrap();
|
||||||
|
|
||||||
let mut open_options = tokio::fs::OpenOptions::new();
|
let mut open_options = tokio::fs::OpenOptions::new();
|
||||||
|
@ -594,12 +594,21 @@ fn op_open(
|
||||||
open_options.read(true);
|
open_options.read(true);
|
||||||
}
|
}
|
||||||
"r+" => {
|
"r+" => {
|
||||||
|
if let Err(e) = state.check_write(&filename_str) {
|
||||||
|
return odd_future(e);
|
||||||
|
}
|
||||||
open_options.read(true).write(true);
|
open_options.read(true).write(true);
|
||||||
}
|
}
|
||||||
"w" => {
|
"w" => {
|
||||||
|
if let Err(e) = state.check_write(&filename_str) {
|
||||||
|
return odd_future(e);
|
||||||
|
}
|
||||||
open_options.create(true).write(true).truncate(true);
|
open_options.create(true).write(true).truncate(true);
|
||||||
}
|
}
|
||||||
"w+" => {
|
"w+" => {
|
||||||
|
if let Err(e) = state.check_write(&filename_str) {
|
||||||
|
return odd_future(e);
|
||||||
|
}
|
||||||
open_options
|
open_options
|
||||||
.read(true)
|
.read(true)
|
||||||
.create(true)
|
.create(true)
|
||||||
|
@ -607,15 +616,27 @@ fn op_open(
|
||||||
.truncate(true);
|
.truncate(true);
|
||||||
}
|
}
|
||||||
"a" => {
|
"a" => {
|
||||||
|
if let Err(e) = state.check_write(&filename_str) {
|
||||||
|
return odd_future(e);
|
||||||
|
}
|
||||||
open_options.create(true).append(true);
|
open_options.create(true).append(true);
|
||||||
}
|
}
|
||||||
"a+" => {
|
"a+" => {
|
||||||
|
if let Err(e) = state.check_write(&filename_str) {
|
||||||
|
return odd_future(e);
|
||||||
|
}
|
||||||
open_options.read(true).create(true).append(true);
|
open_options.read(true).create(true).append(true);
|
||||||
}
|
}
|
||||||
"x" => {
|
"x" => {
|
||||||
|
if let Err(e) = state.check_write(&filename_str) {
|
||||||
|
return odd_future(e);
|
||||||
|
}
|
||||||
open_options.create_new(true).write(true);
|
open_options.create_new(true).write(true);
|
||||||
}
|
}
|
||||||
"x+" => {
|
"x+" => {
|
||||||
|
if let Err(e) = state.check_write(&filename_str) {
|
||||||
|
return odd_future(e);
|
||||||
|
}
|
||||||
open_options.create_new(true).read(true).write(true);
|
open_options.create_new(true).read(true).write(true);
|
||||||
}
|
}
|
||||||
&_ => {
|
&_ => {
|
||||||
|
|
Loading…
Add table
Reference in a new issue