From f4fa98233990bc078caa6cc005b893896b1e3db3 Mon Sep 17 00:00:00 2001 From: Erik Kline Date: Fri, 27 Apr 2018 22:48:33 +0900 Subject: [PATCH] Remove ResolveUtil from frameworks/base callers Use the Private DNS bypass logic that was moved into Network. Once all callers of ResolvUtil are updated to use this interface ResolvUtil can be deleted. Test: as follows - built, flashed, booted - runtest frameworks-net passes - connection to captive portal network detects portal correctly and the login activity functions as expected Bug: 64133961 Bug: 72345192 Bug: 73872000 Bug: 78548486 Change-Id: If11ef2b5ffdc729f8449cf18dccd5f1eccbc51e6 --- .../java/android/net/ConnectivityManager.java | 2 +- core/java/android/net/Network.java | 21 ++++++++++++------- core/java/android/net/SntpClient.java | 9 +++----- .../CaptivePortalLoginActivity.java | 8 +++---- .../server/connectivity/DnsManager.java | 10 --------- .../server/connectivity/NetworkMonitor.java | 14 +++++-------- .../connectivity/NetworkMonitorTest.java | 1 + 7 files changed, 27 insertions(+), 38 deletions(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index fb916d38f3ba8..ce1879620ce3e 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -3840,7 +3840,7 @@ public class ConnectivityManager { @UnsupportedAppUsage public static boolean setProcessDefaultNetworkForHostResolution(Network network) { return NetworkUtils.bindProcessToNetworkForHostResolution( - network == null ? NETID_UNSET : network.netId); + (network == null) ? NETID_UNSET : network.getNetIdForResolv()); } /** diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java index 142023d40c0e9..bf2344d4a9f6d 100644 --- a/core/java/android/net/Network.java +++ b/core/java/android/net/Network.java @@ -100,21 +100,29 @@ public class Network implements Parcelable { // anytime and (b) receivers should be explicit about attempts to bypass // Private DNS so that the intent of the code is easily determined and // code search audits are possible. - private boolean mPrivateDnsBypass = false; + private final transient boolean mPrivateDnsBypass; /** * @hide */ @UnsupportedAppUsage public Network(int netId) { + this(netId, false); + } + + /** + * @hide + */ + public Network(int netId, boolean privateDnsBypass) { this.netId = netId; + this.mPrivateDnsBypass = privateDnsBypass; } /** * @hide */ public Network(Network that) { - this.netId = that.netId; + this(that.netId, that.mPrivateDnsBypass); } /** @@ -133,8 +141,7 @@ public class Network implements Parcelable { * Operates the same as {@code InetAddress.getByName} except that host * resolution is done on this network. * - * @param host - * the hostName to be resolved to an address or {@code null}. + * @param host the hostname to be resolved to an address or {@code null}. * @return the {@code InetAddress} instance representing the host. * @throws UnknownHostException * if the address lookup fails. @@ -144,14 +151,14 @@ public class Network implements Parcelable { } /** - * Specify whether or not Private DNS should be bypassed when attempting + * Obtain a Network object for which Private DNS is to be bypassed when attempting * to use {@link #getAllByName(String)}/{@link #getByName(String)} methods on the given * instance for hostname resolution. * * @hide */ - public void setPrivateDnsBypass(boolean bypass) { - mPrivateDnsBypass = bypass; + public Network getPrivateDnsBypassingCopy() { + return new Network(netId, true); } /** diff --git a/core/java/android/net/SntpClient.java b/core/java/android/net/SntpClient.java index 10c0ce25e97b1..b8d7cf167ca86 100644 --- a/core/java/android/net/SntpClient.java +++ b/core/java/android/net/SntpClient.java @@ -85,19 +85,16 @@ public class SntpClient { * @return true if the transaction was successful. */ public boolean requestTime(String host, int timeout, Network network) { - // This flag only affects DNS resolution and not other socket semantics, - // therefore it's safe to set unilaterally rather than take more - // defensive measures like making a copy. - network.setPrivateDnsBypass(true); + final Network networkForResolv = network.getPrivateDnsBypassingCopy(); InetAddress address = null; try { - address = network.getByName(host); + address = networkForResolv.getByName(host); } catch (Exception e) { EventLogTags.writeNtpFailure(host, e.toString()); if (DBG) Log.d(TAG, "request time failed: " + e); return false; } - return requestTime(address, NTP_PORT, timeout, network); + return requestTime(address, NTP_PORT, timeout, networkForResolv); } public boolean requestTime(InetAddress address, int port, int timeout, Network network) { diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index 3630005416be9..fd1212af3cfad 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -33,7 +33,6 @@ import android.net.NetworkRequest; import android.net.Proxy; import android.net.Uri; import android.net.captiveportal.CaptivePortalProbeSpec; -import android.net.dns.ResolvUtil; import android.net.http.SslError; import android.net.wifi.WifiInfo; import android.os.Build; @@ -132,9 +131,9 @@ public class CaptivePortalLoginActivity extends Activity { } // Also initializes proxy system properties. + mNetwork = mNetwork.getPrivateDnsBypassingCopy(); mCm.bindProcessToNetwork(mNetwork); - mCm.setProcessDefaultNetworkForHostResolution( - ResolvUtil.getNetworkWithUseLocalNameserversFlag(mNetwork)); + mCm.setProcessDefaultNetworkForHostResolution(mNetwork); // Proxy system properties must be initialized before setContentView is called because // setContentView initializes the WebView logic which in turn reads the system properties. @@ -334,7 +333,6 @@ public class CaptivePortalLoginActivity extends Activity { // TODO: reuse NetworkMonitor facilities for consistent captive portal detection. new Thread(new Runnable() { public void run() { - final Network network = ResolvUtil.makeNetworkWithPrivateDnsBypass(mNetwork); // Give time for captive portal to open. try { Thread.sleep(1000); @@ -344,7 +342,7 @@ public class CaptivePortalLoginActivity extends Activity { int httpResponseCode = 500; String locationHeader = null; try { - urlConnection = (HttpURLConnection) network.openConnection(mUrl); + urlConnection = (HttpURLConnection) mNetwork.openConnection(mUrl); urlConnection.setInstanceFollowRedirects(false); urlConnection.setConnectTimeout(SOCKET_TIMEOUT_MS); urlConnection.setReadTimeout(SOCKET_TIMEOUT_MS); diff --git a/services/core/java/com/android/server/connectivity/DnsManager.java b/services/core/java/com/android/server/connectivity/DnsManager.java index c0beb37577fc1..b8f057db290a9 100644 --- a/services/core/java/com/android/server/connectivity/DnsManager.java +++ b/services/core/java/com/android/server/connectivity/DnsManager.java @@ -35,7 +35,6 @@ import android.net.LinkProperties; import android.net.Network; import android.net.NetworkUtils; import android.net.Uri; -import android.net.dns.ResolvUtil; import android.os.Binder; import android.os.INetworkManagementService; import android.os.UserHandle; @@ -174,15 +173,6 @@ public class DnsManager { return new PrivateDnsConfig(useTls); } - public static PrivateDnsConfig tryBlockingResolveOf(Network network, String name) { - try { - final InetAddress[] ips = ResolvUtil.blockingResolveAllLocally(network, name); - return new PrivateDnsConfig(name, ips); - } catch (UnknownHostException uhe) { - return new PrivateDnsConfig(name, null); - } - } - public static Uri[] getPrivateDnsSettingsUris() { return new Uri[]{ Settings.Global.getUriFor(PRIVATE_DNS_DEFAULT_MODE), diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index 843ba2e232249..ca9b25699c1c5 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -43,7 +43,6 @@ import android.net.TrafficStats; import android.net.Uri; import android.net.captiveportal.CaptivePortalProbeResult; import android.net.captiveportal.CaptivePortalProbeSpec; -import android.net.dns.ResolvUtil; import android.net.metrics.IpConnectivityLog; import android.net.metrics.NetworkEvent; import android.net.metrics.ValidationProbeEvent; @@ -326,7 +325,7 @@ public class NetworkMonitor extends StateMachine { mConnectivityServiceHandler = handler; mDependencies = deps; mNetworkAgentInfo = networkAgentInfo; - mNetwork = deps.getNetwork(networkAgentInfo); + mNetwork = deps.getNetwork(networkAgentInfo).getPrivateDnsBypassingCopy(); mNetId = mNetwork.netId; mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); @@ -800,9 +799,7 @@ public class NetworkMonitor extends StateMachine { private void resolveStrictModeHostname() { try { // Do a blocking DNS resolution using the network-assigned nameservers. - // Do not set AI_ADDRCONFIG in ai_flags so we get all address families in advance. - final InetAddress[] ips = ResolvUtil.blockingResolveAllLocally( - mNetwork, mPrivateDnsProviderHostname, 0 /* aiFlags */); + final InetAddress[] ips = mNetwork.getAllByName(mPrivateDnsProviderHostname); mPrivateDnsConfig = new PrivateDnsConfig(mPrivateDnsProviderHostname, ips); validationLog("Strict mode hostname resolved: " + mPrivateDnsConfig); } catch (UnknownHostException uhe) { @@ -860,14 +857,13 @@ public class NetworkMonitor extends StateMachine { // to complete, regardless of how many IP addresses a host has. private static class OneAddressPerFamilyNetwork extends Network { public OneAddressPerFamilyNetwork(Network network) { - super(network); + // Always bypass Private DNS. + super(network.getPrivateDnsBypassingCopy()); } @Override public InetAddress[] getAllByName(String host) throws UnknownHostException { - // Always bypass Private DNS. - final List addrs = Arrays.asList( - ResolvUtil.blockingResolveAllLocally(this, host)); + final List addrs = Arrays.asList(super.getAllByName(host)); // Ensure the address family of the first address is tried first. LinkedHashMap addressByFamily = new LinkedHashMap<>(); diff --git a/tests/net/java/com/android/server/connectivity/NetworkMonitorTest.java b/tests/net/java/com/android/server/connectivity/NetworkMonitorTest.java index b017130062549..b399b0d51577d 100644 --- a/tests/net/java/com/android/server/connectivity/NetworkMonitorTest.java +++ b/tests/net/java/com/android/server/connectivity/NetworkMonitorTest.java @@ -106,6 +106,7 @@ public class NetworkMonitorTest { anyString())).thenReturn(TEST_HTTP_URL); when(mDependencies.getSetting(any(), eq(Settings.Global.CAPTIVE_PORTAL_HTTPS_URL), anyString())).thenReturn(TEST_HTTPS_URL); + when(mNetwork.getPrivateDnsBypassingCopy()).thenReturn(mNetwork); when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephony); when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifi);