From bbbf9f299c284e24882927d34e13ffad1ed6093e Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Sat, 2 May 2020 18:33:43 -0400 Subject: [PATCH] Deno.chdir should require allow-read not allow-write (#5033) --- cli/js/lib.deno.ns.d.ts | 2 +- cli/js/tests/dir_test.ts | 52 ++++++++++++++++++++++------------------ cli/ops/fs.rs | 2 +- 3 files changed, 31 insertions(+), 25 deletions(-) diff --git a/cli/js/lib.deno.ns.d.ts b/cli/js/lib.deno.ns.d.ts index f2c9fa4bb9..45730acbc6 100644 --- a/cli/js/lib.deno.ns.d.ts +++ b/cli/js/lib.deno.ns.d.ts @@ -140,7 +140,7 @@ declare namespace Deno { * Throws `Deno.errors.PermissionDenied` if the user does not have access * rights * - * Requires --allow-write. + * Requires --allow-read. */ export function chdir(directory: string): void; diff --git a/cli/js/tests/dir_test.ts b/cli/js/tests/dir_test.ts index 09236fa22f..3686471f1f 100644 --- a/cli/js/tests/dir_test.ts +++ b/cli/js/tests/dir_test.ts @@ -5,20 +5,23 @@ unitTest(function dirCwdNotNull(): void { assert(Deno.cwd() != null); }); -unitTest({ perms: { write: true } }, function dirCwdChdirSuccess(): void { - const initialdir = Deno.cwd(); - const path = Deno.makeTempDirSync(); - Deno.chdir(path); - const current = Deno.cwd(); - if (Deno.build.os === "darwin") { - assertEquals(current, "/private" + path); - } else { - assertEquals(current, path); +unitTest( + { perms: { read: true, write: true } }, + function dirCwdChdirSuccess(): void { + const initialdir = Deno.cwd(); + const path = Deno.makeTempDirSync(); + Deno.chdir(path); + const current = Deno.cwd(); + if (Deno.build.os === "darwin") { + assertEquals(current, "/private" + path); + } else { + assertEquals(current, path); + } + Deno.chdir(initialdir); } - Deno.chdir(initialdir); -}); +); -unitTest({ perms: { write: true } }, function dirCwdError(): void { +unitTest({ perms: { read: true, write: true } }, function dirCwdError(): void { // excluding windows since it throws resource busy, while removeSync if (["linux", "darwin"].includes(Deno.build.os)) { const initialdir = Deno.cwd(); @@ -39,16 +42,19 @@ unitTest({ perms: { write: true } }, function dirCwdError(): void { } }); -unitTest({ perms: { write: true } }, function dirChdirError(): void { - const path = Deno.makeTempDirSync() + "test"; - try { - Deno.chdir(path); - throw Error("directory not available, should throw error"); - } catch (err) { - if (err instanceof Deno.errors.NotFound) { - assert(err.name === "NotFound"); - } else { - throw Error("raised different exception"); +unitTest( + { perms: { read: true, write: true } }, + function dirChdirError(): void { + const path = Deno.makeTempDirSync() + "test"; + try { + Deno.chdir(path); + throw Error("directory not available, should throw error"); + } catch (err) { + if (err instanceof Deno.errors.NotFound) { + assert(err.name === "NotFound"); + } else { + throw Error("raised different exception"); + } } } -}); +); diff --git a/cli/ops/fs.rs b/cli/ops/fs.rs index 55ee1afa39..cccf32c12b 100644 --- a/cli/ops/fs.rs +++ b/cli/ops/fs.rs @@ -254,7 +254,7 @@ fn op_chdir( ) -> Result { let args: ChdirArgs = serde_json::from_value(args)?; let d = PathBuf::from(&args.directory); - state.check_write(&d)?; + state.check_read(&d)?; set_current_dir(&d)?; Ok(JsonOp::Sync(json!({}))) }