summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMarkus Pettersson <markus.pettersson@mullvad.net>2023-05-30 16:32:22 +0200
committerDavid Lönnhager <david.l@mullvad.net>2023-06-08 10:59:23 +0200
commit7a155092662260116c5d7829645e7dfeaf7a0665 (patch)
tree9f712f14a461ab149e08352b0090419d6bb26965
parent67b7f7d987898df0dce5d78887ecf6f9c8776143 (diff)
downloadmullvadvpn-7a155092662260116c5d7829645e7dfeaf7a0665.tar.xz
mullvadvpn-7a155092662260116c5d7829645e7dfeaf7a0665.zip
Improve UX of CLI when user connects while not logged in
If the user is *not* logged in to an active account, we will from now on issue a warning if they try to connect to a relay using `mullvad-cli`. Previously, we would silently just start blocking all internet traffic. This is well and good, as this is mandated by the state machine model. The huge issue is that the user was unaware about the current status of their connection without running further CLI commands or checking the GUI. As this is to be considered a frustrating edge case, we might as well try to help the user, since they can't look for answers on the world wide web.
-rw-r--r--mullvad-cli/src/cmds/status.rs20
-rw-r--r--mullvad-cli/src/cmds/tunnel_state.rs31
2 files changed, 50 insertions, 1 deletions
diff --git a/mullvad-cli/src/cmds/status.rs b/mullvad-cli/src/cmds/status.rs
index 8ddd195333..a4a8add15e 100644
--- a/mullvad-cli/src/cmds/status.rs
+++ b/mullvad-cli/src/cmds/status.rs
@@ -2,7 +2,7 @@ use anyhow::Result;
use clap::{Args, Subcommand};
use futures::StreamExt;
use mullvad_management_interface::{client::DaemonEvent, MullvadProxyClient};
-use mullvad_types::states::TunnelState;
+use mullvad_types::{device::DeviceState, states::TunnelState};
use crate::format;
@@ -81,6 +81,9 @@ impl Status {
pub async fn handle(cmd: Option<Status>, args: StatusArgs) -> Result<()> {
let mut rpc = MullvadProxyClient::new().await?;
let state = rpc.get_tunnel_state().await?;
+ let device = rpc.get_device().await?;
+
+ print_account_loggedout(&state, &device);
if args.debug {
println!("Tunnel state: {state:#?}");
@@ -122,3 +125,18 @@ async fn print_location(rpc: &mut MullvadProxyClient) -> Result<()> {
);
Ok(())
}
+
+fn print_account_loggedout(state: &TunnelState, device: &DeviceState) {
+ match state {
+ TunnelState::Connecting { .. } | TunnelState::Connected { .. } | TunnelState::Error(_) => {
+ match device {
+ DeviceState::LoggedOut => {
+ println!("Warning: You are not logged in to an account.")
+ }
+ DeviceState::Revoked => println!("Warning: This device has been revoked."),
+ DeviceState::LoggedIn(_) => (),
+ }
+ }
+ TunnelState::Disconnected | TunnelState::Disconnecting(_) => (),
+ }
+}
diff --git a/mullvad-cli/src/cmds/tunnel_state.rs b/mullvad-cli/src/cmds/tunnel_state.rs
index 383b343ef4..6e115c5ba1 100644
--- a/mullvad-cli/src/cmds/tunnel_state.rs
+++ b/mullvad-cli/src/cmds/tunnel_state.rs
@@ -2,11 +2,15 @@ use crate::format;
use anyhow::{anyhow, Result};
use futures::{Stream, StreamExt};
use mullvad_management_interface::{client::DaemonEvent, MullvadProxyClient};
+use mullvad_types::device::DeviceState;
use mullvad_types::states::TunnelState;
pub async fn connect(wait: bool) -> Result<()> {
let mut rpc = MullvadProxyClient::new().await?;
+ let device_state = rpc.get_device().await?;
+ print_account_loggedout(&device_state);
+
let listener = if wait {
Some(rpc.events_listen().await?)
} else {
@@ -48,6 +52,9 @@ pub async fn disconnect(wait: bool) -> Result<()> {
pub async fn reconnect(wait: bool) -> Result<()> {
let mut rpc = MullvadProxyClient::new().await?;
+ let device_state = rpc.get_device().await?;
+ print_account_loggedout(&device_state);
+
let listener = if wait {
Some(rpc.events_listen().await?)
} else {
@@ -83,3 +90,27 @@ async fn wait_for_tunnel_state(
}
Err(anyhow!("Failed to wait for expected tunnel state"))
}
+
+/// Checks the if the user is logged in. If not, we print a warning to get their
+/// attention.
+///
+/// When using the CLI, the user could potentially end up in a situation where
+/// they try to connect to a Mullvad relay without having successfully logged in
+/// to their account. In this case, we at least want to issue a warning to guide
+/// the user when they inevitably will go troubleshooting.
+fn print_account_loggedout(state: &DeviceState) {
+ match state {
+ DeviceState::LoggedOut => println!("Warning: You are not logged in to an account."),
+ DeviceState::Revoked => println!("Warning: This device has been revoked"),
+ DeviceState::LoggedIn(_) => return, // Normal case, do nothing.
+ };
+
+ println!(
+ "Mullvad is blocking all network traffic until you perform one of the following actions:
+
+1. Login to a Mullvad account with available time/credits.
+2. Disconnect from Mullvad VPN. This can either be done from the CLI or the Mullvad App.
+
+For more information, try 'mullvad account -h' or 'mullvad disconnect -h'"
+ );
+}