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