summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-08-30 14:38:40 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2018-09-03 08:05:18 -0300
commita4add0ecce0b7105c2eb6c9af738ba91aaafe86f (patch)
tree9267173e475bf28d88937a00fd4eeeab69f97086
parent7663c2ea549dff8fdf210c41f95a373b4bdedd9b (diff)
downloadmullvadvpn-a4add0ecce0b7105c2eb6c9af738ba91aaafe86f.tar.xz
mullvadvpn-a4add0ecce0b7105c2eb6c9af738ba91aaafe86f.zip
Add reason to transition to blocked state
-rw-r--r--gui/packages/desktop/src/renderer/app.js8
-rw-r--r--gui/packages/desktop/src/renderer/lib/daemon-rpc.js48
-rw-r--r--mullvad-cli/src/cmds/status.rs2
-rw-r--r--talpid-core/src/tunnel_state_machine/blocked_state.rs8
-rw-r--r--talpid-types/src/tunnel.rs16
5 files changed, 66 insertions, 16 deletions
diff --git a/gui/packages/desktop/src/renderer/app.js b/gui/packages/desktop/src/renderer/app.js
index 5c4847d76a..e3ed3f78ef 100644
--- a/gui/packages/desktop/src/renderer/app.js
+++ b/gui/packages/desktop/src/renderer/app.js
@@ -504,7 +504,11 @@ export default class AppRenderer {
if (newState) {
const connectionState = this._tunnelStateToConnectionState(newState);
- log.debug(`Got new state from daemon '${newState}', translated to '${connectionState}'`);
+ log.debug(
+ `Got new state from daemon '${JSON.stringify(
+ newState,
+ )}', translated to '${connectionState}'`,
+ );
this._updateConnectionState(connectionState);
this._refreshStateOnChange();
@@ -546,7 +550,7 @@ export default class AppRenderer {
}
_tunnelStateToConnectionState(tunnelState: TunnelState): ConnectionState {
- switch (tunnelState) {
+ switch (tunnelState.state) {
case 'disconnected':
// Fall through
case 'disconnecting':
diff --git a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js
index 5dcf041dcd..1578b04638 100644
--- a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js
+++ b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js
@@ -41,7 +41,29 @@ const LocationSchema = object({
mullvad_exit_ip: boolean,
});
-export type TunnelState = 'disconnected' | 'connecting' | 'connected' | 'disconnecting' | 'blocked';
+export type BlockReason = string;
+export type DisconnectedState = {
+ state: 'disconnected',
+};
+export type ConnectingState = {
+ state: 'connecting',
+};
+export type ConnectedState = {
+ state: 'connected',
+};
+export type DisconnectingState = {
+ state: 'disconnecting',
+};
+export type BlockedState = {
+ state: 'blocked',
+ details: BlockReason,
+};
+export type TunnelState =
+ | DisconnectedState
+ | ConnectingState
+ | ConnectedState
+ | DisconnectingState
+ | BlockedState;
export type RelayProtocol = 'tcp' | 'udp';
export type RelayLocation = {| city: [string, string] |} | {| country: string |};
@@ -196,14 +218,22 @@ const AccountDataSchema = object({
expiry: string,
});
-const allTunnelStates: Array<TunnelState> = [
- 'disconnected',
- 'connecting',
- 'connected',
- 'disconnecting',
- 'blocked',
-];
-const TunnelStateSchema = enumeration(...allTunnelStates);
+const BlockedStateSchema = object({
+ state: enumeration('blocked'),
+ details: string,
+});
+const ConnectedStateSchema = object({ state: enumeration('connected') });
+const ConnectingStateSchema = object({ state: enumeration('connecting') });
+const DisconnectedStateSchema = object({ state: enumeration('disconnected') });
+const DisconnectingStateSchema = object({ state: enumeration('disconnecting') });
+
+const TunnelStateSchema = oneOf(
+ BlockedStateSchema,
+ ConnectedStateSchema,
+ ConnectingStateSchema,
+ DisconnectedStateSchema,
+ DisconnectingStateSchema,
+);
export type AppVersionInfo = {
currentIsSupported: boolean,
diff --git a/mullvad-cli/src/cmds/status.rs b/mullvad-cli/src/cmds/status.rs
index bdc308892e..1266299c17 100644
--- a/mullvad-cli/src/cmds/status.rs
+++ b/mullvad-cli/src/cmds/status.rs
@@ -43,7 +43,7 @@ impl Command for Status {
fn print_state(state: TunnelStateTransition) {
print!("Tunnel status: ");
match state {
- Blocked => println!("Blocked"),
+ Blocked(reason) => println!("Blocked ({})", reason),
Connected => println!("Connected"),
Connecting => println!("Connecting..."),
Disconnected => println!("Disconnected"),
diff --git a/talpid-core/src/tunnel_state_machine/blocked_state.rs b/talpid-core/src/tunnel_state_machine/blocked_state.rs
index f4499c7b58..f63326b800 100644
--- a/talpid-core/src/tunnel_state_machine/blocked_state.rs
+++ b/talpid-core/src/tunnel_state_machine/blocked_state.rs
@@ -1,6 +1,8 @@
use futures::sync::mpsc;
use futures::Stream;
+use talpid_types::tunnel::BlockReason;
+
use super::{
ConnectingState, DisconnectedState, EventConsequence, SharedTunnelStateValues, TunnelCommand,
TunnelState, TunnelStateTransition, TunnelStateWrapper,
@@ -10,15 +12,15 @@ use super::{
pub struct BlockedState;
impl TunnelState for BlockedState {
- type Bootstrap = ();
+ type Bootstrap = BlockReason;
fn enter(
_: &mut SharedTunnelStateValues,
- _: Self::Bootstrap,
+ block_reason: Self::Bootstrap,
) -> (TunnelStateWrapper, TunnelStateTransition) {
(
TunnelStateWrapper::from(BlockedState),
- TunnelStateTransition::Blocked,
+ TunnelStateTransition::Blocked(block_reason),
)
}
diff --git a/talpid-types/src/tunnel.rs b/talpid-types/src/tunnel.rs
index ce94b43685..59ee2499cd 100644
--- a/talpid-types/src/tunnel.rs
+++ b/talpid-types/src/tunnel.rs
@@ -1,6 +1,9 @@
+use std::fmt;
+
/// Event resulting from a transition to a new tunnel state.
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
+#[serde(tag = "state", content = "details")]
pub enum TunnelStateTransition {
/// No connection is established and network is unsecured.
Disconnected,
@@ -11,5 +14,16 @@ pub enum TunnelStateTransition {
/// Disconnecting tunnel.
Disconnecting,
/// Tunnel is disconnected but secured by blocking all connections.
- Blocked,
+ Blocked(BlockReason),
+}
+
+/// Reason for entering the blocked state.
+#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+pub enum BlockReason {}
+
+impl fmt::Display for BlockReason {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ Ok(())
+ }
}