1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/page_info_model.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string> 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/command_line.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/i18n/time_formatting.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ssl/ssl_error_info.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/ssl/ssl_manager.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/cert_store.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 18731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "grit/theme_resources.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/cert_status_flags.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/ssl_connection_status_flags.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/ssl_cipher_suite_names.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/x509_certificate.h" 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPageInfoModel::PageInfoModel(Profile* profile, 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url, 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NavigationEntry::SSLStatus& ssl, 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool show_history, 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PageInfoModelObserver* observer) 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : observer_(observer) { 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Init(); 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SectionStateIcon icon_id = ICON_STATE_OK; 353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 headline; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 description; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<net::X509Certificate> cert; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Identity section. 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 subject_name(UTF8ToUTF16(url.host())); 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool empty_subject_name = false; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (subject_name.empty()) { 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name.assign( 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch empty_subject_name = true; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Some of what IsCertStatusError classifies as errors we want to show as 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // warnings instead. 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const int cert_warnings = 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION | 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::CERT_STATUS_NO_REVOCATION_MECHANISM; 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int status_with_warnings_removed = ssl.cert_status() & ~cert_warnings; 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.cert_id() && 5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertStore::GetInstance()->RetrieveCert(ssl.cert_id(), &cert) && 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !net::IsCertStatusError(status_with_warnings_removed)) { 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // No error found so far, check cert_status warnings. 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int cert_status = ssl.cert_status(); 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (cert_status & cert_warnings) { 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 issuer_name(UTF8ToUTF16(cert->issuer().GetDisplayName())); 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (issuer_name.empty()) { 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick issuer_name.assign(l10n_util::GetStringUTF16( 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, issuer_name)); 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += ASCIIToUTF16("\n\n"); 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (cert_status & net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION) { 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += l10n_util::GetStringUTF16( 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_UNABLE_TO_CHECK_REVOCATION); 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (cert_status & net::CERT_STATUS_NO_REVOCATION_MECHANISM) { 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += l10n_util::GetStringUTF16( 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_NO_REVOCATION_MECHANISM); 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTREACHED() << "Need to specify string for this warning"; 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_WARNING_MINOR; 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if ((ssl.cert_status() & net::CERT_STATUS_IS_EV) != 0) { 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // EV HTTPS page. 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().organization_names.empty()); 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline = 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringFUTF16(IDS_PAGE_INFO_EV_IDENTITY_TITLE, 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().organization_names[0]), 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(url.host())); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // An EV Cert is required to have a city (localityName) and country but 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // state is "if any". 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().locality_name.empty()); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().country_name.empty()); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 locality; 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!cert->subject().state_or_province_name.empty()) { 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality = l10n_util::GetStringFUTF16( 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGEINFO_ADDRESS, 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().locality_name), 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().state_or_province_name), 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().country_name)); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality = l10n_util::GetStringFUTF16( 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGEINFO_PARTIAL_ADDRESS, 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().locality_name), 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().country_name)); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().organization_names.empty()); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV, 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().organization_names[0]), 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality, 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToUTF16(cert->issuer().GetDisplayName()))); 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if ((ssl.cert_status() & net::CERT_STATUS_IS_DNSSEC) != 0) { 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // DNSSEC authenticated page. 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (empty_subject_name) 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); // Don't display any title. 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick else 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.assign(subject_name); 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, UTF8ToUTF16("DNSSEC"))); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Non-EV OK HTTPS page. 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (empty_subject_name) 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); // Don't display any title. 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.assign(subject_name); 1243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 issuer_name(UTF8ToUTF16(cert->issuer().GetDisplayName())); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (issuer_name.empty()) { 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch issuer_name.assign(l10n_util::GetStringUTF16( 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, issuer_name)); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // HTTP or HTTPS with errors (not warnings). 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringUTF16( 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_INSECURE_IDENTITY)); 136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_WARNING_MAJOR : ICON_STATE_ERROR; 138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 bullet = UTF8ToUTF16("\n • "); 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::vector<SSLErrorInfo> errors; 14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SSLErrorInfo::GetErrorsForCertStatus(ssl.cert_id(), ssl.cert_status(), 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen url, &errors); 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (size_t i = 0; i < errors.size(); ++i) { 14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen description += bullet; 14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen description += errors[i].short_description(); 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (ssl.cert_status() & net::CERT_STATUS_NON_UNIQUE_NAME) { 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick description += ASCIIToUTF16("\n\n"); 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick description += l10n_util::GetStringUTF16( 151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_NON_UNIQUE_NAME); 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id, 1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline, 1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description, 1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_IDENTITY)); 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Connection section. 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We consider anything less than 80 bits encryption to be weak encryption. 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(wtc): Bug 1198735: report mixed/unsafe content for unencrypted and 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // weakly encrypted connections. 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_OK; 1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.clear(); 1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (!ssl.cert_id()) { 1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Not HTTPS. 1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK_EQ(ssl.security_style(), SECURITY_STYLE_UNAUTHENTICATED); 1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch icon_id = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? 1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ICON_STATE_WARNING_MAJOR : ICON_STATE_ERROR; 1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch description.assign(l10n_util::GetStringFUTF16( 1734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, 1744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch subject_name)); 1754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } else if (ssl.security_bits() < 0) { 1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Security strength is unknown. Say nothing. 177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_ERROR; 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (ssl.security_bits() == 0) { 1794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK_NE(ssl.security_style(), SECURITY_STYLE_UNAUTHENTICATED); 1804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch icon_id = ICON_STATE_ERROR; 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name)); 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (ssl.security_bits() < 80) { 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_ERROR; 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_WEAK_ENCRYPTION_CONNECTION_TEXT, 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name)); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_CONNECTION_TEXT, 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name, 1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::IntToString16(ssl.security_bits()))); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.displayed_insecure_content() || ssl.ran_insecure_content()) { 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ssl.ran_insecure_content() ? 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_ERROR : ICON_STATE_WARNING_MINOR; 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_SENTENCE_LINK, 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description, 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(ssl.ran_insecure_content() ? 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_ERROR : 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_WARNING))); 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uint16 cipher_suite = 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLConnectionStatusToCipherSuite(ssl.connection_status()); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.security_bits() > 0 && cipher_suite) { 209513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int ssl_version = 210513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch net::SSLConnectionStatusToVersion(ssl.connection_status()); 211513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* ssl_version_str; 212513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch net::SSLVersionToString(&ssl_version_str, ssl_version); 213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch description += ASCIIToUTF16("\n\n"); 214513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch description += l10n_util::GetStringFUTF16( 215513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch IDS_PAGE_INFO_SECURITY_TAB_SSL_VERSION, 216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASCIIToUTF16(ssl_version_str)); 217513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool did_fallback = (ssl.connection_status() & 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSL_CONNECTION_SSL3_FALLBACK) != 0; 2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool no_renegotiation = 2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (ssl.connection_status() & 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION) != 0; 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char *key_exchange, *cipher, *mac; 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, cipher_suite); 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringFUTF16( 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTION_DETAILS, 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASCIIToUTF16(cipher), ASCIIToUTF16(mac), ASCIIToUTF16(key_exchange)); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uint8 compression_id = 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLConnectionStatusToCompression(ssl.connection_status()); 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (compression_id) { 235513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* compression; 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLCompressionToString(&compression, compression_id); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringFUTF16( 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_COMPRESSION_DETAILS, 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASCIIToUTF16(compression)); 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_NO_COMPRESSION); 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (did_fallback) { 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // For now, only SSLv3 fallback will trigger a warning icon. 247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (icon_id < ICON_STATE_WARNING_MINOR) 248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen icon_id = ICON_STATE_WARNING_MINOR; 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_FALLBACK_MESSAGE); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (no_renegotiation) { 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_RENEGOTIATION_MESSAGE); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!description.empty()) { 2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick sections_.push_back(SectionInfo( 262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id, 2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline, 2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description, 2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_CONNECTION)); 2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Request the number of visits. 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HistoryService* history = profile->GetHistoryService( 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile::EXPLICIT_ACCESS); 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (show_history && history) { 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history->GetVisitCountToHost( 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url, 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &request_consumer_, 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewCallback(this, &PageInfoModel::OnGotVisitCountToHost)); 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 279dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenPageInfoModel::~PageInfoModel() {} 2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint PageInfoModel::GetSectionCount() { 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return sections_.size(); 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPageInfoModel::SectionInfo PageInfoModel::GetSectionInfo(int index) { 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(index < static_cast<int>(sections_.size())); 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return sections_[index]; 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsengfx::Image* PageInfoModel::GetIconImage(SectionStateIcon icon_id) { 291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (icon_id == ICON_NONE) 292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return NULL; 293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The bubble uses new, various icons. 294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return icons_[icon_id]; 295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PageInfoModel::OnGotVisitCountToHost(HistoryService::Handle handle, 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool found_visits, 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int count, 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time first_visit) { 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!found_visits) { 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This indicates an error, such as the page wasn't http/https; do nothing. 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool visited_before_today = false; 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (count) { 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time today = base::Time::Now().LocalMidnight(); 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time first_visit_midnight = first_visit.LocalMidnight(); 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch visited_before_today = (first_visit_midnight < today); 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 313513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 headline = l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE); 3143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!visited_before_today) { 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_WARNING_MAJOR, 318513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch headline, 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16( 3203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_FIRST_VISITED_TODAY), 3213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_FIRST_VISIT)); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_INFO, 325513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch headline, 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringFUTF16( 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_VISITED_BEFORE_TODAY, 32821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::TimeFormatShortDate(first_visit)), 3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_FIRST_VISIT)); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch observer_->ModelChanged(); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 334731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickPageInfoModel::PageInfoModel() : observer_(NULL) { 335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Init(); 336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid PageInfoModel::Init() { 339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Loads the icons into the vector. The order must match the SectionStateIcon 340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // enum. 341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 342dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen icons_.push_back(&rb.GetNativeImageNamed(IDR_PAGEINFO_GOOD)); 343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen icons_.push_back(&rb.GetNativeImageNamed(IDR_PAGEINFO_WARNING_MINOR)); 344dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen icons_.push_back(&rb.GetNativeImageNamed(IDR_PAGEINFO_WARNING_MAJOR)); 345dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen icons_.push_back(&rb.GetNativeImageNamed(IDR_PAGEINFO_BAD)); 346dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen icons_.push_back(&rb.GetNativeImageNamed(IDR_PAGEINFO_INFO)); 3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 348