Prompt user before accepting incoming devtools connection

This commit is contained in:
Paul Rouget 2019-12-12 14:48:14 +01:00
parent 51f15a055e
commit 49376e3b31
6 changed files with 25 additions and 7 deletions

1
Cargo.lock generated
View file

@ -1219,6 +1219,7 @@ version = "0.0.1"
dependencies = [ dependencies = [
"crossbeam-channel", "crossbeam-channel",
"devtools_traits", "devtools_traits",
"embedder_traits",
"headers", "headers",
"http", "http",
"hyper", "hyper",

View file

@ -13,6 +13,7 @@ path = "lib.rs"
[dependencies] [dependencies]
crossbeam-channel = "0.3" crossbeam-channel = "0.3"
devtools_traits = {path = "../devtools_traits"} devtools_traits = {path = "../devtools_traits"}
embedder_traits = {path = "../embedder_traits"}
headers = "0.2" headers = "0.2"
http = "0.1" http = "0.1"
hyper = "0.12" hyper = "0.12"

View file

@ -39,7 +39,8 @@ use crossbeam_channel::{unbounded, Receiver, Sender};
use devtools_traits::{ChromeToDevtoolsControlMsg, ConsoleMessage, DevtoolsControlMsg}; use devtools_traits::{ChromeToDevtoolsControlMsg, ConsoleMessage, DevtoolsControlMsg};
use devtools_traits::{DevtoolScriptControlMsg, DevtoolsPageInfo, LogLevel, NetworkEvent}; use devtools_traits::{DevtoolScriptControlMsg, DevtoolsPageInfo, LogLevel, NetworkEvent};
use devtools_traits::{PageError, ScriptToDevtoolsControlMsg, WorkerId}; use devtools_traits::{PageError, ScriptToDevtoolsControlMsg, WorkerId};
use ipc_channel::ipc::IpcSender; use embedder_traits::{EmbedderMsg, EmbedderProxy, PromptDefinition, PromptOrigin, PromptResult};
use ipc_channel::ipc::{self, IpcSender};
use msg::constellation_msg::PipelineId; use msg::constellation_msg::PipelineId;
use std::borrow::ToOwned; use std::borrow::ToOwned;
use std::cell::RefCell; use std::cell::RefCell;
@ -135,13 +136,13 @@ struct ResponseStartUpdateMsg {
} }
/// Spin up a devtools server that listens for connections on the specified port. /// Spin up a devtools server that listens for connections on the specified port.
pub fn start_server(port: u16) -> Sender<DevtoolsControlMsg> { pub fn start_server(port: u16, embedder: EmbedderProxy) -> Sender<DevtoolsControlMsg> {
let (sender, receiver) = unbounded(); let (sender, receiver) = unbounded();
{ {
let sender = sender.clone(); let sender = sender.clone();
thread::Builder::new() thread::Builder::new()
.name("Devtools".to_owned()) .name("Devtools".to_owned())
.spawn(move || run_server(sender, receiver, port)) .spawn(move || run_server(sender, receiver, port, embedder))
.expect("Thread spawning failed"); .expect("Thread spawning failed");
} }
sender sender
@ -151,6 +152,7 @@ fn run_server(
sender: Sender<DevtoolsControlMsg>, sender: Sender<DevtoolsControlMsg>,
receiver: Receiver<DevtoolsControlMsg>, receiver: Receiver<DevtoolsControlMsg>,
port: u16, port: u16,
embedder: EmbedderProxy,
) { ) {
let listener = TcpListener::bind(&("0.0.0.0", port)).unwrap(); let listener = TcpListener::bind(&("0.0.0.0", port)).unwrap();
@ -553,7 +555,17 @@ fn run_server(
.spawn(move || { .spawn(move || {
// accept connections and process them, spawning a new thread for each one // accept connections and process them, spawning a new thread for each one
for stream in listener.incoming() { for stream in listener.incoming() {
// connection succeeded // Prompt user for permission
let (embedder_sender, receiver) =
ipc::channel().expect("Failed to create IPC channel!");
let message = "Accept incoming devtools connection?".to_owned();
let prompt = PromptDefinition::YesNo(message, embedder_sender);
let msg = EmbedderMsg::Prompt(prompt, PromptOrigin::Trusted);
embedder.send((None, msg));
if receiver.recv().unwrap() != PromptResult::Primary {
continue;
}
// connection succeeded and accepted
sender sender
.send(DevtoolsControlMsg::FromChrome( .send(DevtoolsControlMsg::FromChrome(
ChromeToDevtoolsControlMsg::AddClient(stream.unwrap()), ChromeToDevtoolsControlMsg::AddClient(stream.unwrap()),

View file

@ -356,8 +356,11 @@ where
opts.profile_heartbeats, opts.profile_heartbeats,
); );
let mem_profiler_chan = profile_mem::Profiler::create(opts.mem_profiler_period); let mem_profiler_chan = profile_mem::Profiler::create(opts.mem_profiler_period);
let debugger_chan = opts.debugger_port.map(|port| debugger::start_server(port)); let debugger_chan = opts.debugger_port.map(|port| debugger::start_server(port));
let devtools_chan = opts.devtools_port.map(|port| devtools::start_server(port)); let devtools_chan = opts
.devtools_port
.map(|port| devtools::start_server(port, embedder_proxy.clone()));
let coordinates = window.get_coordinates(); let coordinates = window.get_coordinates();
let device_pixel_ratio = coordinates.hidpi_factor.get(); let device_pixel_ratio = coordinates.hidpi_factor.get();

View file

@ -45,5 +45,6 @@
<Capability Name="internetClient" /> <Capability Name="internetClient" />
<Capability Name="codeGeneration" /> <Capability Name="codeGeneration" />
<Capability Name="privateNetworkClientServer" /> <Capability Name="privateNetworkClientServer" />
<Capability Name="internetClientServer" />
</Capabilities> </Capabilities>
</Package> </Package>

View file

@ -119,7 +119,7 @@ Servo::Servo(hstring url, hstring args, GLsizei width, GLsizei height,
// Example Call when *pfilters[] is used: // Example Call when *pfilters[] is used:
// o.vslogger_mod_list = pfilters; // servo log modules // o.vslogger_mod_list = pfilters; // servo log modules
// o.vslogger_mod_size = sizeof(pfilters) / sizeof(pfilters[0]) -1; // // o.vslogger_mod_size = sizeof(pfilters) / sizeof(pfilters[0]); //
// Important: Number of modules in pfilters // Important: Number of modules in pfilters
o.vslogger_mod_list = NULL; o.vslogger_mod_list = NULL;
o.vslogger_mod_size = 0; o.vslogger_mod_size = 0;