From: csagan5 <32685696+csagan5@users.noreply.github.com> Date: Sat, 23 Nov 2019 10:55:16 +0100 Subject: Add user setting for DNS-over-HTTPS (DoH) custom URL --- chrome/android/chrome_java_resources.gni | 2 + chrome/android/chrome_java_sources.gni | 2 + chrome/android/java/res/layout/doh_editor.xml | 65 +++++++++++++ chrome/android/java/res/values/values.xml | 2 + .../android/java/res/xml/doh_preferences.xml | 25 +++++ .../java/res/xml/privacy_preferences.xml | 5 + .../chrome/browser/settings/DoHEditor.java | 92 +++++++++++++++++++ .../browser/settings/DoHPreferences.java | 54 +++++++++++ chrome/app/generated_resources.grd | 6 ++ .../flags/android/cached_feature_flags.cc | 25 +++++ .../browser/flags/CachedFeatureFlags.java | 24 +++++ .../net/stub_resolver_config_reader.cc | 36 ++------ .../strings/android_chrome_strings.grd | 11 +++ chrome/common/chrome_features.cc | 4 +- 14 files changed, 322 insertions(+), 31 deletions(-) create mode 100644 chrome/android/java/res/layout/doh_editor.xml create mode 100644 chrome/android/java/res/xml/doh_preferences.xml create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/DoHEditor.java create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/settings/DoHPreferences.java diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni @@ -954,6 +954,7 @@ chrome_java_resources = [ "java/res/layout/device_item_list.xml", "java/res/layout/distilled_page_font_family_spinner.xml", "java/res/layout/distilled_page_prefs_view.xml", + "java/res/layout/doh_editor.xml", "java/res/layout/edit_url_suggestion_layout.xml", "java/res/layout/editable_option_editor_footer.xml", "java/res/layout/editable_option_editor_icons.xml", @@ -1185,6 +1186,7 @@ chrome_java_resources = [ "java/res/xml/data_reduction_preferences.xml", "java/res/xml/data_reduction_preferences_off_lite_mode.xml", "java/res/xml/developer_preferences.xml", + "java/res/xml/doh_preferences.xml", "java/res/xml/do_not_track_preferences.xml", "java/res/xml/google_services_preferences.xml", "java/res/xml/homepage_preferences.xml", diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni @@ -1374,6 +1374,8 @@ chrome_java_sources = [ "java/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProvider.java", "java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetAdapter.java", "java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetContent.java", + "java/src/org/chromium/chrome/browser/settings/DoHEditor.java", + "java/src/org/chromium/chrome/browser/settings/DoHPreferences.java", "java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationManager.java", "java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationSharedPrefManager.java", "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfAndroidBridge.java", diff --git a/chrome/android/java/res/layout/doh_editor.xml b/chrome/android/java/res/layout/doh_editor.xml new file mode 100644 --- /dev/null +++ b/chrome/android/java/res/layout/doh_editor.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chrome/android/java/res/values/values.xml b/chrome/android/java/res/values/values.xml --- a/chrome/android/java/res/values/values.xml +++ b/chrome/android/java/res/values/values.xml @@ -80,6 +80,8 @@ 400 200 + https://www.bromite.org/doh + true diff --git a/chrome/android/java/res/xml/doh_preferences.xml b/chrome/android/java/res/xml/doh_preferences.xml new file mode 100644 --- /dev/null +++ b/chrome/android/java/res/xml/doh_preferences.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + diff --git a/chrome/android/java/res/xml/privacy_preferences.xml b/chrome/android/java/res/xml/privacy_preferences.xml --- a/chrome/android/java/res/xml/privacy_preferences.xml +++ b/chrome/android/java/res/xml/privacy_preferences.xml @@ -19,6 +19,11 @@ android:key="can_make_payment" android:title="@string/can_make_payment_title" android:summary="@string/settings_can_make_payment_toggle_label" /> + { + CachedFeatureFlags.setDoHEnabled((boolean) newValue); + return true; + }); + + mDoHEdit = findPreference(PREF_DOH_EDIT); + updateCurrentDoHUrl(); + } + + private void updateCurrentDoHUrl() { + mDoHEdit.setSummary(CachedFeatureFlags.getDoHTemplates()); + } + + @Override + public void onResume() { + super.onResume(); + updateCurrentDoHUrl(); + } +} diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -6912,6 +6912,12 @@ the Bookmarks menu."> + + Secure DNS + + + Configure DNS-over-HTTPS (DoH) secure DNS + Homepage diff --git a/chrome/browser/flags/android/cached_feature_flags.cc b/chrome/browser/flags/android/cached_feature_flags.cc --- a/chrome/browser/flags/android/cached_feature_flags.cc +++ b/chrome/browser/flags/android/cached_feature_flags.cc @@ -11,6 +11,10 @@ #include "content/public/common/content_features.h" #include "content/public/common/network_service_util.h" +#include "chrome/browser/browser_process.h" +#include "components/prefs/pref_service.h" +#include "chrome/common/pref_names.h" + using base::android::ConvertJavaStringToUTF8; using base::android::ConvertUTF8ToJavaString; using base::android::JavaParamRef; @@ -49,3 +53,24 @@ static jboolean JNI_CachedFeatureFlags_IsNetworkServiceWarmUpEnabled( return content::IsOutOfProcessNetworkService() && base::FeatureList::IsEnabled(features::kWarmUpNetworkProcess); } + +static jboolean JNI_CachedFeatureFlags_GetDoHEnabled(JNIEnv* env) { + std::string doh_mode = g_browser_process->local_state()->GetString(prefs::kDnsOverHttpsMode); + return ((doh_mode == "secure") || (doh_mode == "auto")) + && !g_browser_process->local_state()->GetString(prefs::kDnsOverHttpsTemplates).empty(); +} + +static void JNI_CachedFeatureFlags_SetDoHEnabled(JNIEnv* env, jboolean enabled) { + if (enabled) + g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsMode, "secure"); + else + g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsMode, "off"); +} + +static ScopedJavaLocalRef JNI_CachedFeatureFlags_GetDoHTemplates(JNIEnv* env) { + return base::android::ConvertUTF8ToJavaString(env, g_browser_process->local_state()->GetString(prefs::kDnsOverHttpsTemplates)); +} + +static void JNI_CachedFeatureFlags_SetDoHTemplates(JNIEnv* env, const JavaParamRef& templates) { + g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsTemplates, base::android::ConvertJavaStringToUTF8(env, templates)); +} diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java @@ -127,6 +127,26 @@ public class CachedFeatureFlags { private static Map sOverridesTestFeatures; private static String sReachedCodeProfilerTrialGroup; + /** + * Records whether custom URL for DoH is enabled with native-side feature utilities. + * @param url Whether custom URL is enabled or not. + */ + public static void setDoHEnabled(boolean enabled) { + CachedFeatureFlagsJni.get().setDoHEnabled(enabled); + } + + public static boolean getDoHEnabled() { + return CachedFeatureFlagsJni.get().getDoHEnabled(); + } + + public static void setDoHTemplates(String t) { + CachedFeatureFlagsJni.get().setDoHTemplates(t); + } + + public static String getDoHTemplates() { + return CachedFeatureFlagsJni.get().getDoHTemplates(); + } + /** * Checks if a cached feature flag is enabled. * @@ -409,6 +429,10 @@ public class CachedFeatureFlags { @NativeMethods interface Natives { + void setDoHEnabled(boolean enabled); + boolean getDoHEnabled(); + void setDoHTemplates(String templates); + String getDoHTemplates(); boolean isNetworkServiceWarmUpEnabled(); void setAdBlockFiltersURL(String url); String getAdBlockFiltersURL(); diff --git a/chrome/browser/net/stub_resolver_config_reader.cc b/chrome/browser/net/stub_resolver_config_reader.cc --- a/chrome/browser/net/stub_resolver_config_reader.cc +++ b/chrome/browser/net/stub_resolver_config_reader.cc @@ -140,28 +140,6 @@ StubResolverConfigReader::StubResolverConfigReader(PrefService* local_state, base::Value(SecureDnsConfig::ModeToString(default_secure_dns_mode))); local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsTemplates, base::Value(default_doh_templates)); - - // If the user has explicitly enabled or disabled the DoH experiment in - // chrome://flags and the DoH UI setting is not visible, store that choice - // in the user prefs so that it can be persisted after the experiment ends. - // Also make sure to remove the stored prefs value if the user has changed - // their chrome://flags selection to the default. - if (!features::kDnsOverHttpsShowUiParam.Get()) { - flags_ui::PrefServiceFlagsStorage flags_storage(local_state_); - std::set entries = flags_storage.GetFlags(); - if (entries.count("dns-over-https@1")) { - // The user has "Enabled" selected. - local_state_->SetString(prefs::kDnsOverHttpsMode, - SecureDnsConfig::kModeAutomatic); - } else if (entries.count("dns-over-https@2")) { - // The user has "Disabled" selected. - local_state_->SetString(prefs::kDnsOverHttpsMode, - SecureDnsConfig::kModeOff); - } else { - // The user has "Default" selected. - local_state_->ClearPref(prefs::kDnsOverHttpsMode); - } - } } pref_change_registrar_.Add(prefs::kBuiltInDnsClientEnabled, pref_callback); @@ -323,21 +301,21 @@ SecureDnsConfig StubResolverConfigReader::GetAndUpdateConfiguration( parental_controls_checked_ = true; } - if (record_metrics) { - UMA_HISTOGRAM_ENUMERATION("Net.DNS.DnsConfig.SecureDnsMode", mode_details); - } - std::string doh_templates = local_state_->GetString(prefs::kDnsOverHttpsTemplates); - std::string server_method; + if (doh_templates.empty()) { + secure_dns_mode = net::DnsConfig::SecureDnsMode::OFF; + } + LOG(INFO) << "DoH templates: '" << doh_templates << "' with mode " << SecureDnsConfig::ModeToString(secure_dns_mode); std::vector dns_over_https_servers; base::Optional> servers_mojo; - if (!doh_templates.empty() && - secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) { + if (secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) { + std::string server_method; for (base::StringPiece server_template : chrome_browser_net::secure_dns::SplitGroup(doh_templates)) { if (!net::dns_util::IsValidDohTemplate(server_template, &server_method)) { + LOG(WARNING) << "DoH templates: skipping invalid: '" << server_template << "'"; continue; } diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd @@ -580,6 +580,17 @@ CHAR-LIMIT guidelines: Chrome Passwords + + + Edit DoH template URLs + + + DoH template URLs + + + Visit help page + + Enter custom web address diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc @@ -281,12 +281,12 @@ const base::Feature kDefaultWebAppInstallation{ // Enable DNS over HTTPS (DoH). const base::Feature kDnsOverHttps{"DnsOverHttps", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // Set whether fallback to insecure DNS is allowed by default. This setting may // be overridden for individual transactions. const base::FeatureParam kDnsOverHttpsFallbackParam{&kDnsOverHttps, - "Fallback", true}; + "Fallback", false}; // Supply one or more space-separated DoH server URI templates to use when this // feature is enabled. If no templates are specified, then a hardcoded mapping -- 2.17.1