| Index: chrome/browser/ssl/chrome_ssl_host_state_delegate.cc
|
| diff --git a/chrome/browser/ssl/chrome_ssl_host_state_delegate.cc b/chrome/browser/ssl/chrome_ssl_host_state_delegate.cc
|
| index c306b22f0a9295b7f8e582a8e977fa859be4bc42..86370de7fbc65e00c831345be32e8110333907e6 100644
|
| --- a/chrome/browser/ssl/chrome_ssl_host_state_delegate.cc
|
| +++ b/chrome/browser/ssl/chrome_ssl_host_state_delegate.cc
|
| @@ -262,16 +262,44 @@ ChromeSSLHostStateDelegate::~ChromeSSLHostStateDelegate() {
|
| Clear();
|
| }
|
|
|
| -void ChromeSSLHostStateDelegate::DenyCert(const std::string& host,
|
| - net::X509Certificate* cert,
|
| - net::CertStatus error) {
|
| - ChangeCertPolicy(host, cert, error, net::CertPolicy::DENIED);
|
| -}
|
| -
|
| void ChromeSSLHostStateDelegate::AllowCert(const std::string& host,
|
| net::X509Certificate* cert,
|
| net::CertStatus error) {
|
| - ChangeCertPolicy(host, cert, error, net::CertPolicy::ALLOWED);
|
| + GURL url = GetSecureGURLForHost(host);
|
| + const ContentSettingsPattern pattern =
|
| + ContentSettingsPattern::FromURLNoWildcard(url);
|
| + HostContentSettingsMap* map = profile_->GetHostContentSettingsMap();
|
| + scoped_ptr<base::Value> value(map->GetWebsiteSetting(
|
| + url, url, CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS, std::string(), NULL));
|
| +
|
| + if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY))
|
| + value.reset(new base::DictionaryValue());
|
| +
|
| + base::DictionaryValue* dict;
|
| + bool success = value->GetAsDictionary(&dict);
|
| + DCHECK(success);
|
| +
|
| + bool expired_previous_decision; // unused value in this function
|
| + base::DictionaryValue* cert_dict = GetValidCertDecisionsDict(
|
| + dict, CreateDictionaryEntries, &expired_previous_decision);
|
| + // If a a valid certificate dictionary cannot be extracted from the content
|
| + // setting, that means it's in an unknown format. Unfortunately, there's
|
| + // nothing to be done in that case, so a silent fail is the only option.
|
| + if (!cert_dict)
|
| + return;
|
| +
|
| + dict->SetIntegerWithoutPathExpansion(kSSLCertDecisionVersionKey,
|
| + kDefaultSSLCertDecisionVersion);
|
| + cert_dict->SetIntegerWithoutPathExpansion(GetKey(cert, error),
|
| + net::CertPolicy::ALLOWED);
|
| +
|
| + // The map takes ownership of the value, so it is released in the call to
|
| + // SetWebsiteSetting.
|
| + map->SetWebsiteSetting(pattern,
|
| + pattern,
|
| + CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS,
|
| + std::string(),
|
| + value.release());
|
| }
|
|
|
| void ChromeSSLHostStateDelegate::Clear() {
|
| @@ -314,11 +342,12 @@ net::CertPolicy::Judgment ChromeSSLHostStateDelegate::QueryPolicy(
|
| &policy_decision);
|
|
|
| // If a policy decision was successfully retrieved and it's a valid value of
|
| - // ALLOWED or DENIED, return the valid value. Otherwise, return UNKNOWN.
|
| + // ALLOWED, return the valid value. Otherwise, return UNKNOWN. Since the UI
|
| + // does not provide a way to deny certs and any DENIED value must have come
|
| + // from an external source, such as manually modifying the prefs file, Chrome
|
| + // we treats DENIED values as UNKNOWN.
|
| if (success && policy_decision == net::CertPolicy::Judgment::ALLOWED)
|
| return net::CertPolicy::Judgment::ALLOWED;
|
| - else if (success && policy_decision == net::CertPolicy::Judgment::DENIED)
|
| - return net::CertPolicy::Judgment::DENIED;
|
|
|
| return net::CertPolicy::Judgment::UNKNOWN;
|
| }
|
| @@ -360,7 +389,7 @@ void ChromeSSLHostStateDelegate::RevokeUserDecisionsHard(
|
| FROM_HERE, base::Bind(&CloseIdleConnections, getter));
|
| }
|
|
|
| -bool ChromeSSLHostStateDelegate::HasUserDecision(const std::string& host) {
|
| +bool ChromeSSLHostStateDelegate::HasAllowed(const std::string& host) {
|
| GURL url = GetSecureGURLForHost(host);
|
| const ContentSettingsPattern pattern =
|
| ContentSettingsPattern::FromURLNoWildcard(url);
|
| @@ -379,8 +408,8 @@ bool ChromeSSLHostStateDelegate::HasUserDecision(const std::string& host) {
|
| for (base::DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
|
| int policy_decision; // Owned by dict
|
| success = it.value().GetAsInteger(&policy_decision);
|
| - if (success && (static_cast<net::CertPolicy::Judgment>(policy_decision) !=
|
| - net::CertPolicy::UNKNOWN))
|
| + if (success && (static_cast<net::CertPolicy::Judgment>(policy_decision) ==
|
| + net::CertPolicy::ALLOWED))
|
| return true;
|
| }
|
|
|
| @@ -400,44 +429,3 @@ bool ChromeSSLHostStateDelegate::DidHostRunInsecureContent(
|
| void ChromeSSLHostStateDelegate::SetClock(scoped_ptr<base::Clock> clock) {
|
| clock_.reset(clock.release());
|
| }
|
| -
|
| -void ChromeSSLHostStateDelegate::ChangeCertPolicy(
|
| - const std::string& host,
|
| - net::X509Certificate* cert,
|
| - net::CertStatus error,
|
| - net::CertPolicy::Judgment judgment) {
|
| - GURL url = GetSecureGURLForHost(host);
|
| - const ContentSettingsPattern pattern =
|
| - ContentSettingsPattern::FromURLNoWildcard(url);
|
| - HostContentSettingsMap* map = profile_->GetHostContentSettingsMap();
|
| - scoped_ptr<base::Value> value(map->GetWebsiteSetting(
|
| - url, url, CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS, std::string(), NULL));
|
| -
|
| - if (!value.get() || !value->IsType(base::Value::TYPE_DICTIONARY))
|
| - value.reset(new base::DictionaryValue());
|
| -
|
| - base::DictionaryValue* dict;
|
| - bool success = value->GetAsDictionary(&dict);
|
| - DCHECK(success);
|
| -
|
| - bool expired_previous_decision; // unused value in this function
|
| - base::DictionaryValue* cert_dict = GetValidCertDecisionsDict(
|
| - dict, CreateDictionaryEntries, &expired_previous_decision);
|
| - // If a a valid certificate dictionary cannot be extracted from the content
|
| - // setting, that means it's in an unknown format. Unfortunately, there's
|
| - // nothing to be done in that case, so a silent fail is the only option.
|
| - if (!cert_dict)
|
| - return;
|
| -
|
| - dict->SetIntegerWithoutPathExpansion(kSSLCertDecisionVersionKey,
|
| - kDefaultSSLCertDecisionVersion);
|
| - cert_dict->SetIntegerWithoutPathExpansion(GetKey(cert, error), judgment);
|
| -
|
| - // The map takes ownership of the value, so it is released in the call to
|
| - // SetWebsiteSetting.
|
| - map->SetWebsiteSetting(pattern,
|
| - pattern,
|
| - CONTENT_SETTINGS_TYPE_SSL_CERT_DECISIONS,
|
| - std::string(),
|
| - value.release());
|
| -}
|
|
|