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) ¬_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) ¬_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