15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/options/certificate_manager_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"  // for FileAccessProvider
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/i18n/string_compare.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/id_map.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/safe_strerror_posix.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/certificate_viewer.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/policy/browser_policy_connector.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/certificate_dialogs.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_select_file_policy.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/crypto_module_password_dialog.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/crypto_module.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "net/cert/cert_trust_anchor_provider.h"
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/cert/x509_certificate.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/cryptohome_client.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kKeyId[] = "id";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kSubNodesId[] = "subnodes";
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kNameId[] = "name";
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kReadOnlyId[] = "readonly";
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kUntrustedId[] = "untrusted";
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kExtractableId[] = "extractable";
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kSecurityDeviceId[] = "device";
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kErrorId[] = "error";
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static const char kPolicyTrustedId[] = "policy";
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enumeration of different callers of SelectFile.  (Start counting at 1 so
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if SelectFile is accidentally called with params=NULL it won't match any.)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPORT_PERSONAL_FILE_SELECTED = 1,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IMPORT_PERSONAL_FILE_SELECTED,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IMPORT_SERVER_FILE_SELECTED,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IMPORT_CA_FILE_SELECTED,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string OrgNameToId(const std::string& org) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return "org-" + org;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool CallbackArgsToBool(const ListValue* args, int index, bool* result) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string string_value;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(index, &string_value))
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *result = string_value[0] == 't';
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct DictionaryIdComparator {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit DictionaryIdComparator(icu::Collator* collator)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : collator_(collator) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator()(const Value* a,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const Value* b) const {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(a->GetType() == Value::TYPE_DICTIONARY);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(b->GetType() == Value::TYPE_DICTIONARY);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DictionaryValue* a_dict = reinterpret_cast<const DictionaryValue*>(a);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DictionaryValue* b_dict = reinterpret_cast<const DictionaryValue*>(b);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 a_str;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 b_str;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    a_dict->GetString(kNameId, &a_str);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    b_dict->GetString(kNameId, &b_str);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (collator_ == NULL)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return a_str < b_str;
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return base::i18n::CompareString16WithCollator(
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        collator_, a_str, b_str) == UCOL_LESS;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icu::Collator* collator_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string NetErrorToString(int net_error) {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (net_error) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(mattm): handle more cases.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case net::ERR_IMPORT_CA_CERT_NOT_CA:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF8(IDS_CERT_MANAGER_ERROR_NOT_CA);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case net::ERR_IMPORT_CERT_ALREADY_EXISTS:
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF8(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_CERT_MANAGER_ERROR_CERT_ALREADY_EXISTS);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Struct to bind the Equals member function to an object for use in find_if.
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct CertEquals {
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  explicit CertEquals(const net::X509Certificate* cert) : cert_(cert) {}
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool operator()(const scoped_refptr<net::X509Certificate> cert) const {
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return cert_->Equals(cert.get());
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const net::X509Certificate* cert_;
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_CHROMEOS)
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)net::CertificateList CopyPolicyWebTrustCerts(
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    net::CertTrustAnchorProvider* provider) {
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Return a copy.
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return provider->GetAdditionalTrustAnchors();
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void RetrievePolicyWebTrustCerts(
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::Callback<void(const net::CertificateList&)> on_completion) {
132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  net::CertTrustAnchorProvider* provider =
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      g_browser_process->browser_policy_connector()->
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          GetCertTrustAnchorProvider();
135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Retrieve the anchors on the IO thread.
136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  BrowserThread::PostTaskAndReplyWithResult(
137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      BrowserThread::IO, FROM_HERE,
138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(&CopyPolicyWebTrustCerts, base::Unretained(provider)),
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      on_completion);
140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
143868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Determine whether a certificate was stored with web trust by a policy.
144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool IsPolicyInstalledWithWebTrust(
145868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const net::CertificateList& web_trust_certs,
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    net::X509Certificate* cert) {
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return std::find_if(web_trust_certs.begin(), web_trust_certs.end(),
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                      CertEquals(cert)) != web_trust_certs.end();
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace options {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  CertIdMap
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CertIdMap {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertIdMap() {}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~CertIdMap() {}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string CertToId(net::X509Certificate* cert);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::X509Certificate* IdToCert(const std::string& id);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::X509Certificate* CallbackArgsToCert(const base::ListValue* args);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<net::X509Certificate*, int32> CertMap;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates an ID for cert and looks up the cert for an ID.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IDMap<net::X509Certificate>id_map_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Finds the ID for a cert.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertMap cert_map_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CertIdMap);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string CertIdMap::CertToId(net::X509Certificate* cert) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertMap::const_iterator iter = cert_map_.find(cert);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (iter != cert_map_.end())
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::IntToString(iter->second);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 new_id = id_map_.Add(cert);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cert_map_[cert] = new_id;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::IntToString(new_id);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::X509Certificate* CertIdMap::IdToCert(const std::string& id) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 cert_id = 0;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!base::StringToInt(id, &cert_id))
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return id_map_.Lookup(cert_id);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)net::X509Certificate* CertIdMap::CallbackArgsToCert(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* args) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string node_id;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(0, &node_id))
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::X509Certificate* cert = IdToCert(node_id);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cert) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cert;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  FileAccessProvider
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mattm): Move to some shared location?
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FileAccessProvider
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public base::RefCountedThreadSafe<FileAccessProvider> {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The first parameter is 0 on success or errno on failure. The second
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // parameter is read result.
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(const int*, const std::string*)> ReadCallback;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The first parameter is 0 on success or errno on failure. The second
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // parameter is the number of bytes written on success.
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef base::Callback<void(const int*, const int*)> WriteCallback;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId StartRead(const base::FilePath& path,
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const ReadCallback& callback,
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          CancelableTaskTracker* tracker);
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelableTaskTracker::TaskId StartWrite(const base::FilePath& path,
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           const std::string& data,
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           const WriteCallback& callback,
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                           CancelableTaskTracker* tracker);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<FileAccessProvider>;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~FileAccessProvider() {}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reads file at |path|. |saved_errno| is 0 on success or errno on failure.
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // When success, |data| has file content.
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoRead(const base::FilePath& path,
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              int* saved_errno,
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              std::string* data);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Writes data to file at |path|. |saved_errno| is 0 on success or errno on
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // failure. When success, |bytes_written| has number of bytes written.
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DoWrite(const base::FilePath& path,
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               const std::string& data,
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               int* saved_errno,
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               int* bytes_written);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId FileAccessProvider::StartRead(
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path,
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ReadCallback& callback,
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CancelableTaskTracker* tracker) {
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Owned by reply callback posted below.
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int* saved_errno = new int(0);
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string* data = new std::string();
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Post task to file thread to read file.
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return tracker->PostTaskAndReply(
2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE).get(),
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&FileAccessProvider::DoRead, this, path, saved_errno, data),
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(callback, base::Owned(saved_errno), base::Owned(data)));
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelableTaskTracker::TaskId FileAccessProvider::StartWrite(
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& data,
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const WriteCallback& callback,
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CancelableTaskTracker* tracker) {
2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Owned by reply callback posted below.
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int* saved_errno = new int(0);
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int* bytes_written = new int(0);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Post task to file thread to write file.
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return tracker->PostTaskAndReply(
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE).get(),
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FROM_HERE,
2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(&FileAccessProvider::DoWrite,
2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 this,
2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 path,
2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 data,
2857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 saved_errno,
2867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 bytes_written),
2877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      base::Bind(
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          callback, base::Owned(saved_errno), base::Owned(bytes_written)));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FileAccessProvider::DoRead(const base::FilePath& path,
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                int* saved_errno,
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                std::string* data) {
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool success = file_util::ReadFileToString(path, data);
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *saved_errno = success ? 0 : errno;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FileAccessProvider::DoWrite(const base::FilePath& path,
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const std::string& data,
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 int* saved_errno,
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 int* bytes_written) {
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *bytes_written = file_util::WriteFile(path, data.data(), data.size());
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  *saved_errno = bytes_written >= 0 ? 0 : errno;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  CertificateManagerHandler
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CertificateManagerHandler::CertificateManagerHandler()
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : use_hardware_backed_(false),
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_access_provider_(new FileAccessProvider()),
312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_ptr_factory_(this),
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cert_id_map_(new CertIdMap) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  certificate_manager_model_.reset(new CertificateManagerModel(this));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CertificateManagerHandler::~CertificateManagerHandler() {
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::GetLocalizedValues(
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* localized_strings) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(localized_strings);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "certificateManagerPage",
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_CERTIFICATE_MANAGER_TITLE);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tabs.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("personalCertsTabTitle",
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_PERSONAL_CERTS_TAB_LABEL));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("serverCertsTabTitle",
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_SERVER_CERTS_TAB_LABEL));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("caCertsTabTitle",
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_CERT_AUTHORITIES_TAB_LABEL));
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("unknownCertsTabTitle",
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_UNKNOWN_TAB_LABEL));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tab descriptions.
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("personalCertsTabDescription",
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_USER_TREE_DESCRIPTION));
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("serverCertsTabDescription",
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_SERVER_TREE_DESCRIPTION));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("caCertsTabDescription",
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_AUTHORITIES_TREE_DESCRIPTION));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("unknownCertsTabDescription",
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_UNKNOWN_TREE_DESCRIPTION));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Buttons.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("view_certificate",
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_VIEW_CERT_BUTTON));
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("import_certificate",
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_IMPORT_BUTTON));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("export_certificate",
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EXPORT_BUTTON));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("edit_certificate",
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EDIT_BUTTON));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("delete_certificate",
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_BUTTON));
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Certificate Delete overlay strings.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("personalCertsTabDeleteConfirm",
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_USER_FORMAT));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("personalCertsTabDeleteImpact",
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_USER_DESCRIPTION));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("serverCertsTabDeleteConfirm",
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_SERVER_FORMAT));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("serverCertsTabDeleteImpact",
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_SERVER_DESCRIPTION));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("caCertsTabDeleteConfirm",
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_CA_FORMAT));
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("caCertsTabDeleteImpact",
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_CA_DESCRIPTION));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("unknownCertsTabDeleteConfirm",
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_UNKNOWN_FORMAT));
374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  localized_strings->SetString("unknownCertsTabDeleteImpact", std::string());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Certificate Restore overlay strings.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateRestorePasswordDescription",
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_RESTORE_PASSWORD_DESC));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificatePasswordLabel",
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_PASSWORD_LABEL));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Personal Certificate Export overlay strings.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateExportPasswordDescription",
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EXPORT_PASSWORD_DESC));
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateExportPasswordHelp",
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EXPORT_PASSWORD_HELP));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateConfirmPasswordLabel",
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_CONFIRM_PASSWORD_LABEL));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Edit CA Trust & Import CA overlay strings.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateEditCaTitle",
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EDIT_CA_TITLE));
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateEditTrustLabel",
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EDIT_TRUST_LABEL));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateEditCaTrustDescriptionFormat",
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_CERT_MANAGER_EDIT_CA_TRUST_DESCRIPTION_FORMAT));
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateImportCaDescriptionFormat",
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_CERT_MANAGER_IMPORT_CA_DESCRIPTION_FORMAT));
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateCaTrustSSLLabel",
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EDIT_CA_TRUST_SSL_LABEL));
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateCaTrustEmailLabel",
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EDIT_CA_TRUST_EMAIL_LABEL));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateCaTrustObjSignLabel",
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EDIT_CA_TRUST_OBJSIGN_LABEL));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("certificateImportErrorFormat",
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_IMPORT_ERROR_FORMAT));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Badges next to certificates
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("badgeCertUntrusted",
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_UNTRUSTED));
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  localized_strings->SetString("certPolicyInstalled",
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_POLICY_INSTALLED));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("importAndBindCertificate",
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_IMPORT_AND_BIND_BUTTON));
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("hardwareBackedKeyFormat",
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_HARDWARE_BACKED_KEY_FORMAT));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("chromeOSDeviceName",
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_HARDWARE_BACKED));
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_CHROMEOS)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::RegisterMessages() {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "viewCertificate",
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::View, base::Unretained(this)));
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "getCaCertificateTrust",
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::GetCATrust,
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "editCaCertificateTrust",
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::EditCATrust,
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "editServerCertificate",
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::EditServer,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "cancelImportExportCertificate",
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::CancelImportExportProcess,
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "exportPersonalCertificate",
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ExportPersonal,
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "exportAllPersonalCertificates",
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ExportAllPersonal,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "exportPersonalCertificatePasswordSelected",
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ExportPersonalPasswordSelected,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "importPersonalCertificate",
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::StartImportPersonal,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "importPersonalCertificatePasswordSelected",
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ImportPersonalPasswordSelected,
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "importCaCertificate",
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ImportCA,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "importCaCertificateTrustSelected",
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ImportCATrustSelected,
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "importServerCertificate",
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ImportServer,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "exportCertificate",
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::Export,
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "deleteCertificate",
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::Delete,
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "populateCertificateManager",
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::Populate,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback(
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "checkTpmTokenReady",
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::CheckTpmTokenReady,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::CertificatesRefreshed() {
510868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined(OS_CHROMEOS)
511868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  RetrievePolicyWebTrustCerts(
512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::OnPolicyWebTrustCertsRetrieved,
513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#else
515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  OnPolicyWebTrustCertsRetrieved(net::CertificateList());
516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CertificateManagerHandler::FileSelected(const base::FilePath& path,
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                             int index,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             void* params) {
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (reinterpret_cast<intptr_t>(params)) {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EXPORT_PERSONAL_FILE_SELECTED:
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExportPersonalFileSelected(path);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IMPORT_PERSONAL_FILE_SELECTED:
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ImportPersonalFileSelected(path);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IMPORT_SERVER_FILE_SELECTED:
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ImportServerFileSelected(path);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IMPORT_CA_FILE_SELECTED:
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ImportCAFileSelected(path);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::FileSelectionCanceled(void* params) {
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (reinterpret_cast<intptr_t>(params)) {
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case EXPORT_PERSONAL_FILE_SELECTED:
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IMPORT_PERSONAL_FILE_SELECTED:
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IMPORT_SERVER_FILE_SELECTED:
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case IMPORT_CA_FILE_SELECTED:
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ImportExportCleanup();
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::View(const ListValue* args) {
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cert)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCertificateViewer(web_ui()->GetWebContents(), GetParentWindow(), cert);
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::GetCATrust(const ListValue* args) {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cert) {
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("CertificateEditCaTrustOverlay.dismiss");
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::NSSCertDatabase::TrustBits trust_bits =
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      certificate_manager_model_->cert_db()->GetCertTrust(cert, net::CA_CERT);
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue ssl_value(
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<bool>(trust_bits & net::NSSCertDatabase::TRUSTED_SSL));
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue email_value(
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<bool>(trust_bits & net::NSSCertDatabase::TRUSTED_EMAIL));
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue obj_sign_value(
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<bool>(trust_bits & net::NSSCertDatabase::TRUSTED_OBJ_SIGN));
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "CertificateEditCaTrustOverlay.populateTrust",
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ssl_value, email_value, obj_sign_value);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::EditCATrust(const ListValue* args) {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fail = !cert;
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool trust_ssl = false;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool trust_email = false;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool trust_obj_sign = false;
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fail |= !CallbackArgsToBool(args, 1, &trust_ssl);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fail |= !CallbackArgsToBool(args, 2, &trust_email);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fail |= !CallbackArgsToBool(args, 3, &trust_obj_sign);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fail) {
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "EditCATrust args fail";
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("CertificateEditCaTrustOverlay.dismiss");
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = certificate_manager_model_->SetCertTrust(
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cert,
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::CA_CERT,
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trust_ssl * net::NSSCertDatabase::TRUSTED_SSL +
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          trust_email * net::NSSCertDatabase::TRUSTED_EMAIL +
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          trust_obj_sign * net::NSSCertDatabase::TRUSTED_OBJ_SIGN);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("CertificateEditCaTrustOverlay.dismiss");
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result) {
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(mattm): better error messages?
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowError(
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_SET_TRUST_ERROR_TITLE),
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR));
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::EditServer(const ListValue* args) {
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ExportPersonal(const ListValue* args) {
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cert)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selected_cert_list_.push_back(cert);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SelectFileDialog::FileTypeInfo file_type_info;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions.resize(1);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("p12"));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extension_description_overrides.push_back(
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_PKCS12_FILES));
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.include_all_files = true;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_ = ui::SelectFileDialog::Create(
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, new ChromeSelectFilePolicy(web_ui()->GetWebContents()));
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_->SelectFile(
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SelectFileDialog::SELECT_SAVEAS_FILE, string16(),
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(), &file_type_info, 1, FILE_PATH_LITERAL("p12"),
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetParentWindow(),
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<void*>(EXPORT_PERSONAL_FILE_SELECTED));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ExportAllPersonal(const ListValue* args) {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ExportPersonalFileSelected(
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) {
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_path_ = path;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "CertificateManager.exportPersonalAskPassword");
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ExportPersonalPasswordSelected(
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* args) {
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(0, &password_)) {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("CertificateRestoreOverlay.dismiss");
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportExportCleanup();
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently, we don't support exporting more than one at a time.  If we do,
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this would need to either change this to use UnlockSlotsIfNecessary or
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // change UnlockCertSlotIfNecessary to take a CertificateList.
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_EQ(selected_cert_list_.size(), 1U);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(mattm): do something smarter about non-extractable keys
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::UnlockCertSlotIfNecessary(
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_cert_list_[0].get(),
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::kCryptoModulePasswordCertExport,
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::string(),  // unused.
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ExportPersonalSlotsUnlocked,
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ExportPersonalSlotsUnlocked() {
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string output;
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_exported = certificate_manager_model_->cert_db()->ExportToPKCS12(
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_cert_list_,
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      password_,
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &output);
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!num_exported) {
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("CertificateRestoreOverlay.dismiss");
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowError(
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_PKCS12_EXPORT_ERROR_TITLE),
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR));
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportExportCleanup();
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_access_provider_->StartWrite(
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_path_,
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output,
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ExportPersonalFileWritten,
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)),
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &tracker_);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CertificateManagerHandler::ExportPersonalFileWritten(
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int* write_errno, const int* bytes_written) {
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("CertificateRestoreOverlay.dismiss");
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImportExportCleanup();
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (*write_errno) {
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowError(
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_PKCS12_EXPORT_ERROR_TITLE),
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringFUTF8(IDS_CERT_MANAGER_WRITE_ERROR_FORMAT,
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  UTF8ToUTF16(safe_strerror(*write_errno))));
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::StartImportPersonal(const ListValue* args) {
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SelectFileDialog::FileTypeInfo file_type_info;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetBoolean(0, &use_hardware_backed_)) {
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Unable to retrieve the hardware backed attribute from the args,
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // so bail.
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("CertificateRestoreOverlay.dismiss");
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportExportCleanup();
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions.resize(1);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("p12"));
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.extension_description_overrides.push_back(
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_CERT_MANAGER_PKCS12_FILES));
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_type_info.include_all_files = true;
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_ = ui::SelectFileDialog::Create(
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, new ChromeSelectFilePolicy(web_ui()->GetWebContents()));
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_->SelectFile(
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SelectFileDialog::SELECT_OPEN_FILE, string16(),
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(), &file_type_info, 1, FILE_PATH_LITERAL("p12"),
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetParentWindow(),
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<void*>(IMPORT_PERSONAL_FILE_SELECTED));
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ImportPersonalFileSelected(
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) {
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_path_ = path;
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "CertificateManager.importPersonalAskPassword");
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ImportPersonalPasswordSelected(
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* args) {
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!args->GetString(0, &password_)) {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("CertificateRestoreOverlay.dismiss");
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportExportCleanup();
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_access_provider_->StartRead(
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_path_,
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ImportPersonalFileRead,
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)),
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &tracker_);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ImportPersonalFileRead(
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int* read_errno, const std::string* data) {
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (*read_errno) {
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportExportCleanup();
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("CertificateRestoreOverlay.dismiss");
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowError(
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_PKCS12_IMPORT_ERROR_TITLE),
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringFUTF8(IDS_CERT_MANAGER_READ_ERROR_FORMAT,
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  UTF8ToUTF16(safe_strerror(*read_errno))));
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  file_data_ = *data;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (use_hardware_backed_) {
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    module_ = certificate_manager_model_->cert_db()->GetPrivateModule();
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    module_ = certificate_manager_model_->cert_db()->GetPublicModule();
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::CryptoModuleList modules;
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modules.push_back(module_);
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::UnlockSlotsIfNecessary(
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      modules,
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::kCryptoModulePasswordCertImport,
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::string(),  // unused.
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ImportPersonalSlotUnlocked,
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ImportPersonalSlotUnlocked() {
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Determine if the private key should be unextractable after the import.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We do this by checking the value of |use_hardware_backed_| which is set
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to true if importing into a hardware module. Currently, this only happens
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for Chrome OS when the "Import and Bind" option is chosen.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_extractable = !use_hardware_backed_;
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = certificate_manager_model_->ImportFromPKCS12(
784868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      module_.get(), file_data_, password_, is_extractable);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImportExportCleanup();
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("CertificateRestoreOverlay.dismiss");
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int string_id;
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (result) {
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case net::OK:
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case net::ERR_PKCS12_IMPORT_BAD_PASSWORD:
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // TODO(mattm): if the error was a bad password, we should reshow the
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // password dialog after the user dismisses the error dialog.
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string_id = IDS_CERT_MANAGER_BAD_PASSWORD;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case net::ERR_PKCS12_IMPORT_INVALID_MAC:
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string_id = IDS_CERT_MANAGER_PKCS12_IMPORT_INVALID_MAC;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case net::ERR_PKCS12_IMPORT_INVALID_FILE:
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string_id = IDS_CERT_MANAGER_PKCS12_IMPORT_INVALID_FILE;
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case net::ERR_PKCS12_IMPORT_UNSUPPORTED:
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string_id = IDS_CERT_MANAGER_PKCS12_IMPORT_UNSUPPORTED;
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string_id = IDS_CERT_MANAGER_UNKNOWN_ERROR;
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowError(
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF8(IDS_CERT_MANAGER_PKCS12_IMPORT_ERROR_TITLE),
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF8(string_id));
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::CancelImportExportProcess(
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ListValue* args) {
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImportExportCleanup();
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ImportExportCleanup() {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_path_.clear();
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password_.clear();
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_data_.clear();
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  use_hardware_backed_ = false;
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selected_cert_list_.clear();
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  module_ = NULL;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There may be pending file dialogs, we need to tell them that we've gone
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // away so they don't try and call back to us.
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (select_file_dialog_.get())
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    select_file_dialog_->ListenerDestroyed();
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_ = NULL;
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ImportServer(const ListValue* args) {
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_ = ui::SelectFileDialog::Create(
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, new ChromeSelectFilePolicy(web_ui()->GetWebContents()));
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCertSelectFileDialog(
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      select_file_dialog_.get(),
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::SelectFileDialog::SELECT_OPEN_FILE,
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetParentWindow(),
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reinterpret_cast<void*>(IMPORT_SERVER_FILE_SELECTED));
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CertificateManagerHandler::ImportServerFileSelected(
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) {
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_path_ = path;
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_access_provider_->StartRead(
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_path_,
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ImportServerFileRead,
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)),
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &tracker_);
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CertificateManagerHandler::ImportServerFileRead(const int* read_errno,
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                     const std::string* data) {
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (*read_errno) {
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportExportCleanup();
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowError(
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_SERVER_IMPORT_ERROR_TITLE),
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringFUTF8(IDS_CERT_MANAGER_READ_ERROR_FORMAT,
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  UTF8ToUTF16(safe_strerror(*read_errno))));
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selected_cert_list_ = net::X509Certificate::CreateCertificateListFromBytes(
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          data->data(), data->size(), net::X509Certificate::FORMAT_AUTO);
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selected_cert_list_.empty()) {
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportExportCleanup();
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowError(
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_SERVER_IMPORT_ERROR_TITLE),
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CERT_PARSE_ERROR));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::NSSCertDatabase::ImportCertFailureList not_imported;
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(mattm): Add UI for trust. http://crbug.com/76274
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = certificate_manager_model_->ImportServerCert(
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_cert_list_,
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      net::NSSCertDatabase::TRUST_DEFAULT,
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &not_imported);
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result) {
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowError(
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_SERVER_IMPORT_ERROR_TITLE),
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR));
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (!not_imported.empty()) {
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowImportErrors(
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_SERVER_IMPORT_ERROR_TITLE),
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        not_imported);
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImportExportCleanup();
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ImportCA(const ListValue* args) {
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  select_file_dialog_ = ui::SelectFileDialog::Create(
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this, new ChromeSelectFilePolicy(web_ui()->GetWebContents()));
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCertSelectFileDialog(select_file_dialog_.get(),
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ui::SelectFileDialog::SELECT_OPEN_FILE,
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           base::FilePath(),
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           GetParentWindow(),
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           reinterpret_cast<void*>(IMPORT_CA_FILE_SELECTED));
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CertificateManagerHandler::ImportCAFileSelected(
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::FilePath& path) {
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_path_ = path;
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file_access_provider_->StartRead(
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      file_path_,
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::ImportCAFileRead,
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)),
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &tracker_);
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CertificateManagerHandler::ImportCAFileRead(const int* read_errno,
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                const std::string* data) {
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (*read_errno) {
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportExportCleanup();
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowError(
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CA_IMPORT_ERROR_TITLE),
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringFUTF8(IDS_CERT_MANAGER_READ_ERROR_FORMAT,
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  UTF8ToUTF16(safe_strerror(*read_errno))));
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selected_cert_list_ = net::X509Certificate::CreateCertificateListFromBytes(
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          data->data(), data->size(), net::X509Certificate::FORMAT_AUTO);
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selected_cert_list_.empty()) {
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportExportCleanup();
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowError(
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CA_IMPORT_ERROR_TITLE),
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CERT_PARSE_ERROR));
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::X509Certificate> root_cert =
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      certificate_manager_model_->cert_db()->FindRootInList(
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          selected_cert_list_);
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(mattm): check here if root_cert is not a CA cert and show error.
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringValue cert_name(root_cert->subject().GetDisplayName());
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("CertificateEditCaTrustOverlay.showImport",
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   cert_name);
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ImportCATrustSelected(const ListValue* args) {
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fail = false;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool trust_ssl = false;
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool trust_email = false;
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool trust_obj_sign = false;
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fail |= !CallbackArgsToBool(args, 0, &trust_ssl);
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fail |= !CallbackArgsToBool(args, 1, &trust_email);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fail |= !CallbackArgsToBool(args, 2, &trust_obj_sign);
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (fail) {
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOG(ERROR) << "ImportCATrustSelected args fail";
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportExportCleanup();
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("CertificateEditCaTrustOverlay.dismiss");
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(mattm): add UI for setting explicit distrust, too.
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // http://crbug.com/128411
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::NSSCertDatabase::ImportCertFailureList not_imported;
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = certificate_manager_model_->ImportCACerts(
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_cert_list_,
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      trust_ssl * net::NSSCertDatabase::TRUSTED_SSL +
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          trust_email * net::NSSCertDatabase::TRUSTED_EMAIL +
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          trust_obj_sign * net::NSSCertDatabase::TRUSTED_OBJ_SIGN,
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &not_imported);
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("CertificateEditCaTrustOverlay.dismiss");
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result) {
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowError(
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CA_IMPORT_ERROR_TITLE),
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR));
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (!not_imported.empty()) {
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowImportErrors(
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CA_IMPORT_ERROR_TITLE),
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        not_imported);
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImportExportCleanup();
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::Export(const ListValue* args) {
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args);
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cert)
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowCertExportDialog(web_ui()->GetWebContents(), GetParentWindow(),
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       cert->os_cert_handle());
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::Delete(const ListValue* args) {
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::X509Certificate* cert = cert_id_map_->CallbackArgsToCert(args);
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cert)
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = certificate_manager_model_->Delete(cert);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result) {
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(mattm): better error messages?
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ShowError(
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_DELETE_CERT_ERROR_TITLE),
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR));
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::Populate(const ListValue* args) {
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  certificate_manager_model_->Refresh();
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1008868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void CertificateManagerHandler::PopulateTree(
1009868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const std::string& tab_name,
1010868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    net::CertType type,
1011868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const net::CertificateList& web_trust_certs) {
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string tree_name = tab_name + "-tree";
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<icu::Collator> collator;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UErrorCode error = U_ZERO_ERROR;
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  collator.reset(
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      icu::Collator::createInstance(
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          icu::Locale(g_browser_process->GetApplicationLocale().c_str()),
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          error));
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (U_FAILURE(error))
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    collator.reset(NULL);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DictionaryIdComparator comparator(collator.get());
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CertificateManagerModel::OrgGroupingMap map;
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  certificate_manager_model_->FilterAndBuildOrgGroupingMap(type, &map);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* nodes = new ListValue;
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (CertificateManagerModel::OrgGroupingMap::iterator i = map.begin();
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         i != map.end(); ++i) {
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Populate first level (org name).
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DictionaryValue* dict = new DictionaryValue;
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kKeyId, OrgNameToId(i->first));
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->SetString(kNameId, i->first);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Populate second level (certs).
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ListValue* subnodes = new ListValue;
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (net::CertificateList::const_iterator org_cert_it = i->second.begin();
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           org_cert_it != i->second.end(); ++org_cert_it) {
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DictionaryValue* cert_dict = new DictionaryValue;
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        net::X509Certificate* cert = org_cert_it->get();
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cert_dict->SetString(kKeyId, cert_id_map_->CertToId(cert));
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cert_dict->SetString(kNameId, certificate_manager_model_->GetColumnText(
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *cert, CertificateManagerModel::COL_SUBJECT_NAME));
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cert_dict->SetBoolean(
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            kReadOnlyId,
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            certificate_manager_model_->cert_db()->IsReadOnly(cert));
1048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        // Policy-installed certificates with web trust are trusted.
1049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        bool policy_trusted =
1050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            IsPolicyInstalledWithWebTrust(web_trust_certs, cert);
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cert_dict->SetBoolean(
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            kUntrustedId,
1053868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            !policy_trusted &&
1054868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                certificate_manager_model_->cert_db()->IsUntrusted(cert));
1055868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        cert_dict->SetBoolean(kPolicyTrustedId, policy_trusted);
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO(hshi): This should be determined by testing for PKCS #11
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // CKA_EXTRACTABLE attribute. We may need to use the NSS function
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // PK11_ReadRawAttribute to do that.
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        cert_dict->SetBoolean(
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            kExtractableId,
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            !certificate_manager_model_->IsHardwareBacked(cert));
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // TODO(mattm): Other columns.
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        subnodes->Append(cert_dict);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::sort(subnodes->begin(), subnodes->end(), comparator);
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dict->Set(kSubNodesId, subnodes);
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nodes->Append(dict);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::sort(nodes->begin(), nodes->end(), comparator);
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue args;
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    args.Append(new base::StringValue(tree_name));
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    args.Append(nodes);
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_ui()->CallJavascriptFunction("CertificateManager.onPopulateTree", args);
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1079868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void CertificateManagerHandler::OnPolicyWebTrustCertsRetrieved(
1080868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const net::CertificateList& web_trust_certs) {
1081868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PopulateTree("personalCertsTab", net::USER_CERT, web_trust_certs);
1082868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PopulateTree("serverCertsTab", net::SERVER_CERT, web_trust_certs);
1083868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PopulateTree("caCertsTab", net::CA_CERT, web_trust_certs);
1084868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  PopulateTree("otherCertsTab", net::UNKNOWN_CERT, web_trust_certs);
1085868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  VLOG(1) << "populating finished";
1086868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
1087868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ShowError(const std::string& title,
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const std::string& error) const {
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedVector<const Value> args;
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  args.push_back(new base::StringValue(title));
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  args.push_back(new base::StringValue(error));
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  args.push_back(new base::StringValue(l10n_util::GetStringUTF8(IDS_OK)));
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args.push_back(Value::CreateNullValue());  // cancelTitle
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args.push_back(Value::CreateNullValue());  // okCallback
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  args.push_back(Value::CreateNullValue());  // cancelCallback
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("AlertOverlay.show", args.get());
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::ShowImportErrors(
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& title,
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::NSSCertDatabase::ImportCertFailureList& not_imported) const {
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error;
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selected_cert_list_.size() == 1)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error = l10n_util::GetStringUTF8(
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IDS_CERT_MANAGER_IMPORT_SINGLE_NOT_IMPORTED);
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (not_imported.size() == selected_cert_list_.size())
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error = l10n_util::GetStringUTF8(IDS_CERT_MANAGER_IMPORT_ALL_NOT_IMPORTED);
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error = l10n_util::GetStringUTF8(IDS_CERT_MANAGER_IMPORT_SOME_NOT_IMPORTED);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue cert_error_list;
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < not_imported.size(); ++i) {
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const net::NSSCertDatabase::ImportCertFailure& failure = not_imported[i];
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* dict = new DictionaryValue;
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString(kNameId, failure.certificate->subject().GetDisplayName());
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    dict->SetString(kErrorId, NetErrorToString(failure.net_error));
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cert_error_list.Append(dict);
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringValue title_value(title);
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StringValue error_value(error);
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("CertificateImportErrorOverlay.show",
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   title_value,
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   error_value,
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   cert_error_list);
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::CheckTpmTokenReady(const ListValue* args) {
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chromeos::CryptohomeClient* cryptohome_client =
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chromeos::DBusThreadManager::Get()->GetCryptohomeClient();
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cryptohome_client->Pkcs11IsTpmTokenReady(
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CertificateManagerHandler::CheckTpmTokenReadyInternal,
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CertificateManagerHandler::CheckTpmTokenReadyInternal(
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chromeos::DBusMethodCallStatus call_status,
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_tpm_token_ready) {
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue ready(
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      call_status == chromeos::DBUS_METHOD_CALL_SUCCESS && is_tpm_token_ready);
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("CertificateManager.onCheckTpmTokenReady",
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   ready);
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow CertificateManagerHandler::GetParentWindow() const {
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_ui()->GetWebContents()->GetView()->GetTopLevelNativeWindow();
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace options
1153