summaryrefslogtreecommitdiffhomepage
path: root/android/src
diff options
context:
space:
mode:
Diffstat (limited to 'android/src')
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/DnsOptions.kt6
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/model/TunnelOptions.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/CustomDns.kt68
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadDaemon.kt6
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/MullvadVpnService.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/ServiceInstance.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/service/SettingsListener.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceConnection.kt1
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/ui/ServiceDependentFragment.kt5
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