diff options
| -rw-r--r-- | gui/packages/desktop/src/renderer/app.js | 6 | ||||
| -rw-r--r-- | gui/packages/desktop/src/renderer/lib/daemon-rpc.js | 44 | ||||
| -rw-r--r-- | gui/packages/desktop/src/renderer/redux/connection/actions.js | 10 | ||||
| -rw-r--r-- | gui/packages/desktop/src/renderer/redux/connection/reducers.js | 4 | ||||
| -rw-r--r-- | mullvad-cli/src/cmds/status.rs | 9 | ||||
| -rw-r--r-- | mullvad-daemon/src/lib.rs | 2 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connected_state.rs | 3 | ||||
| -rw-r--r-- | talpid-core/src/tunnel_state_machine/connecting_state.rs | 8 | ||||
| -rw-r--r-- | talpid-types/src/net.rs | 2 | ||||
| -rw-r--r-- | talpid-types/src/tunnel.rs | 2 |
10 files changed, 58 insertions, 32 deletions
diff --git a/gui/packages/desktop/src/renderer/app.js b/gui/packages/desktop/src/renderer/app.js index 1ef54ca4e9..20de8d81e3 100644 --- a/gui/packages/desktop/src/renderer/app.js +++ b/gui/packages/desktop/src/renderer/app.js @@ -229,7 +229,7 @@ export default class AppRenderer { if (tunnelState.state === 'disconnected' || tunnelState.state === 'blocked') { // switch to connecting state immediately to prevent a lag that may be caused by RPC // communication delay - actions.connection.connecting(); + actions.connection.connecting(null); await this._daemonRpc.connectTunnel(); } @@ -616,11 +616,11 @@ export default class AppRenderer { switch (stateTransition.state) { case 'connecting': - actions.connection.connecting(); + actions.connection.connecting(stateTransition.details); break; case 'connected': - actions.connection.connected(); + actions.connection.connected(stateTransition.details); break; 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 572954b26b..c4ac506f36 100644 --- a/gui/packages/desktop/src/renderer/lib/daemon-rpc.js +++ b/gui/packages/desktop/src/renderer/lib/daemon-rpc.js @@ -55,8 +55,22 @@ export type AfterDisconnect = 'nothing' | 'block' | 'reconnect'; export type TunnelState = 'connecting' | 'connected' | 'disconnecting' | 'disconnected' | 'blocked'; +export type TunnelEndpoint = { + address: string, + tunnel: TunnelEndpointData, +}; + +export type TunnelEndpointData = { + openvpn: { + port: number, + protocol: RelayProtocol, + }, +}; + export type TunnelStateTransition = - | { state: 'disconnected' | 'connecting' | 'connected' } + | { state: 'disconnected' } + | { state: 'connecting', details: ?TunnelEndpoint } + | { state: 'connected', details: TunnelEndpoint } | { state: 'disconnecting', details: AfterDisconnect } | { state: 'blocked', details: BlockReason }; @@ -91,12 +105,7 @@ type RelaySettingsNormal<TTunnelConstraints> = { // types describing the structure of RelaySettings export type RelaySettingsCustom = { host: string, - tunnel: { - openvpn: { - port: number, - protocol: RelayProtocol, - }, - }, + tunnel: TunnelEndpointData, }; export type RelaySettings = | {| @@ -127,6 +136,13 @@ const constraint = <T>(constraintValue: SchemaNode<T>) => { ); }; +const TunnelEndpointDataSchema = object({ + openvpn: object({ + port: number, + protocol: enumeration('udp', 'tcp'), + }), +}); + const RelaySettingsSchema = oneOf( object({ normal: object({ @@ -156,12 +172,7 @@ const RelaySettingsSchema = oneOf( object({ custom_tunnel_endpoint: object({ host: string, - tunnel: object({ - openvpn: object({ - port: number, - protocol: enumeration('udp', 'tcp'), - }), - }), + tunnel: TunnelEndpointDataSchema, }), }), ); @@ -240,6 +251,13 @@ const TunnelStateTransitionSchema = oneOf( details: enumeration('nothing', 'block', 'reconnect'), }), object({ + state: enumeration('connecting', 'connected'), + details: object({ + address: string, + tunnel: TunnelEndpointDataSchema, + }), + }), + object({ state: enumeration('blocked'), details: oneOf( object({ diff --git a/gui/packages/desktop/src/renderer/redux/connection/actions.js b/gui/packages/desktop/src/renderer/redux/connection/actions.js index 668eb2a67b..6f8a297678 100644 --- a/gui/packages/desktop/src/renderer/redux/connection/actions.js +++ b/gui/packages/desktop/src/renderer/redux/connection/actions.js @@ -1,13 +1,15 @@ // @flow -import type { AfterDisconnect, BlockReason } from '../../lib/daemon-rpc'; +import type { AfterDisconnect, BlockReason, TunnelEndpoint } from '../../lib/daemon-rpc'; type ConnectingAction = { type: 'CONNECTING', + tunnelEndpoint: ?TunnelEndpoint, }; type ConnectedAction = { type: 'CONNECTED', + tunnelEndpoint: TunnelEndpoint, }; type DisconnectedAction = { @@ -54,15 +56,17 @@ export type ConnectionAction = | OnlineAction | OfflineAction; -function connecting(): ConnectingAction { +function connecting(tunnelEndpoint: ?TunnelEndpoint): ConnectingAction { return { type: 'CONNECTING', + tunnelEndpoint, }; } -function connected(): ConnectedAction { +function connected(tunnelEndpoint: TunnelEndpoint): ConnectedAction { return { type: 'CONNECTED', + tunnelEndpoint, }; } diff --git a/gui/packages/desktop/src/renderer/redux/connection/reducers.js b/gui/packages/desktop/src/renderer/redux/connection/reducers.js index b90f285e4f..622663dc14 100644 --- a/gui/packages/desktop/src/renderer/redux/connection/reducers.js +++ b/gui/packages/desktop/src/renderer/redux/connection/reducers.js @@ -32,10 +32,10 @@ export default function( return { ...state, ...action.newLocation }; case 'CONNECTING': - return { ...state, status: { state: 'connecting' } }; + return { ...state, status: { state: 'connecting', details: action.tunnelEndpoint } }; case 'CONNECTED': - return { ...state, status: { state: 'connected' } }; + return { ...state, status: { state: 'connected', details: action.tunnelEndpoint } }; case 'DISCONNECTED': return { ...state, status: { state: 'disconnected' } }; diff --git a/mullvad-cli/src/cmds/status.rs b/mullvad-cli/src/cmds/status.rs index 11e436d34a..d25a591726 100644 --- a/mullvad-cli/src/cmds/status.rs +++ b/mullvad-cli/src/cmds/status.rs @@ -31,8 +31,9 @@ impl Command for Status { for new_state in rpc.new_state_subscribe()? { print_state(&new_state); - if new_state == Connected || new_state == Disconnected { - print_location(&mut rpc)?; + match new_state { + Connected(_) | Disconnected => print_location(&mut rpc)?, + _ => {} } } } @@ -44,8 +45,8 @@ fn print_state(state: &TunnelStateTransition) { print!("Tunnel status: "); match state { Blocked(reason) => println!("Blocked ({})", reason), - Connected => println!("Connected"), - Connecting => println!("Connecting..."), + Connected(_) => println!("Connected"), + Connecting(_) => println!("Connecting..."), Disconnected => println!("Disconnected"), Disconnecting(_) => println!("Disconnecting..."), } diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs index ad62336a38..a65a34dd8e 100644 --- a/mullvad-daemon/src/lib.rs +++ b/mullvad-daemon/src/lib.rs @@ -455,7 +455,7 @@ impl Daemon { }) }); } - Connecting | Connected | Disconnecting(..) => { + Connecting(_) | Connected(_) | Disconnecting(..) => { if let Some(ref relay) = self.last_generated_relay { let location = relay.location.as_ref().cloned().unwrap(); let hostname = relay.hostname.clone(); diff --git a/talpid-core/src/tunnel_state_machine/connected_state.rs b/talpid-core/src/tunnel_state_machine/connected_state.rs index a969ece39f..d648b43ec4 100644 --- a/talpid-core/src/tunnel_state_machine/connected_state.rs +++ b/talpid-core/src/tunnel_state_machine/connected_state.rs @@ -149,12 +149,13 @@ impl TunnelState for ConnectedState { shared_values: &mut SharedTunnelStateValues, bootstrap: Self::Bootstrap, ) -> (TunnelStateWrapper, TunnelStateTransition) { + let tunnel_endpoint = bootstrap.tunnel_parameters.endpoint; let connected_state = ConnectedState::from(bootstrap); match connected_state.set_security_policy(shared_values) { Ok(()) => ( TunnelStateWrapper::from(connected_state), - TunnelStateTransition::Connected, + TunnelStateTransition::Connected(tunnel_endpoint), ), Err(error) => { error!("{}", error.display_chain()); diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs index 1e0880141e..f2ce3e0b4e 100644 --- a/talpid-core/src/tunnel_state_machine/connecting_state.rs +++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs @@ -283,9 +283,9 @@ impl TunnelState for ConnectingState { { None => BlockedState::enter(shared_values, BlockReason::NoMatchingRelay), Some(tunnel_parameters) => { - if let Err(error) = - Self::set_security_policy(shared_values, tunnel_parameters.endpoint) - { + let tunnel_endpoint = tunnel_parameters.endpoint; + + if let Err(error) = Self::set_security_policy(shared_values, tunnel_endpoint) { error!("{}", error.display_chain()); BlockedState::enter(shared_values, BlockReason::StartTunnelError) } else { @@ -297,7 +297,7 @@ impl TunnelState for ConnectingState { ) { Ok(connecting_state) => ( TunnelStateWrapper::from(connecting_state), - TunnelStateTransition::Connecting, + TunnelStateTransition::Connecting(tunnel_endpoint), ), Err(error) => { let block_reason = match *error.kind() { diff --git a/talpid-types/src/net.rs b/talpid-types/src/net.rs index e00d0d9fe4..e871e7a93e 100644 --- a/talpid-types/src/net.rs +++ b/talpid-types/src/net.rs @@ -4,7 +4,7 @@ use std::net::{IpAddr, SocketAddr}; use std::str::FromStr; /// Represents one tunnel endpoint. Address, plus extra parameters specific to tunnel protocol. -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize)] pub struct TunnelEndpoint { pub address: IpAddr, pub tunnel: TunnelEndpointData, diff --git a/talpid-types/src/tunnel.rs b/talpid-types/src/tunnel.rs index ffe89ecd6a..cfe1472cdf 100644 --- a/talpid-types/src/tunnel.rs +++ b/talpid-types/src/tunnel.rs @@ -1,5 +1,7 @@ use std::fmt; +use super::net::TunnelEndpoint; + /// Event resulting from a transition to a new tunnel state. #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] |
