ssl_blocking_page.cc revision 58537e28ecd584eab876aee8be7156509866d23a
1902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// Use of this source code is governed by a BSD-style license that can be
3902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// found in the LICENSE file.
4902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
5902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "chrome/browser/ssl/ssl_blocking_page.h"
6902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
7902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "base/i18n/rtl.h"
8902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "base/metrics/field_trial.h"
9902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "base/metrics/histogram.h"
10902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "base/strings/string_piece.h"
11902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "base/strings/utf_string_conversions.h"
12902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "base/values.h"
13902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "chrome/browser/history/history_service_factory.h"
14902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "chrome/browser/profiles/profile.h"
15902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "chrome/browser/renderer_preferences_util.h"
168a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com#include "chrome/browser/ssl/ssl_error_info.h"
1797cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com#include "chrome/browser/ui/browser.h"
18902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "chrome/browser/ui/browser_finder.h"
1932bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com#include "content/public/browser/cert_store.h"
2032bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com#include "content/public/browser/interstitial_page.h"
2186681b37bd20204e47a492119b345c01d00bc939fmalita@google.com#include "content/public/browser/navigation_controller.h"
22902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "content/public/browser/navigation_entry.h"
2380a4a60f96c33ccd850f9b0eb4b69ab08c198196chudy@google.com#include "content/public/browser/notification_service.h"
24f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com#include "content/public/browser/notification_types.h"
25902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "content/public/browser/render_process_host.h"
26902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "content/public/browser/render_view_host.h"
27902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "content/public/browser/web_contents.h"
28902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "content/public/common/ssl_status.h"
29f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com#include "grit/app_locale_settings.h"
30f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com#include "grit/browser_resources.h"
31f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com#include "grit/generated_resources.h"
32f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com#include "net/base/net_errors.h"
33f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com#include "net/base/net_util.h"
3432bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com#include "ui/base/l10n/l10n_util.h"
3532bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com#include "ui/base/resource/resource_bundle.h"
36f84ad8f7fc0194389a8099da2c5e8fff9f092890skia.committer@gmail.com#include "ui/webui/jstemplate_builder.h"
3732bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com
3832bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com#if defined(OS_WIN)
39902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#include "base/win/windows_version.h"
40902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#endif
41902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
42902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comusing base::TimeTicks;
43902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comusing content::InterstitialPage;
44902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comusing content::NavigationController;
45902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comusing content::NavigationEntry;
46902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
47902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comnamespace {
48902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
49902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// These represent the commands sent by ssl_roadblock.html.
50902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comenum SSLBlockingPageCommands {
51902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  CMD_DONT_PROCEED,
52902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  CMD_PROCEED,
53902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  CMD_FOCUS,
54902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  CMD_MORE
55902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com};
56902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
57902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com// Events for UMA.
580b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.comenum SSLBlockingPageEvent {
590b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com  SHOW_ALL,
600b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com  SHOW_OVERRIDABLE,
61a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  PROCEED_OVERRIDABLE,
62a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  PROCEED_NAME,
63a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  PROCEED_DATE,
64a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  PROCEED_AUTHORITY,
65a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  DONT_PROCEED_OVERRIDABLE,
66a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  DONT_PROCEED_NAME,
67a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  DONT_PROCEED_DATE,
68a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  DONT_PROCEED_AUTHORITY,
69a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  MORE,
70a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  SHOW_UNDERSTAND,  // Used by the summer 2013 Finch trial. Deprecated.
71a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  SHOW_INTERNAL_HOSTNAME,
72a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  PROCEED_INTERNAL_HOSTNAME,
73a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  SHOW_NEW_SITE,
74a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  PROCEED_NEW_SITE,
750b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com  UNUSED_BLOCKING_PAGE_EVENT,
760b5bbb0f82e022c8acfbcb6312f0ed18e1ab90cechudy@google.com};
77830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com
78902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid RecordSSLBlockingPageEventStats(SSLBlockingPageEvent event) {
79902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  UMA_HISTOGRAM_ENUMERATION("interstitial.ssl",
8050c84da68b17647371a81593402e897d639989e4robertphillips@google.com                            event,
8150c84da68b17647371a81593402e897d639989e4robertphillips@google.com                            UNUSED_BLOCKING_PAGE_EVENT);
8250c84da68b17647371a81593402e897d639989e4robertphillips@google.com}
8350c84da68b17647371a81593402e897d639989e4robertphillips@google.com
8450c84da68b17647371a81593402e897d639989e4robertphillips@google.comvoid RecordSSLBlockingPageDetailedStats(
8550c84da68b17647371a81593402e897d639989e4robertphillips@google.com    bool proceed,
86902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    int cert_error,
87902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    bool overridable,
88902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    bool internal,
89902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    const base::TimeTicks& start_time,
90902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    int num_visits) {
91902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  UMA_HISTOGRAM_ENUMERATION("interstitial.ssl_error_type",
9250c84da68b17647371a81593402e897d639989e4robertphillips@google.com     SSLErrorInfo::NetErrorToErrorType(cert_error), SSLErrorInfo::END_OF_ENUM);
9350c84da68b17647371a81593402e897d639989e4robertphillips@google.com  if (start_time.is_null() || !overridable) {
9450c84da68b17647371a81593402e897d639989e4robertphillips@google.com    // A null start time will occur if the page never came into focus.
9550c84da68b17647371a81593402e897d639989e4robertphillips@google.com    // Overridable is false if the user didn't have any option except to turn
9650c84da68b17647371a81593402e897d639989e4robertphillips@google.com    // back. In either case, we don't want to record some of our metrics.
9750c84da68b17647371a81593402e897d639989e4robertphillips@google.com    return;
9850c84da68b17647371a81593402e897d639989e4robertphillips@google.com  }
99902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  if (num_visits == 0)
100902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    RecordSSLBlockingPageEventStats(SHOW_NEW_SITE);
101902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  if (proceed) {
10297cee9735350cb472249ce1a827ba1aa6b2a5f59chudy@google.com    RecordSSLBlockingPageEventStats(PROCEED_OVERRIDABLE);
103902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    if (internal)
104902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      RecordSSLBlockingPageEventStats(PROCEED_INTERNAL_HOSTNAME);
1057e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    if (num_visits == 0)
1067e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com      RecordSSLBlockingPageEventStats(PROCEED_NEW_SITE);
1077e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com  } else if (!proceed) {
1087e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com    RecordSSLBlockingPageEventStats(DONT_PROCEED_OVERRIDABLE);
1097e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com  }
1107e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com  SSLErrorInfo::ErrorType type = SSLErrorInfo::NetErrorToErrorType(cert_error);
111902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  switch (type) {
112902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    case SSLErrorInfo::CERT_COMMON_NAME_INVALID: {
1134469938e92d779dff05e745559e67907bbf21e78reed@google.com      if (proceed)
1148a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com        RecordSSLBlockingPageEventStats(PROCEED_NAME);
1152e71f1619d9a2c51c1292e618f42a56ad2da1de8skia.committer@gmail.com      else
116febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com        RecordSSLBlockingPageEventStats(DONT_PROCEED_NAME);
117febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com      break;
118febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com    }
119febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com    case SSLErrorInfo::CERT_DATE_INVALID: {
120febc0ec41b4cff6ea69f2b89d72c0d330d198283robertphillips@google.com      if (proceed)
121902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        RecordSSLBlockingPageEventStats(PROCEED_DATE);
122902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      else
123902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        RecordSSLBlockingPageEventStats(DONT_PROCEED_DATE);
124902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      break;
1258a1cdaece7e1d009befb84f21bb82370025bf4d6robertphillips@google.com    }
126902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    case SSLErrorInfo::CERT_AUTHORITY_INVALID: {
127902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      if (proceed)
128f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com        RecordSSLBlockingPageEventStats(PROCEED_AUTHORITY);
129f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com      else
1300d4fe14a41bd04535310f8b2edee9e30191fdd79commit-bot@chromium.org        RecordSSLBlockingPageEventStats(DONT_PROCEED_AUTHORITY);
13167baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com      break;
132f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com    }
133f14143226acf209615c4dd841aa6632aff112ab3chudy@google.com    default: {
134902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      break;
135902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
136902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  }
137902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
138902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
139902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}  // namespace
140b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com
141b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com// Note that we always create a navigation entry with SSL errors.
142b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com// No error happening loading a sub-resource triggers an interstitial so far.
143b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.comSSLBlockingPage::SSLBlockingPage(
144b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com    content::WebContents* web_contents,
145e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    int cert_error,
146e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com    const net::SSLInfo& ssl_info,
147830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    const GURL& request_url,
148830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    bool overridable,
149902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    bool strict_enforcement,
150902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    const base::Callback<void(bool)>& callback)
151902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    : callback_(callback),
152902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      web_contents_(web_contents),
153902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      cert_error_(cert_error),
154902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      ssl_info_(ssl_info),
155902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      request_url_(request_url),
156902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      overridable_(overridable),
157902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      strict_enforcement_(strict_enforcement),
158902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      internal_(false),
15967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com      num_visits_(-1) {
16067baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  // For UMA stats.
16167baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  if (net::IsHostnameNonUnique(request_url_.HostNoBrackets()))
16267baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    internal_ = true;
163902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  RecordSSLBlockingPageEventStats(SHOW_ALL);
164902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  if (overridable_ && !strict_enforcement_) {
165902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    RecordSSLBlockingPageEventStats(SHOW_OVERRIDABLE);
166902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    if (internal_)
167902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      RecordSSLBlockingPageEventStats(SHOW_INTERNAL_HOSTNAME);
168902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    HistoryService* history_service = HistoryServiceFactory::GetForProfile(
169902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com        Profile::FromBrowserContext(web_contents->GetBrowserContext()),
1707112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com        Profile::EXPLICIT_ACCESS);
171eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org    if (history_service) {
172eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org      history_service->GetVisibleVisitCountToHost(
173902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com          request_url_,
174902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com          &request_consumer_,
175902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com          base::Bind(&SSLBlockingPage::OnGotHistoryCount,
176902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                    base::Unretained(this)));
177902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
178902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  }
179902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
180902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  interstitial_page_ = InterstitialPage::Create(
181902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      web_contents_, true, request_url, this);
1820a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com  display_start_time_ = TimeTicks();
1830a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com  interstitial_page_->Show();
1840a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com}
1850a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com
1860a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.comSSLBlockingPage::~SSLBlockingPage() {
1870a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com  if (!callback_.is_null()) {
18867baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    RecordSSLBlockingPageDetailedStats(false,
18967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com                                       cert_error_,
190902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                                       overridable_ && !strict_enforcement_,
191902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                                       internal_,
1927ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com                                       display_start_time_,
1937ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com                                       num_visits_);
194902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    // The page is closed without the user having chosen what to do, default to
195902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    // deny.
196902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    NotifyDenyCertificate();
197902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  }
198902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
199902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
200902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comstd::string SSLBlockingPage::GetHTMLContents() {
201902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  // Let's build the html error page.
202902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  DictionaryValue strings;
203422188f3c6286d2991a029027958387b070e4dc6skia.committer@gmail.com  SSLErrorInfo error_info =
20467baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com      SSLErrorInfo::CreateError(SSLErrorInfo::NetErrorToErrorType(cert_error_),
205902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                                ssl_info_.cert.get(),
2067ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com                                request_url_);
2077ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com
20867baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  int resource_id = IDR_SSL_ROAD_BLOCK_HTML;
20967baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  strings.SetString("headLine", error_info.title());
210902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  strings.SetString("description", error_info.details());
211902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  strings.SetString("moreInfoTitle",
212902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_TITLE));
213902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  SetExtraInfo(&strings, error_info.extra_information());
214902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
215902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  strings.SetString("exit",
216902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                    l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_EXIT));
21767baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com
218902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  if (overridable_ && !strict_enforcement_) {
219902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    strings.SetString("title",
220902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                      l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_TITLE));
22167baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    strings.SetString("proceed",
22267baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com                      l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_PROCEED));
22367baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com    strings.SetString("reasonForNotProceeding",
224902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                      l10n_util::GetStringUTF16(
225902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                          IDS_SSL_BLOCKING_PAGE_SHOULD_NOT_PROCEED));
226902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    strings.SetString("errorType", "overridable");
227902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  } else {
228902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    strings.SetString("title",
229902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                      l10n_util::GetStringUTF16(IDS_SSL_ERROR_PAGE_TITLE));
230902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    if (strict_enforcement_) {
231902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      strings.SetString("reasonForNotProceeding",
232902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                        l10n_util::GetStringUTF16(
233902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com                            IDS_SSL_ERROR_PAGE_CANNOT_PROCEED));
234902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    } else {
235902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      strings.SetString("reasonForNotProceeding", std::string());
236902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    }
237902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    strings.SetString("errorType", "notoverridable");
238902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  }
239902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
240902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  strings.SetString("textdirection", base::i18n::IsRTL() ? "rtl" : "ltr");
241902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
2423b0a9fe5672e7339ec3e5e6d3986b15f57ae24e7robertphillips@google.com  base::StringPiece html(
2433b0a9fe5672e7339ec3e5e6d3986b15f57ae24e7robertphillips@google.com      ResourceBundle::GetSharedInstance().GetRawDataResource(
2443b0a9fe5672e7339ec3e5e6d3986b15f57ae24e7robertphillips@google.com          resource_id));
245902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com
24667baba4892649fdb6fb0827c7d54e5adb7538443robertphillips@google.com  return webui::GetI18nTemplateHtml(html, &strings);
247b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com}
248b9ddd4e9f184f4a4545eca69c55ec1ad1ce59170chudy@google.com
249902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.comvoid SSLBlockingPage::OverrideEntry(NavigationEntry* entry) {
2507e4cfbf144af7d530d552946cee2a21d30b9b50fchudy@google.com  int cert_id = content::CertStore::GetInstance()->StoreCert(
251830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com      ssl_info_.cert.get(), web_contents_->GetRenderProcessHost()->GetID());
252e8cc6e8071935339a06548b13a0668b56a7540f5bungeman@google.com
253a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com  entry->GetSSL().security_style =
254a9e937c7b712b024de108fa963f92d0e70e4a296chudy@google.com      content::SECURITY_STYLE_AUTHENTICATION_BROKEN;
25532bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com  entry->GetSSL().cert_id = cert_id;
256f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com  entry->GetSSL().cert_status = ssl_info_.cert_status;
257f4741c1322944e194ca34a8f5cf8188fe2c0efe2robertphillips@google.com  entry->GetSSL().security_bits = ssl_info_.security_bits;
258902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#if !defined(OS_ANDROID)
25932bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com  Browser* browser = chrome::FindBrowserWithWebContents(web_contents_);
26032bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com  if (browser)
26132bbcf828d66ad244fa25b468bc3a229e531491frobertphillips@google.com    browser->VisibleSSLStateChanged(web_contents_);
262902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com#endif  // !defined(OS_ANDROID)
2630699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com}
2640699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com
2650699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com// Matches events defined in ssl_error.html and ssl_roadblock.html.
2660699e02101405623ad47f225729ed2521b2a0501tomhudson@google.comvoid SSLBlockingPage::CommandReceived(const std::string& command) {
2670699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com  int cmd = atoi(command.c_str());
2680699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com  if (cmd == CMD_DONT_PROCEED) {
2690699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com    interstitial_page_->DontProceed();
2700699e02101405623ad47f225729ed2521b2a0501tomhudson@google.com  } else if (cmd == CMD_PROCEED) {
271902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    interstitial_page_->Proceed();
272902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  } else if (cmd == CMD_FOCUS) {
273902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    // Start recording the time when the page is first in focus
274902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com    display_start_time_ = base::TimeTicks::Now();
275830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com  } else if (cmd == CMD_MORE) {
276830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com    RecordSSLBlockingPageEventStats(MORE);
277830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com  }
278830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com}
279830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.com
280830b8793bb1646bb76817bdc228dd8e2a92bef7dchudy@google.comvoid SSLBlockingPage::OverrideRendererPrefs(
2813b0a9fe5672e7339ec3e5e6d3986b15f57ae24e7robertphillips@google.com      content::RendererPreferences* prefs) {
2823b0a9fe5672e7339ec3e5e6d3986b15f57ae24e7robertphillips@google.com  Profile* profile = Profile::FromBrowserContext(
283902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com      web_contents_->GetBrowserContext());
284902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com  renderer_preferences_util::UpdateFromSystemSettings(prefs, profile);
285902ebe5eb41a350b766238b3b103c22fe9fc0fb5chudy@google.com}
286
287void SSLBlockingPage::OnProceed() {
288  RecordSSLBlockingPageDetailedStats(true,
289                                     cert_error_,
290                                     overridable_ && !strict_enforcement_,
291                                     internal_,
292                                     display_start_time_,
293                                     num_visits_);
294  // Accepting the certificate resumes the loading of the page.
295  NotifyAllowCertificate();
296}
297
298void SSLBlockingPage::OnDontProceed() {
299  RecordSSLBlockingPageDetailedStats(false,
300                                     cert_error_,
301                                     overridable_ && !strict_enforcement_,
302                                     internal_,
303                                     display_start_time_,
304                                     num_visits_);
305  NotifyDenyCertificate();
306}
307
308void SSLBlockingPage::NotifyDenyCertificate() {
309  // It's possible that callback_ may not exist if the user clicks "Proceed"
310  // followed by pressing the back button before the interstitial is hidden.
311  // In that case the certificate will still be treated as allowed.
312  if (callback_.is_null())
313    return;
314
315  callback_.Run(false);
316  callback_.Reset();
317}
318
319void SSLBlockingPage::NotifyAllowCertificate() {
320  DCHECK(!callback_.is_null());
321
322  callback_.Run(true);
323  callback_.Reset();
324}
325
326// static
327void SSLBlockingPage::SetExtraInfo(
328    DictionaryValue* strings,
329    const std::vector<string16>& extra_info) {
330  DCHECK_LT(extra_info.size(), 5U);  // We allow 5 paragraphs max.
331  const char* keys[5] = {
332      "moreInfo1", "moreInfo2", "moreInfo3", "moreInfo4", "moreInfo5"
333  };
334  int i;
335  for (i = 0; i < static_cast<int>(extra_info.size()); i++) {
336    strings->SetString(keys[i], extra_info[i]);
337  }
338  for (; i < 5; i++) {
339    strings->SetString(keys[i], std::string());
340  }
341}
342
343void SSLBlockingPage::OnGotHistoryCount(HistoryService::Handle handle,
344                                        bool success,
345                                        int num_visits,
346                                        base::Time first_visit) {
347  num_visits_ = num_visits;
348}
349