diff options
| -rw-r--r-- | CHANGELOG.md | 1 | ||||
| -rw-r--r-- | gui/src/main/index.ts | 7 | ||||
| -rw-r--r-- | mullvad-daemon/src/device/mod.rs | 2 | ||||
| -rw-r--r-- | mullvad-daemon/src/management_interface.rs | 25 |
4 files changed, 21 insertions, 14 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c1f3afe37..9c51b55e5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ Line wrap the file at 100 chars. Th ### Fixed - Fix time added view displayed due to incorrect local clock. +- Fix logout failing if the API cannot be reached in the GUI. #### Windows - Be more scrupulous about removing temporary files used by the installer and uninstaller. diff --git a/gui/src/main/index.ts b/gui/src/main/index.ts index fc34ab2033..dce30ff2b0 100644 --- a/gui/src/main/index.ts +++ b/gui/src/main/index.ts @@ -1385,7 +1385,12 @@ class ApplicationMain { IpcMainEventChannel.account.handleUpdateData(() => this.updateAccountData()); IpcMainEventChannel.account.handleGetDeviceState(async () => { - await this.daemonRpc.updateDevice(); + try { + await this.daemonRpc.updateDevice(); + } catch (e) { + const error = e as Error; + log.warn(`Failed to update device info: ${error.message}`); + } return this.daemonRpc.getDevice(); }); IpcMainEventChannel.account.handleListDevices((accountToken: AccountToken) => { diff --git a/mullvad-daemon/src/device/mod.rs b/mullvad-daemon/src/device/mod.rs index 4d420a404a..a0e3bed908 100644 --- a/mullvad-daemon/src/device/mod.rs +++ b/mullvad-daemon/src/device/mod.rs @@ -279,7 +279,7 @@ impl Error { } } - fn unpack(&self) -> &Error { + pub fn unpack(&self) -> &Error { if let Error::ResponseFailure(ref inner) = self { &*inner } else { diff --git a/mullvad-daemon/src/management_interface.rs b/mullvad-daemon/src/management_interface.rs index 078fb52d97..2264159fc8 100644 --- a/mullvad-daemon/src/management_interface.rs +++ b/mullvad-daemon/src/management_interface.rs @@ -448,7 +448,7 @@ impl ManagementService for ManagementServiceImpl { "Unable to get account data from API: {}", error.display_chain() ); - map_rest_error(error) + map_rest_error(&error) }) } @@ -927,15 +927,15 @@ fn map_daemon_error(error: crate::Error) -> Status { use crate::Error as DaemonError; match error { - DaemonError::RestError(error) => map_rest_error(error), + DaemonError::RestError(error) => map_rest_error(&error), DaemonError::SettingsError(error) => map_settings_error(error), DaemonError::AlreadyLoggedIn => Status::already_exists(error.to_string()), - DaemonError::LoginError(error) => map_device_error(error), - DaemonError::LogoutError(error) => map_device_error(error), - DaemonError::KeyRotationError(error) => map_device_error(error), - DaemonError::ListDevicesError(error) => map_device_error(error), - DaemonError::RemoveDeviceError(error) => map_device_error(error), - DaemonError::UpdateDeviceError(error) => map_device_error(error), + DaemonError::LoginError(error) => map_device_error(&error), + DaemonError::LogoutError(error) => map_device_error(&error), + DaemonError::KeyRotationError(error) => map_device_error(&error), + DaemonError::ListDevicesError(error) => map_device_error(&error), + DaemonError::RemoveDeviceError(error) => map_device_error(&error), + DaemonError::UpdateDeviceError(error) => map_device_error(&error), #[cfg(windows)] DaemonError::SplitTunnelError(error) => map_split_tunnel_error(error), DaemonError::AccountHistory(error) => map_account_history_error(error), @@ -975,15 +975,15 @@ fn map_rest_voucher_error(error: RestError) -> Status { error => Status::unknown(format!("Voucher error: {}", error)), }, - error => map_rest_error(error), + error => map_rest_error(&error), } } /// Converts a REST API error into a tonic status. -fn map_rest_error(error: RestError) -> Status { +fn map_rest_error(error: &RestError) -> Status { match error { RestError::ApiError(status, message) - if status == StatusCode::UNAUTHORIZED || status == StatusCode::FORBIDDEN => + if *status == StatusCode::UNAUTHORIZED || *status == StatusCode::FORBIDDEN => { Status::new(Code::Unauthenticated, message) } @@ -1009,7 +1009,7 @@ fn map_settings_error(error: settings::Error) -> Status { } /// Converts an instance of [`mullvad_daemon::device::Error`] into a tonic status. -fn map_device_error(error: device::Error) -> Status { +fn map_device_error(error: &device::Error) -> Status { match error { device::Error::MaxDevicesReached => Status::new(Code::ResourceExhausted, error.to_string()), device::Error::InvalidAccount => Status::new(Code::Unauthenticated, error.to_string()), @@ -1020,6 +1020,7 @@ fn map_device_error(error: device::Error) -> Status { Status::new(Code::Unavailable, error.to_string()) } device::Error::OtherRestError(error) => map_rest_error(error), + device::Error::ResponseFailure(error) => map_device_error(error.unpack()), _ => Status::new(Code::Unknown, error.to_string()), } } |
