page_info_model.cc revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
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" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/command_line.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/i18n/time_formatting.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/cert_store.h" 153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/profile.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/ssl/ssl_manager.h" 183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/common/chrome_switches.h" 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/cert_status_flags.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/ssl_connection_status_flags.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/ssl_cipher_suite_names.h" 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/x509_certificate.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) { 323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SectionInfoState state = SECTION_STATE_OK; 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 headline; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 description; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<net::X509Certificate> cert; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Identity section. 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 subject_name(UTF8ToUTF16(url.host())); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool empty_subject_name = false; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (subject_name.empty()) { 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name.assign( 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch empty_subject_name = true; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Some of what IsCertStatusError classifies as errors we want to show as 473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // warnings instead. 483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick static const int cert_warnings = 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION | 503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::CERT_STATUS_NO_REVOCATION_MECHANISM; 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int status_with_warnings_removed = ssl.cert_status() & ~cert_warnings; 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.cert_id() && 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CertStore::GetSharedInstance()->RetrieveCert(ssl.cert_id(), &cert) && 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !net::IsCertStatusError(status_with_warnings_removed)) { 563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // No error found so far, check cert_status warnings. 573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick int cert_status = ssl.cert_status(); 583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (cert_status & cert_warnings) { 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 issuer_name(UTF8ToUTF16(cert->issuer().GetDisplayName())); 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (issuer_name.empty()) { 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick issuer_name.assign(l10n_util::GetStringUTF16( 623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, issuer_name)); 663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += ASCIIToUTF16("\n\n"); 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (cert_status & net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION) { 693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += l10n_util::GetStringUTF16( 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_UNABLE_TO_CHECK_REVOCATION); 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (cert_status & net::CERT_STATUS_NO_REVOCATION_MECHANISM) { 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description += l10n_util::GetStringUTF16( 733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_NO_REVOCATION_MECHANISM); 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NOTREACHED() << "Need to specify string for this warning"; 763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick state = SECTION_STATE_WARNING_MINOR; 783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if ((ssl.cert_status() & net::CERT_STATUS_IS_EV) != 0) { 793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // EV HTTPS page. 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().organization_names.empty()); 813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline = 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringFUTF16(IDS_PAGE_INFO_EV_IDENTITY_TITLE, 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().organization_names[0]), 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(url.host())); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // An EV Cert is required to have a city (localityName) and country but 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // state is "if any". 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().locality_name.empty()); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().country_name.empty()); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch string16 locality; 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!cert->subject().state_or_province_name.empty()) { 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality = l10n_util::GetStringFUTF16( 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGEINFO_ADDRESS, 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().locality_name), 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().state_or_province_name), 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().country_name)); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality = l10n_util::GetStringFUTF16( 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGEINFO_PARTIAL_ADDRESS, 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().locality_name), 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().country_name)); 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!cert->subject().organization_names.empty()); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY_EV, 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch UTF8ToUTF16(cert->subject().organization_names[0]), 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch locality, 1073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick UTF8ToUTF16(cert->issuer().GetDisplayName()))); 1083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if ((ssl.cert_status() & net::CERT_STATUS_IS_DNSSEC) != 0) { 1093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // DNSSEC authenticated page. 1103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (empty_subject_name) 1113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); // Don't display any title. 1123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick else 1133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.assign(subject_name); 1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, UTF8ToUTF16("DNSSEC"))); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Non-EV OK HTTPS page. 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (empty_subject_name) 1193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); // Don't display any title. 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch else 1213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.assign(subject_name); 1223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 issuer_name(UTF8ToUTF16(cert->issuer().GetDisplayName())); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (issuer_name.empty()) { 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch issuer_name.assign(l10n_util::GetStringUTF16( 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_UNKNOWN_PARTY)); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description.assign(l10n_util::GetStringFUTF16( 1283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_SECURE_IDENTITY, issuer_name)); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // HTTP or HTTPS with errors (not warnings). 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringUTF16( 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_INSECURE_IDENTITY)); 1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick state = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? 1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_STATE_WARNING_MAJOR : SECTION_STATE_ERROR; 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch state, 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_IDENTITY_TITLE), 1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline, 1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description, 1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_IDENTITY)); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Connection section. 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We consider anything less than 80 bits encryption to be weak encryption. 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(wtc): Bug 1198735: report mixed/unsafe content for unencrypted and 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // weakly encrypted connections. 1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick state = SECTION_STATE_OK; 1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline.clear(); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.clear(); 1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (ssl.security_bits() < 0) { 1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Security strength is unknown. Say nothing. 1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick state = SECTION_STATE_ERROR; 1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (ssl.security_bits() == 0) { 1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick state = ssl.security_style() == SECURITY_STYLE_UNAUTHENTICATED ? 1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_STATE_WARNING_MAJOR : SECTION_STATE_ERROR; 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_NOT_ENCRYPTED_CONNECTION_TEXT, 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name)); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (ssl.security_bits() < 80) { 1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick state = SECTION_STATE_ERROR; 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_WEAK_ENCRYPTION_CONNECTION_TEXT, 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name)); 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_CONNECTION_TEXT, 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch subject_name, 1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick base::IntToString16(ssl.security_bits()))); 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.displayed_insecure_content() || ssl.ran_insecure_content()) { 1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // The old SSL dialog only had good and bad state, so for the old 1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // implementation we raise an error on finding mixed content. The new 1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // SSL info bubble has a warning state for displaying insecure content, 1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // so we check. The command line check will go away once we eliminate 1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // the old dialogs. 1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const CommandLine* command_line(CommandLine::ForCurrentProcess()); 1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (command_line->HasSwitch(switches::kEnableNewPageInfoBubble) && 1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !ssl.ran_insecure_content()) { 1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick state = SECTION_STATE_WARNING_MINOR; 1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick state = SECTION_STATE_ERROR; 1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description.assign(l10n_util::GetStringFUTF16( 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_SENTENCE_LINK, 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description, 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16(ssl.ran_insecure_content() ? 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_ERROR : 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTED_INSECURE_CONTENT_WARNING))); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uint16 cipher_suite = 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLConnectionStatusToCipherSuite(ssl.connection_status()); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (ssl.security_bits() > 0 && cipher_suite) { 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool did_fallback = (ssl.connection_status() & 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSL_CONNECTION_SSL3_FALLBACK) != 0; 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool no_renegotiation = 1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick (ssl.connection_status() & 1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick net::SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION) != 0; 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char *key_exchange, *cipher, *mac; 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLCipherSuiteToStrings(&key_exchange, &cipher, &mac, cipher_suite); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringFUTF16( 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_ENCRYPTION_DETAILS, 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASCIIToUTF16(cipher), ASCIIToUTF16(mac), ASCIIToUTF16(key_exchange)); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch uint8 compression_id = 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLConnectionStatusToCompression(ssl.connection_status()); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (compression_id) { 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char *compression; 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::SSLCompressionToString(&compression, compression_id); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringFUTF16( 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_COMPRESSION_DETAILS, 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASCIIToUTF16(compression)); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_NO_COMPRESSION); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (did_fallback) { 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // For now, only SSLv3 fallback will trigger a warning icon. 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick state = SECTION_STATE_ERROR; 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_FALLBACK_MESSAGE); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (no_renegotiation) { 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += ASCIIToUTF16("\n\n"); 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch description += l10n_util::GetStringUTF16( 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_RENEGOTIATION_MESSAGE); 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!description.empty()) { 2373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick sections_.push_back(SectionInfo( 2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick state, 2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick l10n_util::GetStringUTF16(IDS_PAGE_INFO_SECURITY_TAB_CONNECTION_TITLE), 2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick headline, 2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick description, 2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_CONNECTION)); 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Request the number of visits. 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HistoryService* history = profile->GetHistoryService( 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile::EXPLICIT_ACCESS); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (show_history && history) { 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history->GetVisitCountToHost( 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url, 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &request_consumer_, 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewCallback(this, &PageInfoModel::OnGotVisitCountToHost)); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickPageInfoModel::~PageInfoModel() { 2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint PageInfoModel::GetSectionCount() { 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return sections_.size(); 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochPageInfoModel::SectionInfo PageInfoModel::GetSectionInfo(int index) { 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(index < static_cast<int>(sections_.size())); 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return sections_[index]; 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PageInfoModel::OnGotVisitCountToHost(HistoryService::Handle handle, 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool found_visits, 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int count, 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time first_visit) { 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!found_visits) { 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This indicates an error, such as the page wasn't http/https; do nothing. 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return; 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool visited_before_today = false; 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (count) { 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time today = base::Time::Now().LocalMidnight(); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::Time first_visit_midnight = first_visit.LocalMidnight(); 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch visited_before_today = (first_visit_midnight < today); 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // We only show the Site Information heading for the new dialogs. 2853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 title; 2863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const CommandLine* command_line(CommandLine::ForCurrentProcess()); 2873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (command_line->HasSwitch(switches::kEnableNewPageInfoBubble)) 2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick title = l10n_util::GetStringUTF16(IDS_PAGE_INFO_SITE_INFO_TITLE); 2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!visited_before_today) { 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_STATE_ERROR, 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16( 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_PERSONAL_HISTORY_TITLE), 2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick title, 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16( 2973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick IDS_PAGE_INFO_SECURITY_TAB_FIRST_VISITED_TODAY), 2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_FIRST_VISIT)); 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sections_.push_back(SectionInfo( 3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_STATE_OK, 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringUTF16( 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_PERSONAL_HISTORY_TITLE), 3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick title, 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch l10n_util::GetStringFUTF16( 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_PAGE_INFO_SECURITY_TAB_VISITED_BEFORE_TODAY, 3073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WideToUTF16(base::TimeFormatShortDate(first_visit))), 3083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SECTION_INFO_FIRST_VISIT)); 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch observer_->ModelChanged(); 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid PageInfoModel::RegisterPrefs(PrefService* prefs) { 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefs->RegisterDictionaryPref(prefs::kPageInfoWindowPlacement); 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 3173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickPageInfoModel::PageInfoModel() { 3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 320