page_info_model.cc revision 4a5e2dc747d50c653511c68ccb2cfbfb740bd5a7
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 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/l10n_util.h" 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "app/resource_bundle.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/command_line.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/i18n/time_formatting.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/cert_store.h" 163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/profile.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/ssl/ssl_manager.h" 193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/chrome_switches.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "grit/theme_resources.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/cert_status_flags.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/ssl_connection_status_flags.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/ssl_cipher_suite_names.h" 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/x509_certificate.h" 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OS_MACOSX) 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/mac_util.h" 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPageInfoModel::PageInfoModel(Profile* profile, 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url, 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NavigationEntry::SSLStatus& ssl, 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool show_history, 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PageInfoModelObserver* observer) 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : observer_(observer) { 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Init(); 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SectionStateIcon icon_id = ICON_STATE_OK; 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 headline; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 description; 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<net::X509Certificate> cert; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Identity section. 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 subject_name(UTF8ToUTF16(url.host())); 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool empty_subject_name = false; 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (subject_name.empty()) { 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name.assign( 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch empty_subject_name = true; 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Some of what IsCertStatusError classifies as errors we want to show as 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // warnings instead. 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const int cert_warnings = 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION | 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::CERT_STATUS_NO_REVOCATION_MECHANISM; 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int status_with_warnings_removed = ssl.cert_status() & ~cert_warnings; 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.cert_id() && 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CertStore::GetSharedInstance()->RetrieveCert(ssl.cert_id(), &cert) && 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !net::IsCertStatusError(status_with_warnings_removed)) { 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // No error found so far, check cert_status warnings. 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int cert_status = ssl.cert_status(); 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (cert_status & cert_warnings) { 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 issuer_name(UTF8ToUTF16(cert->issuer().GetDisplayName())); 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (issuer_name.empty()) { 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick issuer_name.assign(l10n_util::GetStringUTF16( 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, issuer_name)); 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += ASCIIToUTF16("\n\n"); 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (cert_status & net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION) { 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += l10n_util::GetStringUTF16( 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_UNABLE_TO_CHECK_REVOCATION); 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (cert_status & net::CERT_STATUS_NO_REVOCATION_MECHANISM) { 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += l10n_util::GetStringUTF16( 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_NO_REVOCATION_MECHANISM); 823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTREACHED() << "Need to specify string for this warning"; 843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_WARNING_MINOR; 863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if ((ssl.cert_status() & net::CERT_STATUS_IS_EV) != 0) { 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // EV HTTPS page. 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().organization_names.empty()); 893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline = 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringFUTF16(IDS_PAGE_INFO_EV_IDENTITY_TITLE, 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().organization_names[0]), 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(url.host())); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // An EV Cert is required to have a city (localityName) and country but 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // state is "if any". 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().locality_name.empty()); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().country_name.empty()); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 locality; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!cert->subject().state_or_province_name.empty()) { 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality = l10n_util::GetStringFUTF16( 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGEINFO_ADDRESS, 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().locality_name), 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().state_or_province_name), 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().country_name)); 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality = l10n_util::GetStringFUTF16( 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGEINFO_PARTIAL_ADDRESS, 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().locality_name), 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().country_name)); 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().organization_names.empty()); 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV, 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().organization_names[0]), 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality, 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToUTF16(cert->issuer().GetDisplayName()))); 1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if ((ssl.cert_status() & net::CERT_STATUS_IS_DNSSEC) != 0) { 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // DNSSEC authenticated page. 1183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (empty_subject_name) 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); // Don't display any title. 1203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick else 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.assign(subject_name); 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 1233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, UTF8ToUTF16("DNSSEC"))); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Non-EV OK HTTPS page. 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (empty_subject_name) 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); // Don't display any title. 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.assign(subject_name); 1303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 issuer_name(UTF8ToUTF16(cert->issuer().GetDisplayName())); 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (issuer_name.empty()) { 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch issuer_name.assign(l10n_util::GetStringUTF16( 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, issuer_name)); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // HTTP or HTTPS with errors (not warnings). 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringUTF16( 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_INSECURE_IDENTITY)); 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_WARNING_MAJOR : ICON_STATE_ERROR; 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (ssl.cert_status() & net::CERT_STATUS_NON_UNIQUE_NAME) { 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick description += ASCIIToUTF16("\n\n"); 147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick description += l10n_util::GetStringUTF16( 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_NON_UNIQUE_NAME); 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id, 1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline, 1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description, 1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_IDENTITY)); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Connection section. 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We consider anything less than 80 bits encryption to be weak encryption. 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(wtc): Bug 1198735: report mixed/unsafe content for unencrypted and 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // weakly encrypted connections. 161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_OK; 1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.clear(); 1644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch if (!ssl.cert_id()) { 1654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Not HTTPS. 1664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK_EQ(ssl.security_style(), SECURITY_STYLE_UNAUTHENTICATED); 1674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch icon_id = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? 1684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ICON_STATE_WARNING_MAJOR : ICON_STATE_ERROR; 1694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch description.assign(l10n_util::GetStringFUTF16( 1704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, 1714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch subject_name)); 1724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } else if (ssl.security_bits() < 0) { 1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Security strength is unknown. Say nothing. 174731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_ERROR; 1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (ssl.security_bits() == 0) { 1764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DCHECK_NE(ssl.security_style(), SECURITY_STYLE_UNAUTHENTICATED); 1774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch icon_id = ICON_STATE_ERROR; 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name)); 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (ssl.security_bits() < 80) { 182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_ERROR; 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_WEAK_ENCRYPTION_CONNECTION_TEXT, 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name)); 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_CONNECTION_TEXT, 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name, 1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::IntToString16(ssl.security_bits()))); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.displayed_insecure_content() || ssl.ran_insecure_content()) { 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ssl.ran_insecure_content() ? 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_ERROR : ICON_STATE_WARNING_MINOR; 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_SENTENCE_LINK, 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description, 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(ssl.ran_insecure_content() ? 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_ERROR : 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_WARNING))); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uint16 cipher_suite = 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLConnectionStatusToCipherSuite(ssl.connection_status()); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.security_bits() > 0 && cipher_suite) { 206513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch int ssl_version = 207513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch net::SSLConnectionStatusToVersion(ssl.connection_status()); 208513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* ssl_version_str; 209513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch net::SSLVersionToString(&ssl_version_str, ssl_version); 210513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch description += ASCIIToUTF16("\n\n"); 211513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch description += l10n_util::GetStringFUTF16( 212513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch IDS_PAGE_INFO_SECURITY_TAB_SSL_VERSION, 213513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch ASCIIToUTF16(ssl_version_str)); 214513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool did_fallback = (ssl.connection_status() & 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSL_CONNECTION_SSL3_FALLBACK) != 0; 2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool no_renegotiation = 2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (ssl.connection_status() & 2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION) != 0; 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char *key_exchange, *cipher, *mac; 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, cipher_suite); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringFUTF16( 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTION_DETAILS, 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASCIIToUTF16(cipher), ASCIIToUTF16(mac), ASCIIToUTF16(key_exchange)); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uint8 compression_id = 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLConnectionStatusToCompression(ssl.connection_status()); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (compression_id) { 232513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const char* compression; 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLCompressionToString(&compression, compression_id); 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringFUTF16( 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_COMPRESSION_DETAILS, 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASCIIToUTF16(compression)); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_NO_COMPRESSION); 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (did_fallback) { 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // For now, only SSLv3 fallback will trigger a warning icon. 244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id = ICON_STATE_ERROR; 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_FALLBACK_MESSAGE); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (no_renegotiation) { 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_RENEGOTIATION_MESSAGE); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!description.empty()) { 2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick sections_.push_back(SectionInfo( 258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icon_id, 2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline, 2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description, 2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_CONNECTION)); 2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Request the number of visits. 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HistoryService* history = profile->GetHistoryService( 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile::EXPLICIT_ACCESS); 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (show_history && history) { 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history->GetVisitCountToHost( 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url, 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &request_consumer_, 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewCallback(this, &PageInfoModel::OnGotVisitCountToHost)); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickPageInfoModel::~PageInfoModel() { 276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OS_MACOSX) 277731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Release the NSImages. 278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (std::vector<gfx::NativeImage>::iterator it = icons_.begin(); 279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick it != icons_.end(); ++it) { 280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mac_util::NSObjectRelease(*it); 281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 2833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint PageInfoModel::GetSectionCount() { 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return sections_.size(); 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPageInfoModel::SectionInfo PageInfoModel::GetSectionInfo(int index) { 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(index < static_cast<int>(sections_.size())); 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return sections_[index]; 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::NativeImage PageInfoModel::GetIconImage(SectionStateIcon icon_id) { 295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (icon_id == ICON_NONE) 296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return NULL; 297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The bubble uses new, various icons. 298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return icons_[icon_id]; 299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PageInfoModel::OnGotVisitCountToHost(HistoryService::Handle handle, 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool found_visits, 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int count, 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time first_visit) { 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!found_visits) { 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This indicates an error, such as the page wasn't http/https; do nothing. 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool visited_before_today = false; 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (count) { 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time today = base::Time::Now().LocalMidnight(); 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time first_visit_midnight = first_visit.LocalMidnight(); 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch visited_before_today = (first_visit_midnight < today); 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 317513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 headline = l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE); 3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!visited_before_today) { 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_WARNING_MAJOR, 322513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch headline, 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16( 3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_FIRST_VISITED_TODAY), 3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_FIRST_VISIT)); 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ICON_STATE_INFO, 329513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch headline, 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringFUTF16( 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_VISITED_BEFORE_TODAY, 3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WideToUTF16(base::TimeFormatShortDate(first_visit))), 3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_FIRST_VISIT)); 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch observer_->ModelChanged(); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 338731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickPageInfoModel::PageInfoModel() : observer_(NULL) { 339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Init(); 340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid PageInfoModel::Init() { 343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Loads the icons into the vector. The order must match the SectionStateIcon 344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // enum. 345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_GOOD)); 346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_WARNING_MINOR)); 347731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_WARNING_MAJOR)); 348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_BAD)); 349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icons_.push_back(GetBitmapNamed(IDR_PAGEINFO_INFO)); 350731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::NativeImage PageInfoModel::GetBitmapNamed(int resource_id) { 353731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ResourceBundle& rb = ResourceBundle::GetSharedInstance(); 354731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick gfx::NativeImage image = rb.GetNativeImageNamed(resource_id); 355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OS_MACOSX) 356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Unlike other platforms, the Mac ResourceBundle does not keep a shared image 357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // cache. These are released in the dtor. 358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick mac_util::NSObjectRetain(image); 359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return image; 3613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 362