| Index: content/browser/ssl/ssl_policy.cc
|
| diff --git a/content/browser/ssl/ssl_policy.cc b/content/browser/ssl/ssl_policy.cc
|
| deleted file mode 100644
|
| index fa07378c0c2b7e3eabc11b8cbba2171362b69797..0000000000000000000000000000000000000000
|
| --- a/content/browser/ssl/ssl_policy.cc
|
| +++ /dev/null
|
| @@ -1,266 +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 "content/browser/ssl/ssl_policy.h"
|
| -
|
| -#include "base/base_switches.h"
|
| -#include "base/bind.h"
|
| -#include "base/command_line.h"
|
| -#include "base/memory/singleton.h"
|
| -#include "base/metrics/histogram_macros.h"
|
| -#include "base/strings/string_piece.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "content/browser/frame_host/navigation_entry_impl.h"
|
| -#include "content/browser/renderer_host/render_process_host_impl.h"
|
| -#include "content/browser/renderer_host/render_view_host_impl.h"
|
| -#include "content/browser/site_instance_impl.h"
|
| -#include "content/browser/ssl/ssl_error_handler.h"
|
| -#include "content/browser/web_contents/web_contents_impl.h"
|
| -#include "content/common/security_style_util.h"
|
| -#include "content/public/browser/content_browser_client.h"
|
| -#include "content/public/browser/ssl_status.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "content/public/common/resource_type.h"
|
| -#include "content/public/common/url_constants.h"
|
| -#include "net/ssl/ssl_info.h"
|
| -#include "url/gurl.h"
|
| -
|
| -namespace content {
|
| -
|
| -namespace {
|
| -
|
| -// Events for UMA. Do not reorder or change!
|
| -enum SSLGoodCertSeenEvent {
|
| - NO_PREVIOUS_EXCEPTION = 0,
|
| - HAD_PREVIOUS_EXCEPTION = 1,
|
| - SSL_GOOD_CERT_SEEN_EVENT_MAX = 2
|
| -};
|
| -
|
| -void OnAllowCertificate(SSLErrorHandler* handler,
|
| - const SSLPolicy* const policy,
|
| - CertificateRequestResultType decision) {
|
| - DCHECK(handler->ssl_info().is_valid());
|
| - switch (decision) {
|
| - case CERTIFICATE_REQUEST_RESULT_TYPE_CONTINUE:
|
| - // Note that we should not call SetMaxSecurityStyle here, because
|
| - // the active NavigationEntry has just been deleted (in
|
| - // HideInterstitialPage) and the new NavigationEntry will not be
|
| - // set until DidNavigate. This is ok, because the new
|
| - // NavigationEntry will have its max security style set within
|
| - // DidNavigate.
|
| - //
|
| - // While AllowCertForHost() executes synchronously on this thread,
|
| - // ContinueRequest() gets posted to a different thread. Calling
|
| - // AllowCertForHost() first ensures deterministic ordering.
|
| - policy->backend()->AllowCertForHost(*handler->ssl_info().cert.get(),
|
| - handler->request_url().host(),
|
| - handler->cert_error());
|
| - handler->ContinueRequest();
|
| - return;
|
| - case CERTIFICATE_REQUEST_RESULT_TYPE_DENY:
|
| - handler->DenyRequest();
|
| - return;
|
| - case CERTIFICATE_REQUEST_RESULT_TYPE_CANCEL:
|
| - handler->CancelRequest();
|
| - return;
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -SSLPolicy::SSLPolicy(SSLPolicyBackend* backend)
|
| - : backend_(backend) {
|
| - DCHECK(backend_);
|
| -}
|
| -
|
| -void SSLPolicy::OnCertError(std::unique_ptr<SSLErrorHandler> handler) {
|
| - bool expired_previous_decision = false;
|
| - // First we check if we know the policy for this error.
|
| - DCHECK(handler->ssl_info().is_valid());
|
| - SSLHostStateDelegate::CertJudgment judgment =
|
| - backend_->QueryPolicy(*handler->ssl_info().cert.get(),
|
| - handler->request_url().host(),
|
| - handler->cert_error(),
|
| - &expired_previous_decision);
|
| -
|
| - if (judgment == SSLHostStateDelegate::ALLOWED) {
|
| - handler->ContinueRequest();
|
| - return;
|
| - }
|
| -
|
| - // For all other hosts, which must be DENIED, a blocking page is shown to the
|
| - // user every time they come 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:
|
| - case net::ERR_CERT_AUTHORITY_INVALID:
|
| - case net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM:
|
| - case net::ERR_CERT_WEAK_KEY:
|
| - case net::ERR_CERT_NAME_CONSTRAINT_VIOLATION:
|
| - case net::ERR_CERT_VALIDITY_TOO_LONG:
|
| - case net::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED:
|
| - if (!handler->fatal())
|
| - options_mask |= OVERRIDABLE;
|
| - else
|
| - options_mask |= STRICT_ENFORCEMENT;
|
| - if (expired_previous_decision)
|
| - options_mask |= EXPIRED_PREVIOUS_DECISION;
|
| - OnCertErrorInternal(std::move(handler), options_mask);
|
| - break;
|
| - case net::ERR_CERT_NO_REVOCATION_MECHANISM:
|
| - // Ignore this error.
|
| - handler->ContinueRequest();
|
| - break;
|
| - case net::ERR_CERT_UNABLE_TO_CHECK_REVOCATION:
|
| - // We ignore this error but will show a warning status in the location
|
| - // bar.
|
| - handler->ContinueRequest();
|
| - break;
|
| - case net::ERR_CERT_CONTAINS_ERRORS:
|
| - case net::ERR_CERT_REVOKED:
|
| - case net::ERR_CERT_INVALID:
|
| - case net::ERR_SSL_WEAK_SERVER_EPHEMERAL_DH_KEY:
|
| - case net::ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN:
|
| - if (handler->fatal())
|
| - options_mask |= STRICT_ENFORCEMENT;
|
| - if (expired_previous_decision)
|
| - options_mask |= EXPIRED_PREVIOUS_DECISION;
|
| - OnCertErrorInternal(std::move(handler), options_mask);
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - handler->CancelRequest();
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void SSLPolicy::DidRunInsecureContent(NavigationEntryImpl* entry,
|
| - const GURL& security_origin) {
|
| - if (!entry)
|
| - return;
|
| -
|
| - SiteInstance* site_instance = entry->site_instance();
|
| - if (!site_instance)
|
| - return;
|
| -
|
| - backend_->HostRanInsecureContent(security_origin.host(),
|
| - site_instance->GetProcess()->GetID());
|
| -}
|
| -
|
| -void SSLPolicy::DidRunContentWithCertErrors(NavigationEntryImpl* entry,
|
| - const GURL& security_origin) {
|
| - if (!entry)
|
| - return;
|
| -
|
| - SiteInstance* site_instance = entry->site_instance();
|
| - if (!site_instance)
|
| - return;
|
| -
|
| - backend_->HostRanContentWithCertErrors(security_origin.host(),
|
| - site_instance->GetProcess()->GetID());
|
| -}
|
| -
|
| -void SSLPolicy::OnRequestStarted(const GURL& url,
|
| - bool has_certificate,
|
| - net::CertStatus cert_status) {
|
| - if (has_certificate && url.SchemeIsCryptographic() &&
|
| - !net::IsCertStatusError(cert_status)) {
|
| - // If the scheme is https: or wss: *and* the security info for the
|
| - // cert has been set (i.e. the cert id is not 0) and the cert did
|
| - // not have any errors, revoke any previous decisions that
|
| - // have occurred. If the cert info has not been set, do nothing since it
|
| - // isn't known if the connection was actually a valid connection or if it
|
| - // had a cert error.
|
| - SSLGoodCertSeenEvent event = NO_PREVIOUS_EXCEPTION;
|
| - if (backend_->HasAllowException(url.host())) {
|
| - // If there's no certificate error, a good certificate has been seen, so
|
| - // clear out any exceptions that were made by the user for bad
|
| - // certificates. This intentionally does not apply to cached resources
|
| - // (see https://crbug.com/634553 for an explanation).
|
| - backend_->RevokeUserAllowExceptions(url.host());
|
| - event = HAD_PREVIOUS_EXCEPTION;
|
| - }
|
| - UMA_HISTOGRAM_ENUMERATION("interstitial.ssl.good_cert_seen", event,
|
| - SSL_GOOD_CERT_SEEN_EVENT_MAX);
|
| - }
|
| -}
|
| -
|
| -void SSLPolicy::UpdateEntry(NavigationEntryImpl* entry,
|
| - WebContents* web_contents) {
|
| - DCHECK(entry);
|
| -
|
| - WebContentsImpl* web_contents_impl =
|
| - static_cast<WebContentsImpl*>(web_contents);
|
| -
|
| - InitializeEntryIfNeeded(entry);
|
| -
|
| - if (entry->GetSSL().security_style == SECURITY_STYLE_UNAUTHENTICATED)
|
| - return;
|
| -
|
| - if (!web_contents_impl->DisplayedInsecureContent())
|
| - entry->GetSSL().content_status &= ~SSLStatus::DISPLAYED_INSECURE_CONTENT;
|
| -
|
| - if (web_contents_impl->DisplayedInsecureContent())
|
| - entry->GetSSL().content_status |= SSLStatus::DISPLAYED_INSECURE_CONTENT;
|
| -
|
| - if (!web_contents_impl->DisplayedContentWithCertErrors())
|
| - entry->GetSSL().content_status &=
|
| - ~SSLStatus::DISPLAYED_CONTENT_WITH_CERT_ERRORS;
|
| -
|
| - if (web_contents_impl->DisplayedContentWithCertErrors())
|
| - entry->GetSSL().content_status |=
|
| - SSLStatus::DISPLAYED_CONTENT_WITH_CERT_ERRORS;
|
| -
|
| - SiteInstance* site_instance = entry->site_instance();
|
| - // Note that |site_instance| can be NULL here because NavigationEntries don't
|
| - // necessarily have site instances. Without a process, the entry can't
|
| - // possibly have insecure content. See bug http://crbug.com/12423.
|
| - if (site_instance &&
|
| - backend_->DidHostRunInsecureContent(
|
| - entry->GetURL().host(), site_instance->GetProcess()->GetID())) {
|
| - entry->GetSSL().security_style =
|
| - SECURITY_STYLE_AUTHENTICATION_BROKEN;
|
| - entry->GetSSL().content_status |= SSLStatus::RAN_INSECURE_CONTENT;
|
| - }
|
| -
|
| - if (site_instance &&
|
| - backend_->DidHostRunContentWithCertErrors(
|
| - entry->GetURL().host(), site_instance->GetProcess()->GetID())) {
|
| - entry->GetSSL().security_style = SECURITY_STYLE_AUTHENTICATION_BROKEN;
|
| - entry->GetSSL().content_status |= SSLStatus::RAN_CONTENT_WITH_CERT_ERRORS;
|
| - }
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// Certificate Error Routines
|
| -
|
| -void SSLPolicy::OnCertErrorInternal(std::unique_ptr<SSLErrorHandler> handler,
|
| - 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;
|
| -
|
| - WebContents* web_contents = handler->web_contents();
|
| - int cert_error = handler->cert_error();
|
| - const net::SSLInfo& ssl_info = handler->ssl_info();
|
| - const GURL& request_url = handler->request_url();
|
| - ResourceType resource_type = handler->resource_type();
|
| - GetContentClient()->browser()->AllowCertificateError(
|
| - web_contents, cert_error, ssl_info, request_url, resource_type,
|
| - overridable, strict_enforcement, expired_previous_decision,
|
| - base::Bind(&OnAllowCertificate, base::Owned(handler.release()), this));
|
| -}
|
| -
|
| -void SSLPolicy::InitializeEntryIfNeeded(NavigationEntryImpl* entry) {
|
| - if (entry->GetSSL().security_style != SECURITY_STYLE_UNKNOWN)
|
| - return;
|
| -
|
| - entry->GetSSL().security_style = GetSecurityStyleForResource(
|
| - entry->GetURL(), !!entry->GetSSL().certificate,
|
| - entry->GetSSL().cert_status);
|
| -}
|
| -
|
| -} // namespace content
|
|
|