diff options
author | Aaron Power <theaaronepower@gmail.com> | 2018-08-31 12:51:12 +0100 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2018-08-31 13:18:24 -0400 |
commit | f131445a46555f1634aecae0fc1d4979b4cefa6d (patch) | |
tree | fb9847c7f1b6aebc98bc8ef788366dd90b3f9b12 /src | |
parent | 45dafe15ee87b34d0c3c9b4bc72905c176514051 (diff) |
Implemented deno.env and refactored flags.rs
Diffstat (limited to 'src')
-rw-r--r-- | src/flags.rs | 49 | ||||
-rw-r--r-- | src/handlers.rs | 71 | ||||
-rw-r--r-- | src/msg.fbs | 19 |
3 files changed, 106 insertions, 33 deletions
diff --git a/src/flags.rs b/src/flags.rs index 7149ab19f..851bacb6b 100644 --- a/src/flags.rs +++ b/src/flags.rs @@ -11,7 +11,7 @@ macro_rules! svec { ($($x:expr),*) => (vec![$($x.to_string()),*]); } -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Default)] pub struct DenoFlags { pub help: bool, pub log_debug: bool, @@ -19,6 +19,7 @@ pub struct DenoFlags { pub reload: bool, pub allow_write: bool, pub allow_net: bool, + pub allow_env: bool, } pub fn print_usage() { @@ -27,6 +28,7 @@ pub fn print_usage() { --allow-write Allow file system write access. --allow-net Allow network access. +--allow-env Allow environment access. -v or --version Print the version. -r or --reload Reload cached remote resources. -D or --log-debug Log debug output. @@ -37,14 +39,7 @@ pub fn print_usage() { // Parses flags for deno. This does not do v8_set_flags() - call that separately. pub fn set_flags(args: Vec<String>) -> (DenoFlags, Vec<String>) { - let mut flags = DenoFlags { - help: false, - version: false, - reload: false, - log_debug: false, - allow_write: false, - allow_net: false, - }; + let mut flags = DenoFlags::default(); let mut rest = Vec::new(); for a in &args { match a.as_str() { @@ -52,6 +47,7 @@ pub fn set_flags(args: Vec<String>) -> (DenoFlags, Vec<String>) { "-D" | "--log-debug" => flags.log_debug = true, "-v" | "--version" => flags.version = true, "-r" | "--reload" => flags.reload = true, + "--allow-env" => flags.allow_env = true, "--allow-write" => flags.allow_write = true, "--allow-net" => flags.allow_net = true, _ => rest.push(a.clone()), @@ -64,15 +60,10 @@ pub fn set_flags(args: Vec<String>) -> (DenoFlags, Vec<String>) { #[test] fn test_set_flags_1() { let (flags, rest) = set_flags(svec!["deno", "--version"]); - assert!(rest == svec!["deno"]); - assert!( - flags == DenoFlags { - help: false, - log_debug: false, + assert_eq!(rest, svec!["deno"]); + assert_eq!(flags, DenoFlags { version: true, - reload: false, - allow_write: false, - allow_net: false, + ..DenoFlags::default() } ); } @@ -80,15 +71,11 @@ fn test_set_flags_1() { #[test] fn test_set_flags_2() { let (flags, rest) = set_flags(svec!["deno", "-r", "-D", "script.ts"]); - assert!(rest == svec!["deno", "script.ts"]); - assert!( - flags == DenoFlags { - help: false, + assert_eq!(rest, svec!["deno", "script.ts"]); + assert_eq!(flags, DenoFlags { log_debug: true, - version: false, reload: true, - allow_write: false, - allow_net: false, + ..DenoFlags::default() } ); } @@ -97,15 +84,11 @@ fn test_set_flags_2() { fn test_set_flags_3() { let (flags, rest) = set_flags(svec!["deno", "-r", "script.ts", "--allow-write"]); - assert!(rest == svec!["deno", "script.ts"]); - assert!( - flags == DenoFlags { - help: false, - log_debug: false, - version: false, + assert_eq!(rest, svec!["deno", "script.ts"]); + assert_eq!(flags, DenoFlags { reload: true, allow_write: true, - allow_net: false, + ..DenoFlags::default() } ); } @@ -142,13 +125,13 @@ fn parse_core_args(args: Vec<String>) -> (Vec<String>, Vec<String>) { fn test_parse_core_args_1() { let js_args = parse_core_args(vec!["deno".to_string(), "--v8-options".to_string()]); - assert!(js_args == (vec!["deno".to_string(), "--help".to_string()], vec![])); + assert_eq!(js_args, (vec!["deno".to_string(), "--help".to_string()], vec![])); } #[test] fn test_parse_core_args_2() { let js_args = parse_core_args(vec!["deno".to_string(), "--help".to_string()]); - assert!(js_args == (vec!["deno".to_string()], vec!["--help".to_string()])); + assert_eq!(js_args, (vec!["deno".to_string()], vec!["--help".to_string()])); } // Pass the command line arguments to v8. diff --git a/src/handlers.rs b/src/handlers.rs index 8d321c46f..407ecf5c8 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -45,6 +45,7 @@ pub extern "C" fn msg_from_js(d: *const DenoC, buf: deno_buf) { let output_code = msg.output_code().unwrap(); handle_code_cache(d, &mut builder, filename, source_code, output_code) } + msg::Any::Environ => handle_env(d, &mut builder), msg::Any::FetchReq => { // TODO base.msg_as_FetchReq(); let msg = msg::FetchReq::init_from_table(base.msg().unwrap()); @@ -79,6 +80,13 @@ pub extern "C" fn msg_from_js(d: *const DenoC, buf: deno_buf) { let filename = msg.filename().unwrap(); handle_read_file_sync(d, &mut builder, filename) } + msg::Any::SetEnv => { + // TODO base.msg_as_SetEnv(); + let msg = msg::SetEnv::init_from_table(base.msg().unwrap()); + let key = msg.key().unwrap(); + let value = msg.value().unwrap(); + handle_set_env(d, &mut builder, key, value) + } msg::Any::StatSync => { // TODO base.msg_as_StatSync(); let msg = msg::StatSync::init_from_table(base.msg().unwrap()); @@ -244,6 +252,69 @@ fn handle_code_cache( Ok(null_buf()) // null response indicates success. } +fn handle_set_env( + d: *const DenoC, + _builder: &mut FlatBufferBuilder, + key: &str, + value: &str, +) -> HandlerResult { + let deno = from_c(d); + if !deno.flags.allow_env { + let err = std::io::Error::new( + std::io::ErrorKind::PermissionDenied, + "allow_env is off.", + ); + return Err(err.into()); + } + + std::env::set_var(key, value); + Ok(null_buf()) +} + +fn handle_env( + d: *const DenoC, + builder: &mut FlatBufferBuilder, +) -> HandlerResult { + let deno = from_c(d); + if !deno.flags.allow_env { + let err = std::io::Error::new( + std::io::ErrorKind::PermissionDenied, + "allow_env is off.", + ); + return Err(err.into()); + } + + let vars: Vec<_> = std::env::vars().map(|(key, value)| { + let key = builder.create_string(&key); + let value = builder.create_string(&value); + + msg::EnvPair::create(builder, &msg::EnvPairArgs { + key: Some(key), + value: Some(value), + ..Default::default() + }) + }).collect(); + + let tables = builder.create_vector_of_reverse_offsets(&vars); + + let msg = msg::EnvironRes::create( + builder, + &msg::EnvironResArgs { + map: Some(tables), + ..Default::default() + }, + ); + + Ok(create_msg( + builder, + &msg::BaseArgs { + msg: Some(flatbuffers::Offset::new(msg.value())), + msg_type: msg::Any::EnvironRes, + ..Default::default() + }, + )) +} + fn handle_fetch_req( d: *const DenoC, _builder: &mut FlatBufferBuilder, diff --git a/src/msg.fbs b/src/msg.fbs index eb3753d75..ca2e16af7 100644 --- a/src/msg.fbs +++ b/src/msg.fbs @@ -10,6 +10,8 @@ union Any { TimerStart, TimerReady, TimerClear, + Environ, + EnvironRes, FetchReq, FetchRes, MakeTempDir, @@ -18,6 +20,7 @@ union Any { ReadFileSyncRes, StatSync, StatSyncRes, + SetEnv, WriteFileSync, } @@ -124,6 +127,22 @@ table TimerClear { id: uint; } +table Environ {} + +table SetEnv { + key: string; + value: string; +} + +table EnvironRes { + map: [EnvPair]; +} + +table EnvPair { + key: string; + value: string; +} + table FetchReq { id: uint; url: string; |