From a7edf6ff56b058c06efa92b1ebe74509b79123e4 Mon Sep 17 00:00:00 2001 From: Erik Kline Date: Wed, 16 May 2018 16:41:57 +0900 Subject: [PATCH] Add explicit override for default Private DNS mode Test: as follows - built - flashed - booted - runtest frameworks-net passes Bug: 79719289 Change-Id: I943c5476666e47d04690626e2133f501cb875b46 --- .../java/android/net/ConnectivityManager.java | 2 +- .../server/connectivity/DnsManager.java | 10 +++-- .../server/connectivity/DnsManagerTest.java | 44 +++++++++++++++---- 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 80b1c3dfa0..c3b8f3959f 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -696,7 +696,7 @@ public class ConnectivityManager { * * @hide */ - public static final String PRIVATE_DNS_DEFAULT_MODE = PRIVATE_DNS_MODE_OPPORTUNISTIC; + public static final String PRIVATE_DNS_DEFAULT_MODE_FALLBACK = PRIVATE_DNS_MODE_OPPORTUNISTIC; private final IConnectivityManager mService; /** diff --git a/services/core/java/com/android/server/connectivity/DnsManager.java b/services/core/java/com/android/server/connectivity/DnsManager.java index d51a196b76..c0beb37577 100644 --- a/services/core/java/com/android/server/connectivity/DnsManager.java +++ b/services/core/java/com/android/server/connectivity/DnsManager.java @@ -16,7 +16,7 @@ package com.android.server.connectivity; -import static android.net.ConnectivityManager.PRIVATE_DNS_DEFAULT_MODE; +import static android.net.ConnectivityManager.PRIVATE_DNS_DEFAULT_MODE_FALLBACK; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; @@ -24,6 +24,7 @@ import static android.provider.Settings.Global.DNS_RESOLVER_MIN_SAMPLES; import static android.provider.Settings.Global.DNS_RESOLVER_MAX_SAMPLES; import static android.provider.Settings.Global.DNS_RESOLVER_SAMPLE_VALIDITY_SECONDS; import static android.provider.Settings.Global.DNS_RESOLVER_SUCCESS_THRESHOLD_PERCENT; +import static android.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE; import static android.provider.Settings.Global.PRIVATE_DNS_MODE; import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER; @@ -184,6 +185,7 @@ public class DnsManager { public static Uri[] getPrivateDnsSettingsUris() { return new Uri[]{ + Settings.Global.getUriFor(PRIVATE_DNS_DEFAULT_MODE), Settings.Global.getUriFor(PRIVATE_DNS_MODE), Settings.Global.getUriFor(PRIVATE_DNS_SPECIFIER), }; @@ -485,8 +487,10 @@ public class DnsManager { } private static String getPrivateDnsMode(ContentResolver cr) { - final String mode = getStringSetting(cr, PRIVATE_DNS_MODE); - return !TextUtils.isEmpty(mode) ? mode : PRIVATE_DNS_DEFAULT_MODE; + String mode = getStringSetting(cr, PRIVATE_DNS_MODE); + if (TextUtils.isEmpty(mode)) mode = getStringSetting(cr, PRIVATE_DNS_DEFAULT_MODE); + if (TextUtils.isEmpty(mode)) mode = PRIVATE_DNS_DEFAULT_MODE_FALLBACK; + return mode; } private static String getStringSetting(ContentResolver cr, String which) { diff --git a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java index 1ec4eec1bc..01b468af94 100644 --- a/tests/net/java/com/android/server/connectivity/DnsManagerTest.java +++ b/tests/net/java/com/android/server/connectivity/DnsManagerTest.java @@ -19,6 +19,9 @@ package com.android.server.connectivity; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OFF; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_OPPORTUNISTIC; import static android.net.ConnectivityManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME; +import static android.provider.Settings.Global.PRIVATE_DNS_DEFAULT_MODE; +import static android.provider.Settings.Global.PRIVATE_DNS_MODE; +import static android.provider.Settings.Global.PRIVATE_DNS_SPECIFIER; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -40,6 +43,7 @@ import android.support.test.runner.AndroidJUnit4; import android.test.mock.MockContentResolver; import com.android.internal.util.test.FakeSettingsProvider; +import com.android.server.connectivity.DnsManager.PrivateDnsConfig; import com.android.server.connectivity.MockableSystemProperties; import java.net.InetAddress; @@ -84,10 +88,9 @@ public class DnsManagerTest { mDnsManager = new DnsManager(mCtx, mNMService, mSystemProperties); // Clear the private DNS settings - Settings.Global.putString(mContentResolver, - Settings.Global.PRIVATE_DNS_MODE, ""); - Settings.Global.putString(mContentResolver, - Settings.Global.PRIVATE_DNS_SPECIFIER, ""); + Settings.Global.putString(mContentResolver, PRIVATE_DNS_DEFAULT_MODE, ""); + Settings.Global.putString(mContentResolver, PRIVATE_DNS_MODE, ""); + Settings.Global.putString(mContentResolver, PRIVATE_DNS_SPECIFIER, ""); } @Test @@ -127,9 +130,8 @@ public class DnsManagerTest { TEST_IFACENAME)); Settings.Global.putString(mContentResolver, - Settings.Global.PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME); - Settings.Global.putString(mContentResolver, - Settings.Global.PRIVATE_DNS_SPECIFIER, "strictmode.com"); + PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME); + Settings.Global.putString(mContentResolver, PRIVATE_DNS_SPECIFIER, "strictmode.com"); mDnsManager.updatePrivateDns(new Network(TEST_NETID), new DnsManager.PrivateDnsConfig("strictmode.com", new InetAddress[] { InetAddress.parseNumericAddress("6.6.6.6"), @@ -222,8 +224,7 @@ public class DnsManagerTest { assertNull(lp.getPrivateDnsServerName()); // Turn private DNS mode off - Settings.Global.putString(mContentResolver, - Settings.Global.PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_OFF); + Settings.Global.putString(mContentResolver, PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_OFF); mDnsManager.updatePrivateDns(new Network(TEST_NETID), mDnsManager.getPrivateDnsConfig()); mDnsManager.setDnsConfigurationForNetwork(TEST_NETID, lp, IS_DEFAULT); @@ -234,4 +235,29 @@ public class DnsManagerTest { assertFalse(lp.isPrivateDnsActive()); assertNull(lp.getPrivateDnsServerName()); } + + @Test + public void testOverrideDefaultMode() throws Exception { + // Hard-coded default is opportunistic mode. + final PrivateDnsConfig cfgAuto = DnsManager.getPrivateDnsConfig(mContentResolver); + assertTrue(cfgAuto.useTls); + assertEquals("", cfgAuto.hostname); + assertEquals(new InetAddress[0], cfgAuto.ips); + + // Pretend a gservices push sets the default to "off". + Settings.Global.putString(mContentResolver, PRIVATE_DNS_DEFAULT_MODE, "off"); + final PrivateDnsConfig cfgOff = DnsManager.getPrivateDnsConfig(mContentResolver); + assertFalse(cfgOff.useTls); + assertEquals("", cfgOff.hostname); + assertEquals(new InetAddress[0], cfgOff.ips); + + // Strict mode still works. + Settings.Global.putString( + mContentResolver, PRIVATE_DNS_MODE, PRIVATE_DNS_MODE_PROVIDER_HOSTNAME); + Settings.Global.putString(mContentResolver, PRIVATE_DNS_SPECIFIER, "strictmode.com"); + final PrivateDnsConfig cfgStrict = DnsManager.getPrivateDnsConfig(mContentResolver); + assertTrue(cfgStrict.useTls); + assertEquals("strictmode.com", cfgStrict.hostname); + assertEquals(new InetAddress[0], cfgStrict.ips); + } }