Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(352)

Side by Side Diff: chrome/browser/ui/website_settings/website_settings.cc

Issue 1314953009: Refactor WebsiteSettings to operate on a SecurityInfo (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/website_settings/website_settings.h" 5 #include "chrome/browser/ui/website_settings/website_settings.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 28 matching lines...) Expand all
39 #include "components/content_settings/core/browser/local_shared_objects_counter. h" 39 #include "components/content_settings/core/browser/local_shared_objects_counter. h"
40 #include "components/content_settings/core/common/content_settings.h" 40 #include "components/content_settings/core/common/content_settings.h"
41 #include "components/content_settings/core/common/content_settings_pattern.h" 41 #include "components/content_settings/core/common/content_settings_pattern.h"
42 #include "components/rappor/rappor_utils.h" 42 #include "components/rappor/rappor_utils.h"
43 #include "components/ssl_errors/error_info.h" 43 #include "components/ssl_errors/error_info.h"
44 #include "components/url_formatter/elide_url.h" 44 #include "components/url_formatter/elide_url.h"
45 #include "content/public/browser/browser_thread.h" 45 #include "content/public/browser/browser_thread.h"
46 #include "content/public/browser/cert_store.h" 46 #include "content/public/browser/cert_store.h"
47 #include "content/public/browser/user_metrics.h" 47 #include "content/public/browser/user_metrics.h"
48 #include "content/public/common/content_switches.h" 48 #include "content/public/common/content_switches.h"
49 #include "content/public/common/ssl_status.h"
50 #include "content/public/common/url_constants.h" 49 #include "content/public/common/url_constants.h"
51 #include "net/cert/cert_status_flags.h" 50 #include "net/cert/cert_status_flags.h"
52 #include "net/cert/x509_certificate.h" 51 #include "net/cert/x509_certificate.h"
53 #include "net/ssl/ssl_cipher_suite_names.h" 52 #include "net/ssl/ssl_cipher_suite_names.h"
54 #include "net/ssl/ssl_connection_status_flags.h" 53 #include "net/ssl/ssl_connection_status_flags.h"
55 #include "ui/base/l10n/l10n_util.h" 54 #include "ui/base/l10n/l10n_util.h"
56 55
57 #if defined(OS_CHROMEOS) 56 #if defined(OS_CHROMEOS)
58 #include "chrome/browser/chromeos/policy/policy_cert_service.h" 57 #include "chrome/browser/chromeos/policy/policy_cert_service.h"
59 #include "chrome/browser/chromeos/policy/policy_cert_service_factory.h" 58 #include "chrome/browser/chromeos/policy/policy_cert_service_factory.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS, 91 CONTENT_SETTINGS_TYPE_AUTOMATIC_DOWNLOADS,
93 CONTENT_SETTINGS_TYPE_PLUGINS, 92 CONTENT_SETTINGS_TYPE_PLUGINS,
94 CONTENT_SETTINGS_TYPE_MOUSELOCK, 93 CONTENT_SETTINGS_TYPE_MOUSELOCK,
95 CONTENT_SETTINGS_TYPE_MIDI_SYSEX, 94 CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
96 #if defined(OS_ANDROID) 95 #if defined(OS_ANDROID)
97 CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, 96 CONTENT_SETTINGS_TYPE_PUSH_MESSAGING,
98 #endif 97 #endif
99 }; 98 };
100 99
101 bool CertificateTransparencyStatusMatch( 100 bool CertificateTransparencyStatusMatch(
102 const content::SignedCertificateTimestampIDStatusList& scts, 101 const std::vector<net::ct::SCTVerifyStatus>& sct_verify_statuses,
103 net::ct::SCTVerifyStatus status) { 102 net::ct::SCTVerifyStatus status) {
104 for (content::SignedCertificateTimestampIDStatusList::const_iterator it = 103 for (const auto& verify_status : sct_verify_statuses) {
105 scts.begin(); 104 if (verify_status == status)
106 it != scts.end();
107 ++it) {
108 if (it->status == status)
109 return true; 105 return true;
110 } 106 }
111
112 return false; 107 return false;
113 } 108 }
114 109
115 int GetSiteIdentityDetailsMessageByCTInfo( 110 int GetSiteIdentityDetailsMessageByCTInfo(
116 const content::SignedCertificateTimestampIDStatusList& scts, 111 const std::vector<net::ct::SCTVerifyStatus>& sct_verify_statuses,
117 bool is_ev) { 112 bool is_ev) {
118 // No SCTs - no CT information. 113 // No SCTs - no CT information.
119 if (scts.empty()) 114 if (sct_verify_statuses.empty())
120 return (is_ev ? IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV_NO_CT 115 return (is_ev ? IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV_NO_CT
121 : IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_NO_CT); 116 : IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_NO_CT);
122 117
123 if (CertificateTransparencyStatusMatch(scts, net::ct::SCT_STATUS_OK)) 118 if (CertificateTransparencyStatusMatch(sct_verify_statuses,
119 net::ct::SCT_STATUS_OK))
124 return (is_ev ? IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV_CT_VERIFIED 120 return (is_ev ? IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV_CT_VERIFIED
125 : IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_CT_VERIFIED); 121 : IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_CT_VERIFIED);
126 122
127 if (CertificateTransparencyStatusMatch(scts, net::ct::SCT_STATUS_INVALID)) 123 if (CertificateTransparencyStatusMatch(sct_verify_statuses,
124 net::ct::SCT_STATUS_INVALID))
128 return (is_ev ? IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV_CT_INVALID 125 return (is_ev ? IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV_CT_INVALID
129 : IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_CT_INVALID); 126 : IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_CT_INVALID);
130 127
131 // status is SCT_STATUS_LOG_UNKNOWN 128 // status is SCT_STATUS_LOG_UNKNOWN
132 return (is_ev ? IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV_CT_UNVERIFIED 129 return (is_ev ? IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV_CT_UNVERIFIED
133 : IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_CT_UNVERIFIED); 130 : IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_CT_UNVERIFIED);
134 } 131 }
135 132
136 // This function will return SITE_IDENTITY_STATUS_CERT or 133 // This function will return SITE_IDENTITY_STATUS_CERT or
137 // SITE_IDENTITY_STATUS_EV_CERT depending on |is_ev| unless there are SCTs 134 // SITE_IDENTITY_STATUS_EV_CERT depending on |is_ev| unless there are SCTs
138 // which failed verification, in which case it will return 135 // which failed verification, in which case it will return
139 // SITE_IDENTITY_STATUS_ERROR. 136 // SITE_IDENTITY_STATUS_ERROR.
140 WebsiteSettings::SiteIdentityStatus GetSiteIdentityStatusByCTInfo( 137 WebsiteSettings::SiteIdentityStatus GetSiteIdentityStatusByCTInfo(
141 const content::SignedCertificateTimestampIDStatusList& scts, 138 const std::vector<net::ct::SCTVerifyStatus>& sct_verify_statuses,
142 bool is_ev) { 139 bool is_ev) {
143 if (CertificateTransparencyStatusMatch(scts, net::ct::SCT_STATUS_INVALID)) 140 if (CertificateTransparencyStatusMatch(sct_verify_statuses,
141 net::ct::SCT_STATUS_INVALID))
144 return WebsiteSettings::SITE_IDENTITY_STATUS_ERROR; 142 return WebsiteSettings::SITE_IDENTITY_STATUS_ERROR;
145 143
146 return is_ev ? WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT 144 return is_ev ? WebsiteSettings::SITE_IDENTITY_STATUS_EV_CERT
147 : WebsiteSettings::SITE_IDENTITY_STATUS_CERT; 145 : WebsiteSettings::SITE_IDENTITY_STATUS_CERT;
148 } 146 }
149 147
150 base::string16 GetSimpleSiteName(const GURL& url, Profile* profile) { 148 base::string16 GetSimpleSiteName(const GURL& url, Profile* profile) {
151 std::string languages; 149 std::string languages;
152 if (profile) 150 if (profile)
153 languages = profile->GetPrefs()->GetString(prefs::kAcceptLanguages); 151 languages = profile->GetPrefs()->GetString(prefs::kAcceptLanguages);
154 return url_formatter::FormatUrlForSecurityDisplayOmitScheme(url, languages); 152 return url_formatter::FormatUrlForSecurityDisplayOmitScheme(url, languages);
155 } 153 }
156 154
157 } // namespace 155 } // namespace
158 156
159 WebsiteSettings::WebsiteSettings( 157 WebsiteSettings::WebsiteSettings(
160 WebsiteSettingsUI* ui, 158 WebsiteSettingsUI* ui,
161 Profile* profile, 159 Profile* profile,
162 TabSpecificContentSettings* tab_specific_content_settings, 160 TabSpecificContentSettings* tab_specific_content_settings,
163 content::WebContents* web_contents, 161 content::WebContents* web_contents,
164 const GURL& url, 162 const GURL& url,
165 const content::SSLStatus& ssl, 163 const SecurityStateModel::SecurityInfo& security_info,
166 content::CertStore* cert_store) 164 content::CertStore* cert_store)
167 : TabSpecificContentSettings::SiteDataObserver( 165 : TabSpecificContentSettings::SiteDataObserver(
168 tab_specific_content_settings), 166 tab_specific_content_settings),
169 ui_(ui), 167 ui_(ui),
170 web_contents_(web_contents), 168 web_contents_(web_contents),
171 show_info_bar_(false), 169 show_info_bar_(false),
172 site_url_(url), 170 site_url_(url),
173 site_identity_status_(SITE_IDENTITY_STATUS_UNKNOWN), 171 site_identity_status_(SITE_IDENTITY_STATUS_UNKNOWN),
174 cert_id_(0), 172 cert_id_(0),
175 site_connection_status_(SITE_CONNECTION_STATUS_UNKNOWN), 173 site_connection_status_(SITE_CONNECTION_STATUS_UNKNOWN),
176 cert_store_(cert_store), 174 cert_store_(cert_store),
177 content_settings_(HostContentSettingsMapFactory::GetForProfile(profile)), 175 content_settings_(HostContentSettingsMapFactory::GetForProfile(profile)),
178 chrome_ssl_host_state_delegate_( 176 chrome_ssl_host_state_delegate_(
179 ChromeSSLHostStateDelegateFactory::GetForProfile(profile)), 177 ChromeSSLHostStateDelegateFactory::GetForProfile(profile)),
180 did_revoke_user_ssl_decisions_(false), 178 did_revoke_user_ssl_decisions_(false),
181 profile_(profile) { 179 profile_(profile) {
182 Init(url, ssl); 180 Init(url, security_info);
183 181
184 PresentSitePermissions(); 182 PresentSitePermissions();
185 PresentSiteData(); 183 PresentSiteData();
186 PresentSiteIdentity(); 184 PresentSiteIdentity();
187 185
188 // Every time the Website Settings UI is opened a |WebsiteSettings| object is 186 // Every time the Website Settings UI is opened a |WebsiteSettings| object is
189 // created. So this counts how ofter the Website Settings UI is opened. 187 // created. So this counts how ofter the Website Settings UI is opened.
190 RecordWebsiteSettingsAction(WEBSITE_SETTINGS_OPENED); 188 RecordWebsiteSettingsAction(WEBSITE_SETTINGS_OPENED);
191 } 189 }
192 190
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 #endif 347 #endif
350 } 348 }
351 349
352 void WebsiteSettings::OnRevokeSSLErrorBypassButtonPressed() { 350 void WebsiteSettings::OnRevokeSSLErrorBypassButtonPressed() {
353 DCHECK(chrome_ssl_host_state_delegate_); 351 DCHECK(chrome_ssl_host_state_delegate_);
354 chrome_ssl_host_state_delegate_->RevokeUserAllowExceptionsHard( 352 chrome_ssl_host_state_delegate_->RevokeUserAllowExceptionsHard(
355 site_url().host()); 353 site_url().host());
356 did_revoke_user_ssl_decisions_ = true; 354 did_revoke_user_ssl_decisions_ = true;
357 } 355 }
358 356
359 void WebsiteSettings::Init(const GURL& url, const content::SSLStatus& ssl) { 357 void WebsiteSettings::Init(
358 const GURL& url,
359 const SecurityStateModel::SecurityInfo& security_info) {
360 bool isChromeUINativeScheme = false; 360 bool isChromeUINativeScheme = false;
361 #if defined(OS_ANDROID) 361 #if defined(OS_ANDROID)
362 isChromeUINativeScheme = url.SchemeIs(chrome::kChromeUINativeScheme); 362 isChromeUINativeScheme = url.SchemeIs(chrome::kChromeUINativeScheme);
363 #endif 363 #endif
364 364
365 if (url.SchemeIs(content::kChromeUIScheme) || 365 if (url.SchemeIs(content::kChromeUIScheme) ||
366 url.SchemeIs(url::kAboutScheme) || isChromeUINativeScheme) { 366 url.SchemeIs(url::kAboutScheme) || isChromeUINativeScheme) {
367 site_identity_status_ = SITE_IDENTITY_STATUS_INTERNAL_PAGE; 367 site_identity_status_ = SITE_IDENTITY_STATUS_INTERNAL_PAGE;
368 site_identity_details_ = 368 site_identity_details_ =
369 l10n_util::GetStringUTF16(IDS_PAGE_INFO_INTERNAL_PAGE); 369 l10n_util::GetStringUTF16(IDS_PAGE_INFO_INTERNAL_PAGE);
370 site_connection_status_ = SITE_CONNECTION_STATUS_INTERNAL_PAGE; 370 site_connection_status_ = SITE_CONNECTION_STATUS_INTERNAL_PAGE;
371 return; 371 return;
372 } 372 }
373 373
374 // Identity section. 374 // Identity section.
375 scoped_refptr<net::X509Certificate> cert; 375 scoped_refptr<net::X509Certificate> cert;
376 cert_id_ = ssl.cert_id; 376 cert_id_ = security_info.cert_id;
377 377
378 if (ssl.cert_id && 378 // HTTPS with no or minor errors.
379 cert_store_->RetrieveCert(ssl.cert_id, &cert) && 379 if (security_info.cert_id &&
380 (!net::IsCertStatusError(ssl.cert_status) || 380 cert_store_->RetrieveCert(security_info.cert_id, &cert) &&
381 net::IsCertStatusMinorError(ssl.cert_status))) { 381 (!net::IsCertStatusError(security_info.cert_status) ||
382 net::IsCertStatusMinorError(security_info.cert_status))) {
382 // There are no major errors. Check for minor errors. 383 // There are no major errors. Check for minor errors.
383 #if defined(OS_CHROMEOS) 384 if (security_info.security_level ==
384 policy::PolicyCertService* service = 385 SecurityStateModel::SECURITY_POLICY_WARNING) {
385 policy::PolicyCertServiceFactory::GetForProfile(profile_);
386 const bool used_policy_certs = service && service->UsedPolicyCertificates();
387 #else
388 const bool used_policy_certs = false;
389 #endif
390 if (used_policy_certs) {
391 site_identity_status_ = SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT; 386 site_identity_status_ = SITE_IDENTITY_STATUS_ADMIN_PROVIDED_CERT;
392 site_identity_details_ = l10n_util::GetStringFUTF16( 387 site_identity_details_ = l10n_util::GetStringFUTF16(
393 IDS_CERT_POLICY_PROVIDED_CERT_MESSAGE, UTF8ToUTF16(url.host())); 388 IDS_CERT_POLICY_PROVIDED_CERT_MESSAGE, UTF8ToUTF16(url.host()));
394 } else if (net::IsCertStatusMinorError(ssl.cert_status)) { 389 } else if (net::IsCertStatusMinorError(security_info.cert_status)) {
395 site_identity_status_ = SITE_IDENTITY_STATUS_CERT_REVOCATION_UNKNOWN; 390 site_identity_status_ = SITE_IDENTITY_STATUS_CERT_REVOCATION_UNKNOWN;
396 base::string16 issuer_name(UTF8ToUTF16(cert->issuer().GetDisplayName())); 391 base::string16 issuer_name(UTF8ToUTF16(cert->issuer().GetDisplayName()));
397 if (issuer_name.empty()) { 392 if (issuer_name.empty()) {
398 issuer_name.assign(l10n_util::GetStringUTF16( 393 issuer_name.assign(l10n_util::GetStringUTF16(
399 IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 394 IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY));
400 } 395 }
401 396
402 site_identity_details_.assign(l10n_util::GetStringFUTF16( 397 site_identity_details_.assign(l10n_util::GetStringFUTF16(
403 GetSiteIdentityDetailsMessageByCTInfo( 398 GetSiteIdentityDetailsMessageByCTInfo(
404 ssl.signed_certificate_timestamp_ids, false /* not EV */), 399 security_info.sct_verify_statuses, false /* not EV */),
405 issuer_name)); 400 issuer_name));
406 401
407 site_identity_details_ += ASCIIToUTF16("\n\n"); 402 site_identity_details_ += ASCIIToUTF16("\n\n");
408 if (ssl.cert_status & net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION) { 403 if (security_info.cert_status &
404 net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION) {
409 site_identity_details_ += l10n_util::GetStringUTF16( 405 site_identity_details_ += l10n_util::GetStringUTF16(
410 IDS_PAGE_INFO_SECURITY_TAB_UNABLE_TO_CHECK_REVOCATION); 406 IDS_PAGE_INFO_SECURITY_TAB_UNABLE_TO_CHECK_REVOCATION);
411 } else if (ssl.cert_status & net::CERT_STATUS_NO_REVOCATION_MECHANISM) { 407 } else if (security_info.cert_status &
408 net::CERT_STATUS_NO_REVOCATION_MECHANISM) {
412 site_identity_details_ += l10n_util::GetStringUTF16( 409 site_identity_details_ += l10n_util::GetStringUTF16(
413 IDS_PAGE_INFO_SECURITY_TAB_NO_REVOCATION_MECHANISM); 410 IDS_PAGE_INFO_SECURITY_TAB_NO_REVOCATION_MECHANISM);
414 } else { 411 } else {
415 NOTREACHED() << "Need to specify string for this warning"; 412 NOTREACHED() << "Need to specify string for this warning";
416 } 413 }
417 } else { 414 } else {
418 if (ssl.cert_status & net::CERT_STATUS_IS_EV) { 415 if (security_info.cert_status & net::CERT_STATUS_IS_EV) {
419 // EV HTTPS page. 416 // EV HTTPS page.
420 site_identity_status_ = GetSiteIdentityStatusByCTInfo( 417 site_identity_status_ = GetSiteIdentityStatusByCTInfo(
421 ssl.signed_certificate_timestamp_ids, true); 418 security_info.sct_verify_statuses, true);
422 DCHECK(!cert->subject().organization_names.empty()); 419 DCHECK(!cert->subject().organization_names.empty());
423 organization_name_ = UTF8ToUTF16(cert->subject().organization_names[0]); 420 organization_name_ = UTF8ToUTF16(cert->subject().organization_names[0]);
424 // An EV Cert is required to have a city (localityName) and country but 421 // An EV Cert is required to have a city (localityName) and country but
425 // state is "if any". 422 // state is "if any".
426 DCHECK(!cert->subject().locality_name.empty()); 423 DCHECK(!cert->subject().locality_name.empty());
427 DCHECK(!cert->subject().country_name.empty()); 424 DCHECK(!cert->subject().country_name.empty());
428 base::string16 locality; 425 base::string16 locality;
429 if (!cert->subject().state_or_province_name.empty()) { 426 if (!cert->subject().state_or_province_name.empty()) {
430 locality = l10n_util::GetStringFUTF16( 427 locality = l10n_util::GetStringFUTF16(
431 IDS_PAGEINFO_ADDRESS, 428 IDS_PAGEINFO_ADDRESS,
432 UTF8ToUTF16(cert->subject().locality_name), 429 UTF8ToUTF16(cert->subject().locality_name),
433 UTF8ToUTF16(cert->subject().state_or_province_name), 430 UTF8ToUTF16(cert->subject().state_or_province_name),
434 UTF8ToUTF16(cert->subject().country_name)); 431 UTF8ToUTF16(cert->subject().country_name));
435 } else { 432 } else {
436 locality = l10n_util::GetStringFUTF16( 433 locality = l10n_util::GetStringFUTF16(
437 IDS_PAGEINFO_PARTIAL_ADDRESS, 434 IDS_PAGEINFO_PARTIAL_ADDRESS,
438 UTF8ToUTF16(cert->subject().locality_name), 435 UTF8ToUTF16(cert->subject().locality_name),
439 UTF8ToUTF16(cert->subject().country_name)); 436 UTF8ToUTF16(cert->subject().country_name));
440 } 437 }
441 DCHECK(!cert->subject().organization_names.empty()); 438 DCHECK(!cert->subject().organization_names.empty());
442 site_identity_details_.assign(l10n_util::GetStringFUTF16( 439 site_identity_details_.assign(l10n_util::GetStringFUTF16(
443 GetSiteIdentityDetailsMessageByCTInfo( 440 GetSiteIdentityDetailsMessageByCTInfo(
444 ssl.signed_certificate_timestamp_ids, true /* is EV */), 441 security_info.sct_verify_statuses, true /* is EV */),
445 UTF8ToUTF16(cert->subject().organization_names[0]), 442 UTF8ToUTF16(cert->subject().organization_names[0]), locality,
446 locality,
447 UTF8ToUTF16(cert->issuer().GetDisplayName()))); 443 UTF8ToUTF16(cert->issuer().GetDisplayName())));
448 } else { 444 } else {
449 // Non-EV OK HTTPS page. 445 // Non-EV OK HTTPS page.
450 site_identity_status_ = GetSiteIdentityStatusByCTInfo( 446 site_identity_status_ = GetSiteIdentityStatusByCTInfo(
451 ssl.signed_certificate_timestamp_ids, false); 447 security_info.sct_verify_statuses, false);
452 base::string16 issuer_name( 448 base::string16 issuer_name(
453 UTF8ToUTF16(cert->issuer().GetDisplayName())); 449 UTF8ToUTF16(cert->issuer().GetDisplayName()));
454 if (issuer_name.empty()) { 450 if (issuer_name.empty()) {
455 issuer_name.assign(l10n_util::GetStringUTF16( 451 issuer_name.assign(l10n_util::GetStringUTF16(
456 IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 452 IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY));
457 } 453 }
458 454
459 site_identity_details_.assign(l10n_util::GetStringFUTF16( 455 site_identity_details_.assign(l10n_util::GetStringFUTF16(
460 GetSiteIdentityDetailsMessageByCTInfo( 456 GetSiteIdentityDetailsMessageByCTInfo(
461 ssl.signed_certificate_timestamp_ids, false /* not EV */), 457 security_info.sct_verify_statuses, false /* not EV */),
462 issuer_name)); 458 issuer_name));
463 } 459 }
464 // The date after which no new SHA-1 certificates may be issued. 460 if (security_info.sha1_deprecation_status !=
sky 2015/09/18 15:53:00 I know nothing about this code, other than to say
465 // 2016-01-01 00:00:00 UTC 461 SecurityStateModel::NO_DEPRECATED_SHA1) {
466 static const int64_t kSHA1LastIssuanceDate = INT64_C(13096080000000000);
467 if ((ssl.cert_status & net::CERT_STATUS_SHA1_SIGNATURE_PRESENT) &&
468 cert->valid_expiry() >
469 base::Time::FromInternalValue(kSHA1LastIssuanceDate)) {
470 site_identity_status_ = 462 site_identity_status_ =
471 SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM; 463 SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM;
472 site_identity_details_ += 464 site_identity_details_ +=
473 UTF8ToUTF16("\n\n") + 465 UTF8ToUTF16("\n\n") +
474 l10n_util::GetStringUTF16( 466 l10n_util::GetStringUTF16(
475 IDS_PAGE_INFO_SECURITY_TAB_DEPRECATED_SIGNATURE_ALGORITHM); 467 IDS_PAGE_INFO_SECURITY_TAB_DEPRECATED_SIGNATURE_ALGORITHM);
476 } 468 }
477 } 469 }
478 } else { 470 } else {
479 // HTTP or HTTPS with errors (not warnings). 471 // HTTP or HTTPS with errors (not warnings).
480 site_identity_details_.assign(l10n_util::GetStringUTF16( 472 site_identity_details_.assign(l10n_util::GetStringUTF16(
481 IDS_PAGE_INFO_SECURITY_TAB_INSECURE_IDENTITY)); 473 IDS_PAGE_INFO_SECURITY_TAB_INSECURE_IDENTITY));
482 if (ssl.security_style == content::SECURITY_STYLE_UNAUTHENTICATED) 474 if (!security_info.scheme_is_cryptographic || !security_info.cert_id)
483 site_identity_status_ = SITE_IDENTITY_STATUS_NO_CERT; 475 site_identity_status_ = SITE_IDENTITY_STATUS_NO_CERT;
484 else 476 else
485 site_identity_status_ = SITE_IDENTITY_STATUS_ERROR; 477 site_identity_status_ = SITE_IDENTITY_STATUS_ERROR;
486 478
487 const base::string16 bullet = UTF8ToUTF16("\n • "); 479 const base::string16 bullet = UTF8ToUTF16("\n • ");
488 std::vector<ssl_errors::ErrorInfo> errors; 480 std::vector<ssl_errors::ErrorInfo> errors;
489 ssl_errors::ErrorInfo::GetErrorsForCertStatus(cert, ssl.cert_status, url, 481 ssl_errors::ErrorInfo::GetErrorsForCertStatus(
490 &errors); 482 cert, security_info.cert_status, url, &errors);
491 for (size_t i = 0; i < errors.size(); ++i) { 483 for (size_t i = 0; i < errors.size(); ++i) {
492 site_identity_details_ += bullet; 484 site_identity_details_ += bullet;
493 site_identity_details_ += errors[i].short_description(); 485 site_identity_details_ += errors[i].short_description();
494 } 486 }
495 487
496 if (ssl.cert_status & net::CERT_STATUS_NON_UNIQUE_NAME) { 488 if (security_info.cert_status & net::CERT_STATUS_NON_UNIQUE_NAME) {
497 site_identity_details_ += ASCIIToUTF16("\n\n"); 489 site_identity_details_ += ASCIIToUTF16("\n\n");
498 site_identity_details_ += l10n_util::GetStringUTF16( 490 site_identity_details_ += l10n_util::GetStringUTF16(
499 IDS_PAGE_INFO_SECURITY_TAB_NON_UNIQUE_NAME); 491 IDS_PAGE_INFO_SECURITY_TAB_NON_UNIQUE_NAME);
500 } 492 }
501 } 493 }
502 494
503 // Site Connection 495 // Site Connection
504 // We consider anything less than 80 bits encryption to be weak encryption. 496 // We consider anything less than 80 bits encryption to be weak encryption.
505 // TODO(wtc): Bug 1198735: report mixed/unsafe content for unencrypted and 497 // TODO(wtc): Bug 1198735: report mixed/unsafe content for unencrypted and
506 // weakly encrypted connections. 498 // weakly encrypted connections.
507 site_connection_status_ = SITE_CONNECTION_STATUS_UNKNOWN; 499 site_connection_status_ = SITE_CONNECTION_STATUS_UNKNOWN;
508 500
509 base::string16 subject_name(GetSimpleSiteName(url, profile_)); 501 base::string16 subject_name(GetSimpleSiteName(url, profile_));
510 if (subject_name.empty()) { 502 if (subject_name.empty()) {
511 subject_name.assign( 503 subject_name.assign(
512 l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 504 l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY));
513 } 505 }
514 506
515 if (ssl.security_style == content::SECURITY_STYLE_UNKNOWN) { 507 if (!security_info.cert_id || !security_info.scheme_is_cryptographic) {
516 // Page is still loading, so SSL status is not yet available. Say nothing. 508 // Page is still loading (so SSL status is not yet available) or
517 DCHECK_EQ(ssl.security_bits, -1); 509 // loaded over HTTP or loaded over HTTPS with no cert.
518 site_connection_status_ = SITE_CONNECTION_STATUS_UNENCRYPTED; 510 site_connection_status_ = SITE_CONNECTION_STATUS_UNENCRYPTED;
519 511
520 site_connection_details_.assign(l10n_util::GetStringFUTF16( 512 site_connection_details_.assign(l10n_util::GetStringFUTF16(
521 IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, 513 IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT,
522 subject_name)); 514 subject_name));
523 } else if (ssl.security_style == content::SECURITY_STYLE_UNAUTHENTICATED) { 515 } else if (security_info.security_bits < 0) {
524 // HTTPS without a certificate, or not HTTPS. 516 // Security strength is unknown. Say nothing.
525 DCHECK(!ssl.cert_id);
526 site_connection_status_ = SITE_CONNECTION_STATUS_UNENCRYPTED;
527
528 site_connection_details_.assign(l10n_util::GetStringFUTF16(
529 IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT,
530 subject_name));
531 } else if (ssl.security_bits < 0) {
532 // Security strength is unknown. Say nothing.
533 site_connection_status_ = SITE_CONNECTION_STATUS_ENCRYPTED_ERROR; 517 site_connection_status_ = SITE_CONNECTION_STATUS_ENCRYPTED_ERROR;
534 } else if (ssl.security_bits == 0) { 518 } else if (security_info.security_bits == 0) {
535 DCHECK_NE(ssl.security_style, content::SECURITY_STYLE_UNAUTHENTICATED); 519 DCHECK_NE(security_info.security_level, SecurityStateModel::NONE);
536 site_connection_status_ = SITE_CONNECTION_STATUS_ENCRYPTED_ERROR; 520 site_connection_status_ = SITE_CONNECTION_STATUS_ENCRYPTED_ERROR;
537 site_connection_details_.assign(l10n_util::GetStringFUTF16( 521 site_connection_details_.assign(l10n_util::GetStringFUTF16(
538 IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, 522 IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT,
539 subject_name)); 523 subject_name));
540 } else { 524 } else {
541 site_connection_status_ = SITE_CONNECTION_STATUS_ENCRYPTED; 525 site_connection_status_ = SITE_CONNECTION_STATUS_ENCRYPTED;
542 526
543 if (net::SSLConnectionStatusToVersion(ssl.connection_status) >= 527 if (net::SSLConnectionStatusToVersion(security_info.connection_status) >=
544 net::SSL_CONNECTION_VERSION_TLS1_2 && 528 net::SSL_CONNECTION_VERSION_TLS1_2 &&
545 net::IsSecureTLSCipherSuite( 529 net::IsSecureTLSCipherSuite(net::SSLConnectionStatusToCipherSuite(
546 net::SSLConnectionStatusToCipherSuite(ssl.connection_status))) { 530 security_info.connection_status))) {
547 site_connection_details_.assign(l10n_util::GetStringFUTF16( 531 site_connection_details_.assign(l10n_util::GetStringFUTF16(
548 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_CONNECTION_TEXT, 532 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_CONNECTION_TEXT,
549 subject_name)); 533 subject_name));
550 } else { 534 } else {
551 site_connection_details_.assign(l10n_util::GetStringFUTF16( 535 site_connection_details_.assign(l10n_util::GetStringFUTF16(
552 IDS_PAGE_INFO_SECURITY_TAB_WEAK_ENCRYPTION_CONNECTION_TEXT, 536 IDS_PAGE_INFO_SECURITY_TAB_WEAK_ENCRYPTION_CONNECTION_TEXT,
553 subject_name)); 537 subject_name));
554 } 538 }
555 539
556 if (ssl.content_status) { 540 if (security_info.mixed_content_status !=
541 SecurityStateModel::NO_MIXED_CONTENT) {
557 bool ran_insecure_content = 542 bool ran_insecure_content =
558 !!(ssl.content_status & content::SSLStatus::RAN_INSECURE_CONTENT); 543 (security_info.mixed_content_status ==
544 SecurityStateModel::RAN_MIXED_CONTENT ||
545 security_info.mixed_content_status ==
546 SecurityStateModel::RAN_AND_DISPLAYED_MIXED_CONTENT);
559 site_connection_status_ = ran_insecure_content 547 site_connection_status_ = ran_insecure_content
560 ? SITE_CONNECTION_STATUS_MIXED_SCRIPT 548 ? SITE_CONNECTION_STATUS_MIXED_SCRIPT
561 : SITE_CONNECTION_STATUS_MIXED_CONTENT; 549 : SITE_CONNECTION_STATUS_MIXED_CONTENT;
562 site_connection_details_.assign(l10n_util::GetStringFUTF16( 550 site_connection_details_.assign(l10n_util::GetStringFUTF16(
563 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_SENTENCE_LINK, 551 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_SENTENCE_LINK,
564 site_connection_details_, 552 site_connection_details_,
565 l10n_util::GetStringUTF16(ran_insecure_content ? 553 l10n_util::GetStringUTF16(ran_insecure_content ?
566 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_ERROR : 554 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_ERROR :
567 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_WARNING))); 555 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_WARNING)));
568 } 556 }
569 } 557 }
570 558
571 uint16 cipher_suite = 559 uint16 cipher_suite =
572 net::SSLConnectionStatusToCipherSuite(ssl.connection_status); 560 net::SSLConnectionStatusToCipherSuite(security_info.connection_status);
573 if (ssl.security_bits > 0 && cipher_suite) { 561 if (security_info.security_bits > 0 && cipher_suite) {
574 int ssl_version = 562 int ssl_version =
575 net::SSLConnectionStatusToVersion(ssl.connection_status); 563 net::SSLConnectionStatusToVersion(security_info.connection_status);
576 const char* ssl_version_str; 564 const char* ssl_version_str;
577 net::SSLVersionToString(&ssl_version_str, ssl_version); 565 net::SSLVersionToString(&ssl_version_str, ssl_version);
578 site_connection_details_ += ASCIIToUTF16("\n\n"); 566 site_connection_details_ += ASCIIToUTF16("\n\n");
579 site_connection_details_ += l10n_util::GetStringFUTF16( 567 site_connection_details_ += l10n_util::GetStringFUTF16(
580 IDS_PAGE_INFO_SECURITY_TAB_SSL_VERSION, 568 IDS_PAGE_INFO_SECURITY_TAB_SSL_VERSION,
581 ASCIIToUTF16(ssl_version_str)); 569 ASCIIToUTF16(ssl_version_str));
582 570
583 bool no_renegotiation = 571 bool no_renegotiation =
584 (ssl.connection_status & 572 (security_info.connection_status &
585 net::SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION) != 0; 573 net::SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION) != 0;
586 const char *key_exchange, *cipher, *mac; 574 const char *key_exchange, *cipher, *mac;
587 bool is_aead; 575 bool is_aead;
588 net::SSLCipherSuiteToStrings( 576 net::SSLCipherSuiteToStrings(
589 &key_exchange, &cipher, &mac, &is_aead, cipher_suite); 577 &key_exchange, &cipher, &mac, &is_aead, cipher_suite);
590 578
591 site_connection_details_ += ASCIIToUTF16("\n\n"); 579 site_connection_details_ += ASCIIToUTF16("\n\n");
592 if (is_aead) { 580 if (is_aead) {
593 site_connection_details_ += l10n_util::GetStringFUTF16( 581 site_connection_details_ += l10n_util::GetStringFUTF16(
594 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTION_DETAILS_AEAD, 582 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTION_DETAILS_AEAD,
595 ASCIIToUTF16(cipher), ASCIIToUTF16(key_exchange)); 583 ASCIIToUTF16(cipher), ASCIIToUTF16(key_exchange));
596 } else { 584 } else {
597 site_connection_details_ += l10n_util::GetStringFUTF16( 585 site_connection_details_ += l10n_util::GetStringFUTF16(
598 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTION_DETAILS, 586 IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTION_DETAILS,
599 ASCIIToUTF16(cipher), ASCIIToUTF16(mac), ASCIIToUTF16(key_exchange)); 587 ASCIIToUTF16(cipher), ASCIIToUTF16(mac), ASCIIToUTF16(key_exchange));
600 } 588 }
601 589
602 if (ssl_version == net::SSL_CONNECTION_VERSION_SSL3 && 590 if (ssl_version == net::SSL_CONNECTION_VERSION_SSL3 &&
603 site_connection_status_ < SITE_CONNECTION_STATUS_MIXED_CONTENT) { 591 site_connection_status_ < SITE_CONNECTION_STATUS_MIXED_CONTENT) {
604 site_connection_status_ = SITE_CONNECTION_STATUS_ENCRYPTED_ERROR; 592 site_connection_status_ = SITE_CONNECTION_STATUS_ENCRYPTED_ERROR;
605 } 593 }
606 594
607 const bool did_fallback = 595 const bool did_fallback = (security_info.connection_status &
608 (ssl.connection_status & net::SSL_CONNECTION_VERSION_FALLBACK) != 0; 596 net::SSL_CONNECTION_VERSION_FALLBACK) != 0;
609 if (did_fallback) { 597 if (did_fallback) {
610 site_connection_details_ += ASCIIToUTF16("\n\n"); 598 site_connection_details_ += ASCIIToUTF16("\n\n");
611 site_connection_details_ += l10n_util::GetStringUTF16( 599 site_connection_details_ += l10n_util::GetStringUTF16(
612 IDS_PAGE_INFO_SECURITY_TAB_FALLBACK_MESSAGE); 600 IDS_PAGE_INFO_SECURITY_TAB_FALLBACK_MESSAGE);
613 } 601 }
614 602
615 if (no_renegotiation) { 603 if (no_renegotiation) {
616 site_connection_details_ += ASCIIToUTF16("\n\n"); 604 site_connection_details_ += ASCIIToUTF16("\n\n");
617 site_connection_details_ += l10n_util::GetStringUTF16( 605 site_connection_details_ += l10n_util::GetStringUTF16(
618 IDS_PAGE_INFO_SECURITY_TAB_RENEGOTIATION_MESSAGE); 606 IDS_PAGE_INFO_SECURITY_TAB_RENEGOTIATION_MESSAGE);
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 info.connection_status = site_connection_status_; 720 info.connection_status = site_connection_status_;
733 info.connection_status_description = 721 info.connection_status_description =
734 UTF16ToUTF8(site_connection_details_); 722 UTF16ToUTF8(site_connection_details_);
735 info.identity_status = site_identity_status_; 723 info.identity_status = site_identity_status_;
736 info.identity_status_description = 724 info.identity_status_description =
737 UTF16ToUTF8(site_identity_details_); 725 UTF16ToUTF8(site_identity_details_);
738 info.cert_id = cert_id_; 726 info.cert_id = cert_id_;
739 info.show_ssl_decision_revoke_button = show_ssl_decision_revoke_button_; 727 info.show_ssl_decision_revoke_button = show_ssl_decision_revoke_button_;
740 ui_->SetIdentityInfo(info); 728 ui_->SetIdentityInfo(info);
741 } 729 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698