summaryrefslogtreecommitdiffhomepage
path: root/talpid-core/src
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2024-05-24 13:50:11 +0200
committerDavid Lönnhager <david.l@mullvad.net>2024-05-29 12:55:01 +0200
commit461bb179af039b2ab9622f8df2c2bffd09a21b77 (patch)
tree38f67fdda816084a54d888d3f4df0a5d3754e85a /talpid-core/src
parent2b04fed8d6a486d97af47f1add45b0eeb1071db8 (diff)
downloadmullvadvpn-461bb179af039b2ab9622f8df2c2bffd09a21b77.tar.xz
mullvadvpn-461bb179af039b2ab9622f8df2c2bffd09a21b77.zip
Add error state cause for full disk permissions error
Diffstat (limited to 'talpid-core/src')
-rw-r--r--talpid-core/src/split_tunnel/macos/mod.rs17
-rw-r--r--talpid-core/src/split_tunnel/macos/process.rs10
-rw-r--r--talpid-core/src/tunnel_state_machine/connected_state.rs6
-rw-r--r--talpid-core/src/tunnel_state_machine/connecting_state.rs6
-rw-r--r--talpid-core/src/tunnel_state_machine/mod.rs8
5 files changed, 30 insertions, 17 deletions
diff --git a/talpid-core/src/split_tunnel/macos/mod.rs b/talpid-core/src/split_tunnel/macos/mod.rs
index 980097d94b..d43c124043 100644
--- a/talpid-core/src/split_tunnel/macos/mod.rs
+++ b/talpid-core/src/split_tunnel/macos/mod.rs
@@ -42,6 +42,16 @@ impl Error {
}
}
+impl From<&Error> for ErrorStateCause {
+ fn from(value: &Error) -> Self {
+ match value {
+ Error::Process(error) => ErrorStateCause::from(error),
+ _v if _v.is_offline() => ErrorStateCause::IsOffline,
+ _ => ErrorStateCause::SplitTunnelError,
+ }
+ }
+}
+
/// Split tunneling actor
pub struct SplitTunnel {
state: State,
@@ -171,6 +181,10 @@ impl SplitTunnel {
/// Handle process monitor unexpectedly stopping
fn handle_process_monitor_shutdown(&mut self, result: Result<(), process::Error>) {
+ let cause = match result {
+ Ok(_) => ErrorStateCause::SplitTunnelError,
+ Err(ref error) => ErrorStateCause::from(error),
+ };
match result {
Ok(()) => log::error!("Process monitor stopped unexpectedly with no error"),
Err(error) => {
@@ -185,8 +199,7 @@ impl SplitTunnel {
// decisions for new processes
if self.state.active() {
if let Some(tunnel_tx) = self.tunnel_tx.upgrade() {
- let _ = tunnel_tx
- .unbounded_send(TunnelCommand::Block(ErrorStateCause::SplitTunnelError));
+ let _ = tunnel_tx.unbounded_send(TunnelCommand::Block(cause));
}
}
diff --git a/talpid-core/src/split_tunnel/macos/process.rs b/talpid-core/src/split_tunnel/macos/process.rs
index f913b9bb49..013aca34e4 100644
--- a/talpid-core/src/split_tunnel/macos/process.rs
+++ b/talpid-core/src/split_tunnel/macos/process.rs
@@ -21,6 +21,7 @@ use std::{
time::Duration,
};
use talpid_platform_metadata::MacosVersion;
+use talpid_types::tunnel::ErrorStateCause;
use tokio::io::{AsyncBufReadExt, BufReader};
const SHUTDOWN_TIMEOUT: Duration = Duration::from_secs(3);
@@ -56,6 +57,15 @@ pub enum Error {
FindProcessPath(#[source] io::Error, u32),
}
+impl From<&Error> for ErrorStateCause {
+ fn from(value: &Error) -> Self {
+ match value {
+ Error::NeedFullDiskPermissions => ErrorStateCause::NeedFullDiskPermissions,
+ _ => ErrorStateCause::SplitTunnelError,
+ }
+ }
+}
+
pub struct ProcessMonitor(());
#[derive(Debug)]
diff --git a/talpid-core/src/tunnel_state_machine/connected_state.rs b/talpid-core/src/tunnel_state_machine/connected_state.rs
index 80ca26ec56..395a67a057 100644
--- a/talpid-core/src/tunnel_state_machine/connected_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connected_state.rs
@@ -353,11 +353,9 @@ impl ConnectedState {
}
}
Err(error) => {
+ let cause = ErrorStateCause::from(&error);
let _ = result_tx.send(Err(error));
- return self.disconnect(
- shared_values,
- AfterDisconnect::Block(ErrorStateCause::SplitTunnelError),
- );
+ return self.disconnect(shared_values, AfterDisconnect::Block(cause));
}
}
SameState(self)
diff --git a/talpid-core/src/tunnel_state_machine/connecting_state.rs b/talpid-core/src/tunnel_state_machine/connecting_state.rs
index 5df58a6adf..a4267d0d56 100644
--- a/talpid-core/src/tunnel_state_machine/connecting_state.rs
+++ b/talpid-core/src/tunnel_state_machine/connecting_state.rs
@@ -498,11 +498,9 @@ impl ConnectingState {
}
}
Err(error) => {
+ let cause = ErrorStateCause::from(&error);
let _ = result_tx.send(Err(error));
- return self.disconnect(
- shared_values,
- AfterDisconnect::Block(ErrorStateCause::SplitTunnelError),
- );
+ return self.disconnect(shared_values, AfterDisconnect::Block(cause));
}
}
SameState(self)
diff --git a/talpid-core/src/tunnel_state_machine/mod.rs b/talpid-core/src/tunnel_state_machine/mod.rs
index e31dec3624..a74d7e39b5 100644
--- a/talpid-core/src/tunnel_state_machine/mod.rs
+++ b/talpid-core/src/tunnel_state_machine/mod.rs
@@ -540,13 +540,7 @@ impl SharedTunnelStateValues {
error.display_chain_with_msg("Failed to set VPN interface for split tunnel")
)
})
- .map_err(|error| {
- if error.is_offline() {
- ErrorStateCause::IsOffline
- } else {
- ErrorStateCause::SplitTunnelError
- }
- })
+ .map_err(|error| ErrorStateCause::from(&error))
}
pub fn set_allow_lan(&mut self, allow_lan: bool) -> Result<(), ErrorStateCause> {