summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2018-09-04 15:46:52 +0200
committerLinus Färnstrand <linus@mullvad.net>2018-09-04 16:31:57 +0200
commit297cd3c8ec92a5802cbedd9cd0d98419b2e96246 (patch)
tree917e3a92683618229178f22b8324b0fb54b27e52
parentb59139b6aaa5dabc628d5530b14e8871df3f8226 (diff)
downloadmullvadvpn-297cd3c8ec92a5802cbedd9cd0d98419b2e96246.tar.xz
mullvadvpn-297cd3c8ec92a5802cbedd9cd0d98419b2e96246.zip
More exact handling of errors in building tunnel parameters
-rw-r--r--mullvad-daemon/src/main.rs73
1 files changed, 27 insertions, 46 deletions
diff --git a/mullvad-daemon/src/main.rs b/mullvad-daemon/src/main.rs
index b37de6c93d..ca9549bf38 100644
--- a/mullvad-daemon/src/main.rs
+++ b/mullvad-daemon/src/main.rs
@@ -79,7 +79,7 @@ use std::{mem, thread};
use talpid_core::mpsc::IntoSender;
use talpid_core::tunnel_state_machine::{self, TunnelCommand, TunnelParameters};
-use talpid_types::net::TunnelOptions;
+use talpid_types::net::{TunnelEndpoint, TunnelOptions};
use talpid_types::tunnel::{BlockReason, TunnelStateTransition};
@@ -99,12 +99,6 @@ error_chain!{
description("Error in the management interface")
display("Management interface error: {}", msg)
}
- NoAccountToken {
- description("No account token configured")
- }
- NoMatchingRelay {
- description("No valid relay servers match the current settings")
- }
}
links {
TunnelError(tunnel_state_machine::Error, tunnel_state_machine::ErrorKind);
@@ -616,24 +610,26 @@ impl Daemon {
}
fn connect_tunnel(&mut self) {
- debug!("Triggering tunnel start");
- let command = match self.build_tunnel_parameters() {
- Ok(parameters) => TunnelCommand::Connect(parameters),
- Err(error) => {
+ let command = match self.settings.get_account_token() {
+ None => TunnelCommand::Block(BlockReason::NoAccountToken),
+ Some(account_token) => match self.settings.get_relay_settings() {
+ RelaySettings::CustomTunnelEndpoint(custom_relay) => custom_relay
+ .to_tunnel_endpoint()
+ .chain_err(|| "Custom tunnel endpoint could not be resolved"),
+ RelaySettings::Normal(constraints) => self
+ .relay_selector
+ .get_tunnel_endpoint(&constraints)
+ .chain_err(|| "No valid relay servers match the current settings")
+ .map(|(relay, endpoint)| {
+ self.current_relay = Some(relay);
+ endpoint
+ }),
+ }.map(|endpoint| self.build_tunnel_parameters(account_token, endpoint))
+ .map(|parameters| TunnelCommand::Connect(parameters))
+ .unwrap_or_else(|error| {
error!("{}", error.display_chain());
- let reason = match error.kind() {
- ErrorKind::NoMatchingRelay => BlockReason::NoMatchingRelay,
- ErrorKind::NoAccountToken => BlockReason::NoAccountToken,
- _ => {
- error!(
- "Invalid error from build_tunnel_parameters: {}",
- error.display_chain()
- );
- BlockReason::NoMatchingRelay
- }
- };
- TunnelCommand::Block(reason)
- }
+ TunnelCommand::Block(BlockReason::NoMatchingRelay)
+ }),
};
self.send_tunnel_command(command);
}
@@ -648,34 +644,19 @@ impl Daemon {
}
}
- fn build_tunnel_parameters(&mut self) -> Result<TunnelParameters> {
- let account_token = self
- .settings
- .get_account_token()
- .ok_or(ErrorKind::NoAccountToken)?;
-
- let endpoint = match self.settings.get_relay_settings() {
- RelaySettings::CustomTunnelEndpoint(custom_relay) => custom_relay
- .to_tunnel_endpoint()
- .chain_err(|| ErrorKind::NoMatchingRelay)?,
- RelaySettings::Normal(constraints) => {
- let (relay, tunnel_endpoint) = self
- .relay_selector
- .get_tunnel_endpoint(&constraints)
- .chain_err(|| ErrorKind::NoMatchingRelay)?;
- self.current_relay = Some(relay);
- tunnel_endpoint
- }
- };
-
- Ok(TunnelParameters {
+ fn build_tunnel_parameters(
+ &self,
+ account_token: AccountToken,
+ endpoint: TunnelEndpoint,
+ ) -> TunnelParameters {
+ TunnelParameters {
endpoint,
options: self.settings.get_tunnel_options().clone(),
log_dir: self.log_dir.clone(),
resource_dir: self.resource_dir.clone(),
username: account_token,
allow_lan: self.settings.get_allow_lan(),
- })
+ }
}
fn send_tunnel_command(&mut self, command: TunnelCommand) {