From d40b0711a786d04b5e6321ae9bbf73c11220e865 Mon Sep 17 00:00:00 2001 From: crowlKats <13135287+crowlKats@users.noreply.github.com> Date: Wed, 25 Nov 2020 15:17:46 +0100 Subject: fix(websocket): Fix PermissionDenied error being caught in constructor (#8402) --- cli/ops/websocket.rs | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) (limited to 'cli/ops/websocket.rs') diff --git a/cli/ops/websocket.rs b/cli/ops/websocket.rs index 23dee5f85..77b2b5f11 100644 --- a/cli/ops/websocket.rs +++ b/cli/ops/websocket.rs @@ -8,12 +8,12 @@ use deno_core::error::AnyError; use deno_core::futures::future::poll_fn; use deno_core::futures::StreamExt; use deno_core::futures::{ready, SinkExt}; -use deno_core::serde_json; use deno_core::serde_json::json; use deno_core::serde_json::Value; use deno_core::url; use deno_core::BufVec; use deno_core::OpState; +use deno_core::{serde_json, ZeroCopyBuf}; use http::{Method, Request, Uri}; use serde::Deserialize; use std::borrow::Cow; @@ -34,6 +34,7 @@ use tokio_tungstenite::{client_async, WebSocketStream}; use webpki::DNSNameRef; pub fn init(rt: &mut deno_core::JsRuntime) { + super::reg_json_sync(rt, "op_ws_check_permission", op_ws_check_permission); super::reg_json_async(rt, "op_ws_create", op_ws_create); super::reg_json_async(rt, "op_ws_send", op_ws_send); super::reg_json_async(rt, "op_ws_close", op_ws_close); @@ -45,6 +46,29 @@ type MaybeTlsStream = type WsStream = WebSocketStream; +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +struct CheckPermissionArgs { + url: String, +} + +// This op is needed because creating a WS instance in JavaScript is a sync +// operation and should throw error when permissions are not fullfiled, +// but actual op that connects WS is async. +pub fn op_ws_check_permission( + state: &mut OpState, + args: Value, + _zero_copy: &mut [ZeroCopyBuf], +) -> Result { + let args: CheckPermissionArgs = serde_json::from_value(args)?; + + state + .borrow::() + .check_net_url(&url::Url::parse(&args.url)?)?; + + Ok(json!({})) +} + #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct CreateArgs { @@ -58,11 +82,16 @@ pub async fn op_ws_create( _bufs: BufVec, ) -> Result { let args: CreateArgs = serde_json::from_value(args)?; + { let s = state.borrow(); s.borrow::() - .check_net_url(&url::Url::parse(&args.url)?)?; + .check_net_url(&url::Url::parse(&args.url)?) + .expect( + "Permission check should have been done in op_ws_check_permission", + ); } + let ca_file = { let cli_state = super::global_state2(&state); cli_state.flags.ca_file.clone() -- cgit v1.2.3