summaryrefslogtreecommitdiffhomepage
path: root/android/lib/daemon-grpc
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2024-11-18 14:23:05 +0100
committerDavid Göransson <david.goransson@mullvad.net>2024-11-27 09:00:18 +0100
commit1bb7fc7ebaa2837ed9f9d28c2bb5a6fd91033988 (patch)
treea83565926fb753a2dd9fd24f0e2bd07262e4507e /android/lib/daemon-grpc
parent0d155385e1cb7075012bd270de0398d83a438bc5 (diff)
downloadmullvadvpn-1bb7fc7ebaa2837ed9f9d28c2bb5a6fd91033988.tar.xz
mullvadvpn-1bb7fc7ebaa2837ed9f9d28c2bb5a6fd91033988.zip
Handle legacy always-on vpn profiles
Co-authored-by: Jonatan Rhodin <jonatan.rhodin@mullvad.net>
Diffstat (limited to 'android/lib/daemon-grpc')
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt127
1 files changed, 83 insertions, 44 deletions
diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt
index fe0222596b..0412871f43 100644
--- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt
+++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt
@@ -35,6 +35,9 @@ import net.mullvad.mullvadvpn.lib.model.DnsState
import net.mullvad.mullvadvpn.lib.model.Endpoint
import net.mullvad.mullvadvpn.lib.model.ErrorState
import net.mullvad.mullvadvpn.lib.model.ErrorStateCause
+import net.mullvad.mullvadvpn.lib.model.ErrorStateCause.AuthFailed
+import net.mullvad.mullvadvpn.lib.model.ErrorStateCause.OtherAlwaysOnApp
+import net.mullvad.mullvadvpn.lib.model.ErrorStateCause.TunnelParameterError
import net.mullvad.mullvadvpn.lib.model.FeatureIndicator
import net.mullvad.mullvadvpn.lib.model.GeoIpLocation
import net.mullvad.mullvadvpn.lib.model.GeoLocationId
@@ -76,49 +79,78 @@ import org.joda.time.Instant
internal fun ManagementInterface.TunnelState.toDomain(): TunnelState =
when (stateCase!!) {
- ManagementInterface.TunnelState.StateCase.DISCONNECTED ->
- TunnelState.Disconnected(
- location =
- with(disconnected) {
- if (hasDisconnectedLocation()) {
- disconnectedLocation.toDomain()
- } else null
- }
- )
- ManagementInterface.TunnelState.StateCase.CONNECTING ->
- TunnelState.Connecting(
- endpoint = connecting.relayInfo.tunnelEndpoint.toDomain(),
- location =
- with(connecting.relayInfo) {
- if (hasLocation()) {
- location.toDomain()
- } else null
- },
- featureIndicators = connecting.featureIndicators.toDomain(),
- )
- ManagementInterface.TunnelState.StateCase.CONNECTED ->
- TunnelState.Connected(
- endpoint = connected.relayInfo.tunnelEndpoint.toDomain(),
- location =
- with(connected.relayInfo) {
- if (hasLocation()) {
- location.toDomain()
- } else {
- null
- }
- },
- featureIndicators = connected.featureIndicators.toDomain(),
- )
- ManagementInterface.TunnelState.StateCase.DISCONNECTING ->
- TunnelState.Disconnecting(
- actionAfterDisconnect = disconnecting.afterDisconnect.toDomain()
- )
- ManagementInterface.TunnelState.StateCase.ERROR ->
- TunnelState.Error(errorState = error.errorState.toDomain())
+ ManagementInterface.TunnelState.StateCase.DISCONNECTED -> disconnected.toDomain()
+ ManagementInterface.TunnelState.StateCase.CONNECTING -> connecting.toDomain()
+ ManagementInterface.TunnelState.StateCase.CONNECTED -> connected.toDomain()
+ ManagementInterface.TunnelState.StateCase.DISCONNECTING -> disconnecting.toDomain()
+ ManagementInterface.TunnelState.StateCase.ERROR -> error.toDomain()
ManagementInterface.TunnelState.StateCase.STATE_NOT_SET ->
TunnelState.Disconnected(location = disconnected.disconnectedLocation.toDomain())
}
+private fun ManagementInterface.TunnelState.Connecting.toDomain(): TunnelState.Connecting =
+ TunnelState.Connecting(
+ endpoint = relayInfo.tunnelEndpoint.toDomain(),
+ location =
+ if (relayInfo.hasLocation()) {
+ relayInfo.location.toDomain()
+ } else null,
+ featureIndicators = featureIndicators.toDomain(),
+ )
+
+private fun ManagementInterface.TunnelState.Disconnected.toDomain(): TunnelState.Disconnected =
+ TunnelState.Disconnected(
+ location =
+ if (hasDisconnectedLocation()) {
+ disconnectedLocation.toDomain()
+ } else null
+ )
+
+private fun ManagementInterface.TunnelState.Connected.toDomain(): TunnelState.Connected =
+ TunnelState.Connected(
+ endpoint = relayInfo.tunnelEndpoint.toDomain(),
+ location =
+ if (relayInfo.hasLocation()) {
+ relayInfo.location.toDomain()
+ } else {
+ null
+ },
+ featureIndicators = featureIndicators.toDomain(),
+ )
+
+private fun ManagementInterface.TunnelState.Disconnecting.toDomain(): TunnelState.Disconnecting =
+ TunnelState.Disconnecting(actionAfterDisconnect = afterDisconnect.toDomain())
+
+private fun ManagementInterface.TunnelState.Error.toDomain(): TunnelState.Error {
+ val otherAlwaysOnAppError =
+ errorState.let {
+ if (it.hasOtherAlwaysOnAppError()) {
+ OtherAlwaysOnApp(it.otherAlwaysOnAppError.appName)
+ } else {
+ null
+ }
+ }
+
+ val invalidDnsServers =
+ errorState.let {
+ if (it.hasInvalidDnsServersError()) {
+ ErrorStateCause.InvalidDnsServers(
+ it.invalidDnsServersError.ipAddrsList.toList().map { InetAddress.getByName(it) }
+ )
+ } else {
+ null
+ }
+ }
+
+ return TunnelState.Error(
+ errorState =
+ errorState.toDomain(
+ otherAlwaysOnApp = otherAlwaysOnAppError,
+ invalidDnsServers = invalidDnsServers,
+ )
+ )
+}
+
internal fun ManagementInterface.GeoIpLocation.toDomain(): GeoIpLocation =
GeoIpLocation(
ipv4 =
@@ -198,12 +230,15 @@ internal fun ManagementInterface.AfterDisconnect.toDomain(): ActionAfterDisconne
throw IllegalArgumentException("Unrecognized action after disconnect")
}
-internal fun ManagementInterface.ErrorState.toDomain(): ErrorState =
+internal fun ManagementInterface.ErrorState.toDomain(
+ otherAlwaysOnApp: ErrorStateCause.OtherAlwaysOnApp?,
+ invalidDnsServers: ErrorStateCause.InvalidDnsServers?,
+): ErrorState =
ErrorState(
cause =
when (cause!!) {
ManagementInterface.ErrorState.Cause.AUTH_FAILED ->
- ErrorStateCause.AuthFailed(authFailedError.toDomain())
+ AuthFailed(authFailedError.toDomain())
ManagementInterface.ErrorState.Cause.IPV6_UNAVAILABLE ->
ErrorStateCause.Ipv6Unavailable
ManagementInterface.ErrorState.Cause.SET_FIREWALL_POLICY_ERROR ->
@@ -212,16 +247,20 @@ internal fun ManagementInterface.ErrorState.toDomain(): ErrorState =
ManagementInterface.ErrorState.Cause.START_TUNNEL_ERROR ->
ErrorStateCause.StartTunnelError
ManagementInterface.ErrorState.Cause.TUNNEL_PARAMETER_ERROR ->
- ErrorStateCause.TunnelParameterError(parameterError.toDomain())
+ TunnelParameterError(parameterError.toDomain())
ManagementInterface.ErrorState.Cause.IS_OFFLINE -> ErrorStateCause.IsOffline
- ManagementInterface.ErrorState.Cause.VPN_PERMISSION_DENIED ->
- ErrorStateCause.VpnPermissionDenied
ManagementInterface.ErrorState.Cause.SPLIT_TUNNEL_ERROR ->
ErrorStateCause.StartTunnelError
ManagementInterface.ErrorState.Cause.UNRECOGNIZED,
ManagementInterface.ErrorState.Cause.NEED_FULL_DISK_PERMISSIONS,
ManagementInterface.ErrorState.Cause.CREATE_TUNNEL_DEVICE ->
throw IllegalArgumentException("Unrecognized error state cause")
+
+ ManagementInterface.ErrorState.Cause.NOT_PREPARED -> ErrorStateCause.NotPrepared
+ ManagementInterface.ErrorState.Cause.OTHER_ALWAYS_ON_APP -> otherAlwaysOnApp!!
+ ManagementInterface.ErrorState.Cause.OTHER_LEGACY_ALWAYS_ON_VPN ->
+ ErrorStateCause.OtherLegacyAlwaysOnApp
+ ManagementInterface.ErrorState.Cause.INVALID_DNS_SERVERS -> invalidDnsServers!!
},
isBlocking = !hasBlockingError(),
)