summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-08-30 15:11:17 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-09-03 08:05:18 -0300
commitc87cbbf49e0309a129d23dea4e2d57afcfe843ba (patch)
tree8dac140230a1880e7586cc377676db5a007ed7a4
parentecce1e7432483a2e6a564de3ecdcf6acd501f720 (diff)
downloadmullvadvpn-c87cbbf49e0309a129d23dea4e2d57afcfe843ba.tar.xz
mullvadvpn-c87cbbf49e0309a129d23dea4e2d57afcfe843ba.zip
Block if security policy can't be set
-rw-r--r--gui/packages/desktop/src/renderer/errors.js3
-rw-r--r--gui/packages/desktop/src/renderer/lib/daemon-rpc.js4
-rw-r--r--talpid-core/src/tunnel_state_machine/connected_state.rs5
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs19
-rw-r--r--talpid-types/src/tunnel.rs3
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(&parameters)?;
@@ -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",
};