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 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 + chrome/android/java/res/xml/doh_preferences.xml | 25 ++++++ .../android/java/res/xml/privacy_preferences.xml | 5 ++ .../chrome/browser/preferences/DoHEditor.java | 91 ++++++++++++++++++++++ .../chrome/browser/preferences/DoHPreferences.java | 52 +++++++++++++ .../chrome/browser/util/FeatureUtilities.java | 25 ++++++ .../java/strings/android_chrome_strings.grd | 11 +++ chrome/app/generated_resources.grd | 6 ++ chrome/browser/android/feature_utilities.cc | 23 ++++++ .../browser/net/system_network_context_manager.cc | 36 +-------- chrome/common/chrome_features.cc | 4 +- 13 files changed, 313 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/preferences/DoHEditor.java create mode 100644 chrome/android/java/src/org/chromium/chrome/browser/preferences/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 @@ -1251,7 +1251,9 @@ chrome_java_sources = [ "java/src/org/chromium/chrome/browser/preferences/ClearBrowsingDataCheckBoxPreference.java", "java/src/org/chromium/chrome/browser/preferences/ExpandablePreferenceGroup.java", "java/src/org/chromium/chrome/browser/preferences/HomepageEditor.java", + "java/src/org/chromium/chrome/browser/preferences/DoHEditor.java", "java/src/org/chromium/chrome/browser/preferences/HomepagePreferences.java", + "java/src/org/chromium/chrome/browser/preferences/DoHPreferences.java", "java/src/org/chromium/chrome/browser/preferences/HyperlinkPreference.java", "java/src/org/chromium/chrome/browser/preferences/LearnMorePreference.java", "java/src/org/chromium/chrome/browser/preferences/LegalInformationPreferences.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 @@ -88,6 +88,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/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java --- a/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/util/FeatureUtilities.java @@ -163,6 +163,27 @@ public class FeatureUtilities { nativeSetCustomTabVisible(visible); } + /** + * 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) { + nativeSetDoHEnabled(enabled); + } + + public static boolean getDoHEnabled() { + return nativeGetDoHEnabled(); + } + + public static void setDoHTemplates(String t) { + nativeSetDoHTemplates(t); + } + + public static String getDoHTemplates() { + return nativeGetDoHTemplates(); + } + + /** * Records whether the activity is in multi-window mode with native-side feature utilities. * @param isInMultiWindowMode Whether the activity is in Android N multi-window mode. @@ -897,6 +918,10 @@ public class FeatureUtilities { } private static native void nativeSetCustomTabVisible(boolean visible); + private static native void nativeSetDoHEnabled(boolean enabled); + private static native boolean nativeGetDoHEnabled(); + private static native void nativeSetDoHTemplates(String templates); + private static native String nativeGetDoHTemplates(); private static native void nativeSetIsInMultiWindowMode(boolean isInMultiWindowMode); private static native boolean nativeIsNetworkServiceWarmUpEnabled(); } diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd --- a/chrome/android/java/strings/android_chrome_strings.grd +++ b/chrome/android/java/strings/android_chrome_strings.grd @@ -656,6 +656,17 @@ CHAR-LIMIT guidelines: Chrome Passwords + + + Edit DoH template URLs + + + DoH template URLs + + + Visit help page + + Edit home page 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 @@ -6507,6 +6507,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" @@ -73,3 +76,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 @@ -134,6 +134,7 @@ void GetStubResolverConfig( std::string doh_templates = local_state->GetString(prefs::kDnsOverHttpsTemplates); + LOG(INFO) << "DoH templates: '" << doh_templates << "' with mode " << doh_mode; std::string server_method; if (!doh_templates.empty() && *secure_dns_mode != net::DnsConfig::SecureDnsMode::OFF) { @@ -404,40 +405,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/common/chrome_features.cc b/chrome/common/chrome_features.cc --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc @@ -271,12 +271,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.11.0