Componentize ssl_config_service_manager_pref.cc
. Removed not needed notifications.
. Created new switches and prefs for ssl_config.
. Using SingleThreadTaskRunner over BrowserThread to remove content dependencies.
BUG=517014
TBR=jochen
Review URL: https://codereview.chromium.org/1320533007
Cr-Commit-Position: refs/heads/master@{#355038}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 5d0b829..ae15717 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -299,6 +299,7 @@
"//components/resources",
"//components/safe_json",
"//components/sessions",
+ "//components/ssl_config",
"//components/storage_monitor",
"//components/syncable_prefs",
"//components/translate/content/browser",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index d9e2ac62..f416c8b 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -90,6 +90,7 @@
"+components/session_manager",
"+components/sessions",
"+components/signin",
+ "+components/ssl_config",
"+components/ssl_errors",
"+components/startup_metric_utils",
"+components/storage_monitor",
diff --git a/chrome/browser/chromeos/mobile/mobile_activator.cc b/chrome/browser/chromeos/mobile/mobile_activator.cc
index 7978921..f16a245 100644
--- a/chrome/browser/chromeos/mobile/mobile_activator.cc
+++ b/chrome/browser/chromeos/mobile/mobile_activator.cc
@@ -34,6 +34,7 @@
#include "chromeos/network/network_handler_callbacks.h"
#include "chromeos/network/network_state.h"
#include "chromeos/network/network_state_handler.h"
+#include "components/ssl_config/ssl_config_prefs.h"
#include "content/public/browser/browser_thread.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
#include "ui/chromeos/network/network_connect.h"
@@ -1096,8 +1097,7 @@
if (!prefs)
return;
if (reenable_cert_check_) {
- prefs->SetBoolean(prefs::kCertRevocationCheckingEnabled,
- true);
+ prefs->SetBoolean(ssl_config::prefs::kCertRevocationCheckingEnabled, true);
reenable_cert_check_ = false;
}
}
@@ -1108,10 +1108,9 @@
// TODO(rkc): We want to do this only if on Cellular.
PrefService* prefs = g_browser_process->local_state();
if (!reenable_cert_check_ &&
- prefs->GetBoolean(
- prefs::kCertRevocationCheckingEnabled)) {
+ prefs->GetBoolean(ssl_config::prefs::kCertRevocationCheckingEnabled)) {
reenable_cert_check_ = true;
- prefs->SetBoolean(prefs::kCertRevocationCheckingEnabled, false);
+ prefs->SetBoolean(ssl_config::prefs::kCertRevocationCheckingEnabled, false);
}
}
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 572e5348..10e53586 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -478,7 +478,9 @@
NULL,
local_state);
ssl_config_service_manager_.reset(
- SSLConfigServiceManager::CreateDefaultManager(local_state));
+ ssl_config::SSLConfigServiceManager::CreateDefaultManager(
+ local_state,
+ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)));
base::Value* dns_client_enabled_default = new base::FundamentalValue(
chrome_browser_net::ConfigureAsyncDnsFieldTrial());
diff --git a/chrome/browser/io_thread.h b/chrome/browser/io_thread.h
index 2d798f6..2b43925 100644
--- a/chrome/browser/io_thread.h
+++ b/chrome/browser/io_thread.h
@@ -19,8 +19,8 @@
#include "base/strings/string_piece.h"
#include "base/time/time.h"
#include "chrome/browser/net/chrome_network_delegate.h"
-#include "chrome/browser/net/ssl_config_service_manager.h"
#include "components/data_usage/core/data_use_aggregator.h"
+#include "components/ssl_config/ssl_config_service_manager.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/browser_thread_delegate.h"
#include "net/base/network_change_notifier.h"
@@ -496,7 +496,7 @@
// This is an instance of the default SSLConfigServiceManager for the current
// platform and it gets SSL preferences from local_state object.
- scoped_ptr<SSLConfigServiceManager> ssl_config_service_manager_;
+ scoped_ptr<ssl_config::SSLConfigServiceManager> ssl_config_service_manager_;
// These member variables are initialized by a task posted to the IO thread,
// which gets posted by calling certain member functions of IOThread.
diff --git a/chrome/browser/net/ssl_config_service_manager_pref_unittest.cc b/chrome/browser/net/ssl_config_service_manager_pref_unittest.cc
deleted file mode 100644
index 3216632..0000000
--- a/chrome/browser/net/ssl_config_service_manager_pref_unittest.cc
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/net/ssl_config_service_manager.h"
-
-#include "base/command_line.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/prefs/pref_registry_simple.h"
-#include "base/prefs/testing_pref_store.h"
-#include "base/values.h"
-#include "chrome/browser/prefs/command_line_pref_store.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/test/base/testing_profile.h"
-#include "components/content_settings/core/browser/host_content_settings_map.h"
-#include "components/content_settings/core/common/content_settings.h"
-#include "components/syncable_prefs/pref_service_mock_factory.h"
-#include "components/syncable_prefs/testing_pref_service_syncable.h"
-#include "content/public/test/test_browser_thread.h"
-#include "net/ssl/ssl_config.h"
-#include "net/ssl/ssl_config_service.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using base::ListValue;
-using base::Value;
-using content::BrowserThread;
-using net::SSLConfig;
-using net::SSLConfigService;
-
-class SSLConfigServiceManagerPrefTest : public testing::Test {
- public:
- SSLConfigServiceManagerPrefTest()
- : ui_thread_(BrowserThread::UI, &message_loop_),
- io_thread_(BrowserThread::IO, &message_loop_) {}
-
- protected:
- base::MessageLoop message_loop_;
- content::TestBrowserThread ui_thread_;
- content::TestBrowserThread io_thread_;
-};
-
-// Test channel id with no user prefs.
-TEST_F(SSLConfigServiceManagerPrefTest, ChannelIDWithoutUserPrefs) {
- TestingPrefServiceSimple local_state;
- SSLConfigServiceManager::RegisterPrefs(local_state.registry());
-
- scoped_ptr<SSLConfigServiceManager> config_manager(
- SSLConfigServiceManager::CreateDefaultManager(&local_state));
- ASSERT_TRUE(config_manager.get());
- scoped_refptr<SSLConfigService> config_service(config_manager->Get());
- ASSERT_TRUE(config_service.get());
-
- SSLConfig config;
- config_service->GetSSLConfig(&config);
- EXPECT_TRUE(config.channel_id_enabled);
-}
-
-// Test that cipher suites can be disabled. "Good" refers to the fact that
-// every value is expected to be successfully parsed into a cipher suite.
-TEST_F(SSLConfigServiceManagerPrefTest, GoodDisabledCipherSuites) {
- TestingPrefServiceSimple local_state;
- SSLConfigServiceManager::RegisterPrefs(local_state.registry());
-
- scoped_ptr<SSLConfigServiceManager> config_manager(
- SSLConfigServiceManager::CreateDefaultManager(&local_state));
- ASSERT_TRUE(config_manager.get());
- scoped_refptr<SSLConfigService> config_service(config_manager->Get());
- ASSERT_TRUE(config_service.get());
-
- SSLConfig old_config;
- config_service->GetSSLConfig(&old_config);
- EXPECT_TRUE(old_config.disabled_cipher_suites.empty());
-
- base::ListValue* list_value = new base::ListValue();
- list_value->Append(new base::StringValue("0x0004"));
- list_value->Append(new base::StringValue("0x0005"));
- local_state.SetUserPref(prefs::kCipherSuiteBlacklist, list_value);
-
- // Pump the message loop to notify the SSLConfigServiceManagerPref that the
- // preferences changed.
- message_loop_.RunUntilIdle();
-
- SSLConfig config;
- config_service->GetSSLConfig(&config);
-
- EXPECT_NE(old_config.disabled_cipher_suites, config.disabled_cipher_suites);
- ASSERT_EQ(2u, config.disabled_cipher_suites.size());
- EXPECT_EQ(0x0004, config.disabled_cipher_suites[0]);
- EXPECT_EQ(0x0005, config.disabled_cipher_suites[1]);
-}
-
-// Test that cipher suites can be disabled. "Bad" refers to the fact that
-// there are one or more non-cipher suite strings in the preference. They
-// should be ignored.
-TEST_F(SSLConfigServiceManagerPrefTest, BadDisabledCipherSuites) {
- TestingPrefServiceSimple local_state;
- SSLConfigServiceManager::RegisterPrefs(local_state.registry());
-
- scoped_ptr<SSLConfigServiceManager> config_manager(
- SSLConfigServiceManager::CreateDefaultManager(&local_state));
- ASSERT_TRUE(config_manager.get());
- scoped_refptr<SSLConfigService> config_service(config_manager->Get());
- ASSERT_TRUE(config_service.get());
-
- SSLConfig old_config;
- config_service->GetSSLConfig(&old_config);
- EXPECT_TRUE(old_config.disabled_cipher_suites.empty());
-
- base::ListValue* list_value = new base::ListValue();
- list_value->Append(new base::StringValue("0x0004"));
- list_value->Append(new base::StringValue("TLS_NOT_WITH_A_CIPHER_SUITE"));
- list_value->Append(new base::StringValue("0x0005"));
- list_value->Append(new base::StringValue("0xBEEFY"));
- local_state.SetUserPref(prefs::kCipherSuiteBlacklist, list_value);
-
- // Pump the message loop to notify the SSLConfigServiceManagerPref that the
- // preferences changed.
- message_loop_.RunUntilIdle();
-
- SSLConfig config;
- config_service->GetSSLConfig(&config);
-
- EXPECT_NE(old_config.disabled_cipher_suites, config.disabled_cipher_suites);
- ASSERT_EQ(2u, config.disabled_cipher_suites.size());
- EXPECT_EQ(0x0004, config.disabled_cipher_suites[0]);
- EXPECT_EQ(0x0005, config.disabled_cipher_suites[1]);
-}
-
-// Test that without command-line settings for minimum and maximum SSL versions,
-// TLS versions from 1.0 up to 1.1 or 1.2 are enabled.
-TEST_F(SSLConfigServiceManagerPrefTest, NoCommandLinePrefs) {
- scoped_refptr<TestingPrefStore> local_state_store(new TestingPrefStore());
-
- syncable_prefs::PrefServiceMockFactory factory;
- factory.set_user_prefs(local_state_store);
- scoped_refptr<PrefRegistrySimple> registry = new PrefRegistrySimple;
- scoped_ptr<PrefService> local_state(factory.Create(registry.get()));
-
- SSLConfigServiceManager::RegisterPrefs(registry.get());
-
- scoped_ptr<SSLConfigServiceManager> config_manager(
- SSLConfigServiceManager::CreateDefaultManager(local_state.get()));
- ASSERT_TRUE(config_manager.get());
- scoped_refptr<SSLConfigService> config_service(config_manager->Get());
- ASSERT_TRUE(config_service.get());
-
- SSLConfig ssl_config;
- config_service->GetSSLConfig(&ssl_config);
- // In the absence of command-line options, the default TLS version range is
- // enabled.
- EXPECT_EQ(net::kDefaultSSLVersionMin, ssl_config.version_min);
- EXPECT_EQ(net::kDefaultSSLVersionMax, ssl_config.version_max);
-
- // The settings should not be added to the local_state.
- EXPECT_FALSE(local_state->HasPrefPath(prefs::kSSLVersionMin));
- EXPECT_FALSE(local_state->HasPrefPath(prefs::kSSLVersionMax));
-
- // Explicitly double-check the settings are not in the preference store.
- std::string version_min_str;
- std::string version_max_str;
- EXPECT_FALSE(local_state_store->GetString(prefs::kSSLVersionMin,
- &version_min_str));
- EXPECT_FALSE(local_state_store->GetString(prefs::kSSLVersionMax,
- &version_max_str));
-}
-
-// Test that command-line settings for minimum and maximum SSL versions are
-// respected and that they do not persist to the preferences files.
-TEST_F(SSLConfigServiceManagerPrefTest, CommandLinePrefs) {
- scoped_refptr<TestingPrefStore> local_state_store(new TestingPrefStore());
-
- base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
- command_line.AppendSwitchASCII(switches::kSSLVersionMin, "tls1.1");
- command_line.AppendSwitchASCII(switches::kSSLVersionMax, "tls1");
-
- syncable_prefs::PrefServiceMockFactory factory;
- factory.set_user_prefs(local_state_store);
- factory.set_command_line_prefs(new CommandLinePrefStore(&command_line));
- scoped_refptr<PrefRegistrySimple> registry = new PrefRegistrySimple;
- scoped_ptr<PrefService> local_state(factory.Create(registry.get()));
-
- SSLConfigServiceManager::RegisterPrefs(registry.get());
-
- scoped_ptr<SSLConfigServiceManager> config_manager(
- SSLConfigServiceManager::CreateDefaultManager(local_state.get()));
- ASSERT_TRUE(config_manager.get());
- scoped_refptr<SSLConfigService> config_service(config_manager->Get());
- ASSERT_TRUE(config_service.get());
-
- SSLConfig ssl_config;
- config_service->GetSSLConfig(&ssl_config);
- // Command-line flags should be respected.
- EXPECT_EQ(net::SSL_PROTOCOL_VERSION_TLS1_1, ssl_config.version_min);
- EXPECT_EQ(net::SSL_PROTOCOL_VERSION_TLS1, ssl_config.version_max);
-
- // Explicitly double-check the settings are not in the preference store.
- const PrefService::Preference* version_min_pref =
- local_state->FindPreference(prefs::kSSLVersionMin);
- EXPECT_FALSE(version_min_pref->IsUserModifiable());
-
- const PrefService::Preference* version_max_pref =
- local_state->FindPreference(prefs::kSSLVersionMax);
- EXPECT_FALSE(version_max_pref->IsUserModifiable());
-
- std::string version_min_str;
- std::string version_max_str;
- EXPECT_FALSE(local_state_store->GetString(prefs::kSSLVersionMin,
- &version_min_str));
- EXPECT_FALSE(local_state_store->GetString(prefs::kSSLVersionMax,
- &version_max_str));
-}
-
-// Tests that "ssl3" is not treated as a valid minimum version.
-TEST_F(SSLConfigServiceManagerPrefTest, NoSSL3) {
- scoped_refptr<TestingPrefStore> local_state_store(new TestingPrefStore());
-
- base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
- command_line.AppendSwitchASCII(switches::kSSLVersionMin, "ssl3");
-
- syncable_prefs::PrefServiceMockFactory factory;
- factory.set_user_prefs(local_state_store);
- factory.set_command_line_prefs(new CommandLinePrefStore(&command_line));
- scoped_refptr<PrefRegistrySimple> registry = new PrefRegistrySimple;
- scoped_ptr<PrefService> local_state(factory.Create(registry.get()));
-
- SSLConfigServiceManager::RegisterPrefs(registry.get());
-
- scoped_ptr<SSLConfigServiceManager> config_manager(
- SSLConfigServiceManager::CreateDefaultManager(local_state.get()));
- ASSERT_TRUE(config_manager.get());
- scoped_refptr<SSLConfigService> config_service(config_manager->Get());
- ASSERT_TRUE(config_service.get());
-
- SSLConfig ssl_config;
- config_service->GetSSLConfig(&ssl_config);
- // The command-line option must not have been honored.
- EXPECT_LE(net::SSL_PROTOCOL_VERSION_TLS1, ssl_config.version_min);
-}
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 3272deb..14ee789 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -30,6 +30,7 @@
#include "components/policy/core/common/schema.h"
#include "components/search_engines/default_search_policy_handler.h"
#include "components/signin/core/common/signin_pref_names.h"
+#include "components/ssl_config/ssl_config_prefs.h"
#include "components/translate/core/common/translate_pref_names.h"
#include "components/variations/pref_names.h"
#include "policy/policy_constants.h"
@@ -219,10 +220,10 @@
prefs::kSigninAllowed,
base::Value::TYPE_BOOLEAN },
{ key::kEnableOnlineRevocationChecks,
- prefs::kCertRevocationCheckingEnabled,
+ ssl_config::prefs::kCertRevocationCheckingEnabled,
base::Value::TYPE_BOOLEAN },
{ key::kRequireOnlineRevocationChecksForLocalAnchors,
- prefs::kCertRevocationCheckingRequiredLocalAnchors,
+ ssl_config::prefs::kCertRevocationCheckingRequiredLocalAnchors,
base::Value::TYPE_BOOLEAN },
{ key::kAuthSchemes,
prefs::kAuthSchemes,
@@ -370,7 +371,7 @@
prefs::kForceEphemeralProfiles,
base::Value::TYPE_BOOLEAN },
{ key::kSSLVersionFallbackMin,
- prefs::kSSLVersionFallbackMin,
+ ssl_config::prefs::kSSLVersionFallbackMin,
base::Value::TYPE_STRING },
#if !defined(OS_MACOSX) && !defined(OS_IOS)
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index 62e6545..c0757902 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -107,6 +107,7 @@
#include "components/search/search.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_service.h"
+#include "components/ssl_config/ssl_config_prefs.h"
#include "components/translate/core/browser/language_state.h"
#include "components/translate/core/browser/translate_infobar_delegate.h"
#include "components/variations/service/variations_service.h"
@@ -2726,7 +2727,7 @@
const std::string new_value("tls1.2");
const std::string default_value(
- prefs->GetString(prefs::kSSLVersionFallbackMin));
+ prefs->GetString(ssl_config::prefs::kSSLVersionFallbackMin));
EXPECT_NE(default_value, new_value);
EXPECT_NE(net::SSL_PROTOCOL_VERSION_TLS1_2,
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 912825d..fbd17bb 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -35,7 +35,6 @@
#include "chrome/browser/net/net_pref_observer.h"
#include "chrome/browser/net/prediction_options.h"
#include "chrome/browser/net/predictor.h"
-#include "chrome/browser/net/ssl_config_service_manager.h"
#include "chrome/browser/notifications/extension_welcome_notification.h"
#include "chrome/browser/notifications/notifier_state_tracker.h"
#include "chrome/browser/pepper_flash_settings_manager.h"
@@ -82,6 +81,7 @@
#include "components/proxy_config/pref_proxy_config_tracker_impl.h"
#include "components/rappor/rappor_service.h"
#include "components/search_engines/template_url_prepopulate_data.h"
+#include "components/ssl_config/ssl_config_service_manager.h"
#include "components/sync_driver/sync_prefs.h"
#include "components/syncable_prefs/pref_service_syncable.h"
#include "components/translate/core/browser/translate_prefs.h"
@@ -263,7 +263,7 @@
rappor::RapporService::RegisterPrefs(registry);
RegisterScreenshotPrefs(registry);
SigninManagerFactory::RegisterPrefs(registry);
- SSLConfigServiceManager::RegisterPrefs(registry);
+ ssl_config::SSLConfigServiceManager::RegisterPrefs(registry);
web_resource::PromoResourceService::RegisterPrefs(registry);
#if defined(ENABLE_AUTOFILL_DIALOG)
diff --git a/chrome/browser/prefs/command_line_pref_store.cc b/chrome/browser/prefs/command_line_pref_store.cc
index c6e9b12..460cf2c 100644
--- a/chrome/browser/prefs/command_line_pref_store.cc
+++ b/chrome/browser/prefs/command_line_pref_store.cc
@@ -19,6 +19,8 @@
#include "components/data_reduction_proxy/core/common/data_reduction_proxy_switches.h"
#include "components/proxy_config/proxy_config_dictionary.h"
#include "components/proxy_config/proxy_config_pref_names.h"
+#include "components/ssl_config/ssl_config_prefs.h"
+#include "components/ssl_config/ssl_config_switches.h"
#include "content/public/common/content_switches.h"
#include "ui/base/ui_base_switches.h"
@@ -32,9 +34,10 @@
{ data_reduction_proxy::switches::kDataReductionProxy,
data_reduction_proxy::prefs::kDataReductionProxy },
{ switches::kAuthServerWhitelist, prefs::kAuthServerWhitelist },
- { switches::kSSLVersionMin, prefs::kSSLVersionMin },
- { switches::kSSLVersionMax, prefs::kSSLVersionMax },
- { switches::kSSLVersionFallbackMin, prefs::kSSLVersionFallbackMin },
+ { switches::kSSLVersionMin, ssl_config::prefs::kSSLVersionMin },
+ { switches::kSSLVersionMax, ssl_config::prefs::kSSLVersionMax },
+ { switches::kSSLVersionFallbackMin,
+ ssl_config::prefs::kSSLVersionFallbackMin },
#if defined(OS_ANDROID)
{ switches::kAuthAndroidNegotiateAccountType,
prefs::kAuthAndroidNegotiateAccountType },
@@ -187,7 +190,7 @@
list_value->AppendStrings(base::SplitString(
command_line_->GetSwitchValueASCII(switches::kCipherSuiteBlacklist),
",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL));
- SetValue(prefs::kCipherSuiteBlacklist, list_value.Pass(),
+ SetValue(ssl_config::prefs::kCipherSuiteBlacklist, list_value.Pass(),
WriteablePrefStore::DEFAULT_PREF_WRITE_FLAGS);
}
}
diff --git a/chrome/browser/prefs/command_line_pref_store_ssl_manager_unittest.cc b/chrome/browser/prefs/command_line_pref_store_ssl_manager_unittest.cc
new file mode 100644
index 0000000..ae81ce5
--- /dev/null
+++ b/chrome/browser/prefs/command_line_pref_store_ssl_manager_unittest.cc
@@ -0,0 +1,79 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/ssl_config/ssl_config_service_manager.h"
+
+#include "base/command_line.h"
+#include "base/message_loop/message_loop.h"
+#include "base/prefs/pref_registry_simple.h"
+#include "base/prefs/pref_service.h"
+#include "base/prefs/testing_pref_store.h"
+#include "base/thread_task_runner_handle.h"
+#include "chrome/browser/prefs/command_line_pref_store.h"
+#include "components/ssl_config/ssl_config_prefs.h"
+#include "components/ssl_config/ssl_config_switches.h"
+#include "components/syncable_prefs/pref_service_mock_factory.h"
+#include "net/ssl/ssl_config.h"
+#include "net/ssl/ssl_config_service.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using net::SSLConfig;
+using net::SSLConfigService;
+using ssl_config::SSLConfigServiceManager;
+
+class CommandLinePrefStoreSSLManagerTest : public testing::Test {
+ public:
+ CommandLinePrefStoreSSLManagerTest() {}
+
+ protected:
+ base::MessageLoop message_loop_;
+};
+
+// Test that command-line settings for minimum and maximum SSL versions are
+// respected and that they do not persist to the preferences files.
+TEST_F(CommandLinePrefStoreSSLManagerTest, CommandLinePrefs) {
+ scoped_refptr<TestingPrefStore> local_state_store(new TestingPrefStore());
+
+ base::CommandLine command_line(base::CommandLine::NO_PROGRAM);
+ command_line.AppendSwitchASCII(switches::kSSLVersionMin, "tls1.1");
+ command_line.AppendSwitchASCII(switches::kSSLVersionMax, "tls1");
+
+ syncable_prefs::PrefServiceMockFactory factory;
+ factory.set_user_prefs(local_state_store);
+ factory.set_command_line_prefs(new CommandLinePrefStore(&command_line));
+ scoped_refptr<PrefRegistrySimple> registry = new PrefRegistrySimple;
+ scoped_ptr<PrefService> local_state(factory.Create(registry.get()));
+
+ SSLConfigServiceManager::RegisterPrefs(registry.get());
+
+ scoped_ptr<SSLConfigServiceManager> config_manager(
+ SSLConfigServiceManager::CreateDefaultManager(
+ local_state.get(), base::ThreadTaskRunnerHandle::Get()));
+ ASSERT_TRUE(config_manager.get());
+ scoped_refptr<SSLConfigService> config_service(config_manager->Get());
+ ASSERT_TRUE(config_service.get());
+
+ SSLConfig ssl_config;
+ config_service->GetSSLConfig(&ssl_config);
+ // Command-line flags should be respected.
+ EXPECT_EQ(net::SSL_PROTOCOL_VERSION_TLS1_1, ssl_config.version_min);
+ EXPECT_EQ(net::SSL_PROTOCOL_VERSION_TLS1, ssl_config.version_max);
+
+ // Explicitly double-check the settings are not in the preference store.
+ const PrefService::Preference* version_min_pref =
+ local_state->FindPreference(ssl_config::prefs::kSSLVersionMin);
+ EXPECT_FALSE(version_min_pref->IsUserModifiable());
+
+ const PrefService::Preference* version_max_pref =
+ local_state->FindPreference(ssl_config::prefs::kSSLVersionMax);
+ EXPECT_FALSE(version_max_pref->IsUserModifiable());
+
+ std::string version_min_str;
+ std::string version_max_str;
+ EXPECT_FALSE(local_state_store->GetString(ssl_config::prefs::kSSLVersionMin,
+ &version_min_str));
+ EXPECT_FALSE(local_state_store->GetString(ssl_config::prefs::kSSLVersionMax,
+ &version_max_str));
+}
+
diff --git a/chrome/browser/prefs/command_line_pref_store_unittest.cc b/chrome/browser/prefs/command_line_pref_store_unittest.cc
index 2799e29..d1f5f1645 100644
--- a/chrome/browser/prefs/command_line_pref_store_unittest.cc
+++ b/chrome/browser/prefs/command_line_pref_store_unittest.cc
@@ -13,6 +13,7 @@
#include "chrome/common/pref_names.h"
#include "components/proxy_config/proxy_config_dictionary.h"
#include "components/proxy_config/proxy_config_pref_names.h"
+#include "components/ssl_config/ssl_config_prefs.h"
#include "ui/base/ui_base_switches.h"
namespace {
@@ -45,7 +46,7 @@
void VerifySSLCipherSuites(const char* const* ciphers,
size_t cipher_count) {
const base::Value* value = NULL;
- ASSERT_TRUE(GetValue(prefs::kCipherSuiteBlacklist, &value));
+ ASSERT_TRUE(GetValue(ssl_config::prefs::kCipherSuiteBlacklist, &value));
ASSERT_EQ(base::Value::TYPE_LIST, value->GetType());
const base::ListValue* list_value =
static_cast<const base::ListValue*>(value);
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 8250be1..e029bd8 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -44,7 +44,6 @@
#include "chrome/browser/net/net_pref_observer.h"
#include "chrome/browser/net/predictor.h"
#include "chrome/browser/net/proxy_service_factory.h"
-#include "chrome/browser/net/ssl_config_service_manager.h"
#include "chrome/browser/permissions/permission_manager.h"
#include "chrome/browser/permissions/permission_manager_factory.h"
#include "chrome/browser/plugins/chrome_plugin_service_filter.h"
@@ -91,6 +90,7 @@
#include "components/proxy_config/pref_proxy_config_tracker.h"
#include "components/signin/core/browser/signin_manager.h"
#include "components/signin/core/common/signin_pref_names.h"
+#include "components/ssl_config/ssl_config_service_manager.h"
#include "components/syncable_prefs/pref_service_syncable.h"
#include "components/ui/zoom/zoom_event_manager.h"
#include "components/url_formatter/url_fixer.h"
@@ -542,7 +542,9 @@
PrefService* local_state = g_browser_process->local_state();
ssl_config_service_manager_.reset(
- SSLConfigServiceManager::CreateDefaultManager(local_state));
+ ssl_config::SSLConfigServiceManager::CreateDefaultManager(
+ local_state,
+ BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)));
#if defined(ENABLE_BACKGROUND)
// Initialize the BackgroundModeManager - this has to be done here before
diff --git a/chrome/browser/profiles/profile_impl.h b/chrome/browser/profiles/profile_impl.h
index b53f6f6..95477b1 100644
--- a/chrome/browser/profiles/profile_impl.h
+++ b/chrome/browser/profiles/profile_impl.h
@@ -25,7 +25,6 @@
class PrefService;
class ShortcutsBackend;
-class SSLConfigServiceManager;
class TrackedPreferenceValidationDelegate;
#if defined(OS_CHROMEOS)
@@ -55,6 +54,10 @@
class SchemaRegistryService;
}
+namespace ssl_config {
+class SSLConfigServiceManager;
+}
+
namespace syncable_prefs {
class PrefServiceSyncable;
}
@@ -236,7 +239,7 @@
extension_special_storage_policy_;
#endif
scoped_ptr<NetPrefObserver> net_pref_observer_;
- scoped_ptr<SSLConfigServiceManager> ssl_config_service_manager_;
+ scoped_ptr<ssl_config::SSLConfigServiceManager> ssl_config_service_manager_;
scoped_refptr<ShortcutsBackend> shortcuts_backend_;
// Exit type the last time the profile was opened. This is set only once from
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index c6d9acf..3256e03 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1973,8 +1973,6 @@
'browser/net/spdyproxy/data_reduction_proxy_chrome_settings_factory.h',
'browser/net/spdyproxy/data_reduction_proxy_settings_android.cc',
'browser/net/spdyproxy/data_reduction_proxy_settings_android.h',
- 'browser/net/ssl_config_service_manager.h',
- 'browser/net/ssl_config_service_manager_pref.cc',
'browser/net/timed_cache.cc',
'browser/net/timed_cache.h',
'browser/net/url_info.cc',
@@ -3239,6 +3237,7 @@
'../components/components.gyp:safe_json',
'../components/components.gyp:sessions_content',
'../components/components.gyp:storage_monitor',
+ '../components/components.gyp:ssl_config',
'../components/components.gyp:syncable_prefs',
'../components/components.gyp:translate_content_browser',
'../components/components.gyp:upload_list',
diff --git a/chrome/chrome_browser_chromeos.gypi b/chrome/chrome_browser_chromeos.gypi
index 77da97b0..d2f5bff 100644
--- a/chrome/chrome_browser_chromeos.gypi
+++ b/chrome/chrome_browser_chromeos.gypi
@@ -1115,6 +1115,7 @@
'../components/components.gyp:pairing',
'../components/components.gyp:policy',
'../components/components.gyp:proxy_config',
+ '../components/components.gyp:ssl_config',
'../components/components.gyp:user_manager',
# This depends directly on the variations target, rather than just
# transitively via the common target because the proto sources need to
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index da11f1d..4b610b89 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -2113,6 +2113,7 @@
'../components/components.gyp:dom_distiller_content_renderer',
'../components/components.gyp:dom_distiller_test_support',
'../components/components.gyp:guest_view_test_support',
+ '../components/components.gyp:ssl_config',
'../components/components.gyp:translate_core_common',
'../components/components_resources.gyp:components_resources',
'../components/components_strings.gyp:components_strings',
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi
index 7bb9788..f649297 100644
--- a/chrome/chrome_tests_unit.gypi
+++ b/chrome/chrome_tests_unit.gypi
@@ -152,7 +152,6 @@
'browser/net/safe_search_util_unittest.cc',
'browser/net/spdyproxy/data_reduction_proxy_chrome_settings_unittest.cc',
'browser/net/spdyproxy/data_reduction_proxy_settings_unittest_android.cc',
- 'browser/net/ssl_config_service_manager_pref_unittest.cc',
'browser/net/url_info_unittest.cc',
'browser/password_manager/chrome_password_manager_client_unittest.cc',
'browser/password_manager/password_manager_internals_service_unittest.cc',
@@ -172,6 +171,7 @@
'browser/predictors/resource_prefetcher_unittest.cc',
'browser/prefs/chrome_pref_service_unittest.cc',
'browser/prefs/command_line_pref_store_proxy_unittest.cc',
+ 'browser/prefs/command_line_pref_store_ssl_manager_unittest.cc',
'browser/prefs/command_line_pref_store_unittest.cc',
'browser/prefs/incognito_mode_prefs_unittest.cc',
'browser/prefs/profile_pref_store_manager_unittest.cc',
diff --git a/chrome/common/chrome_switches.cc b/chrome/common/chrome_switches.cc
index 2b40a6f4..89093a0a 100644
--- a/chrome/common/chrome_switches.cc
+++ b/chrome/common/chrome_switches.cc
@@ -1064,22 +1064,6 @@
"spelling-service-feedback-interval-seconds";
#endif
-// Specifies the maximum SSL/TLS version ("tls1", "tls1.1", or "tls1.2").
-const char kSSLVersionMax[] = "ssl-version-max";
-
-// Specifies the minimum SSL/TLS version ("tls1", "tls1.1", or "tls1.2").
-const char kSSLVersionMin[] = "ssl-version-min";
-
-// Specifies the minimum SSL/TLS version ("tls1", "tls1.1", or "tls1.2") that
-// TLS fallback will accept.
-const char kSSLVersionFallbackMin[] = "ssl-version-fallback-min";
-
-// These values aren't switches, but rather the values that kSSLVersionMax,
-// kSSLVersionMin and kSSLVersionFallbackMin can have.
-const char kSSLVersionTLSv1[] = "tls1";
-const char kSSLVersionTLSv11[] = "tls1.1";
-const char kSSLVersionTLSv12[] = "tls1.2";
-
// Starts the browser maximized, regardless of any previous settings.
const char kStartMaximized[] = "start-maximized";
diff --git a/chrome/common/chrome_switches.h b/chrome/common/chrome_switches.h
index 7813093..0c6778c 100644
--- a/chrome/common/chrome_switches.h
+++ b/chrome/common/chrome_switches.h
@@ -290,12 +290,6 @@
extern const char kSpellingServiceFeedbackUrl[];
extern const char kSpellingServiceFeedbackIntervalSeconds[];
#endif
-extern const char kSSLVersionMax[];
-extern const char kSSLVersionMin[];
-extern const char kSSLVersionFallbackMin[];
-extern const char kSSLVersionTLSv1[];
-extern const char kSSLVersionTLSv11[];
-extern const char kSSLVersionTLSv12[];
extern const char kStartMaximized[];
extern const char kSupervisedUserId[];
extern const char kSupervisedUserSafeSites[];
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 371889f..b46e8b3 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -1246,15 +1246,6 @@
const char kProfileResetPromptMementosInLocalState[] =
"profile.reset_prompt_mementos";
-// Prefs for SSLConfigServicePref.
-const char kCertRevocationCheckingEnabled[] = "ssl.rev_checking.enabled";
-const char kCertRevocationCheckingRequiredLocalAnchors[] =
- "ssl.rev_checking.required_for_local_anchors";
-const char kSSLVersionMin[] = "ssl.version_min";
-const char kSSLVersionMax[] = "ssl.version_max";
-const char kSSLVersionFallbackMin[] = "ssl.version_fallback_min";
-const char kCipherSuiteBlacklist[] = "ssl.cipher_suites.blacklist";
-
// Boolean that specifies whether or not crash reports are sent
// over the network for analysis.
#if defined(OS_ANDROID)
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index fdc30b3..a20f6436 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -410,14 +410,6 @@
extern const char kWebRTCNonProxiedUdpEnabled[];
#endif
-// Local state prefs. Please add Profile prefs above instead.
-extern const char kCertRevocationCheckingEnabled[];
-extern const char kCertRevocationCheckingRequiredLocalAnchors[];
-extern const char kSSLVersionMin[];
-extern const char kSSLVersionMax[];
-extern const char kSSLVersionFallbackMin[];
-extern const char kCipherSuiteBlacklist[];
-
extern const char kGLVendorString[];
extern const char kGLRendererString[];
extern const char kGLVersionString[];
diff --git a/components/BUILD.gn b/components/BUILD.gn
index c3ac7cd..5342da3 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -122,6 +122,7 @@
"//components/security_interstitials/core",
"//components/sessions",
"//components/signin/core/browser",
+ "//components/ssl_config",
"//components/startup_metric_utils",
"//components/sync_driver",
"//components/sync_sessions",
@@ -386,6 +387,7 @@
"//components/search:unit_tests",
"//components/search_provider_logos:unit_tests",
"//components/signin/core/browser:unit_tests",
+ "//components/ssl_config:unit_tests",
"//components/sync_driver:unit_tests",
"//components/sync_sessions:unit_tests",
"//components/translate/core/browser:unit_tests",
diff --git a/components/components.gyp b/components/components.gyp
index dce35ae8..ccb6578 100644
--- a/components/components.gyp
+++ b/components/components.gyp
@@ -76,6 +76,7 @@
'security_interstitials.gypi',
'sessions.gypi',
'signin.gypi',
+ 'ssl_config.gypi',
'ssl_errors.gypi',
'startup_metric_utils.gypi',
'suggestions.gypi',
diff --git a/components/components_tests.gyp b/components/components_tests.gyp
index f359292..cac8068d 100644
--- a/components/components_tests.gyp
+++ b/components/components_tests.gyp
@@ -632,6 +632,9 @@
'signin/ios/browser/account_consistency_service_unittest.mm',
'signin/ios/browser/profile_oauth2_token_service_ios_delegate_unittest.mm',
],
+ 'ssl_config_unittest_sources': [
+ 'ssl_config/ssl_config_service_manager_pref_unittest.cc',
+ ],
'storage_monitor_unittest_sources': [
'storage_monitor/image_capture_device_manager_unittest.mm',
'storage_monitor/media_storage_util_unittest.cc',
@@ -870,6 +873,7 @@
'<@(search_unittest_sources)',
'<@(sessions_unittest_sources)',
'<@(signin_unittest_sources)',
+ '<@(ssl_config_unittest_sources)',
'<@(suggestions_unittest_sources)',
'<@(sync_driver_unittest_sources)',
'<@(sync_sessions_unittest_sources)',
@@ -994,6 +998,7 @@
'components.gyp:sessions_test_support',
'components.gyp:signin_core_browser',
'components.gyp:signin_core_browser_test_support',
+ 'components.gyp:ssl_config',
'components.gyp:suggestions',
'components.gyp:sync_driver_test_support',
'components.gyp:sync_sessions',
diff --git a/components/ssl_config.gypi b/components/ssl_config.gypi
new file mode 100644
index 0000000..261b26c8
--- /dev/null
+++ b/components/ssl_config.gypi
@@ -0,0 +1,31 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+{
+ 'targets': [
+ {
+ # GN version: //components/ssl_config
+ 'target_name': 'ssl_config',
+ 'type': 'static_library',
+ 'dependencies': [
+ '../base/base.gyp:base',
+ '../base/base.gyp:base_prefs',
+ '../net/net.gyp:net',
+ 'content_settings_core_browser',
+ 'content_settings_core_common',
+ ],
+ 'include_dirs': [
+ '..',
+ ],
+ 'sources': [
+ 'ssl_config/ssl_config_prefs.cc',
+ 'ssl_config/ssl_config_prefs.h',
+ 'ssl_config/ssl_config_service_manager.h',
+ 'ssl_config/ssl_config_service_manager_pref.cc',
+ 'ssl_config/ssl_config_switches.cc',
+ 'ssl_config/ssl_config_switches.h',
+ ],
+ },
+ ],
+}
diff --git a/components/ssl_config/BUILD.gn b/components/ssl_config/BUILD.gn
new file mode 100644
index 0000000..cc79bea
--- /dev/null
+++ b/components/ssl_config/BUILD.gn
@@ -0,0 +1,34 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# GYP version: components/ssl_config.gypi:ssl_config
+source_set("ssl_config") {
+ sources = [
+ "ssl_config_prefs.cc",
+ "ssl_config_prefs.h",
+ "ssl_config_service_manager.h",
+ "ssl_config_service_manager_pref.cc",
+ "ssl_config_switches.cc",
+ "ssl_config_switches.h",
+ ]
+
+ deps = [
+ "//base",
+ "//base:prefs",
+ "//components/content_settings/core/browser",
+ "//components/content_settings/core/common",
+ "//net",
+ ]
+}
+
+source_set("unit_tests") {
+ testonly = true
+ sources = [
+ "ssl_config_service_manager_pref_unittest.cc",
+ ]
+ deps = [
+ ":ssl_config",
+ "//testing/gtest",
+ ]
+}
diff --git a/components/ssl_config/DEPS b/components/ssl_config/DEPS
new file mode 100644
index 0000000..198af50
--- /dev/null
+++ b/components/ssl_config/DEPS
@@ -0,0 +1,7 @@
+include_rules = [
+ "+components/content_settings/core/browser",
+ "+components/content_settings/core/common",
+ "+net/socket",
+ "+net/ssl",
+]
+
diff --git a/components/ssl_config/OWNERS b/components/ssl_config/OWNERS
new file mode 100644
index 0000000..42d0d3b
--- /dev/null
+++ b/components/ssl_config/OWNERS
@@ -0,0 +1,3 @@
[email protected]
[email protected]
[email protected]
diff --git a/components/ssl_config/ssl_config_prefs.cc b/components/ssl_config/ssl_config_prefs.cc
new file mode 100644
index 0000000..8f4bc727
--- /dev/null
+++ b/components/ssl_config/ssl_config_prefs.cc
@@ -0,0 +1,21 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/ssl_config/ssl_config_prefs.h"
+
+namespace ssl_config {
+namespace prefs {
+
+// Prefs for SSLConfigServicePref.
+const char kCertRevocationCheckingEnabled[] = "ssl.rev_checking.enabled";
+const char kCertRevocationCheckingRequiredLocalAnchors[] =
+ "ssl.rev_checking.required_for_local_anchors";
+const char kSSLVersionMin[] = "ssl.version_min";
+const char kSSLVersionMax[] = "ssl.version_max";
+const char kSSLVersionFallbackMin[] = "ssl.version_fallback_min";
+const char kCipherSuiteBlacklist[] = "ssl.cipher_suites.blacklist";
+const char kDisableSSLRecordSplitting[] = "ssl.ssl_record_splitting.disabled";
+
+} // namespace prefs
+} // namespace ssl_config
diff --git a/components/ssl_config/ssl_config_prefs.h b/components/ssl_config/ssl_config_prefs.h
new file mode 100644
index 0000000..e29bb0f
--- /dev/null
+++ b/components/ssl_config/ssl_config_prefs.h
@@ -0,0 +1,22 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SSL_CONFIG_SSL_CONFIG_PREFS_H_
+#define COMPONENTS_SSL_CONFIG_SSL_CONFIG_PREFS_H_
+
+namespace ssl_config {
+namespace prefs {
+
+extern const char kCertRevocationCheckingEnabled[];
+extern const char kCertRevocationCheckingRequiredLocalAnchors[];
+extern const char kSSLVersionMin[];
+extern const char kSSLVersionMax[];
+extern const char kSSLVersionFallbackMin[];
+extern const char kCipherSuiteBlacklist[];
+extern const char kDisableSSLRecordSplitting[];
+
+} // namespace prefs
+} // namespace ssl_config
+
+#endif // COMPONENTS_SSL_CONFIG_SSL_CONFIG_PREFS_H_
diff --git a/chrome/browser/net/ssl_config_service_manager.h b/components/ssl_config/ssl_config_service_manager.h
similarity index 69%
rename from chrome/browser/net/ssl_config_service_manager.h
rename to components/ssl_config/ssl_config_service_manager.h
index 85185c6..30bc1c0 100644
--- a/chrome/browser/net/ssl_config_service_manager.h
+++ b/components/ssl_config/ssl_config_service_manager.h
@@ -2,8 +2,14 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#ifndef CHROME_BROWSER_NET_SSL_CONFIG_SERVICE_MANAGER_H_
-#define CHROME_BROWSER_NET_SSL_CONFIG_SERVICE_MANAGER_H_
+#ifndef COMPONENTS_SSL_CONFIG_SSL_CONFIG_SERVICE_MANAGER_H_
+#define COMPONENTS_SSL_CONFIG_SSL_CONFIG_SERVICE_MANAGER_H_
+
+#include "base/memory/ref_counted.h"
+
+namespace base {
+class SingleThreadTaskRunner;
+}
namespace net {
class SSLConfigService;
@@ -12,6 +18,8 @@
class PrefService;
class PrefRegistrySimple;
+namespace ssl_config {
+
// An interface for creating SSLConfigService objects.
class SSLConfigServiceManager {
public:
@@ -19,7 +27,8 @@
// PrefService objects must be longer than that of the manager. Get SSL
// preferences from local_state object.
static SSLConfigServiceManager* CreateDefaultManager(
- PrefService* local_state);
+ PrefService* local_state,
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner);
static void RegisterPrefs(PrefRegistrySimple* registry);
@@ -32,4 +41,5 @@
virtual net::SSLConfigService* Get() = 0;
};
-#endif // CHROME_BROWSER_NET_SSL_CONFIG_SERVICE_MANAGER_H_
+} // namespace ssl_config
+#endif // COMPONENTS_SSL_CONFIG_SSL_CONFIG_SERVICE_MANAGER_H_
diff --git a/chrome/browser/net/ssl_config_service_manager_pref.cc b/components/ssl_config/ssl_config_service_manager_pref.cc
similarity index 70%
rename from chrome/browser/net/ssl_config_service_manager_pref.cc
rename to components/ssl_config/ssl_config_service_manager_pref.cc
index 9a400ec..0f7329f 100644
--- a/chrome/browser/net/ssl_config_service_manager_pref.cc
+++ b/components/ssl_config/ssl_config_service_manager_pref.cc
@@ -1,7 +1,7 @@
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "chrome/browser/net/ssl_config_service_manager.h"
+#include "components/ssl_config/ssl_config_service_manager.h"
#include <algorithm>
#include <string>
@@ -14,16 +14,17 @@
#include "base/prefs/pref_member.h"
#include "base/prefs/pref_registry_simple.h"
#include "base/prefs/pref_service.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/common/pref_names.h"
+#include "base/single_thread_task_runner.h"
#include "components/content_settings/core/browser/content_settings_utils.h"
#include "components/content_settings/core/common/content_settings.h"
-#include "content/public/browser/browser_thread.h"
+#include "components/ssl_config/ssl_config_prefs.h"
+#include "components/ssl_config/ssl_config_switches.h"
#include "net/ssl/ssl_cipher_suite_names.h"
#include "net/ssl/ssl_config_service.h"
-using content::BrowserThread;
+namespace base {
+class SingleThreadTaskRunner;
+}
namespace {
@@ -54,8 +55,7 @@
it != cipher_strings.end(); ++it) {
uint16 cipher_suite = 0;
if (!net::ParseSSLCipherString(*it, &cipher_suite)) {
- LOG(ERROR) << "Ignoring unrecognized or unparsable cipher suite: "
- << *it;
+ LOG(ERROR) << "Ignoring unrecognized or unparsable cipher suite: " << *it;
continue;
}
cipher_suites.push_back(cipher_suite);
@@ -88,7 +88,8 @@
// change.
class SSLConfigServicePref : public net::SSLConfigService {
public:
- SSLConfigServicePref() {}
+ explicit SSLConfigServicePref(
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner);
// Store SSL config settings in |config|. Must only be called from IO thread.
void GetSSLConfig(net::SSLConfig* config) override;
@@ -106,16 +107,21 @@
// Cached value of prefs, should only be accessed from IO thread.
net::SSLConfig cached_config_;
+ scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
+
DISALLOW_COPY_AND_ASSIGN(SSLConfigServicePref);
};
+SSLConfigServicePref::SSLConfigServicePref(
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner)
+ : io_task_runner_(io_task_runner) {}
+
void SSLConfigServicePref::GetSSLConfig(net::SSLConfig* config) {
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
+ DCHECK(io_task_runner_->BelongsToCurrentThread());
*config = cached_config_;
}
-void SSLConfigServicePref::SetNewSSLConfig(
- const net::SSLConfig& new_config) {
+void SSLConfigServicePref::SetNewSSLConfig(const net::SSLConfig& new_config) {
net::SSLConfig orig_config = cached_config_;
cached_config_ = new_config;
ProcessConfigUpdate(orig_config, new_config);
@@ -125,10 +131,11 @@
// SSLConfigServiceManagerPref
// The manager for holding and updating an SSLConfigServicePref instance.
-class SSLConfigServiceManagerPref
- : public SSLConfigServiceManager {
+class SSLConfigServiceManagerPref : public ssl_config::SSLConfigServiceManager {
public:
- explicit SSLConfigServiceManagerPref(PrefService* local_state);
+ SSLConfigServiceManagerPref(
+ PrefService* local_state,
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner);
~SSLConfigServiceManagerPref() override {}
// Register local_state SSL preferences.
@@ -139,8 +146,7 @@
private:
// Callback for preference changes. This will post the changes to the IO
// thread with SetNewSSLConfig.
- void OnPreferenceChanged(PrefService* prefs,
- const std::string& pref_name);
+ void OnPreferenceChanged(PrefService* prefs, const std::string& pref_name);
// Store SSL config settings in |config|, directly from the preferences. Must
// only be called from UI thread.
@@ -164,35 +170,37 @@
scoped_refptr<SSLConfigServicePref> ssl_config_service_;
+ scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
+
DISALLOW_COPY_AND_ASSIGN(SSLConfigServiceManagerPref);
};
SSLConfigServiceManagerPref::SSLConfigServiceManagerPref(
- PrefService* local_state)
- : ssl_config_service_(new SSLConfigServicePref()) {
+ PrefService* local_state,
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner)
+ : ssl_config_service_(new SSLConfigServicePref(io_task_runner)),
+ io_task_runner_(io_task_runner) {
DCHECK(local_state);
- PrefChangeRegistrar::NamedChangeCallback local_state_callback = base::Bind(
- &SSLConfigServiceManagerPref::OnPreferenceChanged,
- base::Unretained(this),
- local_state);
+ PrefChangeRegistrar::NamedChangeCallback local_state_callback =
+ base::Bind(&SSLConfigServiceManagerPref::OnPreferenceChanged,
+ base::Unretained(this), local_state);
- rev_checking_enabled_.Init(
- prefs::kCertRevocationCheckingEnabled, local_state, local_state_callback);
+ rev_checking_enabled_.Init(ssl_config::prefs::kCertRevocationCheckingEnabled,
+ local_state, local_state_callback);
rev_checking_required_local_anchors_.Init(
- prefs::kCertRevocationCheckingRequiredLocalAnchors,
- local_state,
- local_state_callback);
- ssl_version_min_.Init(
- prefs::kSSLVersionMin, local_state, local_state_callback);
- ssl_version_max_.Init(
- prefs::kSSLVersionMax, local_state, local_state_callback);
- ssl_version_fallback_min_.Init(
- prefs::kSSLVersionFallbackMin, local_state, local_state_callback);
+ ssl_config::prefs::kCertRevocationCheckingRequiredLocalAnchors,
+ local_state, local_state_callback);
+ ssl_version_min_.Init(ssl_config::prefs::kSSLVersionMin, local_state,
+ local_state_callback);
+ ssl_version_max_.Init(ssl_config::prefs::kSSLVersionMax, local_state,
+ local_state_callback);
+ ssl_version_fallback_min_.Init(ssl_config::prefs::kSSLVersionFallbackMin,
+ local_state, local_state_callback);
local_state_change_registrar_.Init(local_state);
- local_state_change_registrar_.Add(
- prefs::kCipherSuiteBlacklist, local_state_callback);
+ local_state_change_registrar_.Add(ssl_config::prefs::kCipherSuiteBlacklist,
+ local_state_callback);
OnDisabledCipherSuitesChange(local_state);
@@ -204,15 +212,19 @@
// static
void SSLConfigServiceManagerPref::RegisterPrefs(PrefRegistrySimple* registry) {
net::SSLConfig default_config;
- registry->RegisterBooleanPref(prefs::kCertRevocationCheckingEnabled,
- default_config.rev_checking_enabled);
registry->RegisterBooleanPref(
- prefs::kCertRevocationCheckingRequiredLocalAnchors,
+ ssl_config::prefs::kCertRevocationCheckingEnabled,
+ default_config.rev_checking_enabled);
+ registry->RegisterBooleanPref(
+ ssl_config::prefs::kCertRevocationCheckingRequiredLocalAnchors,
default_config.rev_checking_required_local_anchors);
- registry->RegisterStringPref(prefs::kSSLVersionMin, std::string());
- registry->RegisterStringPref(prefs::kSSLVersionMax, std::string());
- registry->RegisterStringPref(prefs::kSSLVersionFallbackMin, std::string());
- registry->RegisterListPref(prefs::kCipherSuiteBlacklist);
+ registry->RegisterStringPref(ssl_config::prefs::kSSLVersionMin,
+ std::string());
+ registry->RegisterStringPref(ssl_config::prefs::kSSLVersionMax,
+ std::string());
+ registry->RegisterStringPref(ssl_config::prefs::kSSLVersionFallbackMin,
+ std::string());
+ registry->RegisterListPref(ssl_config::prefs::kCipherSuiteBlacklist);
}
net::SSLConfigService* SSLConfigServiceManagerPref::Get() {
@@ -222,9 +234,8 @@
void SSLConfigServiceManagerPref::OnPreferenceChanged(
PrefService* prefs,
const std::string& pref_name_in) {
- DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(prefs);
- if (pref_name_in == prefs::kCipherSuiteBlacklist)
+ if (pref_name_in == ssl_config::prefs::kCipherSuiteBlacklist)
OnDisabledCipherSuitesChange(prefs);
net::SSLConfig new_config;
@@ -232,13 +243,9 @@
// Post a task to |io_loop| with the new configuration, so it can
// update |cached_config_|.
- BrowserThread::PostTask(
- BrowserThread::IO,
- FROM_HERE,
- base::Bind(
- &SSLConfigServicePref::SetNewSSLConfig,
- ssl_config_service_.get(),
- new_config));
+ io_task_runner_->PostTask(FROM_HERE,
+ base::Bind(&SSLConfigServicePref::SetNewSSLConfig,
+ ssl_config_service_.get(), new_config));
}
void SSLConfigServiceManagerPref::GetSSLConfigFromPrefs(
@@ -277,20 +284,23 @@
void SSLConfigServiceManagerPref::OnDisabledCipherSuitesChange(
PrefService* local_state) {
const base::ListValue* value =
- local_state->GetList(prefs::kCipherSuiteBlacklist);
+ local_state->GetList(ssl_config::prefs::kCipherSuiteBlacklist);
disabled_cipher_suites_ = ParseCipherSuites(ListValueToStringVector(value));
}
////////////////////////////////////////////////////////////////////////////////
// SSLConfigServiceManager
+namespace ssl_config {
// static
SSLConfigServiceManager* SSLConfigServiceManager::CreateDefaultManager(
- PrefService* local_state) {
- return new SSLConfigServiceManagerPref(local_state);
+ PrefService* local_state,
+ const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner) {
+ return new SSLConfigServiceManagerPref(local_state, io_task_runner);
}
// static
void SSLConfigServiceManager::RegisterPrefs(PrefRegistrySimple* registry) {
SSLConfigServiceManagerPref::RegisterPrefs(registry);
}
+} // namespace ssl_config
diff --git a/components/ssl_config/ssl_config_service_manager_pref_unittest.cc b/components/ssl_config/ssl_config_service_manager_pref_unittest.cc
new file mode 100644
index 0000000..85cbc20
--- /dev/null
+++ b/components/ssl_config/ssl_config_service_manager_pref_unittest.cc
@@ -0,0 +1,175 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/ssl_config/ssl_config_service_manager.h"
+
+#include "base/memory/ref_counted.h"
+#include "base/message_loop/message_loop.h"
+#include "base/prefs/testing_pref_service.h"
+#include "base/thread_task_runner_handle.h"
+#include "base/values.h"
+#include "components/ssl_config/ssl_config_prefs.h"
+#include "components/ssl_config/ssl_config_switches.h"
+#include "net/ssl/ssl_config.h"
+#include "net/ssl/ssl_config_service.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using base::ListValue;
+using net::SSLConfig;
+using net::SSLConfigService;
+using ssl_config::SSLConfigServiceManager;
+
+class SSLConfigServiceManagerPrefTest : public testing::Test {
+ public:
+ SSLConfigServiceManagerPrefTest() {}
+
+ protected:
+ base::MessageLoop message_loop_;
+};
+
+// Test channel id with no user prefs.
+TEST_F(SSLConfigServiceManagerPrefTest, ChannelIDWithoutUserPrefs) {
+ TestingPrefServiceSimple local_state;
+ SSLConfigServiceManager::RegisterPrefs(local_state.registry());
+
+ scoped_ptr<SSLConfigServiceManager> config_manager(
+ SSLConfigServiceManager::CreateDefaultManager(
+ &local_state, base::ThreadTaskRunnerHandle::Get()));
+ ASSERT_TRUE(config_manager.get());
+ scoped_refptr<SSLConfigService> config_service(config_manager->Get());
+ ASSERT_TRUE(config_service.get());
+
+ SSLConfig config;
+ config_service->GetSSLConfig(&config);
+ EXPECT_TRUE(config.channel_id_enabled);
+}
+
+// Test that cipher suites can be disabled. "Good" refers to the fact that
+// every value is expected to be successfully parsed into a cipher suite.
+TEST_F(SSLConfigServiceManagerPrefTest, GoodDisabledCipherSuites) {
+ TestingPrefServiceSimple local_state;
+ SSLConfigServiceManager::RegisterPrefs(local_state.registry());
+
+ scoped_ptr<SSLConfigServiceManager> config_manager(
+ SSLConfigServiceManager::CreateDefaultManager(
+ &local_state, base::ThreadTaskRunnerHandle::Get()));
+ ASSERT_TRUE(config_manager.get());
+ scoped_refptr<SSLConfigService> config_service(config_manager->Get());
+ ASSERT_TRUE(config_service.get());
+
+ SSLConfig old_config;
+ config_service->GetSSLConfig(&old_config);
+ EXPECT_TRUE(old_config.disabled_cipher_suites.empty());
+
+ base::ListValue* list_value = new base::ListValue();
+ list_value->Append(new base::StringValue("0x0004"));
+ list_value->Append(new base::StringValue("0x0005"));
+ local_state.SetUserPref(ssl_config::prefs::kCipherSuiteBlacklist, list_value);
+
+ // Pump the message loop to notify the SSLConfigServiceManagerPref that the
+ // preferences changed.
+ message_loop_.RunUntilIdle();
+
+ SSLConfig config;
+ config_service->GetSSLConfig(&config);
+
+ EXPECT_NE(old_config.disabled_cipher_suites, config.disabled_cipher_suites);
+ ASSERT_EQ(2u, config.disabled_cipher_suites.size());
+ EXPECT_EQ(0x0004, config.disabled_cipher_suites[0]);
+ EXPECT_EQ(0x0005, config.disabled_cipher_suites[1]);
+}
+
+// Test that cipher suites can be disabled. "Bad" refers to the fact that
+// there are one or more non-cipher suite strings in the preference. They
+// should be ignored.
+TEST_F(SSLConfigServiceManagerPrefTest, BadDisabledCipherSuites) {
+ TestingPrefServiceSimple local_state;
+ SSLConfigServiceManager::RegisterPrefs(local_state.registry());
+
+ scoped_ptr<SSLConfigServiceManager> config_manager(
+ SSLConfigServiceManager::CreateDefaultManager(
+ &local_state, base::ThreadTaskRunnerHandle::Get()));
+ ASSERT_TRUE(config_manager.get());
+ scoped_refptr<SSLConfigService> config_service(config_manager->Get());
+ ASSERT_TRUE(config_service.get());
+
+ SSLConfig old_config;
+ config_service->GetSSLConfig(&old_config);
+ EXPECT_TRUE(old_config.disabled_cipher_suites.empty());
+
+ base::ListValue* list_value = new base::ListValue();
+ list_value->Append(new base::StringValue("0x0004"));
+ list_value->Append(new base::StringValue("TLS_NOT_WITH_A_CIPHER_SUITE"));
+ list_value->Append(new base::StringValue("0x0005"));
+ list_value->Append(new base::StringValue("0xBEEFY"));
+ local_state.SetUserPref(ssl_config::prefs::kCipherSuiteBlacklist, list_value);
+
+ // Pump the message loop to notify the SSLConfigServiceManagerPref that the
+ // preferences changed.
+ message_loop_.RunUntilIdle();
+
+ SSLConfig config;
+ config_service->GetSSLConfig(&config);
+
+ EXPECT_NE(old_config.disabled_cipher_suites, config.disabled_cipher_suites);
+ ASSERT_EQ(2u, config.disabled_cipher_suites.size());
+ EXPECT_EQ(0x0004, config.disabled_cipher_suites[0]);
+ EXPECT_EQ(0x0005, config.disabled_cipher_suites[1]);
+}
+
+// Test that without command-line settings for minimum and maximum SSL versions,
+// TLS versions from 1.0 up to 1.1 or 1.2 are enabled.
+TEST_F(SSLConfigServiceManagerPrefTest, NoCommandLinePrefs) {
+ scoped_refptr<TestingPrefStore> local_state_store(new TestingPrefStore());
+ TestingPrefServiceSimple local_state;
+ SSLConfigServiceManager::RegisterPrefs(local_state.registry());
+
+ scoped_ptr<SSLConfigServiceManager> config_manager(
+ SSLConfigServiceManager::CreateDefaultManager(
+ &local_state, base::ThreadTaskRunnerHandle::Get()));
+ ASSERT_TRUE(config_manager.get());
+ scoped_refptr<SSLConfigService> config_service(config_manager->Get());
+ ASSERT_TRUE(config_service.get());
+
+ SSLConfig ssl_config;
+ config_service->GetSSLConfig(&ssl_config);
+ // In the absence of command-line options, the default TLS version range is
+ // enabled.
+ EXPECT_EQ(net::kDefaultSSLVersionMin, ssl_config.version_min);
+ EXPECT_EQ(net::kDefaultSSLVersionMax, ssl_config.version_max);
+
+ // The settings should not be added to the local_state.
+ EXPECT_FALSE(local_state.HasPrefPath(ssl_config::prefs::kSSLVersionMin));
+ EXPECT_FALSE(local_state.HasPrefPath(ssl_config::prefs::kSSLVersionMax));
+
+ // Explicitly double-check the settings are not in the preference store.
+ std::string version_min_str;
+ std::string version_max_str;
+ EXPECT_FALSE(local_state_store->GetString(ssl_config::prefs::kSSLVersionMin,
+ &version_min_str));
+ EXPECT_FALSE(local_state_store->GetString(ssl_config::prefs::kSSLVersionMax,
+ &version_max_str));
+}
+
+// Tests that "ssl3" is not treated as a valid minimum version.
+TEST_F(SSLConfigServiceManagerPrefTest, NoSSL3) {
+ scoped_refptr<TestingPrefStore> local_state_store(new TestingPrefStore());
+
+ TestingPrefServiceSimple local_state;
+ local_state.SetUserPref(ssl_config::prefs::kSSLVersionMin,
+ new base::StringValue("ssl3"));
+ SSLConfigServiceManager::RegisterPrefs(local_state.registry());
+
+ scoped_ptr<SSLConfigServiceManager> config_manager(
+ SSLConfigServiceManager::CreateDefaultManager(
+ &local_state, base::ThreadTaskRunnerHandle::Get()));
+ ASSERT_TRUE(config_manager.get());
+ scoped_refptr<SSLConfigService> config_service(config_manager->Get());
+ ASSERT_TRUE(config_service.get());
+
+ SSLConfig ssl_config;
+ config_service->GetSSLConfig(&ssl_config);
+ // The command-line option must not have been honored.
+ EXPECT_LE(net::SSL_PROTOCOL_VERSION_TLS1, ssl_config.version_min);
+}
diff --git a/components/ssl_config/ssl_config_switches.cc b/components/ssl_config/ssl_config_switches.cc
new file mode 100644
index 0000000..139593e5
--- /dev/null
+++ b/components/ssl_config/ssl_config_switches.cc
@@ -0,0 +1,25 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/ssl_config/ssl_config_switches.h"
+
+namespace switches {
+
+// Specifies the maximum SSL/TLS version ("tls1", "tls1.1", or "tls1.2").
+const char kSSLVersionMax[] = "ssl-version-max";
+
+// Specifies the minimum SSL/TLS version ("tls1", "tls1.1", or "tls1.2").
+const char kSSLVersionMin[] = "ssl-version-min";
+
+// Specifies the minimum SSL/TLS version ("tls1", "tls1.1", or "tls1.2") that
+// TLS fallback will accept.
+const char kSSLVersionFallbackMin[] = "ssl-version-fallback-min";
+
+// These values aren't switches, but rather the values that kSSLVersionMax,
+// kSSLVersionMin and kSSLVersionFallbackMin can have.
+const char kSSLVersionTLSv1[] = "tls1";
+const char kSSLVersionTLSv11[] = "tls1.1";
+const char kSSLVersionTLSv12[] = "tls1.2";
+
+} // namespace switches
diff --git a/components/ssl_config/ssl_config_switches.h b/components/ssl_config/ssl_config_switches.h
new file mode 100644
index 0000000..fc8d437f
--- /dev/null
+++ b/components/ssl_config/ssl_config_switches.h
@@ -0,0 +1,19 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_SSL_CONFIG_SSL_CONFIG_SWITCHES_H_
+#define COMPONENTS_SSL_CONFIG_SSL_CONFIG_SWITCHES_H_
+
+namespace switches {
+
+extern const char kSSLVersionMax[];
+extern const char kSSLVersionMin[];
+extern const char kSSLVersionFallbackMin[];
+extern const char kSSLVersionTLSv1[];
+extern const char kSSLVersionTLSv11[];
+extern const char kSSLVersionTLSv12[];
+
+} // namespace switches
+
+#endif // COMPONENTS_SSL_CONFIG_SSL_CONFIG_SWITCHES_H_