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