From 2d7d6e1357411787e15346c0da69aaff2a7a278a Mon Sep 17 00:00:00 2001 From: kari-ts <135075563+kari-ts@users.noreply.github.com> Date: Tue, 7 May 2024 12:44:27 -0700 Subject: [PATCH] IpnViewModel: reset vpn state before login/reauth (#366) Fixes ENG-3479 Clear routes when switching profiles and reauthenticating. This fixes an issue where previously set routes/DNS configs caused actions to fail. Signed-off-by: kari-ts --- .../ipn/ui/viewModel/IpnViewModel.kt | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/android/src/main/java/com/tailscale/ipn/ui/viewModel/IpnViewModel.kt b/android/src/main/java/com/tailscale/ipn/ui/viewModel/IpnViewModel.kt index 9f7e0e9..7b19b32 100644 --- a/android/src/main/java/com/tailscale/ipn/ui/viewModel/IpnViewModel.kt +++ b/android/src/main/java/com/tailscale/ipn/ui/viewModel/IpnViewModel.kt @@ -100,9 +100,19 @@ open class IpnViewModel : ViewModel() { } } + // Need to stop running before logging in to clear routes: + // https://linear.app/tailscale/issue/ENG-3441/routesdns-is-not-cleared-when-switching-profiles-or-reauthenticating + val stopThenLogin = { + Client(viewModelScope).editPrefs(Ipn.MaskedPrefs().apply { WantRunning = false }) { result -> + result + .onSuccess { loginAction() } + .onFailure { Log.e(TAG, "Error setting wantRunning to false: ${it.message}") } + } + } + val startAction = { Client(viewModelScope).start(Ipn.Options(AuthKey = authKey)) { start -> - start.onFailure { completionHandler(Result.failure(it)) }.onSuccess { loginAction() } + start.onFailure { completionHandler(Result.failure(it)) }.onSuccess { stopThenLogin() } } } @@ -164,9 +174,16 @@ open class IpnViewModel : ViewModel() { } fun switchProfile(profile: IpnLocal.LoginProfile, completionHandler: (Result) -> Unit) { - Client(viewModelScope).switchProfile(profile) { - startVPN() - completionHandler(it) + val switchProfile = { + Client(viewModelScope).switchProfile(profile) { + startVPN() + completionHandler(it) + } + } + Client(viewModelScope).editPrefs(Ipn.MaskedPrefs().apply { WantRunning = false }) { result -> + result + .onSuccess { switchProfile() } + .onFailure { Log.e(TAG, "Error setting wantRunning to false: ${it.message}") } } }