Chromium Code Reviews| Index: chrome/browser/ssl/ssl_blocking_page.cc |
| diff --git a/chrome/browser/ssl/ssl_blocking_page.cc b/chrome/browser/ssl/ssl_blocking_page.cc |
| index 8ed43633fc336659735411577deaf962fe319dd9..fa71dae65012f43356e20369eecbd7089fd36267 100644 |
| --- a/chrome/browser/ssl/ssl_blocking_page.cc |
| +++ b/chrome/browser/ssl/ssl_blocking_page.cc |
| @@ -7,7 +7,9 @@ |
| #include "base/i18n/rtl.h" |
| #include "base/metrics/field_trial.h" |
| #include "base/metrics/histogram.h" |
| +#include "base/strings/string_number_conversions.h" |
| #include "base/strings/string_piece.h" |
| +#include "base/strings/stringprintf.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "base/values.h" |
| #include "chrome/browser/history/history_service_factory.h" |
| @@ -29,6 +31,7 @@ |
| #include "grit/app_locale_settings.h" |
| #include "grit/browser_resources.h" |
| #include "grit/generated_resources.h" |
| +#include "net/base/hash_value.h" |
| #include "net/base/net_errors.h" |
| #include "net/base/net_util.h" |
| #include "ui/base/l10n/l10n_util.h" |
| @@ -51,7 +54,8 @@ enum SSLBlockingPageCommands { |
| CMD_DONT_PROCEED, |
| CMD_PROCEED, |
| CMD_FOCUS, |
| - CMD_MORE |
| + CMD_MORE, |
| + CMD_RELOAD, |
| }; |
| // Events for UMA. |
| @@ -154,7 +158,7 @@ SSLBlockingPage::SSLBlockingPage( |
| ssl_info_(ssl_info), |
| request_url_(request_url), |
| overridable_(overridable), |
| - strict_enforcement_(strict_enforcement), |
| + strict_enforcement_(true), |
| internal_(false), |
| num_visits_(-1) { |
| // For UMA stats. |
| @@ -198,51 +202,145 @@ SSLBlockingPage::~SSLBlockingPage() { |
| } |
| std::string SSLBlockingPage::GetHTMLContents() { |
| - // Let's build the html error page. |
| DictionaryValue strings; |
| - SSLErrorInfo error_info = |
| - SSLErrorInfo::CreateError(SSLErrorInfo::NetErrorToErrorType(cert_error_), |
| - ssl_info_.cert.get(), |
| - request_url_); |
| - |
| - int resource_id = IDR_SSL_ROAD_BLOCK_HTML; |
| - strings.SetString("headLine", error_info.title()); |
| - strings.SetString("description", error_info.details()); |
| - strings.SetString("moreInfoTitle", |
| - l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_TITLE)); |
| - SetExtraInfo(&strings, error_info.extra_information()); |
| - |
| - strings.SetString("exit", |
| - l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_EXIT)); |
| - |
| + int resource_id; |
| if (overridable_ && !strict_enforcement_) { |
| - strings.SetString("title", |
| - l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_TITLE)); |
| - strings.SetString("proceed", |
| - l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_PROCEED)); |
| - strings.SetString("reasonForNotProceeding", |
| - l10n_util::GetStringUTF16( |
| - IDS_SSL_BLOCKING_PAGE_SHOULD_NOT_PROCEED)); |
| + // Let's build the overridable error page. |
| + SSLErrorInfo error_info = |
| + SSLErrorInfo::CreateError( |
| + SSLErrorInfo::NetErrorToErrorType(cert_error_), |
| + ssl_info_.cert.get(), |
| + request_url_); |
| + |
| + resource_id = IDR_SSL_ROAD_BLOCK_HTML; |
| + strings.SetString("headLine", error_info.title()); |
| + strings.SetString("description", error_info.details()); |
| + strings.SetString("moreInfoTitle", |
| + l10n_util::GetStringUTF16(IDS_CERT_ERROR_EXTRA_INFO_TITLE)); |
| + SetExtraInfo(&strings, error_info.extra_information()); |
| + |
| + strings.SetString( |
| + "exit", l10n_util::GetStringUTF16(IDS_SSL_OVERRIDABLE_PAGE_EXIT)); |
| + strings.SetString( |
| + "title", l10n_util::GetStringUTF16(IDS_SSL_OVERRIDABLE_PAGE_TITLE)); |
| + strings.SetString( |
| + "proceed", l10n_util::GetStringUTF16(IDS_SSL_OVERRIDABLE_PAGE_PROCEED)); |
| + strings.SetString( |
| + "reasonForNotProceeding", l10n_util::GetStringUTF16( |
| + IDS_SSL_OVERRIDABLE_PAGE_SHOULD_NOT_PROCEED)); |
| strings.SetString("errorType", "overridable"); |
| + strings.SetString("textdirection", base::i18n::IsRTL() ? "rtl" : "ltr"); |
| } else { |
| - strings.SetString("title", |
| - l10n_util::GetStringUTF16(IDS_SSL_ERROR_PAGE_TITLE)); |
| - if (strict_enforcement_) { |
| - strings.SetString("reasonForNotProceeding", |
| - l10n_util::GetStringUTF16( |
| - IDS_SSL_ERROR_PAGE_CANNOT_PROCEED)); |
| + // Let's build the blocking error page. |
| + resource_id = IDR_SSL_BLOCKING_HTML; |
| + |
| + // Strings that are not dependent on the URL. |
| + strings.SetString( |
| + "title", l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_TITLE)); |
| + strings.SetString( |
| + "reloadMsg", l10n_util::GetStringUTF16(IDS_ERRORPAGES_BUTTON_RELOAD)); |
| + strings.SetString( |
| + "more", l10n_util::GetStringUTF16(IDS_ERRORPAGES_BUTTON_MORE)); |
| + strings.SetString( |
| + "less", l10n_util::GetStringUTF16(IDS_ERRORPAGES_BUTTON_LESS)); |
| + strings.SetString( |
| + "moreTitle", |
| + l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_MORE_TITLE)); |
| + strings.SetString( |
| + "techTitle", |
| + l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_TECH_TITLE)); |
| + |
| + // Strings that are dependent on the URL. |
| + string16 url(ASCIIToUTF16(request_url_.host())); |
| + bool rtl = base::i18n::IsRTL(); |
| + strings.SetString("textDirection", rtl ? "rtl" : "ltr"); |
| + if (rtl) |
| + base::i18n::WrapStringWithLTRFormatting(&url); |
| + strings.SetString( |
| + "headline", l10n_util::GetStringFUTF16(IDS_SSL_BLOCKING_PAGE_HEADLINE, |
| + url.c_str())); |
| + strings.SetString( |
| + "message", l10n_util::GetStringFUTF16(IDS_SSL_BLOCKING_PAGE_BODY_TEXT, |
| + url.c_str())); |
| + LOG(INFO) << l10n_util::GetStringFUTF16(IDS_SSL_BLOCKING_PAGE_BODY_TEXT, |
|
Patrick Dubroy
2013/09/18 15:01:35
Don't think you need this.
felt
2013/10/18 05:53:12
Done.
|
| + url.c_str()); |
| + strings.SetString( |
| + "moreMessage", |
| + l10n_util::GetStringFUTF16(IDS_SSL_BLOCKING_PAGE_MORE_TEXT, |
| + url.c_str())); |
| + strings.SetString("reloadUrl", request_url_.spec()); |
| + |
| + // Strings that are dependent on the error type. |
| + SSLErrorInfo::ErrorType type = |
| + SSLErrorInfo::NetErrorToErrorType(cert_error_); |
| + string16 errorType; |
| + if (type == SSLErrorInfo::CERT_REVOKED) { |
| + errorType = string16(ASCIIToUTF16("Key revocation")); |
| + strings.SetString( |
| + "failure", |
| + l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_REVOKED)); |
| + } else if (type == SSLErrorInfo::CERT_INVALID) { |
| + errorType = string16(ASCIIToUTF16("Malformed certificate")); |
| + strings.SetString( |
| + "failure", |
| + l10n_util::GetStringUTF16(IDS_SSL_BLOCKING_PAGE_FORMATTED)); |
| + } else if (type == SSLErrorInfo::CERT_PINNING_KEY_MISSING) { |
| + errorType = string16(ASCIIToUTF16("Certificate pinning failure")); |
| + strings.SetString( |
| + "failure", |
| + l10n_util::GetStringFUTF16(IDS_SSL_BLOCKING_PAGE_PINNING, |
| + url.c_str())); |
| + } else if (type == SSLErrorInfo::CERT_WEAK_KEY_DH) { |
| + errorType = string16(ASCIIToUTF16("Weak DH public key")); |
| + strings.SetString( |
| + "failure", |
| + l10n_util::GetStringFUTF16(IDS_SSL_BLOCKING_PAGE_WEAK_DH, |
| + url.c_str())); |
| } else { |
| - strings.SetString("reasonForNotProceeding", std::string()); |
| + // HSTS failure. |
| + errorType = string16(ASCIIToUTF16("HSTS failure")); |
| + strings.SetString( |
| + "failure", |
| + l10n_util::GetStringFUTF16(IDS_SSL_BLOCKING_PAGE_HSTS, url.c_str())); |
| + } |
| + if (rtl) |
| + base::i18n::WrapStringWithLTRFormatting(&errorType); |
| + strings.SetString( |
| + "errorType", l10n_util::GetStringFUTF16(IDS_SSL_BLOCKING_PAGE_ERROR, |
| + errorType.c_str())); |
| + |
| + // Strings that display the invalid cert. |
| + string16 subject(ASCIIToUTF16(ssl_info_.cert->subject().GetDisplayName())); |
| + string16 issuer(ASCIIToUTF16(ssl_info_.cert->issuer().GetDisplayName())); |
| + std::string hashes; |
| + for (std::vector<net::HashValue>::iterator it = |
| + ssl_info_.public_key_hashes.begin(); |
| + it != ssl_info_.public_key_hashes.end(); |
| + ++it) { |
| + base::StringAppendF(&hashes, "%s ", it->ToString().c_str()); |
| } |
| - strings.SetString("errorType", "notoverridable"); |
| + string16 fingerprint(ASCIIToUTF16(hashes)); |
| + if (rtl) { |
| + // These are always going to be LTR. |
| + base::i18n::WrapStringWithLTRFormatting(&subject); |
| + base::i18n::WrapStringWithLTRFormatting(&issuer); |
| + base::i18n::WrapStringWithLTRFormatting(&fingerprint); |
| + } |
| + strings.SetString( |
| + "subject", l10n_util::GetStringFUTF16(IDS_SSL_BLOCKING_PAGE_SUBJECT, |
| + subject.c_str())); |
| + strings.SetString( |
| + "issuer", l10n_util::GetStringFUTF16(IDS_SSL_BLOCKING_PAGE_ISSUER, |
| + issuer.c_str())); |
| + strings.SetString( |
| + "fingerprint", |
| + l10n_util::GetStringFUTF16(IDS_SSL_BLOCKING_PAGE_HASHES, |
| + fingerprint.c_str())); |
| } |
| - strings.SetString("textdirection", base::i18n::IsRTL() ? "rtl" : "ltr"); |
| - |
| base::StringPiece html( |
| ResourceBundle::GetSharedInstance().GetRawDataResource( |
| resource_id)); |
| - |
| return webui::GetI18nTemplateHtml(html, &strings); |
| } |
| @@ -274,6 +372,10 @@ void SSLBlockingPage::CommandReceived(const std::string& command) { |
| display_start_time_ = base::TimeTicks::Now(); |
| } else if (cmd == CMD_MORE) { |
| RecordSSLBlockingPageEventStats(MORE); |
| + } else if (cmd == CMD_RELOAD) { |
| + // The interstitial can't refresh itself. |
| + content::NavigationController* controller = &web_contents_->GetController(); |
| + controller->Reload(true); |
| } |
| } |