Index: content/browser/ssl/ssl_policy.cc |
diff --git a/content/browser/ssl/ssl_policy.cc b/content/browser/ssl/ssl_policy.cc |
index c06c7db852c97d6ca4bc75aaa7d1d608fc54c972..18fdde4dfe2bf9823e716ae01e48db73f1641fb8 100644 |
--- a/content/browser/ssl/ssl_policy.cc |
+++ b/content/browser/ssl/ssl_policy.cc |
@@ -32,11 +32,13 @@ SSLPolicy::SSLPolicy(SSLPolicyBackend* backend) |
} |
void SSLPolicy::OnCertError(SSLCertErrorHandler* handler) { |
+ bool expired_previous_decision; |
// First we check if we know the policy for this error. |
net::CertPolicy::Judgment judgment = |
backend_->QueryPolicy(handler->ssl_info().cert.get(), |
handler->request_url().host(), |
- handler->cert_error()); |
+ handler->cert_error(), |
+ &expired_previous_decision); |
if (judgment == net::CertPolicy::ALLOWED) { |
handler->ContinueRequest(); |
@@ -47,6 +49,7 @@ void SSLPolicy::OnCertError(SSLCertErrorHandler* handler) { |
// For now we handle the DENIED as the UNKNOWN, which means a blocking |
// page is shown to the user every time he comes back to the page. |
+ int options_mask = 0; |
switch (handler->cert_error()) { |
case net::ERR_CERT_COMMON_NAME_INVALID: |
case net::ERR_CERT_DATE_INVALID: |
@@ -54,7 +57,13 @@ void SSLPolicy::OnCertError(SSLCertErrorHandler* handler) { |
case net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM: |
case net::ERR_CERT_WEAK_KEY: |
case net::ERR_CERT_NAME_CONSTRAINT_VIOLATION: |
- OnCertErrorInternal(handler, !handler->fatal(), handler->fatal()); |
+ if (!handler->fatal()) |
+ options_mask |= OVERRIDABLE; |
+ else |
+ options_mask |= STRICT_ENFORCEMENT; |
+ if (expired_previous_decision) |
+ options_mask |= EXPIRED_PREVIOUS_DECISION; |
+ OnCertErrorInternal(handler, options_mask); |
break; |
case net::ERR_CERT_NO_REVOCATION_MECHANISM: |
// Ignore this error. |
@@ -70,7 +79,11 @@ void SSLPolicy::OnCertError(SSLCertErrorHandler* handler) { |
case net::ERR_CERT_INVALID: |
case net::ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY: |
case net::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN: |
- OnCertErrorInternal(handler, false, handler->fatal()); |
+ if (handler->fatal()) |
+ options_mask |= STRICT_ENFORCEMENT; |
+ if (expired_previous_decision) |
+ options_mask |= EXPIRED_PREVIOUS_DECISION; |
+ OnCertErrorInternal(handler, options_mask); |
break; |
default: |
NOTREACHED(); |
@@ -182,8 +195,11 @@ void SSLPolicy::OnAllowCertificate(scoped_refptr<SSLCertErrorHandler> handler, |
// Certificate Error Routines |
void SSLPolicy::OnCertErrorInternal(SSLCertErrorHandler* handler, |
- bool overridable, |
- bool strict_enforcement) { |
+ int options_mask) { |
+ bool overridable = (options_mask & OVERRIDABLE) != 0; |
+ bool strict_enforcement = (options_mask & STRICT_ENFORCEMENT) != 0; |
+ bool expired_previous_decision = |
+ (options_mask & EXPIRED_PREVIOUS_DECISION) != 0; |
CertificateRequestResultType result = |
CERTIFICATE_REQUEST_RESULT_TYPE_CONTINUE; |
GetContentClient()->browser()->AllowCertificateError( |
@@ -195,7 +211,9 @@ void SSLPolicy::OnCertErrorInternal(SSLCertErrorHandler* handler, |
handler->resource_type(), |
overridable, |
strict_enforcement, |
- base::Bind(&SSLPolicy::OnAllowCertificate, base::Unretained(this), |
+ expired_previous_decision, |
+ base::Bind(&SSLPolicy::OnAllowCertificate, |
+ base::Unretained(this), |
make_scoped_refptr(handler)), |
&result); |
switch (result) { |