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_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 + .../browser/flags/FeatureUtilities.java | 24 +++++ .../chrome/browser/settings/DoHEditor.java | 92 +++++++++++++++++++ .../browser/settings/DoHPreferences.java | 54 +++++++++++ chrome/app/generated_resources.grd | 6 ++ chrome/browser/android/feature_utilities.cc | 23 +++++ .../net/system_network_context_manager.cc | 46 +++------- .../strings/android_chrome_strings.grd | 11 +++ chrome/common/chrome_features.cc | 4 +- 13 files changed, 322 insertions(+), 37 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_sources.gni b/chrome/android/chrome_java_sources.gni --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni @@ -1335,6 +1335,8 @@ chrome_java_sources = [ "java/src/org/chromium/chrome/browser/settings/ChromeSwitchPreference.java", "java/src/org/chromium/chrome/browser/settings/ClearBrowsingDataCheckBoxPreference.java", "java/src/org/chromium/chrome/browser/settings/ExpandablePreferenceGroup.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/settings/HomepageEditor.java", "java/src/org/chromium/chrome/browser/settings/HomepagePreferences.java", "java/src/org/chromium/chrome/browser/settings/HyperlinkPreference.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 @@ -91,6 +91,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" /> + { + FeatureUtilities.setDoHEnabled((boolean) newValue); + return true; + }); + + mDoHEdit = findPreference(PREF_DOH_EDIT); + updateCurrentDoHUrl(); + } + + private void updateCurrentDoHUrl() { + mDoHEdit.setSummary(FeatureUtilities.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 @@ -6699,6 +6699,12 @@ the Bookmarks menu."> Home page + + Secure DNS + + + Configure DNS-over-HTTPS (DoH) secure DNS + diff --git a/chrome/browser/android/feature_utilities.cc b/chrome/browser/android/feature_utilities.cc --- a/chrome/browser/android/feature_utilities.cc +++ b/chrome/browser/android/feature_utilities.cc @@ -7,6 +7,9 @@ #include "chrome/android/chrome_jni_headers/FeatureUtilities_jni.h" #include "base/android/jni_string.h" +#include "chrome/browser/browser_process.h" +#include "components/prefs/pref_service.h" +#include "chrome/common/pref_names.h" #include "chrome/browser/ntp_snippets/content_suggestions_service_factory.h" #include "chrome/browser/profiles/profile_manager.h" #include "components/ntp_snippets/content_suggestions_service.h" @@ -87,3 +90,23 @@ static jboolean JNI_FeatureUtilities_IsNetworkServiceWarmUpEnabled( return content::IsOutOfProcessNetworkService() && base::FeatureList::IsEnabled(features::kWarmUpNetworkProcess); } + +static jboolean JNI_FeatureUtilities_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_FeatureUtilities_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_FeatureUtilities_GetDoHTemplates(JNIEnv* env) { + return base::android::ConvertUTF8ToJavaString(env, g_browser_process->local_state()->GetString(prefs::kDnsOverHttpsTemplates)); +} + +static void JNI_FeatureUtilities_SetDoHTemplates(JNIEnv* env, const JavaParamRef& templates) { + g_browser_process->local_state()->SetString(prefs::kDnsOverHttpsTemplates, base::android::ConvertJavaStringToUTF8(env, templates)); +} diff --git a/chrome/browser/net/system_network_context_manager.cc b/chrome/browser/net/system_network_context_manager.cc --- a/chrome/browser/net/system_network_context_manager.cc +++ b/chrome/browser/net/system_network_context_manager.cc @@ -139,9 +139,14 @@ void GetStubResolverConfig( std::string doh_templates = local_state->GetString(prefs::kDnsOverHttpsTemplates); - std::string server_method; - 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 (const std::string& server_template : SplitString(doh_templates, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) { @@ -429,40 +434,11 @@ SystemNetworkContextManager::SystemNetworkContextManager( // features before registering change callbacks for these preferences. 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(); - } + //NOTE: DoH fallback feature to insecure mode is not evaluated local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsMode, - base::Value(default_doh_mode)); + base::Value(chrome_browser_net::kDnsOverHttpsModeOff)); local_state_->SetDefaultPrefValue(prefs::kDnsOverHttpsTemplates, - base::Value(default_doh_templates)); - - // If the user has explicitly enabled or disabled the DoH experiment in - // chrome://flags, 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. - 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); - } + base::Value(features::kDnsOverHttpsTemplatesParam.Get())); PrefChangeRegistrar::NamedChangeCallback dns_pref_callback = base::BindRepeating(&OnStubResolverConfigChanged, 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 @@ -674,6 +674,17 @@ CHAR-LIMIT guidelines: Chrome Passwords + + + Edit DoH template URLs + + + DoH template URLs + + + Visit help page + + Edit home page 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 @@ -303,12 +303,12 @@ const char kDisallowUnsafeHttpDownloadsParamName[] = "MimeTypeList"; // 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