1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/net/ssl_config_service_manager.h"
7 #include "base/command_line.h"
8 #include "base/memory/ref_counted.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/prefs/pref_registry_simple.h"
11 #include "base/prefs/testing_pref_store.h"
12 #include "base/values.h"
13 #include "chrome/browser/content_settings/host_content_settings_map.h"
14 #include "chrome/browser/prefs/pref_service_mock_factory.h"
15 #include "chrome/common/chrome_switches.h"
16 #include "chrome/common/pref_names.h"
17 #include "chrome/test/base/testing_pref_service_syncable.h"
18 #include "chrome/test/base/testing_profile.h"
19 #include "components/content_settings/core/common/content_settings.h"
20 #include "content/public/test/test_browser_thread.h"
21 #include "net/ssl/ssl_config_service.h"
22 #include "testing/gtest/include/gtest/gtest.h"
24 using base::ListValue
;
26 using content::BrowserThread
;
28 using net::SSLConfigService
;
30 class SSLConfigServiceManagerPrefTest
: public testing::Test
{
32 SSLConfigServiceManagerPrefTest()
33 : ui_thread_(BrowserThread::UI
, &message_loop_
),
34 io_thread_(BrowserThread::IO
, &message_loop_
) {}
37 base::MessageLoop message_loop_
;
38 content::TestBrowserThread ui_thread_
;
39 content::TestBrowserThread io_thread_
;
42 // Test channel id with no user prefs.
43 TEST_F(SSLConfigServiceManagerPrefTest
, ChannelIDWithoutUserPrefs
) {
44 TestingPrefServiceSimple local_state
;
45 SSLConfigServiceManager::RegisterPrefs(local_state
.registry());
47 scoped_ptr
<SSLConfigServiceManager
> config_manager(
48 SSLConfigServiceManager::CreateDefaultManager(&local_state
));
49 ASSERT_TRUE(config_manager
.get());
50 scoped_refptr
<SSLConfigService
> config_service(config_manager
->Get());
51 ASSERT_TRUE(config_service
.get());
54 config_service
->GetSSLConfig(&config
);
55 EXPECT_TRUE(config
.channel_id_enabled
);
58 // Test that cipher suites can be disabled. "Good" refers to the fact that
59 // every value is expected to be successfully parsed into a cipher suite.
60 TEST_F(SSLConfigServiceManagerPrefTest
, GoodDisabledCipherSuites
) {
61 TestingPrefServiceSimple local_state
;
62 SSLConfigServiceManager::RegisterPrefs(local_state
.registry());
64 scoped_ptr
<SSLConfigServiceManager
> config_manager(
65 SSLConfigServiceManager::CreateDefaultManager(&local_state
));
66 ASSERT_TRUE(config_manager
.get());
67 scoped_refptr
<SSLConfigService
> config_service(config_manager
->Get());
68 ASSERT_TRUE(config_service
.get());
71 config_service
->GetSSLConfig(&old_config
);
72 EXPECT_TRUE(old_config
.disabled_cipher_suites
.empty());
74 base::ListValue
* list_value
= new base::ListValue();
75 list_value
->Append(new base::StringValue("0x0004"));
76 list_value
->Append(new base::StringValue("0x0005"));
77 local_state
.SetUserPref(prefs::kCipherSuiteBlacklist
, list_value
);
79 // Pump the message loop to notify the SSLConfigServiceManagerPref that the
80 // preferences changed.
81 message_loop_
.RunUntilIdle();
84 config_service
->GetSSLConfig(&config
);
86 EXPECT_NE(old_config
.disabled_cipher_suites
, config
.disabled_cipher_suites
);
87 ASSERT_EQ(2u, config
.disabled_cipher_suites
.size());
88 EXPECT_EQ(0x0004, config
.disabled_cipher_suites
[0]);
89 EXPECT_EQ(0x0005, config
.disabled_cipher_suites
[1]);
92 // Test that cipher suites can be disabled. "Bad" refers to the fact that
93 // there are one or more non-cipher suite strings in the preference. They
95 TEST_F(SSLConfigServiceManagerPrefTest
, BadDisabledCipherSuites
) {
96 TestingPrefServiceSimple local_state
;
97 SSLConfigServiceManager::RegisterPrefs(local_state
.registry());
99 scoped_ptr
<SSLConfigServiceManager
> config_manager(
100 SSLConfigServiceManager::CreateDefaultManager(&local_state
));
101 ASSERT_TRUE(config_manager
.get());
102 scoped_refptr
<SSLConfigService
> config_service(config_manager
->Get());
103 ASSERT_TRUE(config_service
.get());
105 SSLConfig old_config
;
106 config_service
->GetSSLConfig(&old_config
);
107 EXPECT_TRUE(old_config
.disabled_cipher_suites
.empty());
109 base::ListValue
* list_value
= new base::ListValue();
110 list_value
->Append(new base::StringValue("0x0004"));
111 list_value
->Append(new base::StringValue("TLS_NOT_WITH_A_CIPHER_SUITE"));
112 list_value
->Append(new base::StringValue("0x0005"));
113 list_value
->Append(new base::StringValue("0xBEEFY"));
114 local_state
.SetUserPref(prefs::kCipherSuiteBlacklist
, list_value
);
116 // Pump the message loop to notify the SSLConfigServiceManagerPref that the
117 // preferences changed.
118 message_loop_
.RunUntilIdle();
121 config_service
->GetSSLConfig(&config
);
123 EXPECT_NE(old_config
.disabled_cipher_suites
, config
.disabled_cipher_suites
);
124 ASSERT_EQ(2u, config
.disabled_cipher_suites
.size());
125 EXPECT_EQ(0x0004, config
.disabled_cipher_suites
[0]);
126 EXPECT_EQ(0x0005, config
.disabled_cipher_suites
[1]);
129 // Test that without command-line settings for minimum and maximum SSL versions,
130 // SSL 3.0 ~ kDefaultSSLVersionMax are enabled.
131 TEST_F(SSLConfigServiceManagerPrefTest
, NoCommandLinePrefs
) {
132 scoped_refptr
<TestingPrefStore
> local_state_store(new TestingPrefStore());
134 PrefServiceMockFactory factory
;
135 factory
.set_user_prefs(local_state_store
);
136 scoped_refptr
<PrefRegistrySimple
> registry
= new PrefRegistrySimple
;
137 scoped_ptr
<PrefService
> local_state(factory
.Create(registry
.get()));
139 SSLConfigServiceManager::RegisterPrefs(registry
.get());
141 scoped_ptr
<SSLConfigServiceManager
> config_manager(
142 SSLConfigServiceManager::CreateDefaultManager(local_state
.get()));
143 ASSERT_TRUE(config_manager
.get());
144 scoped_refptr
<SSLConfigService
> config_service(config_manager
->Get());
145 ASSERT_TRUE(config_service
.get());
147 SSLConfig ssl_config
;
148 config_service
->GetSSLConfig(&ssl_config
);
149 // The default value in the absence of command-line options is that
150 // SSL 3.0 ~ kDefaultSSLVersionMax are enabled.
151 EXPECT_EQ(net::SSL_PROTOCOL_VERSION_SSL3
, ssl_config
.version_min
);
152 EXPECT_EQ(net::kDefaultSSLVersionMax
, ssl_config
.version_max
);
154 // The settings should not be added to the local_state.
155 EXPECT_FALSE(local_state
->HasPrefPath(prefs::kSSLVersionMin
));
156 EXPECT_FALSE(local_state
->HasPrefPath(prefs::kSSLVersionMax
));
158 // Explicitly double-check the settings are not in the preference store.
159 std::string version_min_str
;
160 std::string version_max_str
;
161 EXPECT_FALSE(local_state_store
->GetString(prefs::kSSLVersionMin
,
163 EXPECT_FALSE(local_state_store
->GetString(prefs::kSSLVersionMax
,
167 // Test that command-line settings for minimum and maximum SSL versions are
168 // respected and that they do not persist to the preferences files.
169 TEST_F(SSLConfigServiceManagerPrefTest
, CommandLinePrefs
) {
170 scoped_refptr
<TestingPrefStore
> local_state_store(new TestingPrefStore());
172 CommandLine
command_line(CommandLine::NO_PROGRAM
);
173 command_line
.AppendSwitchASCII(switches::kSSLVersionMin
, "tls1");
174 command_line
.AppendSwitchASCII(switches::kSSLVersionMax
, "ssl3");
176 PrefServiceMockFactory factory
;
177 factory
.set_user_prefs(local_state_store
);
178 factory
.SetCommandLine(&command_line
);
179 scoped_refptr
<PrefRegistrySimple
> registry
= new PrefRegistrySimple
;
180 scoped_ptr
<PrefService
> local_state(factory
.Create(registry
.get()));
182 SSLConfigServiceManager::RegisterPrefs(registry
.get());
184 scoped_ptr
<SSLConfigServiceManager
> config_manager(
185 SSLConfigServiceManager::CreateDefaultManager(local_state
.get()));
186 ASSERT_TRUE(config_manager
.get());
187 scoped_refptr
<SSLConfigService
> config_service(config_manager
->Get());
188 ASSERT_TRUE(config_service
.get());
190 SSLConfig ssl_config
;
191 config_service
->GetSSLConfig(&ssl_config
);
192 // Command-line flags should be respected.
193 EXPECT_EQ(net::SSL_PROTOCOL_VERSION_TLS1
, ssl_config
.version_min
);
194 EXPECT_EQ(net::SSL_PROTOCOL_VERSION_SSL3
, ssl_config
.version_max
);
196 // Explicitly double-check the settings are not in the preference store.
197 const PrefService::Preference
* version_min_pref
=
198 local_state
->FindPreference(prefs::kSSLVersionMin
);
199 EXPECT_FALSE(version_min_pref
->IsUserModifiable());
201 const PrefService::Preference
* version_max_pref
=
202 local_state
->FindPreference(prefs::kSSLVersionMax
);
203 EXPECT_FALSE(version_max_pref
->IsUserModifiable());
205 std::string version_min_str
;
206 std::string version_max_str
;
207 EXPECT_FALSE(local_state_store
->GetString(prefs::kSSLVersionMin
,
209 EXPECT_FALSE(local_state_store
->GetString(prefs::kSSLVersionMax
,