diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-08-30 15:11:17 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-09-03 08:05:18 -0300 |
| commit | c87cbbf49e0309a129d23dea4e2d57afcfe843ba (patch) | |
| tree | 8dac140230a1880e7586cc377676db5a007ed7a4 | |
| parent | ecce1e7432483a2e6a564de3ecdcf6acd501f720 (diff) | |
| download | mullvadvpn-c87cbbf49e0309a129d23dea4e2d57afcfe843ba.tar.xz mullvadvpn-c87cbbf49e0309a129d23dea4e2d57afcfe843ba.zip | |
Block if security policy can't be set
| -rw-r--r-- | gui/packages/desktop/src/renderer/errors.js | 3 | ||||
| -rw-r--r-- | gui/packages/desktop/src/renderer/lib/daemon-rpc.js | 4 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connected_state.rs | 5 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connecting_state.rs | 19 | ||||
| -rw-r--r-- | talpid-types/src/tunnel.rs | 3 |
5 files changed, 22 insertions, 12 deletions
diff --git a/gui/packages/desktop/src/renderer/errors.js b/gui/packages/desktop/src/renderer/errors.js index 8651adfb97..ddf0c239bb 100644 --- a/gui/packages/desktop/src/renderer/errors.js +++ b/gui/packages/desktop/src/renderer/errors.js @@ -5,6 +5,9 @@ import type { BlockReason } from './lib/daemon-rpc'; export class BlockedError extends Error { constructor(reason: BlockReason) { switch (reason) { + case 'set_security_policy_error': + super('Failed to apply security policy'); + break; case 'start_tunnel_error': super('Failed to start tunnel connection'); break; diff --git a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js index 38450173fd..ae2e501268 100644 --- a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js +++ b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js @@ -41,7 +41,7 @@ const LocationSchema = object({ mullvad_exit_ip: boolean, }); -export type BlockReason = 'start_tunnel_error'; +export type BlockReason = 'set_security_policy_error' | 'start_tunnel_error'; export type DisconnectedState = { state: 'disconnected', }; @@ -218,7 +218,7 @@ const AccountDataSchema = object({ expiry: string, }); -const allBlockReasons: Array<BlockReason> = ['start_tunnel_error']; +const allBlockReasons: Array<BlockReason> = ['set_security_policy_error', 'start_tunnel_error']; const BlockedStateSchema = object({ state: enumeration('blocked'), details: enumeration(...allBlockReasons), diff --git a/talpid-core/src/tunnel_state_machine/connected_state.rs b/talpid-core/src/tunnel_state_machine/connected_state.rs index ce8175d814..02a44c8be0 100644 --- a/talpid-core/src/tunnel_state_machine/connected_state.rs +++ b/talpid-core/src/tunnel_state_machine/connected_state.rs @@ -3,6 +3,7 @@ use futures::sync::{mpsc, oneshot}; use futures::{Async, Future, Stream}; use talpid_types::net::TunnelEndpoint; +use talpid_types::tunnel::BlockReason; use super::{ AfterDisconnect, ConnectingState, DisconnectingState, EventConsequence, Result, ResultExt, @@ -100,7 +101,7 @@ impl ConnectedState { ( self.close_handle, self.tunnel_close_event, - AfterDisconnect::Nothing, + AfterDisconnect::Block(BlockReason::SetSecurityPolicyError), ), )) } @@ -170,7 +171,7 @@ impl TunnelState for ConnectedState { ( connected_state.close_handle, connected_state.tunnel_close_event, - AfterDisconnect::Nothing, + AfterDisconnect::Block(BlockReason::SetSecurityPolicyError), ), ) } diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs index 41031faa34..a87fa1384e 100644 --- a/talpid-core/src/tunnel_state_machine/connecting_state.rs +++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs @@ -41,12 +41,7 @@ pub struct ConnectingState { } impl ConnectingState { - fn new( - shared_values: &mut SharedTunnelStateValues, - parameters: TunnelParameters, - ) -> Result<Self> { - Self::set_security_policy(shared_values, parameters.endpoint, parameters.allow_lan)?; - + fn new(parameters: TunnelParameters) -> Result<Self> { let tunnel_endpoint = parameters.endpoint; let (tunnel_events, tunnel_close_event, close_handle) = Self::start_tunnel(¶meters)?; @@ -214,7 +209,7 @@ impl ConnectingState { ( self.close_handle, self.tunnel_close_event, - AfterDisconnect::Nothing, + AfterDisconnect::Block(BlockReason::SetSecurityPolicyError), ), )) } @@ -273,7 +268,15 @@ impl TunnelState for ConnectingState { shared_values: &mut SharedTunnelStateValues, parameters: Self::Bootstrap, ) -> (TunnelStateWrapper, TunnelStateTransition) { - match Self::new(shared_values, parameters) { + if let Err(error) = + Self::set_security_policy(shared_values, parameters.endpoint, parameters.allow_lan) + { + error!("{}", error.display_chain()); + + return BlockedState::enter(shared_values, BlockReason::StartTunnelError); + } + + match Self::new(parameters) { Ok(connecting_state) => ( TunnelStateWrapper::from(connecting_state), TunnelStateTransition::Connecting, diff --git a/talpid-types/src/tunnel.rs b/talpid-types/src/tunnel.rs index 70b81fca36..e5454988c5 100644 --- a/talpid-types/src/tunnel.rs +++ b/talpid-types/src/tunnel.rs @@ -21,6 +21,8 @@ pub enum TunnelStateTransition { #[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum BlockReason { + /// Failed to set security policy + SetSecurityPolicyError, /// Failed to start connection to remote server StartTunnelError, } @@ -28,6 +30,7 @@ pub enum BlockReason { impl fmt::Display for BlockReason { fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { let description = match *self { + BlockReason::SetSecurityPolicyError => "Failed to set security policy", BlockReason::StartTunnelError => "Failed to start connection to remote server", }; |
