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 | 24 +++++ .../browser/flags/CachedFeatureFlags.java | 24 +++++ .../net/stub_resolver_config_reader.cc | 40 ++------ .../strings/android_chrome_strings.grd | 11 +++ chrome/common/chrome_features.cc | 4 +- 14 files changed, 322 insertions(+), 34 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 @@ -1108,6 +1108,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", @@ -1347,6 +1348,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/download_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 @@ -1402,6 +1402,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 @@ -86,6 +86,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 @@ -6864,6 +6864,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,23 @@ 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")); +} + +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 @@ -124,6 +124,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. * @@ -401,6 +421,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 @@ -122,41 +122,12 @@ StubResolverConfigReader::StubResolverConfigReader(PrefService* local_state, local_state_->SetDefaultPrefValue(prefs::kBuiltInDnsClientEnabled, base::Value(ShouldEnableAsyncDns())); std::string default_doh_mode = chrome_browser_net::kDnsOverHttpsModeOff; - std::string default_doh_templates; - if (base::FeatureList::IsEnabled(features::kDnsOverHttps)) { - if (features::kDnsOverHttpsFallbackParam.Get()) { - default_doh_mode = chrome_browser_net::kDnsOverHttpsModeAutomatic; - } else { - default_doh_mode = chrome_browser_net::kDnsOverHttpsModeSecure; - } - default_doh_templates = features::kDnsOverHttpsTemplatesParam.Get(); - } + std::string default_doh_templates = features::kDnsOverHttpsTemplatesParam.Get(); local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsMode, base::Value(default_doh_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, - chrome_browser_net::kDnsOverHttpsModeAutomatic); - } else if (entries.count("dns-over-https@2")) { - // The user has "Disabled" selected. - local_state_->SetString(prefs::kDnsOverHttpsMode, - chrome_browser_net::kDnsOverHttpsModeOff); - } else { - // The user has "Default" selected. - local_state_->ClearPref(prefs::kDnsOverHttpsMode); - } - } } pref_change_registrar_.Add(prefs::kBuiltInDnsClientEnabled, pref_callback); @@ -346,8 +317,13 @@ void StubResolverConfigReader::GetAndUpdateConfiguration( std::vector dns_over_https_servers; base::Optional> servers_mojo; - if (!doh_templates.empty() && - secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) { + if (doh_templates.empty()) { + secure_dns_mode = net::DnsConfig::SecureDnsMode::OFF; + doh_mode = chrome_browser_net::kDnsOverHttpsModeOff; + } + LOG(INFO) << "DoH templates: '" << doh_templates << "' with mode " << doh_mode; + if (secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) { + std::string server_method; for (base::StringPiece server_template : chrome_browser_net::SplitDohTemplateGroup(doh_templates)) { if (!net::dns_util::IsValidDohTemplate(server_template, &server_method)) { 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 @@ -576,6 +576,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 @@ -265,12 +265,12 @@ const base::Feature kDnsHttpssvc{"DnsHttpssvc", // 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