From 6a875e8854e94ebe56b6cbaab6ffc8d10b125d3f Mon Sep 17 00:00:00 2001 From: Percy Wegmann Date: Sun, 24 Mar 2024 16:47:43 -0500 Subject: [PATCH] android: correctly grab DNS settings Closes #ENG-3005 Signed-off-by: Percy Wegmann --- .../src/main/java/com/tailscale/ipn/App.kt | 36 ++++++++++--------- .../java/com/tailscale/ipn/DnsConfig.java | 17 ++++----- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/android/src/main/java/com/tailscale/ipn/App.kt b/android/src/main/java/com/tailscale/ipn/App.kt index 7c4c97d..d8f0924 100644 --- a/android/src/main/java/com/tailscale/ipn/App.kt +++ b/android/src/main/java/com/tailscale/ipn/App.kt @@ -23,12 +23,12 @@ import android.content.res.Configuration import android.net.ConnectivityManager import android.net.LinkProperties import android.net.Network +import android.net.NetworkCapabilities +import android.net.NetworkRequest import android.net.Uri import android.net.VpnService import android.os.Build import android.os.Environment -import android.os.Handler -import android.os.Looper import android.provider.MediaStore import android.provider.Settings import android.util.Log @@ -64,7 +64,6 @@ import java.util.Objects class App : Application(), libtailscale.AppContext { private val applicationScope = CoroutineScope(SupervisorJob() + Dispatchers.Default) - var dnsConfigObj = DnsConfig() companion object { const val STATUS_CHANNEL_ID = "tailscale-status" @@ -75,11 +74,13 @@ class App : Application(), libtailscale.AppContext { private const val FILE_CHANNEL_ID = "tailscale-files" private const val FILE_NOTIFICATION_ID = 3 private const val TAG = "App" - private val mainHandler = Handler(Looper.getMainLooper()) + private val networkConnectivityRequest = + NetworkRequest.Builder() + .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) + .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN) + .build() lateinit var appInstance: App - private fun isEmpty(str: String?) = str.isNullOrEmpty() - @JvmStatic fun startActivityForResult(act: Activity, intent: Intent?, request: Int) { val f: Fragment = act.getFragmentManager().findFragmentByTag(PEER_TAG) @@ -143,33 +144,36 @@ class App : Application(), libtailscale.AppContext { } // requestNetwork attempts to find the best network that matches the passed NetworkRequest. It is - // possible that - // this might return an unusuable network, eg a captive portal. + // possible that this might return an unusuable network, eg a captive portal. private fun setAndRegisterNetworkCallbacks() { connectivityManager.requestNetwork( - dnsConfigObj.dnsConfigNetworkRequest, + networkConnectivityRequest, object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { super.onAvailable(network) + val sb = StringBuilder() val linkProperties: LinkProperties? = connectivityManager.getLinkProperties(network) - val dnsList: MutableList = - linkProperties?.getDnsServers() ?: mutableListOf() + val dnsList: MutableList = linkProperties?.dnsServers ?: mutableListOf() for (ip in dnsList) { - sb.append(ip.getHostAddress()).append(" ") + sb.append(ip.hostAddress).append(" ") } - val searchDomains: String? = linkProperties?.getDomains() + val searchDomains: String? = linkProperties?.domains if (searchDomains != null) { sb.append("\n") sb.append(searchDomains) } - dnsConfigObj.updateDNSFromNetwork(sb.toString()) - Libtailscale.onDnsConfigChanged() + + if (dns.updateDNSFromNetwork(sb.toString())) { + Libtailscale.onDnsConfigChanged() + } } override fun onLost(network: Network) { super.onLost(network) - Libtailscale.onDnsConfigChanged() + if (dns.updateDNSFromNetwork("")) { + Libtailscale.onDnsConfigChanged() + } } }) } diff --git a/android/src/main/java/com/tailscale/ipn/DnsConfig.java b/android/src/main/java/com/tailscale/ipn/DnsConfig.java index ff1bb7b..7dad316 100644 --- a/android/src/main/java/com/tailscale/ipn/DnsConfig.java +++ b/android/src/main/java/com/tailscale/ipn/DnsConfig.java @@ -3,9 +3,6 @@ package com.tailscale.ipn; -import android.net.NetworkCapabilities; -import android.net.NetworkRequest; - // Tailscale DNS Config retrieval // // Tailscale's DNS support can either override the local DNS servers with a set of servers @@ -44,14 +41,14 @@ public class DnsConfig { } } - void updateDNSFromNetwork(String dnsConfigs) { + boolean updateDNSFromNetwork(String dnsConfigs) { synchronized (this) { - this.dnsConfigs = dnsConfigs; + if (!dnsConfigs.equals(this.dnsConfigs)) { + this.dnsConfigs = dnsConfigs; + return true; + } else { + return false; + } } } - - NetworkRequest getDNSConfigNetworkRequest() { - // Request networks that are able to reach the Internet. - return new NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build(); - } }