summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gui/packages/desktop/src/renderer/app.js6
-rw-r--r--gui/packages/desktop/src/renderer/lib/daemon-rpc.js44
-rw-r--r--gui/packages/desktop/src/renderer/redux/connection/actions.js10
-rw-r--r--gui/packages/desktop/src/renderer/redux/connection/reducers.js4
-rw-r--r--mullvad-cli/src/cmds/status.rs9
-rw-r--r--mullvad-daemon/src/lib.rs2
-rw-r--r--talpid-core/src/tunnel_state_machine/connected_state.rs3
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs8
-rw-r--r--talpid-types/src/net.rs2
-rw-r--r--talpid-types/src/tunnel.rs2
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")]