diff options
Diffstat (limited to 'chrome/browser/ssl')
-rw-r--r-- | chrome/browser/ssl/ssl_blocking_page.cc | 31 | ||||
-rw-r--r-- | chrome/browser/ssl/ssl_blocking_page.h | 6 | ||||
-rw-r--r-- | chrome/browser/ssl/ssl_policy.cc | 64 | ||||
-rw-r--r-- | chrome/browser/ssl/ssl_policy.h | 18 |
4 files changed, 37 insertions, 82 deletions
diff --git a/chrome/browser/ssl/ssl_blocking_page.cc b/chrome/browser/ssl/ssl_blocking_page.cc index 904c083..aa3df31 100644 --- a/chrome/browser/ssl/ssl_blocking_page.cc +++ b/chrome/browser/ssl/ssl_blocking_page.cc @@ -45,11 +45,13 @@ void RecordSSLBlockingPageStats(SSLBlockingPageEvent event) { // Note that we always create a navigation entry with SSL errors. // No error happening loading a sub-resource triggers an interstitial so far. SSLBlockingPage::SSLBlockingPage(SSLCertErrorHandler* handler, - Delegate* delegate) + Delegate* delegate, + bool overridable) : InterstitialPage(handler->GetTabContents(), true, handler->request_url()), handler_(handler), delegate_(delegate), - delegate_has_been_notified_(false) { + delegate_has_been_notified_(false), + overridable_(overridable) { RecordSSLBlockingPageStats(SHOW); } @@ -65,8 +67,6 @@ std::string SSLBlockingPage::GetHTMLContents() { // Let's build the html error page. DictionaryValue strings; SSLErrorInfo error_info = delegate_->GetSSLErrorInfo(handler_); - strings.SetString(L"title", - l10n_util::GetString(IDS_SSL_BLOCKING_PAGE_TITLE)); strings.SetString(L"headLine", error_info.title()); strings.SetString(L"description", error_info.details()); @@ -74,16 +74,25 @@ std::string SSLBlockingPage::GetHTMLContents() { l10n_util::GetString(IDS_CERT_ERROR_EXTRA_INFO_TITLE)); SetExtraInfo(&strings, error_info.extra_information()); - strings.SetString(L"proceed", - l10n_util::GetString(IDS_SSL_BLOCKING_PAGE_PROCEED)); - strings.SetString(L"exit", - l10n_util::GetString(IDS_SSL_BLOCKING_PAGE_EXIT)); + int resource_id; + if (overridable_) { + resource_id = IDR_SSL_ROAD_BLOCK_HTML; + strings.SetString(L"title", + l10n_util::GetString(IDS_SSL_BLOCKING_PAGE_TITLE)); + strings.SetString(L"proceed", + l10n_util::GetString(IDS_SSL_BLOCKING_PAGE_PROCEED)); + strings.SetString(L"exit", + l10n_util::GetString(IDS_SSL_BLOCKING_PAGE_EXIT)); + } else { + resource_id = IDR_SSL_ERROR_HTML; + strings.SetString(L"title", l10n_util::GetString(IDS_SSL_ERROR_PAGE_TITLE)); + strings.SetString(L"back", l10n_util::GetString(IDS_SSL_ERROR_PAGE_BACK)); + } strings.SetString(L"textdirection", base::i18n::IsRTL() ? L"rtl" : L"ltr"); - static const base::StringPiece html( - ResourceBundle::GetSharedInstance().GetRawDataResource( - IDR_SSL_ROAD_BLOCK_HTML)); + base::StringPiece html( + ResourceBundle::GetSharedInstance().GetRawDataResource(resource_id)); return jstemplate_builder::GetI18nTemplateHtml(html, &strings); } diff --git a/chrome/browser/ssl/ssl_blocking_page.h b/chrome/browser/ssl/ssl_blocking_page.h index 8ef9b28..dd282ad 100644 --- a/chrome/browser/ssl/ssl_blocking_page.h +++ b/chrome/browser/ssl/ssl_blocking_page.h @@ -33,7 +33,8 @@ class SSLBlockingPage : public InterstitialPage { virtual void OnAllowCertificate(SSLCertErrorHandler* handler) = 0; }; - SSLBlockingPage(SSLCertErrorHandler* handler, Delegate* delegate); + SSLBlockingPage(SSLCertErrorHandler* handler, Delegate* delegate, + bool overridable); virtual ~SSLBlockingPage(); // A method that sets strings in the specified dictionary from the passed @@ -66,6 +67,9 @@ class SSLBlockingPage : public InterstitialPage { // A flag to indicate if we've notified |delegate_| of the user's decision. bool delegate_has_been_notified_; + // Can the user override the certificate error? + bool overridable_; + DISALLOW_COPY_AND_ASSIGN(SSLBlockingPage); }; diff --git a/chrome/browser/ssl/ssl_policy.cc b/chrome/browser/ssl/ssl_policy.cc index 5f15772..7f3ad87 100644 --- a/chrome/browser/ssl/ssl_policy.cc +++ b/chrome/browser/ssl/ssl_policy.cc @@ -60,7 +60,7 @@ void SSLPolicy::OnCertError(SSLCertErrorHandler* handler) { case net::ERR_CERT_DATE_INVALID: case net::ERR_CERT_AUTHORITY_INVALID: case net::ERR_CERT_WEAK_SIGNATURE_ALGORITHM: - OnOverridableCertError(handler); + OnCertErrorInternal(handler, true); break; case net::ERR_CERT_NO_REVOCATION_MECHANISM: // Ignore this error. @@ -74,7 +74,7 @@ void SSLPolicy::OnCertError(SSLCertErrorHandler* handler) { case net::ERR_CERT_CONTAINS_ERRORS: case net::ERR_CERT_REVOKED: case net::ERR_CERT_INVALID: - OnFatalCertError(handler); + OnCertErrorInternal(handler, false); break; default: NOTREACHED(); @@ -184,7 +184,8 @@ void SSLPolicy::OnAllowCertificate(SSLCertErrorHandler* handler) { //////////////////////////////////////////////////////////////////////////////// // Certificate Error Routines -void SSLPolicy::OnOverridableCertError(SSLCertErrorHandler* handler) { +void SSLPolicy::OnCertErrorInternal(SSLCertErrorHandler* handler, + bool overridable) { if (handler->resource_type() != ResourceType::MAIN_FRAME) { // A sub-resource has a certificate error. The user doesn't really // have a context for making the right decision, so block the @@ -193,64 +194,11 @@ void SSLPolicy::OnOverridableCertError(SSLCertErrorHandler* handler) { handler->DenyRequest(); return; } - // We need to ask the user to approve this certificate. - SSLBlockingPage* blocking_page = new SSLBlockingPage(handler, this); + SSLBlockingPage* blocking_page = new SSLBlockingPage(handler, this, + overridable); blocking_page->Show(); } -void SSLPolicy::OnFatalCertError(SSLCertErrorHandler* handler) { - if (handler->resource_type() != ResourceType::MAIN_FRAME) { - handler->DenyRequest(); - return; - } - handler->CancelRequest(); - ShowErrorPage(handler); - // No need to degrade our security indicators because we didn't continue. -} - -void SSLPolicy::ShowErrorPage(SSLCertErrorHandler* handler) { - SSLErrorInfo error_info = GetSSLErrorInfo(handler); - - // Let's build the html error page. - DictionaryValue strings; - strings.SetString(L"title", l10n_util::GetString(IDS_SSL_ERROR_PAGE_TITLE)); - strings.SetString(L"headLine", error_info.title()); - strings.SetString(L"description", error_info.details()); - strings.SetString(L"moreInfoTitle", - l10n_util::GetString(IDS_CERT_ERROR_EXTRA_INFO_TITLE)); - SSLBlockingPage::SetExtraInfo(&strings, error_info.extra_information()); - - strings.SetString(L"back", l10n_util::GetString(IDS_SSL_ERROR_PAGE_BACK)); - - strings.SetString(L"textdirection", base::i18n::IsRTL() ? L"rtl" : L"ltr"); - - static const base::StringPiece html( - ResourceBundle::GetSharedInstance().GetRawDataResource( - IDR_SSL_ERROR_HTML)); - - std::string html_text(jstemplate_builder::GetI18nTemplateHtml(html, - &strings)); - - TabContents* tab = handler->GetTabContents(); - int cert_id = CertStore::GetSharedInstance()->StoreCert( - handler->ssl_info().cert, - tab->render_view_host()->process()->id()); - std::string security_info = - SSLManager::SerializeSecurityInfo(cert_id, - handler->ssl_info().cert_status, - handler->ssl_info().security_bits); - tab->render_view_host()->LoadAlternateHTMLString(html_text, - true, - handler->request_url(), - security_info); - - // TODO(jcampan): we may want to set the navigation entry type to - // PageType::ERROR_PAGE. The navigation entry is not available at this point, - // it is created when the renderer receives a DidNavigate (triggered by the - // LoadAlternateHTMLString above). We'd probably need to pass the page type - // along with the security_info. -} - void SSLPolicy::InitializeEntryIfNeeded(NavigationEntry* entry) { if (entry->ssl().security_style() != SECURITY_STYLE_UNKNOWN) return; diff --git a/chrome/browser/ssl/ssl_policy.h b/chrome/browser/ssl/ssl_policy.h index 5a4b822..bd30df5 100644 --- a/chrome/browser/ssl/ssl_policy.h +++ b/chrome/browser/ssl/ssl_policy.h @@ -47,18 +47,12 @@ class SSLPolicy : public SSLBlockingPage::Delegate { virtual void OnAllowCertificate(SSLCertErrorHandler* handler); private: - // Helper method for derived classes handling certificate errors that can be - // overridden by the user. - // Show a blocking page and let the user continue or cancel the request. - void OnOverridableCertError(SSLCertErrorHandler* handler); - - // Helper method for derived classes handling fatal certificate errors. - // Cancel the request and show an error page. - void OnFatalCertError(SSLCertErrorHandler* handler); - - // Show an error page for this certificate error. This error page does not - // give the user the opportunity to ingore the error. - void ShowErrorPage(SSLCertErrorHandler* handler); + // Helper method for derived classes handling certificate errors. + // If the error can be overridden by the user, pass overriable=true, which + // shows a blocking page and lets the user continue or cancel the request. + // For fatal certificate errors, pass overridable=false, which show an error + // page. + void OnCertErrorInternal(SSLCertErrorHandler* handler, bool overridable); // If the security style of |entry| has not been initialized, then initialize // it with the default style for its URL. |