diff options
Diffstat (limited to 'android/src')
9 files changed, 96 insertions, 1 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsOptions.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsOptions.kt new file mode 100644 index 0000000000..e4d7b75481 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsOptions.kt @@ -0,0 +1,6 @@ +package net.mullvad.mullvadvpn.model + +import java.net.InetAddress +import java.util.ArrayList + +data class DnsOptions(val custom: Boolean, val addresses: ArrayList<InetAddress>) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt index 7579a469ca..7e3bdef2b3 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt @@ -2,4 +2,4 @@ package net.mullvad.mullvadvpn.model import net.mullvad.talpid.net.wireguard.TunnelOptions as WireguardTunnelOptions -data class TunnelOptions(val wireguard: WireguardTunnelOptions) +data class TunnelOptions(val wireguard: WireguardTunnelOptions, val dnsOptions: DnsOptions) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/CustomDns.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/CustomDns.kt new file mode 100644 index 0000000000..95a4be3cb9 --- /dev/null +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/CustomDns.kt @@ -0,0 +1,68 @@ +package net.mullvad.mullvadvpn.service + +import java.net.InetAddress +import java.util.ArrayList +import kotlin.properties.Delegates.observable +import net.mullvad.mullvadvpn.model.DnsOptions +import net.mullvad.talpid.util.EventNotifier + +class CustomDns(val daemon: MullvadDaemon, val settingsListener: SettingsListener) { + private var enabled by observable(false) { _, oldValue, newValue -> + if (oldValue != newValue) { + onEnabledChanged.notify(newValue) + } + } + + private var dnsServers by observable<ArrayList<InetAddress>>(ArrayList()) { _, _, servers -> + onDnsServersChanged.notify(servers.toList()) + } + + val onEnabledChanged = EventNotifier(false) + val onDnsServersChanged = EventNotifier<List<InetAddress>>(emptyList()) + + init { + settingsListener.dnsOptionsNotifier.subscribe(this) { dnsOptions -> + enabled = dnsOptions.custom + dnsServers = ArrayList(dnsOptions.addresses) + } + } + + fun onDestroy() { + settingsListener.dnsOptionsNotifier.unsubscribe(this) + } + + fun enable() { + synchronized(this) { + changeDnsOptions(true, dnsServers) + } + } + + fun disable() { + synchronized(this) { + changeDnsOptions(false, dnsServers) + } + } + + fun addDnsServer(server: InetAddress) { + synchronized(this) { + if (!dnsServers.contains(server)) { + dnsServers.add(server) + changeDnsOptions(enabled, dnsServers) + } + } + } + + fun removeDnsServer(server: InetAddress) { + synchronized(this) { + if (dnsServers.remove(server)) { + changeDnsOptions(enabled, dnsServers) + } + } + } + + private fun changeDnsOptions(enable: Boolean, dnsServers: ArrayList<InetAddress>) { + val options = DnsOptions(enable, dnsServers) + + daemon.setDnsOptions(options) + } +} diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt index 838fe80c31..083568f726 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt @@ -1,6 +1,7 @@ package net.mullvad.mullvadvpn.service import net.mullvad.mullvadvpn.model.AppVersionInfo +import net.mullvad.mullvadvpn.model.DnsOptions import net.mullvad.mullvadvpn.model.GeoIpLocation import net.mullvad.mullvadvpn.model.GetAccountDataResult import net.mullvad.mullvadvpn.model.KeygenEvent @@ -106,6 +107,10 @@ class MullvadDaemon(val vpnService: MullvadVpnService) { setAutoConnect(daemonInterfaceAddress, autoConnect) } + fun setDnsOptions(dnsOptions: DnsOptions) { + setDnsOptions(daemonInterfaceAddress, dnsOptions) + } + fun setWireguardMtu(wireguardMtu: Int?) { setWireguardMtu(daemonInterfaceAddress, wireguardMtu) } @@ -158,6 +163,7 @@ class MullvadDaemon(val vpnService: MullvadVpnService) { private external fun setAccount(daemonInterfaceAddress: Long, accountToken: String?) private external fun setAllowLan(daemonInterfaceAddress: Long, allowLan: Boolean) private external fun setAutoConnect(daemonInterfaceAddress: Long, alwaysOn: Boolean) + private external fun setDnsOptions(daemonInterfaceAddress: Long, dnsOptions: DnsOptions) private external fun setWireguardMtu(daemonInterfaceAddress: Long, wireguardMtu: Int?) private external fun shutdown(daemonInterfaceAddress: Long) private external fun submitVoucher( diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt index be49d3723c..1b31605adc 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt @@ -226,6 +226,7 @@ class MullvadVpnService : TalpidVpnService() { private suspend fun setUpInstance(daemon: MullvadDaemon, settings: Settings) { val settingsListener = SettingsListener(daemon, settings) val connectionProxy = ConnectionProxy(this, daemon) + val customDns = CustomDns(daemon, settingsListener) val splitTunneling = splitTunneling.await() splitTunneling.onChange = { excludedApps -> @@ -241,6 +242,7 @@ class MullvadVpnService : TalpidVpnService() { daemon, connectionProxy, connectivityListener, + customDns, settingsListener, splitTunneling ) diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt index 5ef94a4f5c..135ea9ef28 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt @@ -6,6 +6,7 @@ class ServiceInstance( val daemon: MullvadDaemon, val connectionProxy: ConnectionProxy, val connectivityListener: ConnectivityListener, + val customDns: CustomDns, val settingsListener: SettingsListener, val splitTunneling: SplitTunneling ) { @@ -16,6 +17,7 @@ class ServiceInstance( fun onDestroy() { accountCache.onDestroy() connectionProxy.onDestroy() + customDns.onDestroy() keyStatusListener.onDestroy() locationInfoCache.onDestroy() settingsListener.onDestroy() diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt index 17af7022a8..5ffe9a1a2f 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt @@ -14,6 +14,7 @@ class SettingsListener(val daemon: MullvadDaemon, val initialSettings: Settings) private val settingsNotifier: EventNotifier<Settings> = EventNotifier(settings) val accountNumberNotifier = EventNotifier(initialSettings.accountToken) + val dnsOptionsNotifier = EventNotifier(initialSettings.tunnelOptions.dnsOptions) var onRelaySettingsChange: ((RelaySettings?) -> Unit)? = null set(value) { @@ -50,6 +51,10 @@ class SettingsListener(val daemon: MullvadDaemon, val initialSettings: Settings) accountNumberNotifier.notify(newSettings.accountToken) } + if (settings.tunnelOptions.dnsOptions != newSettings.tunnelOptions.dnsOptions) { + dnsOptionsNotifier.notify(newSettings.tunnelOptions.dnsOptions) + } + if (settings.relaySettings != newSettings.relaySettings) { onRelaySettingsChange?.invoke(newSettings.relaySettings) } diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt index 88de95d04a..33e1698b15 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt @@ -9,6 +9,7 @@ class ServiceConnection(private val service: ServiceInstance, val mainActivity: val accountCache = service.accountCache val connectionProxy = service.connectionProxy val connectivityListener = service.connectivityListener + val customDns = service.customDns val keyStatusListener = service.keyStatusListener val locationInfoCache = service.locationInfoCache val settingsListener = service.settingsListener diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt index 7f84f09008..1e1ba969ed 100644 --- a/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt +++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt @@ -9,6 +9,7 @@ import net.mullvad.mullvadvpn.dataproxy.AppVersionInfoCache import net.mullvad.mullvadvpn.dataproxy.RelayListListener import net.mullvad.mullvadvpn.service.AccountCache import net.mullvad.mullvadvpn.service.ConnectionProxy +import net.mullvad.mullvadvpn.service.CustomDns import net.mullvad.mullvadvpn.service.KeyStatusListener import net.mullvad.mullvadvpn.service.LocationInfoCache import net.mullvad.mullvadvpn.service.MullvadDaemon @@ -44,6 +45,9 @@ abstract class ServiceDependentFragment(val onNoService: OnNoService) : ServiceA lateinit var connectivityListener: ConnectivityListener private set + lateinit var customDns: CustomDns + private set + lateinit var daemon: MullvadDaemon private set @@ -69,6 +73,7 @@ abstract class ServiceDependentFragment(val onNoService: OnNoService) : ServiceA appVersionInfoCache = serviceConnection.appVersionInfoCache connectionProxy = serviceConnection.connectionProxy connectivityListener = serviceConnection.connectivityListener + customDns = serviceConnection.customDns daemon = serviceConnection.daemon keyStatusListener = serviceConnection.keyStatusListener locationInfoCache = serviceConnection.locationInfoCache |
