diff options
6 files changed, 68 insertions, 41 deletions
diff --git a/talpid-core/src/tunnel_state_machine/blocked_state.rs b/talpid-core/src/tunnel_state_machine/blocked_state.rs index f63326b800..50efb9e371 100644 --- a/talpid-core/src/tunnel_state_machine/blocked_state.rs +++ b/talpid-core/src/tunnel_state_machine/blocked_state.rs @@ -38,6 +38,9 @@ impl TunnelState for BlockedState { Ok(TunnelCommand::Disconnect) | Err(_) => { NewState(DisconnectedState::enter(shared_values, ())) } + Ok(TunnelCommand::Block(reason)) => { + NewState(BlockedState::enter(shared_values, reason)) + } _ => SameState(self), } } diff --git a/talpid-core/src/tunnel_state_machine/connected_state.rs b/talpid-core/src/tunnel_state_machine/connected_state.rs index 02a44c8be0..0117958503 100644 --- a/talpid-core/src/tunnel_state_machine/connected_state.rs +++ b/talpid-core/src/tunnel_state_machine/connected_state.rs @@ -66,6 +66,25 @@ impl ConnectedState { use self::EventConsequence::*; match try_handle_event!(self, commands.poll()) { + Ok(TunnelCommand::AllowLan(allow_lan)) => { + self.tunnel_parameters.allow_lan = allow_lan; + + match self.set_security_policy(shared_values) { + Ok(()) => SameState(self), + Err(error) => { + error!("{}", error.display_chain()); + + NewState(DisconnectingState::enter( + shared_values, + ( + self.close_handle, + self.tunnel_close_event, + AfterDisconnect::Block(BlockReason::SetSecurityPolicyError), + ), + )) + } + } + } Ok(TunnelCommand::Connect(parameters)) => { if parameters != self.tunnel_parameters { NewState(DisconnectingState::enter( @@ -88,25 +107,14 @@ impl ConnectedState { AfterDisconnect::Nothing, ), )), - Ok(TunnelCommand::AllowLan(allow_lan)) => { - self.tunnel_parameters.allow_lan = allow_lan; - - match self.set_security_policy(shared_values) { - Ok(()) => SameState(self), - Err(error) => { - error!("{}", error.display_chain()); - - NewState(DisconnectingState::enter( - shared_values, - ( - self.close_handle, - self.tunnel_close_event, - AfterDisconnect::Block(BlockReason::SetSecurityPolicyError), - ), - )) - } - } - } + Ok(TunnelCommand::Block(reason)) => NewState(DisconnectingState::enter( + shared_values, + ( + self.close_handle, + self.tunnel_close_event, + AfterDisconnect::Block(reason), + ), + )), } } diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs index a87fa1384e..184832acaa 100644 --- a/talpid-core/src/tunnel_state_machine/connecting_state.rs +++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs @@ -175,6 +175,24 @@ impl ConnectingState { use self::EventConsequence::*; match try_handle_event!(self, commands.poll()) { + Ok(TunnelCommand::AllowLan(allow_lan)) => { + self.tunnel_parameters.allow_lan = allow_lan; + match Self::set_security_policy(shared_values, self.tunnel_endpoint, allow_lan) { + Ok(()) => SameState(self), + Err(error) => { + error!("{}", error.display_chain()); + + NewState(DisconnectingState::enter( + shared_values, + ( + self.close_handle, + self.tunnel_close_event, + AfterDisconnect::Block(BlockReason::SetSecurityPolicyError), + ), + )) + } + } + } Ok(TunnelCommand::Connect(parameters)) => { if parameters != self.tunnel_parameters { NewState(DisconnectingState::enter( @@ -197,24 +215,14 @@ impl ConnectingState { AfterDisconnect::Nothing, ), )), - Ok(TunnelCommand::AllowLan(allow_lan)) => { - self.tunnel_parameters.allow_lan = allow_lan; - match Self::set_security_policy(shared_values, self.tunnel_endpoint, allow_lan) { - Ok(()) => SameState(self), - Err(error) => { - error!("{}", error.display_chain()); - - NewState(DisconnectingState::enter( - shared_values, - ( - self.close_handle, - self.tunnel_close_event, - AfterDisconnect::Block(BlockReason::SetSecurityPolicyError), - ), - )) - } - } - } + Ok(TunnelCommand::Block(reason)) => NewState(DisconnectingState::enter( + shared_values, + ( + self.close_handle, + self.tunnel_close_event, + AfterDisconnect::Block(reason), + ), + )), } } diff --git a/talpid-core/src/tunnel_state_machine/disconnected_state.rs b/talpid-core/src/tunnel_state_machine/disconnected_state.rs index f92630606c..80a7eb5ce0 100644 --- a/talpid-core/src/tunnel_state_machine/disconnected_state.rs +++ b/talpid-core/src/tunnel_state_machine/disconnected_state.rs @@ -3,8 +3,8 @@ use futures::sync::mpsc; use futures::Stream; use super::{ - ConnectingState, Error, EventConsequence, SharedTunnelStateValues, TunnelCommand, TunnelState, - TunnelStateTransition, TunnelStateWrapper, + BlockedState, ConnectingState, Error, EventConsequence, SharedTunnelStateValues, TunnelCommand, + TunnelState, TunnelStateTransition, TunnelStateWrapper, }; use security::NetworkSecurity; @@ -47,6 +47,9 @@ impl TunnelState for DisconnectedState { Ok(TunnelCommand::Connect(parameters)) => { NewState(ConnectingState::enter(shared_values, parameters)) } + Ok(TunnelCommand::Block(reason)) => { + NewState(BlockedState::enter(shared_values, reason)) + } Ok(_) => SameState(self), Err(_) => Finished, } diff --git a/talpid-core/src/tunnel_state_machine/disconnecting_state.rs b/talpid-core/src/tunnel_state_machine/disconnecting_state.rs index 6fbdacffe2..452b8d3ac1 100644 --- a/talpid-core/src/tunnel_state_machine/disconnecting_state.rs +++ b/talpid-core/src/tunnel_state_machine/disconnecting_state.rs @@ -33,20 +33,23 @@ impl DisconnectingState { self.after_disconnect = match after_disconnect { AfterDisconnect::Nothing => match event { Ok(TunnelCommand::Connect(parameters)) => Reconnect(parameters), + Ok(TunnelCommand::Block(reason)) => Block(reason), _ => Nothing, }, AfterDisconnect::Block(reason) => match event { Ok(TunnelCommand::Connect(parameters)) => Reconnect(parameters), Ok(TunnelCommand::Disconnect) => Nothing, + Ok(TunnelCommand::Block(new_reason)) => Block(new_reason), _ => AfterDisconnect::Block(reason), }, AfterDisconnect::Reconnect(mut tunnel_parameters) => match event { - Ok(TunnelCommand::Connect(parameters)) => Reconnect(parameters), Ok(TunnelCommand::AllowLan(allow_lan)) => { tunnel_parameters.allow_lan = allow_lan; Reconnect(tunnel_parameters) } + Ok(TunnelCommand::Connect(parameters)) => Reconnect(parameters), Ok(TunnelCommand::Disconnect) | Err(_) => Nothing, + Ok(TunnelCommand::Block(reason)) => Block(reason), }, }; diff --git a/talpid-core/src/tunnel_state_machine/mod.rs b/talpid-core/src/tunnel_state_machine/mod.rs index 20f1529b01..433333efa0 100644 --- a/talpid-core/src/tunnel_state_machine/mod.rs +++ b/talpid-core/src/tunnel_state_machine/mod.rs @@ -18,7 +18,7 @@ use futures::{Async, Future, Poll, Stream}; use tokio_core::reactor::Core; use talpid_types::net::{TunnelEndpoint, TunnelOptions}; -use talpid_types::tunnel::TunnelStateTransition; +use talpid_types::tunnel::{BlockReason, TunnelStateTransition}; use self::blocked_state::BlockedState; use self::connected_state::{ConnectedState, ConnectedStateBootstrap}; @@ -110,6 +110,8 @@ pub enum TunnelCommand { Connect(TunnelParameters), /// Close tunnel connection. Disconnect, + /// Disconnect any open tunnel and block all network access + Block(BlockReason), } /// Information necessary to open a tunnel. |
