Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: chrome/browser/ssl/chrome_ssl_host_state_delegate.cc

Issue 441043005: Cleanup of SSLHostStateDelegate and related code (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: const and pass-by-ref changes Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ssl/chrome_ssl_host_state_delegate.h" 5 #include "chrome/browser/ssl/chrome_ssl_host_state_delegate.h"
6 6
7 #include <set>
8
7 #include "base/base64.h" 9 #include "base/base64.h"
8 #include "base/bind.h" 10 #include "base/bind.h"
9 #include "base/command_line.h" 11 #include "base/command_line.h"
10 #include "base/logging.h" 12 #include "base/logging.h"
11 #include "base/metrics/field_trial.h" 13 #include "base/metrics/field_trial.h"
12 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
13 #include "base/time/clock.h" 15 #include "base/time/clock.h"
14 #include "base/time/default_clock.h" 16 #include "base/time/default_clock.h"
15 #include "base/time/time.h" 17 #include "base/time/time.h"
18 #include "base/values.h"
16 #include "chrome/browser/content_settings/host_content_settings_map.h" 19 #include "chrome/browser/content_settings/host_content_settings_map.h"
17 #include "chrome/browser/profiles/profile.h" 20 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/common/chrome_switches.h" 21 #include "chrome/common/chrome_switches.h"
19 #include "components/content_settings/core/common/content_settings_types.h" 22 #include "components/content_settings/core/common/content_settings_types.h"
20 #include "components/variations/variations_associated_data.h" 23 #include "components/variations/variations_associated_data.h"
21 #include "net/base/hash_value.h" 24 #include "net/base/hash_value.h"
22 #include "net/cert/x509_certificate.h" 25 #include "net/cert/x509_certificate.h"
23 #include "net/http/http_transaction_factory.h" 26 #include "net/http/http_transaction_factory.h"
24 #include "net/url_request/url_request_context.h" 27 #include "net/url_request/url_request_context.h"
25 #include "net/url_request/url_request_context_getter.h" 28 #include "net/url_request/url_request_context_getter.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 // canonicalizes all hosts into a secure scheme GURL to use with content 68 // canonicalizes all hosts into a secure scheme GURL to use with content
66 // settings. The returned GURL will be the passed in host with an empty path and 69 // settings. The returned GURL will be the passed in host with an empty path and
67 // https:// as the scheme. 70 // https:// as the scheme.
68 GURL GetSecureGURLForHost(const std::string& host) { 71 GURL GetSecureGURLForHost(const std::string& host) {
69 std::string url = "https://" + host; 72 std::string url = "https://" + host;
70 return GURL(url); 73 return GURL(url);
71 } 74 }
72 75
73 // This is a helper function that returns the length of time before a 76 // This is a helper function that returns the length of time before a
74 // certificate decision expires based on the command line flags. Returns a 77 // certificate decision expires based on the command line flags. Returns a
75 // non-negative value in seconds or a value of -1 indicating that decisions 78 // non-negative value in seconds or a value of -1 indicating that decisions
76 // should not be remembered after the current session has ended (but should be 79 // should not be remembered after the current session has ended (but should be
77 // remembered indefinitely as long as the session does not end), which is the 80 // remembered indefinitely as long as the session does not end), which is the
78 // "old" style of certificate decision memory. Uses the experimental group 81 // "old" style of certificate decision memory. Uses the experimental group
79 // unless overridden by a command line flag. 82 // unless overridden by a command line flag.
80 int64 GetExpirationDelta() { 83 int64 GetExpirationDelta() {
81 // Check command line flags first to give them priority, then check 84 // Check command line flags first to give them priority, then check
82 // experimental groups. 85 // experimental groups.
83 if (CommandLine::ForCurrentProcess()->HasSwitch( 86 if (CommandLine::ForCurrentProcess()->HasSwitch(
84 switches::kRememberCertErrorDecisions)) { 87 switches::kRememberCertErrorDecisions)) {
85 std::string switch_value = 88 std::string switch_value =
(...skipping 25 matching lines...) Expand all
111 kRememberCertificateErrorDecisionsFieldTrialLengthParam); 114 kRememberCertificateErrorDecisionsFieldTrialLengthParam);
112 if (!param.empty() && base::StringToInt64(base::StringPiece(param), 115 if (!param.empty() && base::StringToInt64(base::StringPiece(param),
113 &field_trial_param_length)) { 116 &field_trial_param_length)) {
114 return field_trial_param_length; 117 return field_trial_param_length;
115 } 118 }
116 } 119 }
117 120
118 return kForgetAtSessionEndSwitchValue; 121 return kForgetAtSessionEndSwitchValue;
119 } 122 }
120 123
121 std::string GetKey(net::X509Certificate* cert, net::CertStatus error) { 124 std::string GetKey(const net::X509Certificate& cert, net::CertStatus error) {
122 // Since a security decision will be made based on the fingerprint, Chrome 125 // Since a security decision will be made based on the fingerprint, Chrome
123 // should use the SHA-256 fingerprint for the certificate. 126 // should use the SHA-256 fingerprint for the certificate.
124 net::SHA256HashValue fingerprint = 127 net::SHA256HashValue fingerprint =
125 net::X509Certificate::CalculateChainFingerprint256( 128 net::X509Certificate::CalculateChainFingerprint256(
126 cert->os_cert_handle(), cert->GetIntermediateCertificates()); 129 cert.os_cert_handle(), cert.GetIntermediateCertificates());
127 std::string base64_fingerprint; 130 std::string base64_fingerprint;
128 base::Base64Encode( 131 base::Base64Encode(
129 base::StringPiece(reinterpret_cast<const char*>(fingerprint.data), 132 base::StringPiece(reinterpret_cast<const char*>(fingerprint.data),
130 sizeof(fingerprint.data)), 133 sizeof(fingerprint.data)),
131 &base64_fingerprint); 134 &base64_fingerprint);
132 return base::UintToString(error) + base64_fingerprint; 135 return base::UintToString(error) + base64_fingerprint;
133 } 136 }
134 137
135 } // namespace 138 } // namespace
136 139
137 // This helper function gets the dictionary of certificate fingerprints to 140 // This helper function gets the dictionary of certificate fingerprints to
138 // errors of certificates that have been accepted by the user from the content 141 // errors of certificates that have been accepted by the user from the content
139 // dictionary that has been passed in. The returned pointer is owned by the the 142 // dictionary that has been passed in. The returned pointer is owned by the the
140 // argument dict that is passed in. 143 // argument dict that is passed in.
141 // 144 //
142 // If create_entries is set to |DoNotCreateDictionaryEntries|, 145 // If create_entries is set to |DO_NOT_CREATE_DICTIONARY_ENTRIES|,
143 // GetValidCertDecisionsDict will return NULL if there is anything invalid about 146 // GetValidCertDecisionsDict will return NULL if there is anything invalid about
144 // the setting, such as an invalid version or invalid value types (in addition 147 // the setting, such as an invalid version or invalid value types (in addition
145 // to there not be any values in the dictionary). If create_entries is set to 148 // to there not being any values in the dictionary). If create_entries is set to
146 // |CreateDictionaryEntries|, if no dictionary is found or the decisions are 149 // |CREATE_DICTIONARY_ENTRIES|, if no dictionary is found or the decisions are
147 // expired, a new dictionary will be created 150 // expired, a new dictionary will be created.
148 base::DictionaryValue* ChromeSSLHostStateDelegate::GetValidCertDecisionsDict( 151 base::DictionaryValue* ChromeSSLHostStateDelegate::GetValidCertDecisionsDict(
149 base::DictionaryValue* dict, 152 base::DictionaryValue* dict,
150 CreateDictionaryEntriesDisposition create_entries, 153 CreateDictionaryEntriesDisposition create_entries,
151 bool* expired_previous_decision) { 154 bool* expired_previous_decision) {
152 // This needs to be done first in case the method is short circuited by an 155 // This needs to be done first in case the method is short circuited by an
153 // early failure. 156 // early failure.
154 *expired_previous_decision = false; 157 *expired_previous_decision = false;
155 158
156 // Extract the version of the certificate decision structure from the content 159 // Extract the version of the certificate decision structure from the content
157 // setting. 160 // setting.
158 int version; 161 int version;
159 bool success = dict->GetInteger(kSSLCertDecisionVersionKey, &version); 162 bool success = dict->GetInteger(kSSLCertDecisionVersionKey, &version);
160 if (!success) { 163 if (!success) {
161 if (create_entries == DoNotCreateDictionaryEntries) 164 if (create_entries == DO_NOT_CREATE_DICTIONARY_ENTRIES)
162 return NULL; 165 return NULL;
163 166
164 dict->SetInteger(kSSLCertDecisionVersionKey, 167 dict->SetInteger(kSSLCertDecisionVersionKey,
165 kDefaultSSLCertDecisionVersion); 168 kDefaultSSLCertDecisionVersion);
166 version = kDefaultSSLCertDecisionVersion; 169 version = kDefaultSSLCertDecisionVersion;
167 } 170 }
168 171
169 // If the version is somehow a newer version than Chrome can handle, there's 172 // If the version is somehow a newer version than Chrome can handle, there's
170 // really nothing to do other than fail silently and pretend it doesn't exist 173 // really nothing to do other than fail silently and pretend it doesn't exist
171 // (or is malformed). 174 // (or is malformed).
(...skipping 21 matching lines...) Expand all
193 LOG(ERROR) << "Failed to parse a certificate error exception that has a " 196 LOG(ERROR) << "Failed to parse a certificate error exception that has a "
194 << "bad value for an expiration time: " 197 << "bad value for an expiration time: "
195 << decision_expiration_string; 198 << decision_expiration_string;
196 return NULL; 199 return NULL;
197 } 200 }
198 decision_expiration = 201 decision_expiration =
199 base::Time::FromInternalValue(decision_expiration_int64); 202 base::Time::FromInternalValue(decision_expiration_int64);
200 } 203 }
201 204
202 // Check to see if the user's certificate decision has expired. 205 // Check to see if the user's certificate decision has expired.
203 // - Expired and |create_entries| is DoNotCreateDictionaryEntries, return 206 // - Expired and |create_entries| is DO_NOT_CREATE_DICTIONARY_ENTRIES, return
204 // NULL. 207 // NULL.
205 // - Expired and |create_entries| is CreateDictionaryEntries, update the 208 // - Expired and |create_entries| is CREATE_DICTIONARY_ENTRIES, update the
206 // expiration time. 209 // expiration time.
207 if (should_remember_ssl_decisions_ != 210 if (should_remember_ssl_decisions_ !=
208 ForgetSSLExceptionDecisionsAtSessionEnd && 211 FORGET_SSL_EXCEPTION_DECISIONS_AT_SESSION_END &&
209 decision_expiration.ToInternalValue() <= now.ToInternalValue()) { 212 decision_expiration.ToInternalValue() <= now.ToInternalValue()) {
210 *expired_previous_decision = true; 213 *expired_previous_decision = true;
211 214
212 if (create_entries == DoNotCreateDictionaryEntries) 215 if (create_entries == DO_NOT_CREATE_DICTIONARY_ENTRIES)
213 return NULL; 216 return NULL;
214 217
215 expired = true; 218 expired = true;
216 base::Time expiration_time = 219 base::Time expiration_time =
217 now + default_ssl_cert_decision_expiration_delta_; 220 now + default_ssl_cert_decision_expiration_delta_;
218 // Unfortunately, JSON (and thus content settings) doesn't support int64 221 // Unfortunately, JSON (and thus content settings) doesn't support int64
219 // values, only doubles. Since this mildly depends on precision, it is 222 // values, only doubles. Since this mildly depends on precision, it is
220 // better to store the value as a string. 223 // better to store the value as a string.
221 dict->SetString(kSSLCertDecisionExpirationTimeKey, 224 dict->SetString(kSSLCertDecisionExpirationTimeKey,
222 base::Int64ToString(expiration_time.ToInternalValue())); 225 base::Int64ToString(expiration_time.ToInternalValue()));
223 } 226 }
224 227
225 // Extract the map of certificate fingerprints to errors from the setting. 228 // Extract the map of certificate fingerprints to errors from the setting.
226 base::DictionaryValue* cert_error_dict = NULL; // Will be owned by dict 229 base::DictionaryValue* cert_error_dict = NULL; // Will be owned by dict
227 if (expired || 230 if (expired ||
228 !dict->GetDictionary(kSSLCertDecisionCertErrorMapKey, &cert_error_dict)) { 231 !dict->GetDictionary(kSSLCertDecisionCertErrorMapKey, &cert_error_dict)) {
229 if (create_entries == DoNotCreateDictionaryEntries) 232 if (create_entries == DO_NOT_CREATE_DICTIONARY_ENTRIES)
230 return NULL; 233 return NULL;
231 234
232 cert_error_dict = new base::DictionaryValue(); 235 cert_error_dict = new base::DictionaryValue();
233 // dict takes ownership of cert_error_dict 236 // dict takes ownership of cert_error_dict
234 dict->Set(kSSLCertDecisionCertErrorMapKey, cert_error_dict); 237 dict->Set(kSSLCertDecisionCertErrorMapKey, cert_error_dict);
235 } 238 }
236 239
237 return cert_error_dict; 240 return cert_error_dict;
238 } 241 }
239 242
240 // If |should_remember_ssl_decisions_| is 243 // If |should_remember_ssl_decisions_| is
241 // ForgetSSLExceptionDecisionsAtSessionEnd, that means that all invalid 244 // FORGET_SSL_EXCEPTION_DECISIONS_AT_SESSION_END, that means that all invalid
242 // certificate proceed decisions should be forgotten when the session ends. At 245 // certificate proceed decisions should be forgotten when the session ends. At
243 // attempt is made in the destructor to remove the entries, but in the case that 246 // attempt is made in the destructor to remove the entries, but in the case that
244 // things didn't shut down cleanly, on start, Clear is called to guarantee a 247 // things didn't shut down cleanly, on start, Clear is called to guarantee a
245 // clean state. 248 // clean state.
246 ChromeSSLHostStateDelegate::ChromeSSLHostStateDelegate(Profile* profile) 249 ChromeSSLHostStateDelegate::ChromeSSLHostStateDelegate(Profile* profile)
247 : clock_(new base::DefaultClock()), profile_(profile) { 250 : clock_(new base::DefaultClock()), profile_(profile) {
248 int64 expiration_delta = GetExpirationDelta(); 251 int64 expiration_delta = GetExpirationDelta();
249 if (expiration_delta == kForgetAtSessionEndSwitchValue) { 252 if (expiration_delta == kForgetAtSessionEndSwitchValue) {
250 should_remember_ssl_decisions_ = ForgetSSLExceptionDecisionsAtSessionEnd; 253 should_remember_ssl_decisions_ =
254 FORGET_SSL_EXCEPTION_DECISIONS_AT_SESSION_END;
251 expiration_delta = 0; 255 expiration_delta = 0;
252 Clear(); 256 Clear();
253 } else { 257 } else {
254 should_remember_ssl_decisions_ = RememberSSLExceptionDecisionsForDelta; 258 should_remember_ssl_decisions_ = REMEMBER_SSL_EXCEPTION_DECISIONS_FOR_DELTA;
255 } 259 }
256 default_ssl_cert_decision_expiration_delta_ = 260 default_ssl_cert_decision_expiration_delta_ =
257 base::TimeDelta::FromSeconds(expiration_delta); 261 base::TimeDelta::FromSeconds(expiration_delta);
258 } 262 }
259 263
260 ChromeSSLHostStateDelegate::~ChromeSSLHostStateDelegate() { 264 ChromeSSLHostStateDelegate::~ChromeSSLHostStateDelegate() {
261 if (should_remember_ssl_decisions_ == ForgetSSLExceptionDecisionsAtSessionEnd) 265 if (should_remember_ssl_decisions_ ==
266 FORGET_SSL_EXCEPTION_DECISIONS_AT_SESSION_END)
262 Clear(); 267 Clear();
263 } 268 }
264 269
265 void ChromeSSLHostStateDelegate::DenyCert(const std::string& host, 270 void ChromeSSLHostStateDelegate::DenyCert(const std::string& host,
266 net::X509Certificate* cert, 271 const net::X509Certificate& cert,
267 net::CertStatus error) { 272 net::CertStatus error) {
268 ChangeCertPolicy(host, cert, error, net::CertPolicy::DENIED); 273 ChangeCertPolicy(host, cert, error, net::CertPolicy::DENIED);
269 } 274 }
270 275
271 void ChromeSSLHostStateDelegate::AllowCert(const std::string& host, 276 void ChromeSSLHostStateDelegate::AllowCert(const std::string& host,
272 net::X509Certificate* cert, 277 const net::X509Certificate& cert,
273 net::CertStatus error) { 278 net::CertStatus error) {
274 ChangeCertPolicy(host, cert, error, net::CertPolicy::ALLOWED); 279 ChangeCertPolicy(host, cert, error, net::CertPolicy::ALLOWED);
275 } 280 }
276 281
277 void ChromeSSLHostStateDelegate::Clear() { 282 void ChromeSSLHostStateDelegate::Clear() {
278 profile_->GetHostContentSettingsMap()->ClearSettingsForOneType( 283 profile_->GetHostContentSettingsMap()->ClearSettingsForOneType(
279 CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS); 284 CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS);
280 } 285 }
281 286
282 net::CertPolicy::Judgment ChromeSSLHostStateDelegate::QueryPolicy( 287 net::CertPolicy::Judgment ChromeSSLHostStateDelegate::QueryPolicy(
283 const std::string& host, 288 const std::string& host,
284 net::X509Certificate* cert, 289 const net::X509Certificate& cert,
285 net::CertStatus error, 290 net::CertStatus error,
286 bool* expired_previous_decision) { 291 bool* expired_previous_decision) {
287 HostContentSettingsMap* map = profile_->GetHostContentSettingsMap(); 292 HostContentSettingsMap* map = profile_->GetHostContentSettingsMap();
288 GURL url = GetSecureGURLForHost(host); 293 GURL url = GetSecureGURLForHost(host);
289 scoped_ptr<base::Value> value(map->GetWebsiteSetting( 294 scoped_ptr<base::Value> value(map->GetWebsiteSetting(
290 url, url, CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS, std::string(), NULL)); 295 url, url, CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS, std::string(), NULL));
291 296
292 // Set a default value in case this method is short circuited and doesn't do a 297 // Set a default value in case this method is short circuited and doesn't do a
293 // full query. 298 // full query.
294 *expired_previous_decision = false; 299 *expired_previous_decision = false;
295 if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY)) 300 if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY))
296 return net::CertPolicy::UNKNOWN; 301 return net::CertPolicy::UNKNOWN;
297 302
298 base::DictionaryValue* dict; // Owned by value 303 base::DictionaryValue* dict; // Owned by value
299 int policy_decision; 304 int policy_decision;
300 bool success = value->GetAsDictionary(&dict); 305 bool success = value->GetAsDictionary(&dict);
301 DCHECK(success); 306 DCHECK(success);
302 307
303 base::DictionaryValue* cert_error_dict; // Owned by value 308 base::DictionaryValue* cert_error_dict; // Owned by value
304 cert_error_dict = GetValidCertDecisionsDict( 309 cert_error_dict = GetValidCertDecisionsDict(
305 dict, DoNotCreateDictionaryEntries, expired_previous_decision); 310 dict, DO_NOT_CREATE_DICTIONARY_ENTRIES, expired_previous_decision);
306 if (!cert_error_dict) { 311 if (!cert_error_dict) {
307 // This revoke is necessary to clear any old expired setting that may 312 // This revoke is necessary to clear any old expired setting that may be
308 // lingering in the case that an old decision expried. 313 // lingering in the case that an old decision expried.
309 RevokeUserDecisions(host); 314 RevokeUserDecisions(host);
310 return net::CertPolicy::UNKNOWN; 315 return net::CertPolicy::UNKNOWN;
311 } 316 }
312 317
313 success = cert_error_dict->GetIntegerWithoutPathExpansion(GetKey(cert, error), 318 success = cert_error_dict->GetIntegerWithoutPathExpansion(GetKey(cert, error),
314 &policy_decision); 319 &policy_decision);
315 320
316 // If a policy decision was successfully retrieved and it's a valid value of 321 // If a policy decision was successfully retrieved and it's a valid value of
317 // ALLOWED or DENIED, return the valid value. Otherwise, return UNKNOWN. 322 // ALLOWED or DENIED, return the valid value. Otherwise, return UNKNOWN.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 // stack a way revoke SSLConfig's allowed_bad_certs lists per socket. 354 // stack a way revoke SSLConfig's allowed_bad_certs lists per socket.
350 // 355 //
351 // For now, RevokeUserDecisionsHard is our solution for the rare case where it 356 // For now, RevokeUserDecisionsHard is our solution for the rare case where it
352 // is necessary to revoke the preferences immediately. It does so by flushing 357 // is necessary to revoke the preferences immediately. It does so by flushing
353 // idle sockets. 358 // idle sockets.
354 void ChromeSSLHostStateDelegate::RevokeUserDecisionsHard( 359 void ChromeSSLHostStateDelegate::RevokeUserDecisionsHard(
355 const std::string& host) { 360 const std::string& host) {
356 RevokeUserDecisions(host); 361 RevokeUserDecisions(host);
357 scoped_refptr<net::URLRequestContextGetter> getter( 362 scoped_refptr<net::URLRequestContextGetter> getter(
358 profile_->GetRequestContext()); 363 profile_->GetRequestContext());
359 profile_->GetRequestContext()->GetNetworkTaskRunner()->PostTask( 364 getter->GetNetworkTaskRunner()->PostTask(
360 FROM_HERE, base::Bind(&CloseIdleConnections, getter)); 365 FROM_HERE, base::Bind(&CloseIdleConnections, getter));
361 } 366 }
362 367
363 bool ChromeSSLHostStateDelegate::HasUserDecision(const std::string& host) { 368 bool ChromeSSLHostStateDelegate::HasUserDecision(
369 const std::string& host) const {
364 GURL url = GetSecureGURLForHost(host); 370 GURL url = GetSecureGURLForHost(host);
365 const ContentSettingsPattern pattern = 371 const ContentSettingsPattern pattern =
366 ContentSettingsPattern::FromURLNoWildcard(url); 372 ContentSettingsPattern::FromURLNoWildcard(url);
367 HostContentSettingsMap* map = profile_->GetHostContentSettingsMap(); 373 HostContentSettingsMap* map = profile_->GetHostContentSettingsMap();
368 374
369 scoped_ptr<base::Value> value(map->GetWebsiteSetting( 375 scoped_ptr<base::Value> value(map->GetWebsiteSetting(
370 url, url, CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS, std::string(), NULL)); 376 url, url, CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS, std::string(), NULL));
371 377
372 if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY)) 378 if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY))
373 return false; 379 return false;
(...skipping 22 matching lines...) Expand all
396 const std::string& host, 402 const std::string& host,
397 int pid) const { 403 int pid) const {
398 return !!ran_insecure_content_hosts_.count(BrokenHostEntry(host, pid)); 404 return !!ran_insecure_content_hosts_.count(BrokenHostEntry(host, pid));
399 } 405 }
400 void ChromeSSLHostStateDelegate::SetClock(scoped_ptr<base::Clock> clock) { 406 void ChromeSSLHostStateDelegate::SetClock(scoped_ptr<base::Clock> clock) {
401 clock_.reset(clock.release()); 407 clock_.reset(clock.release());
402 } 408 }
403 409
404 void ChromeSSLHostStateDelegate::ChangeCertPolicy( 410 void ChromeSSLHostStateDelegate::ChangeCertPolicy(
405 const std::string& host, 411 const std::string& host,
406 net::X509Certificate* cert, 412 const net::X509Certificate& cert,
407 net::CertStatus error, 413 net::CertStatus error,
408 net::CertPolicy::Judgment judgment) { 414 const net::CertPolicy::Judgment judgment) {
409 GURL url = GetSecureGURLForHost(host); 415 GURL url = GetSecureGURLForHost(host);
410 const ContentSettingsPattern pattern = 416 const ContentSettingsPattern pattern =
411 ContentSettingsPattern::FromURLNoWildcard(url); 417 ContentSettingsPattern::FromURLNoWildcard(url);
412 HostContentSettingsMap* map = profile_->GetHostContentSettingsMap(); 418 HostContentSettingsMap* map = profile_->GetHostContentSettingsMap();
413 scoped_ptr<base::Value> value(map->GetWebsiteSetting( 419 scoped_ptr<base::Value> value(map->GetWebsiteSetting(
414 url, url, CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS, std::string(), NULL)); 420 url, url, CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS, std::string(), NULL));
415 421
416 if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY)) 422 if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY))
417 value.reset(new base::DictionaryValue()); 423 value.reset(new base::DictionaryValue());
418 424
419 base::DictionaryValue* dict; 425 base::DictionaryValue* dict;
420 bool success = value->GetAsDictionary(&dict); 426 bool success = value->GetAsDictionary(&dict);
421 DCHECK(success); 427 DCHECK(success);
422 428
423 bool expired_previous_decision; // unused value in this function 429 bool expired_previous_decision; // unused value in this function
424 base::DictionaryValue* cert_dict = GetValidCertDecisionsDict( 430 base::DictionaryValue* cert_dict = GetValidCertDecisionsDict(
425 dict, CreateDictionaryEntries, &expired_previous_decision); 431 dict, CREATE_DICTIONARY_ENTRIES, &expired_previous_decision);
426 // If a a valid certificate dictionary cannot be extracted from the content 432 // If a a valid certificate dictionary cannot be extracted from the content
427 // setting, that means it's in an unknown format. Unfortunately, there's 433 // setting, that means it's in an unknown format. Unfortunately, there's
428 // nothing to be done in that case, so a silent fail is the only option. 434 // nothing to be done in that case, so a silent fail is the only option.
429 if (!cert_dict) 435 if (!cert_dict)
430 return; 436 return;
431 437
432 dict->SetIntegerWithoutPathExpansion(kSSLCertDecisionVersionKey, 438 dict->SetIntegerWithoutPathExpansion(kSSLCertDecisionVersionKey,
433 kDefaultSSLCertDecisionVersion); 439 kDefaultSSLCertDecisionVersion);
434 cert_dict->SetIntegerWithoutPathExpansion(GetKey(cert, error), judgment); 440 cert_dict->SetIntegerWithoutPathExpansion(GetKey(cert, error), judgment);
435 441
436 // The map takes ownership of the value, so it is released in the call to 442 // The map takes ownership of the value, so it is released in the call to
437 // SetWebsiteSetting. 443 // SetWebsiteSetting.
438 map->SetWebsiteSetting(pattern, 444 map->SetWebsiteSetting(pattern,
439 pattern, 445 pattern,
440 CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS, 446 CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS,
441 std::string(), 447 std::string(),
442 value.release()); 448 value.release());
443 } 449 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698