diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-08-25 09:55:29 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-09-06 08:47:56 -0300 |
| commit | 759a20aaebe2d460800472ac3b076f42c81b65c9 (patch) | |
| tree | 7ee434d5ecdff848095dab3fc094b0294eb0ae12 | |
| parent | 4f4b7670a8254a147c9e379b00e60390a0a7716e (diff) | |
| download | mullvadvpn-759a20aaebe2d460800472ac3b076f42c81b65c9.tar.xz mullvadvpn-759a20aaebe2d460800472ac3b076f42c81b65c9.zip | |
Add `BlockReason::Ipv6Unavailable`
| -rw-r--r-- | gui/packages/desktop/src/renderer/errors.js | 3 | ||||
| -rw-r--r-- | gui/packages/desktop/src/renderer/lib/daemon-rpc.js | 2 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connecting_state.rs | 34 | ||||
| -rw-r--r-- | talpid-types/src/tunnel.rs | 5 |
4 files changed, 37 insertions, 7 deletions
diff --git a/gui/packages/desktop/src/renderer/errors.js b/gui/packages/desktop/src/renderer/errors.js index b333f66221..9cbf63808a 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 'enable_ipv6_error': + super('Could not configure IPv6, please enable it on your system or disable it in the app'); + break; case 'set_security_policy_error': super('Failed to apply security policy'); break; diff --git a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js index aa9f020826..7a3a0bb030 100644 --- a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js +++ b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js @@ -42,6 +42,7 @@ const LocationSchema = object({ }); export type BlockReason = + | 'enable_ipv6_error' | 'set_security_policy_error' | 'start_tunnel_error' | 'no_matching_relay' @@ -245,6 +246,7 @@ const AccountDataSchema = object({ }); const allBlockReasons: Array<BlockReason> = [ + 'enable_ipv6_error', 'set_security_policy_error', 'start_tunnel_error', 'no_matching_relay', diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs index 80fd94f364..6c31a08c69 100644 --- a/talpid-core/src/tunnel_state_machine/connecting_state.rs +++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs @@ -14,12 +14,12 @@ use talpid_types::tunnel::BlockReason; use super::{ AfterDisconnect, BlockedState, ConnectedState, ConnectedStateBootstrap, DisconnectingState, - EventConsequence, Result, ResultExt, SharedTunnelStateValues, TunnelCommand, TunnelParameters, - TunnelState, TunnelStateTransition, TunnelStateWrapper, + EventConsequence, SharedTunnelStateValues, TunnelCommand, TunnelParameters, TunnelState, + TunnelStateTransition, TunnelStateWrapper, }; use logging; use security::SecurityPolicy; -use tunnel::{CloseHandle, TunnelEvent, TunnelMetadata, TunnelMonitor}; +use tunnel::{self, CloseHandle, TunnelEvent, TunnelMetadata, TunnelMonitor}; const MIN_TUNNEL_ALIVE_TIME: Duration = Duration::from_millis(1000); @@ -31,6 +31,18 @@ const TUNNEL_INTERFACE_ALIAS: Option<&str> = Some("Mullvad"); #[cfg(not(windows))] const TUNNEL_INTERFACE_ALIAS: Option<&str> = None; +error_chain! { + errors { + RotateLogError { + description("Failed to rotate tunnel log file") + } + } + + links { + TunnelMonitorError(tunnel::Error, tunnel::ErrorKind); + } +} + /// The tunnel has been started, but it is not established/functional. pub struct ConnectingState { tunnel_events: mpsc::UnboundedReceiver<TunnelEvent>, @@ -101,7 +113,7 @@ impl ConnectingState { }; let log_file = Self::prepare_tunnel_log_file(¶meters)?; - TunnelMonitor::new( + Ok(TunnelMonitor::new( parameters.endpoint, ¶meters.options, TUNNEL_INTERFACE_ALIAS.to_owned().map(OsString::from), @@ -109,7 +121,7 @@ impl ConnectingState { log_file.as_ref().map(PathBuf::as_path), ¶meters.resource_dir, on_tunnel_event, - ).chain_err(|| "Unable to start tunnel monitor") + )?) } fn prepare_tunnel_log_file(parameters: &TunnelParameters) -> Result<Option<PathBuf>> { @@ -119,7 +131,7 @@ impl ConnectingState { TunnelEndpointData::Wireguard(_) => WIREGUARD_LOG_FILENAME, }; let tunnel_log = log_dir.join(filename); - logging::rotate_log(&tunnel_log).chain_err(|| "Unable to rotate tunnel log")?; + logging::rotate_log(&tunnel_log).chain_err(|| ErrorKind::RotateLogError)?; Ok(Some(tunnel_log)) } else { Ok(None) @@ -291,9 +303,17 @@ impl TunnelState for ConnectingState { TunnelStateTransition::Connecting, ), Err(error) => { + let block_reason = match *error.kind() { + ErrorKind::TunnelMonitorError(tunnel::ErrorKind::EnableIpv6Error) => { + BlockReason::Ipv6Unavailable + } + _ => BlockReason::StartTunnelError, + }; + let chained_error = error.chain_err(|| "Failed to start tunnel"); error!("{}", chained_error.display_chain()); - BlockedState::enter(shared_values, (BlockReason::StartTunnelError, allow_lan)) + + BlockedState::enter(shared_values, (block_reason, allow_lan)) } } } diff --git a/talpid-types/src/tunnel.rs b/talpid-types/src/tunnel.rs index 77a1ffacb5..324ad4e7d4 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 configure IPv6 because it's disabled in the platform. + Ipv6Unavailable, /// Failed to set security policy. SetSecurityPolicyError, /// Failed to start connection to remote server. @@ -34,6 +36,9 @@ pub enum BlockReason { impl fmt::Display for BlockReason { fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { let description = match *self { + BlockReason::Ipv6Unavailable => { + "Failed to configure IPv6 because it's disabled in the platform" + } BlockReason::SetSecurityPolicyError => "Failed to set security policy", BlockReason::StartTunnelError => "Failed to start connection to remote server", BlockReason::NoMatchingRelay => "No relay server matches the current settings", |
