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