diff options
5 files changed, 56 insertions, 14 deletions
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 80b1c3dfa06d..c3b8f3959fec 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/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 27f446aff84d..4038d0b70119 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -9297,7 +9297,7 @@ public final class Settings { * values. * Consists of a comma seperated list of strings: * "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type" - * note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" + * note that empty fields can be omitted: "name,apn,,,,,,,,,310,260,,DUN" * @hide */ public static final String TETHER_DUN_APN = "tether_dun_apn"; @@ -10358,6 +10358,17 @@ public final class Settings { private static final Validator PRIVATE_DNS_SPECIFIER_VALIDATOR = ANY_STRING_VALIDATOR; + /** + * Forced override of the default mode (hardcoded as "automatic", nee "opportunistic"). + * This allows changing the default mode without effectively disabling other modes, + * all of which require explicit user action to enable/configure. See also b/79719289. + * + * Value is a string, suitable for assignment to PRIVATE_DNS_MODE above. + * + * {@hide} + */ + public static final String PRIVATE_DNS_DEFAULT_MODE = "private_dns_default_mode"; + /** {@hide} */ public static final String BLUETOOTH_HEADSET_PRIORITY_PREFIX = "bluetooth_headset_priority_"; diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 22aca3092fb2..5b7fc6efee95 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -358,6 +358,7 @@ public class SettingsBackupTest { Settings.Global.PREFERRED_NETWORK_MODE, Settings.Global.PRIV_APP_OOB_ENABLED, Settings.Global.PRIV_APP_OOB_LIST, + Settings.Global.PRIVATE_DNS_DEFAULT_MODE, Settings.Global.PROVISIONING_APN_ALARM_DELAY_IN_MS, Settings.Global.RADIO_BLUETOOTH, Settings.Global.RADIO_CELL, diff --git a/services/core/java/com/android/server/connectivity/DnsManager.java b/services/core/java/com/android/server/connectivity/DnsManager.java index d51a196b76ab..c0beb37577fc 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 1ec4eec1bc64..01b468af9447 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); + } } |