page_info_model.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
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" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/cert_store.h" 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ssl/ssl_error_info.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/ssl/ssl_manager.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 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OS_MACOSX) 273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/mac/mac_util.h" 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPageInfoModel::PageInfoModel(Profile* profile, 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url, 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NavigationEntry::SSLStatus& ssl, 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool show_history, 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PageInfoModelObserver* observer) 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : observer_(observer) { 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Init(); 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SectionStateIcon icon_id = ICON_STATE_OK; 393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 headline; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 description; 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<net::X509Certificate> cert; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Identity section. 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 subject_name(UTF8ToUTF16(url.host())); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool empty_subject_name = false; 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (subject_name.empty()) { 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name.assign( 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch empty_subject_name = true; 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Some of what IsCertStatusError classifies as errors we want to show as 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // warnings instead. 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const int cert_warnings = 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION | 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::CERT_STATUS_NO_REVOCATION_MECHANISM; 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int status_with_warnings_removed = ssl.cert_status() & ~cert_warnings; 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.cert_id() && 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen CertStore::GetInstance()->RetrieveCert(ssl.cert_id(), &cert) && 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !net::IsCertStatusError(status_with_warnings_removed)) { 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // No error found so far, check cert_status warnings. 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int cert_status = ssl.cert_status(); 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (cert_status & cert_warnings) { 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 issuer_name(UTF8ToUTF16(cert->issuer().GetDisplayName())); 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (issuer_name.empty()) { 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick issuer_name.assign(l10n_util::GetStringUTF16( 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, issuer_name)); 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += ASCIIToUTF16("\n\n"); 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (cert_status & net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION) { 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += l10n_util::GetStringUTF16( 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_UNABLE_TO_CHECK_REVOCATION); 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (cert_status & net::CERT_STATUS_NO_REVOCATION_MECHANISM) { 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += l10n_util::GetStringUTF16( 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_NO_REVOCATION_MECHANISM); 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTREACHED() << "Need to specify string for this warning"; 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_WARNING_MINOR; 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if ((ssl.cert_status() & net::CERT_STATUS_IS_EV) != 0) { 853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // EV HTTPS page. 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().organization_names.empty()); 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline = 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringFUTF16(IDS_PAGE_INFO_EV_IDENTITY_TITLE, 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().organization_names[0]), 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(url.host())); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // An EV Cert is required to have a city (localityName) and country but 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // state is "if any". 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().locality_name.empty()); 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().country_name.empty()); 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 locality; 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!cert->subject().state_or_province_name.empty()) { 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality = l10n_util::GetStringFUTF16( 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGEINFO_ADDRESS, 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().locality_name), 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().state_or_province_name), 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().country_name)); 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality = l10n_util::GetStringFUTF16( 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGEINFO_PARTIAL_ADDRESS, 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().locality_name), 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().country_name)); 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().organization_names.empty()); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV, 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().organization_names[0]), 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality, 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToUTF16(cert->issuer().GetDisplayName()))); 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if ((ssl.cert_status() & net::CERT_STATUS_IS_DNSSEC) != 0) { 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // DNSSEC authenticated page. 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (empty_subject_name) 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); // Don't display any title. 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick else 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.assign(subject_name); 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, UTF8ToUTF16("DNSSEC"))); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Non-EV OK HTTPS page. 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (empty_subject_name) 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); // Don't display any title. 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.assign(subject_name); 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 issuer_name(UTF8ToUTF16(cert->issuer().GetDisplayName())); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (issuer_name.empty()) { 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch issuer_name.assign(l10n_util::GetStringUTF16( 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, issuer_name)); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // HTTP or HTTPS with errors (not warnings). 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringUTF16( 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_INSECURE_IDENTITY)); 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_WARNING_MAJOR : ICON_STATE_ERROR; 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const string16 bullet = UTF8ToUTF16("\n • "); 14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::vector<SSLErrorInfo> errors; 14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SSLErrorInfo::GetErrorsForCertStatus(ssl.cert_id(), ssl.cert_status(), 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen url, &errors); 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (size_t i = 0; i < errors.size(); ++i) { 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen description += bullet; 14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen description += errors[i].short_description(); 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (ssl.cert_status() & net::CERT_STATUS_NON_UNIQUE_NAME) { 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick description += ASCIIToUTF16("\n\n"); 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick description += l10n_util::GetStringUTF16( 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_NON_UNIQUE_NAME); 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id, 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline, 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description, 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_IDENTITY)); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Connection section. 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We consider anything less than 80 bits encryption to be weak encryption. 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(wtc): Bug 1198735: report mixed/unsafe content for unencrypted and 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // weakly encrypted connections. 168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_OK; 1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.clear(); 1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (!ssl.cert_id()) { 1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Not HTTPS. 1734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK_EQ(ssl.security_style(), SECURITY_STYLE_UNAUTHENTICATED); 1744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch icon_id = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? 1754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ICON_STATE_WARNING_MAJOR : ICON_STATE_ERROR; 1764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch description.assign(l10n_util::GetStringFUTF16( 1774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, 1784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch subject_name)); 1794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } else if (ssl.security_bits() < 0) { 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Security strength is unknown. Say nothing. 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_ERROR; 1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (ssl.security_bits() == 0) { 1834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK_NE(ssl.security_style(), SECURITY_STYLE_UNAUTHENTICATED); 1844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch icon_id = ICON_STATE_ERROR; 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name)); 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (ssl.security_bits() < 80) { 189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_ERROR; 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_WEAK_ENCRYPTION_CONNECTION_TEXT, 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name)); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_CONNECTION_TEXT, 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name, 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::IntToString16(ssl.security_bits()))); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.displayed_insecure_content() || ssl.ran_insecure_content()) { 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ssl.ran_insecure_content() ? 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_ERROR : ICON_STATE_WARNING_MINOR; 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_SENTENCE_LINK, 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description, 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(ssl.ran_insecure_content() ? 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_ERROR : 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_WARNING))); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uint16 cipher_suite = 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLConnectionStatusToCipherSuite(ssl.connection_status()); 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.security_bits() > 0 && cipher_suite) { 213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int ssl_version = 214513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch net::SSLConnectionStatusToVersion(ssl.connection_status()); 215513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* ssl_version_str; 216513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch net::SSLVersionToString(&ssl_version_str, ssl_version); 217513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch description += ASCIIToUTF16("\n\n"); 218513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch description += l10n_util::GetStringFUTF16( 219513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch IDS_PAGE_INFO_SECURITY_TAB_SSL_VERSION, 220513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASCIIToUTF16(ssl_version_str)); 221513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool did_fallback = (ssl.connection_status() & 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSL_CONNECTION_SSL3_FALLBACK) != 0; 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool no_renegotiation = 2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (ssl.connection_status() & 2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION) != 0; 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char *key_exchange, *cipher, *mac; 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, cipher_suite); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringFUTF16( 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTION_DETAILS, 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASCIIToUTF16(cipher), ASCIIToUTF16(mac), ASCIIToUTF16(key_exchange)); 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uint8 compression_id = 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLConnectionStatusToCompression(ssl.connection_status()); 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (compression_id) { 239513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* compression; 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLCompressionToString(&compression, compression_id); 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringFUTF16( 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_COMPRESSION_DETAILS, 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASCIIToUTF16(compression)); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_NO_COMPRESSION); 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (did_fallback) { 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // For now, only SSLv3 fallback will trigger a warning icon. 251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_ERROR; 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_FALLBACK_MESSAGE); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (no_renegotiation) { 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_RENEGOTIATION_MESSAGE); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!description.empty()) { 2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick sections_.push_back(SectionInfo( 265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id, 2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline, 2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description, 2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_CONNECTION)); 2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Request the number of visits. 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HistoryService* history = profile->GetHistoryService( 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile::EXPLICIT_ACCESS); 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (show_history && history) { 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history->GetVisitCountToHost( 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url, 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &request_consumer_, 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewCallback(this, &PageInfoModel::OnGotVisitCountToHost)); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickPageInfoModel::~PageInfoModel() { 283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OS_MACOSX) 284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Release the NSImages. 285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (std::vector<gfx::NativeImage>::iterator it = icons_.begin(); 286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick it != icons_.end(); ++it) { 2873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::mac::NSObjectRelease(*it); 288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 2903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint PageInfoModel::GetSectionCount() { 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return sections_.size(); 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPageInfoModel::SectionInfo PageInfoModel::GetSectionInfo(int index) { 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(index < static_cast<int>(sections_.size())); 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return sections_[index]; 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::NativeImage PageInfoModel::GetIconImage(SectionStateIcon icon_id) { 302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (icon_id == ICON_NONE) 303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return NULL; 304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The bubble uses new, various icons. 305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return icons_[icon_id]; 306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PageInfoModel::OnGotVisitCountToHost(HistoryService::Handle handle, 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool found_visits, 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int count, 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time first_visit) { 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!found_visits) { 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This indicates an error, such as the page wasn't http/https; do nothing. 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool visited_before_today = false; 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (count) { 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time today = base::Time::Now().LocalMidnight(); 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time first_visit_midnight = first_visit.LocalMidnight(); 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch visited_before_today = (first_visit_midnight < today); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 324513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 headline = l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE); 3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!visited_before_today) { 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_WARNING_MAJOR, 329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch headline, 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16( 3313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_FIRST_VISITED_TODAY), 3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_FIRST_VISIT)); 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_INFO, 336513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch headline, 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringFUTF16( 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_VISITED_BEFORE_TODAY, 33921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::TimeFormatShortDate(first_visit)), 3403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_FIRST_VISIT)); 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch observer_->ModelChanged(); 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 345731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickPageInfoModel::PageInfoModel() : observer_(NULL) { 346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Init(); 347731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid PageInfoModel::Init() { 350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Loads the icons into the vector. The order must match the SectionStateIcon 351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // enum. 352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_GOOD)); 353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_WARNING_MINOR)); 354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_WARNING_MAJOR)); 355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_BAD)); 356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_INFO)); 357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::NativeImage PageInfoModel::GetBitmapNamed(int resource_id) { 360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::NativeImage image = rb.GetNativeImageNamed(resource_id); 362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OS_MACOSX) 363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Unlike other platforms, the Mac ResourceBundle does not keep a shared image 364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // cache. These are released in the dtor. 3653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen base::mac::NSObjectRetain(image); 366731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return image; 3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 369