diff options
author | Chiachang Wang <chiachangwang@google.com> | 2020-04-06 02:29:56 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-04-06 02:29:56 +0000 |
commit | d1ec74f58891584fc68587127e28ccf4877b45e8 (patch) | |
tree | 1bdf407f24f23113ffbfb0e7dc8b00d1ae49f22d | |
parent | 74d48f7229803dfb0b58c7039a532b49d7b584d7 (diff) | |
parent | 2a4deaf3457248bd7ffe842a383902387834f4fe (diff) |
Merge changes Ifdf54ace,Ib2c1d16d into rvc-dev
* changes:
[MP02] Make multiple probe url configration overlayable
[MP01] Add configuration to support multiple probes
-rw-r--r-- | res/values/config.xml | 4 | ||||
-rw-r--r-- | res/values/overlayable.xml | 2 | ||||
-rw-r--r-- | src/android/net/util/NetworkStackUtils.java | 23 | ||||
-rw-r--r-- | src/com/android/server/connectivity/NetworkMonitor.java | 103 |
4 files changed, 109 insertions, 23 deletions
diff --git a/res/values/config.xml b/res/values/config.xml index 13c9326..a2f3959 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -39,6 +39,10 @@ </string-array> <string-array name="config_captive_portal_fallback_probe_specs" translatable="false"> </string-array> + <string-array name="config_captive_portal_http_urls" translatable="false"> + </string-array> + <string-array name="config_captive_portal_https_urls" translatable="false"> + </string-array> <!-- Customized default DNS Servers address. --> <string-array name="config_default_dns_servers" translatable="false"> diff --git a/res/values/overlayable.xml b/res/values/overlayable.xml index 717c5ca..052266d 100644 --- a/res/values/overlayable.xml +++ b/res/values/overlayable.xml @@ -20,6 +20,8 @@ <item type="integer" name="config_captive_portal_dns_probe_timeout"/> <item type="string" name="config_captive_portal_http_url"/> <item type="string" name="config_captive_portal_https_url"/> + <item type="array" name="config_captive_portal_http_urls"/> + <item type="array" name="config_captive_portal_https_urls"/> <item type="array" name="config_captive_portal_fallback_urls"/> <item type="bool" name="config_no_sim_card_uses_neighbor_mcc"/> <!-- Configuration value for DhcpResults --> diff --git a/src/android/net/util/NetworkStackUtils.java b/src/android/net/util/NetworkStackUtils.java index 9d913fc..bc41549 100644 --- a/src/android/net/util/NetworkStackUtils.java +++ b/src/android/net/util/NetworkStackUtils.java @@ -56,6 +56,18 @@ public class NetworkStackUtils { "captive_portal_other_fallback_urls"; /** + * A comma separated list of URLs used for captive portal detection in addition to the HTTP url + * associated with the CAPTIVE_PORTAL_HTTP_URL settings. + */ + public static final String CAPTIVE_PORTAL_OTHER_HTTP_URLS = "captive_portal_other_http_urls"; + + /** + * A comma separated list of URLs used for network validation. in addition to the HTTPS url + * associated with the CAPTIVE_PORTAL_HTTPS_URL settings. + */ + public static final String CAPTIVE_PORTAL_OTHER_HTTPS_URLS = "captive_portal_other_https_urls"; + + /** * Which User-Agent string to use in the header of the captive portal detection probes. * The User-Agent field is unset when this setting has no value (HttpUrlConnection default). */ @@ -112,6 +124,17 @@ public class NetworkStackUtils { public static final int CAPTIVE_PORTAL_MODE_AVOID = 2; /** + * The default list of HTTP URLs to use for detecting captive portals. + */ + public static final String[] DEFAULT_CAPTIVE_PORTAL_HTTP_URLS = + new String [] {"http://connectivitycheck.gstatic.com/generate_204"}; + /** + * The default list of HTTPS URLs for network validation, to use for confirming internet + * connectivity. + */ + public static final String[] DEFAULT_CAPTIVE_PORTAL_HTTPS_URLS = + new String [] {"https://www.google.com/generate_204"}; + /** * @deprecated Considering boolean experiment flag is likely to cause misconfiguration * particularly when NetworkStack module rolls back to previous version. It's * much safer to determine whether or not to enable one specific experimental diff --git a/src/com/android/server/connectivity/NetworkMonitor.java b/src/com/android/server/connectivity/NetworkMonitor.java index 50c76ce..7ea61fa 100644 --- a/src/com/android/server/connectivity/NetworkMonitor.java +++ b/src/com/android/server/connectivity/NetworkMonitor.java @@ -63,8 +63,12 @@ import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_MODE; import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_MODE_IGNORE; import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_MODE_PROMPT; import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS; +import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_OTHER_HTTPS_URLS; +import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_OTHER_HTTP_URLS; import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_USER_AGENT; import static android.net.util.NetworkStackUtils.CAPTIVE_PORTAL_USE_HTTPS; +import static android.net.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_HTTPS_URLS; +import static android.net.util.NetworkStackUtils.DEFAULT_CAPTIVE_PORTAL_HTTP_URLS; import static android.net.util.NetworkStackUtils.DISMISS_PORTAL_IN_VALIDATED_NETWORK; import static android.net.util.NetworkStackUtils.isEmpty; import static android.provider.DeviceConfig.NAMESPACE_CONNECTIVITY; @@ -358,9 +362,11 @@ public class NetworkMonitor extends StateMachine { private final TcpSocketTracker mTcpTracker; // Configuration values for captive portal detection probes. private final String mCaptivePortalUserAgent; - private final URL mCaptivePortalHttpsUrl; - private final URL mCaptivePortalHttpUrl; private final URL[] mCaptivePortalFallbackUrls; + @NonNull + private final URL[] mCaptivePortalHttpUrls; + @NonNull + private final URL[] mCaptivePortalHttpsUrls; @Nullable private final CaptivePortalProbeSpec[] mCaptivePortalFallbackSpecs; @@ -480,8 +486,8 @@ public class NetworkMonitor extends StateMachine { mIsCaptivePortalCheckEnabled = getIsCaptivePortalCheckEnabled(); mUseHttps = getUseHttpsValidation(); mCaptivePortalUserAgent = getCaptivePortalUserAgent(); - mCaptivePortalHttpsUrl = makeURL(getCaptivePortalServerHttpsUrl()); - mCaptivePortalHttpUrl = makeURL(getCaptivePortalServerHttpUrl()); + mCaptivePortalHttpsUrls = makeCaptivePortalHttpsUrls(); + mCaptivePortalHttpUrls = makeCaptivePortalHttpUrls(); mCaptivePortalFallbackUrls = makeCaptivePortalFallbackUrls(); mCaptivePortalFallbackSpecs = makeCaptivePortalFallbackProbeSpecs(); mRandom = deps.getRandom(); @@ -1594,19 +1600,8 @@ public class NetworkMonitor extends StateMachine { try { final String firstUrl = mDependencies.getSetting(mContext, CAPTIVE_PORTAL_FALLBACK_URL, null); - - final URL[] settingProviderUrls; - if (!TextUtils.isEmpty(firstUrl)) { - final String otherUrls = mDependencies.getDeviceConfigProperty( - NAMESPACE_CONNECTIVITY, CAPTIVE_PORTAL_OTHER_FALLBACK_URLS, ""); - // otherUrls may be empty, but .split() ignores trailing empty strings - final String separator = ","; - final String[] urls = (firstUrl + separator + otherUrls).split(separator); - settingProviderUrls = convertStrings(urls, this::makeURL, new URL[0]); - } else { - settingProviderUrls = new URL[0]; - } - + final URL[] settingProviderUrls = + combineCaptivePortalUrls(firstUrl, CAPTIVE_PORTAL_OTHER_FALLBACK_URLS); return getProbeUrlArrayConfig(settingProviderUrls, R.array.config_captive_portal_fallback_urls, R.array.default_captive_portal_fallback_urls, this::makeURL); @@ -1638,6 +1633,49 @@ public class NetworkMonitor extends StateMachine { } } + private URL[] makeCaptivePortalHttpsUrls() { + final String firstUrl = getCaptivePortalServerHttpsUrl(); + try { + final URL[] settingProviderUrls = + combineCaptivePortalUrls(firstUrl, CAPTIVE_PORTAL_OTHER_HTTPS_URLS); + return getProbeUrlArrayConfig(settingProviderUrls, + R.array.config_captive_portal_https_urls, + DEFAULT_CAPTIVE_PORTAL_HTTPS_URLS, this::makeURL); + } catch (Exception e) { + // Don't let a misconfiguration bootloop the system. + Log.e(TAG, "Error parsing configured https URLs", e); + // Ensure URL aligned with legacy configuration. + return new URL[]{makeURL(firstUrl)}; + } + } + + private URL[] makeCaptivePortalHttpUrls() { + final String firstUrl = getCaptivePortalServerHttpUrl(); + try { + final URL[] settingProviderUrls = + combineCaptivePortalUrls(firstUrl, CAPTIVE_PORTAL_OTHER_HTTP_URLS); + return getProbeUrlArrayConfig(settingProviderUrls, + R.array.config_captive_portal_http_urls, + DEFAULT_CAPTIVE_PORTAL_HTTP_URLS, this::makeURL); + } catch (Exception e) { + // Don't let a misconfiguration bootloop the system. + Log.e(TAG, "Error parsing configured http URLs", e); + // Ensure URL aligned with legacy configuration. + return new URL[]{makeURL(firstUrl)}; + } + } + + private URL[] combineCaptivePortalUrls(final String firstUrl, final String name) { + if (TextUtils.isEmpty(firstUrl)) return new URL[0]; + + final String otherUrls = mDependencies.getDeviceConfigProperty( + NAMESPACE_CONNECTIVITY, name, ""); + // otherUrls may be empty, but .split() ignores trailing empty strings + final String separator = ","; + final String[] urls = (firstUrl + separator + otherUrls).split(separator); + return convertStrings(urls, this::makeURL, new URL[0]); + } + /** * Read a setting from a resource or the settings provider. * @@ -1678,6 +1716,24 @@ public class NetworkMonitor extends StateMachine { private <T> T[] getProbeUrlArrayConfig(@NonNull T[] providerValue, @ArrayRes int configResId, @ArrayRes int defaultResId, @NonNull Function<String, T> resourceConverter) { final Resources res = getContextByMccIfNoSimCardOrDefault().getResources(); + return getProbeUrlArrayConfig(providerValue, configResId, res.getStringArray(defaultResId), + resourceConverter); + } + + /** + * Get an array configuration from resources or the settings provider. + * + * <p>The configuration resource is prioritized, then the provider values, then the default + * resource values. + * @param providerValue Values obtained from the setting provider. + * @param configResId ID of the configuration resource. + * @param defaultConfig Values of default configuration. + * @param resourceConverter Converter from the resource strings to stored setting class. Null + * return values are ignored. + */ + private <T> T[] getProbeUrlArrayConfig(@NonNull T[] providerValue, @ArrayRes int configResId, + String[] defaultConfig, @NonNull Function<String, T> resourceConverter) { + final Resources res = getContextByMccIfNoSimCardOrDefault().getResources(); String[] configValue = res.getStringArray(configResId); if (configValue.length == 0) { @@ -1685,7 +1741,7 @@ public class NetworkMonitor extends StateMachine { return providerValue; } - configValue = res.getStringArray(defaultResId); + configValue = defaultConfig; } return convertStrings(configValue, resourceConverter, Arrays.copyOf(providerValue, 0)); @@ -1746,8 +1802,8 @@ public class NetworkMonitor extends StateMachine { } URL pacUrl = null; - URL httpsUrl = mCaptivePortalHttpsUrl; - URL httpUrl = mCaptivePortalHttpUrl; + final URL[] httpsUrls = mCaptivePortalHttpsUrls; + final URL[] httpUrls = mCaptivePortalHttpUrls; // On networks with a PAC instead of fetching a URL that should result in a 204 // response, we instead simply fetch the PAC script. This is done for a few reasons: @@ -1774,7 +1830,8 @@ public class NetworkMonitor extends StateMachine { } } - if ((pacUrl == null) && (httpUrl == null || httpsUrl == null)) { + if ((pacUrl == null) && (httpUrls.length == 0 || httpsUrls.length == 0 + || httpUrls[0] == null || httpsUrls[0] == null)) { return CaptivePortalProbeResult.FAILED; } @@ -1786,9 +1843,9 @@ public class NetworkMonitor extends StateMachine { reportHttpProbeResult(NETWORK_VALIDATION_PROBE_HTTP, result); } else if (mUseHttps) { // Probe results are reported inside sendParallelHttpProbes. - result = sendParallelHttpProbes(proxyInfo, httpsUrl, httpUrl); + result = sendParallelHttpProbes(proxyInfo, httpsUrls[0], httpUrls[0]); } else { - result = sendDnsAndHttpProbes(proxyInfo, httpUrl, ValidationProbeEvent.PROBE_HTTP); + result = sendDnsAndHttpProbes(proxyInfo, httpUrls[0], ValidationProbeEvent.PROBE_HTTP); reportHttpProbeResult(NETWORK_VALIDATION_PROBE_HTTP, result); } |