diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-08-30 14:50:25 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-09-03 08:05:18 -0300 |
| commit | 329efd1f50a640c7cb20f042446a3eed5186057b (patch) | |
| tree | 4c4a0daf7459748574f360c1483898554719ca7f | |
| parent | d35b7d5f22ea2018aa0a383c846c4fdcb6d9f080 (diff) | |
| download | mullvadvpn-329efd1f50a640c7cb20f042446a3eed5186057b.tar.xz mullvadvpn-329efd1f50a640c7cb20f042446a3eed5186057b.zip | |
Block connection if starting the tunnel fails
| -rw-r--r-- | gui/packages/desktop/src/renderer/errors.js | 8 | ||||
| -rw-r--r-- | gui/packages/desktop/src/renderer/lib/daemon-rpc.js | 5 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connecting_state.rs | 13 | ||||
| -rw-r--r-- | talpid-types/src/tunnel.rs | 11 |
4 files changed, 27 insertions, 10 deletions
diff --git a/gui/packages/desktop/src/renderer/errors.js b/gui/packages/desktop/src/renderer/errors.js index 15a7696f18..8651adfb97 100644 --- a/gui/packages/desktop/src/renderer/errors.js +++ b/gui/packages/desktop/src/renderer/errors.js @@ -4,7 +4,13 @@ import type { BlockReason } from './lib/daemon-rpc'; export class BlockedError extends Error { constructor(reason: BlockReason) { - super(reason); + switch (reason) { + case 'start_tunnel_error': + super('Failed to start tunnel connection'); + break; + default: + super(`Unknown error: ${(reason: empty)}`); + } } } diff --git a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js index 1578b04638..38450173fd 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 = string; +export type BlockReason = 'start_tunnel_error'; export type DisconnectedState = { state: 'disconnected', }; @@ -218,9 +218,10 @@ const AccountDataSchema = object({ expiry: string, }); +const allBlockReasons: Array<BlockReason> = ['start_tunnel_error']; const BlockedStateSchema = object({ state: enumeration('blocked'), - details: string, + details: enumeration(...allBlockReasons), }); const ConnectedStateSchema = object({ state: enumeration('connected') }); const ConnectingStateSchema = object({ state: enumeration('connecting') }); diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs index 8aee60fd69..41031faa34 100644 --- a/talpid-core/src/tunnel_state_machine/connecting_state.rs +++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs @@ -10,11 +10,12 @@ use futures::sync::{mpsc, oneshot}; use futures::{Async, Future, Sink, Stream}; use talpid_types::net::{TunnelEndpoint, TunnelEndpointData}; +use talpid_types::tunnel::BlockReason; use super::{ - AfterDisconnect, ConnectedState, ConnectedStateBootstrap, DisconnectedState, - DisconnectingState, EventConsequence, Result, ResultExt, SharedTunnelStateValues, - TunnelCommand, TunnelParameters, TunnelState, TunnelStateTransition, TunnelStateWrapper, + AfterDisconnect, BlockedState, ConnectedState, ConnectedStateBootstrap, DisconnectingState, + EventConsequence, Result, ResultExt, SharedTunnelStateValues, TunnelCommand, TunnelParameters, + TunnelState, TunnelStateTransition, TunnelStateWrapper, }; use logging; use security::{NetworkSecurity, SecurityPolicy}; @@ -278,8 +279,10 @@ impl TunnelState for ConnectingState { TunnelStateTransition::Connecting, ), Err(error) => { - error!("{}", error.chain_err(|| "Failed to start tunnel")); - DisconnectedState::enter(shared_values, ()) + let chained_error = error.chain_err(|| "Failed to start tunnel"); + error!("{}", chained_error.display_chain()); + + BlockedState::enter(shared_values, BlockReason::StartTunnelError) } } } diff --git a/talpid-types/src/tunnel.rs b/talpid-types/src/tunnel.rs index 59ee2499cd..70b81fca36 100644 --- a/talpid-types/src/tunnel.rs +++ b/talpid-types/src/tunnel.rs @@ -20,10 +20,17 @@ pub enum TunnelStateTransition { /// Reason for entering the blocked state. #[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] -pub enum BlockReason {} +pub enum BlockReason { + /// Failed to start connection to remote server + StartTunnelError, +} impl fmt::Display for BlockReason { fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - Ok(()) + let description = match *self { + BlockReason::StartTunnelError => "Failed to start connection to remote server", + }; + + write!(formatter, "{}", description) } } |
