172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be 3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file. 4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/certificate_manager_handler.h" 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/file_util.h" // for FileAccessProvider 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_vector.h" 9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/safe_strerror_posix.h" 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string_number_conversions.h" 11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/values.h" 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/browser_process.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/crypto_module_password_dialog.h" 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/certificate_dialogs.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" // for FileAccessProvider 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/certificate_viewer.h" 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents_view.h" 19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "grit/generated_resources.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "net/base/crypto_module.h" 21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "net/base/x509_certificate.h" 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util_collator.h" 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS) 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h" 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/cryptohome_library.h" 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknamespace { 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const char kKeyId[] = "id"; 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const char kSubNodesId[] = "subnodes"; 34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const char kNameId[] = "name"; 35513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstatic const char kReadOnlyId[] = "readonly"; 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const char kIconId[] = "icon"; 37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const char kSecurityDeviceId[] = "device"; 38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstatic const char kErrorId[] = "error"; 39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Enumeration of different callers of SelectFile. (Start counting at 1 so 41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// if SelectFile is accidentally called with params=NULL it won't match any.) 42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickenum { 43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPORT_PERSONAL_FILE_SELECTED = 1, 44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IMPORT_PERSONAL_FILE_SELECTED, 45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IMPORT_SERVER_FILE_SELECTED, 46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IMPORT_CA_FILE_SELECTED, 47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// TODO(mattm): These are duplicated from cookies_view_handler.cc 50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Encodes a pointer value into a hex string. 51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string PointerToHexString(const void* pointer) { 52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return base::HexEncode(&pointer, sizeof(pointer)); 53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Decodes a pointer from a hex string. 56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid* HexStringToPointer(const std::string& str) { 57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::vector<uint8> buffer; 58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!base::HexStringToBytes(str, &buffer) || 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick buffer.size() != sizeof(void*)) { 60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return NULL; 61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return *reinterpret_cast<void**>(&buffer[0]); 64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string OrgNameToId(const std::string& org) { 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return "org-" + org; 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string CertToId(const net::X509Certificate& cert) { 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return "cert-" + PointerToHexString(&cert); 72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 74731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknet::X509Certificate* IdToCert(const std::string& id) { 75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!StartsWithASCII(id, "cert-", true)) 76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return NULL; 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return reinterpret_cast<net::X509Certificate*>( 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HexStringToPointer(id.substr(5))); 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merricknet::X509Certificate* CallbackArgsToCert(const ListValue* args) { 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string node_id; 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!args->GetString(0, &node_id)){ 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return NULL; 85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::X509Certificate* cert = IdToCert(node_id); 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!cert) { 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTREACHED(); 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return NULL; 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return cert; 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool CallbackArgsToBool(const ListValue* args, int index, bool* result) { 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string string_value; 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!args->GetString(index, &string_value)) 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return false; 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *result = string_value[0] == 't'; 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return true; 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstruct DictionaryIdComparator { 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick explicit DictionaryIdComparator(icu::Collator* collator) 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : collator_(collator) { 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool operator()(const Value* a, 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const Value* b) const { 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(a->GetType() == Value::TYPE_DICTIONARY); 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(b->GetType() == Value::TYPE_DICTIONARY); 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const DictionaryValue* a_dict = reinterpret_cast<const DictionaryValue*>(a); 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const DictionaryValue* b_dict = reinterpret_cast<const DictionaryValue*>(b); 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick string16 a_str; 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick string16 b_str; 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick a_dict->GetString(kNameId, &a_str); 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick b_dict->GetString(kNameId, &b_str); 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (collator_ == NULL) 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return a_str < b_str; 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return l10n_util::CompareString16WithCollator( 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick collator_, a_str, b_str) == UCOL_LESS; 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icu::Collator* collator_; 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string NetErrorToString(int net_error) { 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick switch (net_error) { 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(mattm): handle more cases. 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case net::ERR_IMPORT_CA_CERT_NOT_CA: 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return l10n_util::GetStringUTF8(IDS_CERT_MANAGER_ERROR_NOT_CA); 132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick default: 133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR); 134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} // namespace 138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick/////////////////////////////////////////////////////////////////////////////// 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// FileAccessProvider 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// TODO(mattm): Move to some shared location? 143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass FileAccessProvider 144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : public base::RefCountedThreadSafe<FileAccessProvider>, 145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public CancelableRequestProvider { 146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Reports 0 on success or errno on failure, and the data of the file upon 148731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // success. 149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(mattm): don't pass std::string by value.. could use RefCountedBytes 150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // but it's a vector. Maybe do the derive from CancelableRequest thing 151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // described in cancelable_request.h? 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick typedef Callback2<int, std::string>::Type ReadCallback; 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Reports 0 on success or errno on failure, and the number of bytes written, 155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // on success. 156731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick typedef Callback2<int, int>::Type WriteCallback; 157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Handle StartRead(const FilePath& path, 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CancelableRequestConsumerBase* consumer, 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ReadCallback* callback); 161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Handle StartWrite(const FilePath& path, 162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& data, 163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CancelableRequestConsumerBase* consumer, 164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WriteCallback* callback); 165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 166731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private: 167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void DoRead(scoped_refptr<CancelableRequest<ReadCallback> > request, 168731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath path); 169731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void DoWrite(scoped_refptr<CancelableRequest<WriteCallback> > request, 170731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath path, 171731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string data); 172731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 174731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickCancelableRequestProvider::Handle FileAccessProvider::StartRead( 175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const FilePath& path, 176731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CancelableRequestConsumerBase* consumer, 177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FileAccessProvider::ReadCallback* callback) { 178731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<CancelableRequest<ReadCallback> > request( 179731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new CancelableRequest<ReadCallback>(callback)); 180731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AddRequest(request, consumer); 181731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 182731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Send the parameters and the request to the file thread. 183731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 184731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::FILE, FROM_HERE, 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewRunnableMethod(this, &FileAccessProvider::DoRead, request, path)); 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 187731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The handle will have been set by AddRequest. 188731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return request->handle(); 189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 190731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 191731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickCancelableRequestProvider::Handle FileAccessProvider::StartWrite( 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const FilePath& path, 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& data, 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CancelableRequestConsumerBase* consumer, 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick WriteCallback* callback) { 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<CancelableRequest<WriteCallback> > request( 197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new CancelableRequest<WriteCallback>(callback)); 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AddRequest(request, consumer); 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Send the parameters and the request to the file thWrite. 201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::FILE, FROM_HERE, 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewRunnableMethod( 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick this, &FileAccessProvider::DoWrite, request, path, data)); 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The handle will have been set by AddRequest. 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return request->handle(); 208731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid FileAccessProvider::DoRead( 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<CancelableRequest<ReadCallback> > request, 212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath path) { 213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (request->canceled()) 214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string data; 217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "DoRead starting read"; 218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool success = file_util::ReadFileToString(path, &data); 219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int saved_errno = success ? 0 : errno; 220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "DoRead done read: " << success << " " << data.size(); 221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick request->ForwardResult(ReadCallback::TupleType(saved_errno, data)); 222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid FileAccessProvider::DoWrite( 225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<CancelableRequest<WriteCallback> > request, 226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath path, 227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string data) { 228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "DoWrite starting write"; 229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int bytes_written = file_util::WriteFile(path, data.data(), data.size()); 230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int saved_errno = bytes_written >= 0 ? 0 : errno; 231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "DoWrite done write " << bytes_written; 232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (request->canceled()) 234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick request->ForwardResult(WriteCallback::TupleType(saved_errno, bytes_written)); 237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick/////////////////////////////////////////////////////////////////////////////// 240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// CertificateManagerHandler 241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 242731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickCertificateManagerHandler::CertificateManagerHandler() 243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : file_access_provider_(new FileAccessProvider) { 244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick certificate_manager_model_.reset(new CertificateManagerModel(this)); 245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 247731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickCertificateManagerHandler::~CertificateManagerHandler() { 248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::GetLocalizedValues( 251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DictionaryValue* localized_strings) { 252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(localized_strings); 253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RegisterTitle(localized_strings, "certificateManagerPage", 25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen IDS_CERTIFICATE_MANAGER_TITLE); 256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Tabs. 258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("personalCertsTabTitle", 259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_PERSONAL_CERTS_TAB_LABEL)); 260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("serverCertsTabTitle", 261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_SERVER_CERTS_TAB_LABEL)); 262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("caCertsTabTitle", 263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_CERT_AUTHORITIES_TAB_LABEL)); 264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("unknownCertsTabTitle", 265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_UNKNOWN_TAB_LABEL)); 266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Tab descriptions. 268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("personalCertsTabDescription", 269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_USER_TREE_DESCRIPTION)); 270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("serverCertsTabDescription", 271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_SERVER_TREE_DESCRIPTION)); 272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("caCertsTabDescription", 273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_AUTHORITIES_TREE_DESCRIPTION)); 274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("unknownCertsTabDescription", 275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_UNKNOWN_TREE_DESCRIPTION)); 276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 277731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Tree columns. 278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certNameColumn", 279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_NAME_COLUMN_LABEL)); 280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certDeviceColumn", 281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DEVICE_COLUMN_LABEL)); 282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certSerialColumn", 283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_SERIAL_NUMBER_COLUMN_LABEL)); 284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certExpiresColumn", 285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EXPIRES_COLUMN_LABEL)); 286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Buttons. 288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("view_certificate", 289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_VIEW_CERT_BUTTON)); 290731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("import_certificate", 291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_IMPORT_BUTTON)); 292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("export_certificate", 293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EXPORT_BUTTON)); 294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("export_all_certificates", 295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EXPORT_ALL_BUTTON)); 296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("edit_certificate", 297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EDIT_BUTTON)); 298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("delete_certificate", 299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_BUTTON)); 300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Certificate Delete overlay strings. 302731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("personalCertsTabDeleteConfirm", 303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_USER_FORMAT)); 304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("personalCertsTabDeleteImpact", 305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_USER_DESCRIPTION)); 306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("serverCertsTabDeleteConfirm", 307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_SERVER_FORMAT)); 308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("serverCertsTabDeleteImpact", 309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_SERVER_DESCRIPTION)); 310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("caCertsTabDeleteConfirm", 311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_CA_FORMAT)); 312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("caCertsTabDeleteImpact", 313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_CA_DESCRIPTION)); 314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("unknownCertsTabDeleteConfirm", 315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DELETE_UNKNOWN_FORMAT)); 316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("unknownCertsTabDeleteImpact", ""); 317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Certificate Restore overlay strings. 319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificateRestorePasswordDescription", 320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_RESTORE_PASSWORD_DESC)); 321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificatePasswordLabel", 322731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_PASSWORD_LABEL)); 323731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Personal Certificate Export overlay strings. 325731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificateExportPasswordDescription", 326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EXPORT_PASSWORD_DESC)); 327731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificateExportPasswordHelp", 328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EXPORT_PASSWORD_HELP)); 329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificateConfirmPasswordLabel", 330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_CONFIRM_PASSWORD_LABEL)); 331731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Edit CA Trust & Import CA overlay strings. 333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificateEditTrustLabel", 334731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EDIT_TRUST_LABEL)); 335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificateEditCaTrustDescriptionFormat", 336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16( 337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IDS_CERT_MANAGER_EDIT_CA_TRUST_DESCRIPTION_FORMAT)); 338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificateImportCaDescriptionFormat", 339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16( 340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IDS_CERT_MANAGER_IMPORT_CA_DESCRIPTION_FORMAT)); 341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificateCaTrustSSLLabel", 342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EDIT_CA_TRUST_SSL_LABEL)); 343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificateCaTrustEmailLabel", 344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EDIT_CA_TRUST_EMAIL_LABEL)); 345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificateCaTrustObjSignLabel", 346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EDIT_CA_TRUST_OBJSIGN_LABEL)); 347731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick localized_strings->SetString("certificateImportErrorFormat", 348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_IMPORT_ERROR_FORMAT)); 349dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 350dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 351dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen localized_strings->SetString("importAndBindCertificate", 352dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen l10n_util::GetStringUTF16(IDS_CERT_MANAGER_IMPORT_AND_BIND_BUTTON)); 353dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen localized_strings->SetString("hardwareBackedKeyFormat", 354dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen l10n_util::GetStringUTF16(IDS_CERT_MANAGER_HARDWARE_BACKED_KEY_FORMAT)); 355dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen localized_strings->SetString("chromeOSDeviceName", 356dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen l10n_util::GetStringUTF16(IDS_CERT_MANAGER_HARDWARE_BACKED)); 357dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif // defined(OS_CHROMEOS) 358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::RegisterMessages() { 36172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("viewCertificate", 362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::View)); 363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 36472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("getCaCertificateTrust", 365731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::GetCATrust)); 36672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("editCaCertificateTrust", 367731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::EditCATrust)); 368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 36972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("editServerCertificate", 370731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::EditServer)); 371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 37272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("cancelImportExportCertificate", 373731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::CancelImportExportProcess)); 374731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 37572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("exportPersonalCertificate", 376731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::ExportPersonal)); 37772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("exportAllPersonalCertificates", 378731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::ExportAllPersonal)); 37972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("exportPersonalCertificatePasswordSelected", 380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, 381731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &CertificateManagerHandler::ExportPersonalPasswordSelected)); 382731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 38372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("importPersonalCertificate", 384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::StartImportPersonal)); 38572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("importPersonalCertificatePasswordSelected", 386731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, 387731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &CertificateManagerHandler::ImportPersonalPasswordSelected)); 388731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 38972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("importCaCertificate", 390731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::ImportCA)); 39172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("importCaCertificateTrustSelected", 392731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::ImportCATrustSelected)); 393731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 39472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("importServerCertificate", 395731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::ImportServer)); 396731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 39772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("exportCertificate", 398731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::Export)); 399731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 40072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("deleteCertificate", 401731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::Delete)); 402731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 40372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->RegisterMessageCallback("populateCertificateManager", 404731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::Populate)); 405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS) 407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->RegisterMessageCallback("checkTpmTokenReady", 408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen NewCallback(this, &CertificateManagerHandler::CheckTpmTokenReady)); 409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 410731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 411731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 412731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::CertificatesRefreshed() { 413731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PopulateTree("personalCertsTab", net::USER_CERT); 414731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PopulateTree("serverCertsTab", net::SERVER_CERT); 415731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PopulateTree("caCertsTab", net::CA_CERT); 416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PopulateTree("otherCertsTab", net::UNKNOWN_CERT); 417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VLOG(1) << "populating finished"; 418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 419731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 420731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::FileSelected(const FilePath& path, int index, 421731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void* params) { 422731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick switch (reinterpret_cast<intptr_t>(params)) { 423731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case EXPORT_PERSONAL_FILE_SELECTED: 424731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ExportPersonalFileSelected(path); 425731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 426731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case IMPORT_PERSONAL_FILE_SELECTED: 427731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportPersonalFileSelected(path); 428731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 429731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case IMPORT_SERVER_FILE_SELECTED: 430731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportServerFileSelected(path); 431731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case IMPORT_CA_FILE_SELECTED: 433731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportCAFileSelected(path); 434731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick default: 436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTREACHED(); 437731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 438731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 439731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 440731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::FileSelectionCanceled(void* params) { 441731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick switch (reinterpret_cast<intptr_t>(params)) { 442731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case EXPORT_PERSONAL_FILE_SELECTED: 443731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case IMPORT_PERSONAL_FILE_SELECTED: 444731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case IMPORT_SERVER_FILE_SELECTED: 445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case IMPORT_CA_FILE_SELECTED: 446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick default: 449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTREACHED(); 450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 452731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 453731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::View(const ListValue* args) { 454731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::X509Certificate* cert = CallbackArgsToCert(args); 455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!cert) 456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 457731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowCertificateViewer(GetParentWindow(), cert); 458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 459731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::GetCATrust(const ListValue* args) { 461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::X509Certificate* cert = CallbackArgsToCert(args); 462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!cert) { 463ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateEditCaTrustOverlay.dismiss"); 464731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int trust = certificate_manager_model_->cert_db().GetCertTrust( 468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cert, net::CA_CERT); 469731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FundamentalValue ssl_value(bool(trust & net::CertDatabase::TRUSTED_SSL)); 470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FundamentalValue email_value(bool(trust & net::CertDatabase::TRUSTED_EMAIL)); 471731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FundamentalValue obj_sign_value( 472731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool(trust & net::CertDatabase::TRUSTED_OBJ_SIGN)); 47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->CallJavascriptFunction( 474ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "CertificateEditCaTrustOverlay.populateTrust", 475731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ssl_value, email_value, obj_sign_value); 476731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 478731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::EditCATrust(const ListValue* args) { 479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::X509Certificate* cert = CallbackArgsToCert(args); 480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool fail = !cert; 48121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool trust_ssl = false; 48221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool trust_email = false; 48321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool trust_obj_sign = false; 484731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fail |= !CallbackArgsToBool(args, 1, &trust_ssl); 485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fail |= !CallbackArgsToBool(args, 2, &trust_email); 486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fail |= !CallbackArgsToBool(args, 3, &trust_obj_sign); 487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (fail) { 488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LOG(ERROR) << "EditCATrust args fail"; 489ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateEditCaTrustOverlay.dismiss"); 490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 491731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 492731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool result = certificate_manager_model_->SetCertTrust( 494731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cert, 495731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::CA_CERT, 496731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick trust_ssl * net::CertDatabase::TRUSTED_SSL + 497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick trust_email * net::CertDatabase::TRUSTED_EMAIL + 498731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick trust_obj_sign * net::CertDatabase::TRUSTED_OBJ_SIGN); 499ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateEditCaTrustOverlay.dismiss"); 500731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!result) { 501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(mattm): better error messages? 502731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 503731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_SET_TRUST_ERROR_TITLE), 504731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR)); 505731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 506731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 507731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 508731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::EditServer(const ListValue* args) { 509731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTIMPLEMENTED(); 510731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 511731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 512731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ExportPersonal(const ListValue* args) { 513731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::X509Certificate* cert = CallbackArgsToCert(args); 514731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!cert) 515731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 516731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 517731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick selected_cert_list_.push_back(cert); 518731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 519731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SelectFileDialog::FileTypeInfo file_type_info; 520731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_type_info.extensions.resize(1); 521731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("p12")); 522731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_type_info.extension_description_overrides.push_back( 523731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_PKCS12_FILES)); 524731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_type_info.include_all_files = true; 525731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick select_file_dialog_ = SelectFileDialog::Create(this); 526731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick select_file_dialog_->SelectFile( 527731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SelectFileDialog::SELECT_SAVEAS_FILE, string16(), 528ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath(), &file_type_info, 1, FILE_PATH_LITERAL("p12"), 529ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->tab_contents(), GetParentWindow(), 530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick reinterpret_cast<void*>(EXPORT_PERSONAL_FILE_SELECTED)); 531731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ExportAllPersonal(const ListValue* args) { 534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTIMPLEMENTED(); 535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 537731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ExportPersonalFileSelected( 538731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const FilePath& path) { 539731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_path_ = path; 54072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->CallJavascriptFunction( 541ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "CertificateManager.exportPersonalAskPassword"); 542731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 543731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 544731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ExportPersonalPasswordSelected( 545731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const ListValue* args) { 546731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!args->GetString(0, &password_)){ 547ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateRestoreOverlay.dismiss"); 548731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 549731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 550731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 55172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 55272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Currently, we don't support exporting more than one at a time. If we do, 553dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // this would need to either change this to use UnlockSlotsIfNecessary or 554dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // change UnlockCertSlotIfNecessary to take a CertificateList. 55572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK_EQ(selected_cert_list_.size(), 1U); 55672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 55772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // TODO(mattm): do something smarter about non-extractable keys 55872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser::UnlockCertSlotIfNecessary( 55972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen selected_cert_list_[0].get(), 56072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser::kCryptoModulePasswordCertExport, 56172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", // unused. 56272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NewCallback(this, 56372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen &CertificateManagerHandler::ExportPersonalSlotsUnlocked)); 56472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 56572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 56672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid CertificateManagerHandler::ExportPersonalSlotsUnlocked() { 567731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string output; 568731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int num_exported = certificate_manager_model_->cert_db().ExportToPKCS12( 569731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick selected_cert_list_, 570731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick password_, 571731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &output); 572731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!num_exported) { 573ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateRestoreOverlay.dismiss"); 574731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 575731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_PKCS12_EXPORT_ERROR_TITLE), 576731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR)); 577731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 578731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 579731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 580731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_access_provider_->StartWrite( 581731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_path_, 582731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick output, 583731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &consumer_, 584731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::ExportPersonalFileWritten)); 585731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 586731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 587731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ExportPersonalFileWritten(int write_errno, 588731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int bytes_written) { 589ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateRestoreOverlay.dismiss"); 590731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 591731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (write_errno) { 592731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 593731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_PKCS12_EXPORT_ERROR_TITLE), 594731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringFUTF8(IDS_CERT_MANAGER_WRITE_ERROR_FORMAT, 595731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick UTF8ToUTF16(safe_strerror(write_errno)))); 596731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 597731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 598731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 599731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::StartImportPersonal(const ListValue* args) { 600731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SelectFileDialog::FileTypeInfo file_type_info; 601ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!args->GetBoolean(0, &use_hardware_backed_)){ 602ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Unable to retrieve the hardware backed attribute from the args, 603ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // so bail. 604ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateRestoreOverlay.dismiss"); 605ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ImportExportCleanup(); 606ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 607ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 608731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_type_info.extensions.resize(1); 609731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("p12")); 610731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_type_info.extension_description_overrides.push_back( 611731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF16(IDS_CERT_MANAGER_PKCS12_FILES)); 612731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_type_info.include_all_files = true; 613731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick select_file_dialog_ = SelectFileDialog::Create(this); 614731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick select_file_dialog_->SelectFile( 615731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SelectFileDialog::SELECT_OPEN_FILE, string16(), 616ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FilePath(), &file_type_info, 1, FILE_PATH_LITERAL("p12"), 617ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->tab_contents(), GetParentWindow(), 618731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick reinterpret_cast<void*>(IMPORT_PERSONAL_FILE_SELECTED)); 619731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 620731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 621731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ImportPersonalFileSelected( 622731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const FilePath& path) { 623731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_path_ = path; 62472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen web_ui_->CallJavascriptFunction( 625ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "CertificateManager.importPersonalAskPassword"); 626731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 627731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 628731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ImportPersonalPasswordSelected( 629731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const ListValue* args) { 630731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!args->GetString(0, &password_)){ 631ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateRestoreOverlay.dismiss"); 632731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 633731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 634731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 635731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_access_provider_->StartRead( 636731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_path_, 637731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &consumer_, 638731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::ImportPersonalFileRead)); 639731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 640731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 641731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ImportPersonalFileRead( 642731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int read_errno, std::string data) { 643731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (read_errno) { 644731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 645ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateRestoreOverlay.dismiss"); 646731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 647731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_PKCS12_IMPORT_ERROR_TITLE), 648731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringFUTF8(IDS_CERT_MANAGER_READ_ERROR_FORMAT, 649731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick UTF8ToUTF16(safe_strerror(read_errno)))); 650731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 651731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 65272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 65372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen file_data_ = data; 65472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 655ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (use_hardware_backed_) { 656ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen module_ = certificate_manager_model_->cert_db().GetPrivateModule(); 657ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 658ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen module_ = certificate_manager_model_->cert_db().GetPublicModule(); 659ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 66072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 661dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::CryptoModuleList modules; 662dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen modules.push_back(module_); 663dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen browser::UnlockSlotsIfNecessary( 664dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen modules, 66572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser::kCryptoModulePasswordCertImport, 66672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", // unused. 66772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NewCallback(this, 66872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen &CertificateManagerHandler::ImportPersonalSlotUnlocked)); 66972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 67072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 67172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid CertificateManagerHandler::ImportPersonalSlotUnlocked() { 67272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int result = certificate_manager_model_->ImportFromPKCS12( 67372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen module_, file_data_, password_); 674731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 675ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateRestoreOverlay.dismiss"); 676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick switch (result) { 677731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case net::OK: 678731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 679731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case net::ERR_PKCS12_IMPORT_BAD_PASSWORD: 680731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 681731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_PKCS12_IMPORT_ERROR_TITLE), 682731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_BAD_PASSWORD)); 683731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(mattm): if the error was a bad password, we should reshow the 684731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // password dialog after the user dismisses the error dialog. 685731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 686731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick default: 687731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 688731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_PKCS12_IMPORT_ERROR_TITLE), 689731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR)); 690731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 691731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 692731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 693731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 694731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::CancelImportExportProcess( 695731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const ListValue* args) { 696731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 697731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 698731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 699731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ImportExportCleanup() { 700731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_path_.clear(); 701731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick password_.clear(); 70272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen file_data_.clear(); 703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen use_hardware_backed_ = false; 704731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick selected_cert_list_.clear(); 70572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen module_ = NULL; 706ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 707ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // There may be pending file dialogs, we need to tell them that we've gone 708ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // away so they don't try and call back to us. 709ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (select_file_dialog_.get()) 710ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen select_file_dialog_->ListenerDestroyed(); 711ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen select_file_dialog_ = NULL; 712731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 713731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 714731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ImportServer(const ListValue* args) { 715731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick select_file_dialog_ = SelectFileDialog::Create(this); 716731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowCertSelectFileDialog( 717731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick select_file_dialog_.get(), 718731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SelectFileDialog::SELECT_OPEN_FILE, 719731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath(), 720ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->tab_contents(), 721731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetParentWindow(), 722731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick reinterpret_cast<void*>(IMPORT_SERVER_FILE_SELECTED)); 723731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 724731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 725731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ImportServerFileSelected(const FilePath& path) { 726731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_path_ = path; 727731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_access_provider_->StartRead( 728731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_path_, 729731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &consumer_, 730731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::ImportServerFileRead)); 731731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 732731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 733731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ImportServerFileRead(int read_errno, 734731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string data) { 735731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (read_errno) { 736731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 737731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 738731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_SERVER_IMPORT_ERROR_TITLE), 739731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringFUTF8(IDS_CERT_MANAGER_READ_ERROR_FORMAT, 740731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick UTF8ToUTF16(safe_strerror(read_errno)))); 741731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 742731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 743731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 744731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick selected_cert_list_ = net::X509Certificate::CreateCertificateListFromBytes( 745731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick data.data(), data.size(), net::X509Certificate::FORMAT_AUTO); 746731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (selected_cert_list_.empty()) { 747731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 748731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 749731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_SERVER_IMPORT_ERROR_TITLE), 750731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CERT_PARSE_ERROR)); 751731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 752731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 753731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 754731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::CertDatabase::ImportCertFailureList not_imported; 755731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool result = certificate_manager_model_->ImportServerCert( 756731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick selected_cert_list_, 757731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ¬_imported); 758731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!result) { 759731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 760731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_SERVER_IMPORT_ERROR_TITLE), 761731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR)); 762731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else if (!not_imported.empty()) { 763731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowImportErrors( 764731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_SERVER_IMPORT_ERROR_TITLE), 765731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick not_imported); 766731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 767731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 768731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 769731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 770731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ImportCA(const ListValue* args) { 771731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick select_file_dialog_ = SelectFileDialog::Create(this); 772731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowCertSelectFileDialog(select_file_dialog_.get(), 773731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SelectFileDialog::SELECT_OPEN_FILE, 774731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FilePath(), 775ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->tab_contents(), 776731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetParentWindow(), 777731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick reinterpret_cast<void*>(IMPORT_CA_FILE_SELECTED)); 778731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 779731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 780731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ImportCAFileSelected(const FilePath& path) { 781731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_path_ = path; 782731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_access_provider_->StartRead( 783731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick file_path_, 784731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick &consumer_, 785731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewCallback(this, &CertificateManagerHandler::ImportCAFileRead)); 786731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 787731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 788731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ImportCAFileRead(int read_errno, 789731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string data) { 790731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (read_errno) { 791731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 792731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 793731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CA_IMPORT_ERROR_TITLE), 794731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringFUTF8(IDS_CERT_MANAGER_READ_ERROR_FORMAT, 795731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick UTF8ToUTF16(safe_strerror(read_errno)))); 796731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 797731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 798731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 799731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick selected_cert_list_ = net::X509Certificate::CreateCertificateListFromBytes( 800731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick data.data(), data.size(), net::X509Certificate::FORMAT_AUTO); 801731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (selected_cert_list_.empty()) { 802731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 803731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 804731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CA_IMPORT_ERROR_TITLE), 805731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CERT_PARSE_ERROR)); 806731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 807731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 808731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 809731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_refptr<net::X509Certificate> root_cert = 810731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick certificate_manager_model_->cert_db().FindRootInList(selected_cert_list_); 811731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 812731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(mattm): check here if root_cert is not a CA cert and show error. 813731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 814731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick StringValue cert_name(root_cert->subject().GetDisplayName()); 815ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateEditCaTrustOverlay.showImport", 816731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cert_name); 817731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 818731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 819731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ImportCATrustSelected(const ListValue* args) { 820731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool fail = false; 82172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool trust_ssl = false; 82272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool trust_email = false; 82372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool trust_obj_sign = false; 824731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fail |= !CallbackArgsToBool(args, 0, &trust_ssl); 825731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fail |= !CallbackArgsToBool(args, 1, &trust_email); 826731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick fail |= !CallbackArgsToBool(args, 2, &trust_obj_sign); 827731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (fail) { 828731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LOG(ERROR) << "ImportCATrustSelected args fail"; 829731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 830ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateEditCaTrustOverlay.dismiss"); 831731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 832731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 833731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 834731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::CertDatabase::ImportCertFailureList not_imported; 835731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool result = certificate_manager_model_->ImportCACerts( 836731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick selected_cert_list_, 837731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick trust_ssl * net::CertDatabase::TRUSTED_SSL + 838731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick trust_email * net::CertDatabase::TRUSTED_EMAIL + 839731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick trust_obj_sign * net::CertDatabase::TRUSTED_OBJ_SIGN, 840731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ¬_imported); 841ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateEditCaTrustOverlay.dismiss"); 842731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!result) { 843731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 844731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CA_IMPORT_ERROR_TITLE), 845731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR)); 846731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else if (!not_imported.empty()) { 847731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowImportErrors( 848731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_CA_IMPORT_ERROR_TITLE), 849731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick not_imported); 850731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 851731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ImportExportCleanup(); 852731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 853731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 854731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::Export(const ListValue* args) { 855731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::X509Certificate* cert = CallbackArgsToCert(args); 856731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!cert) 857731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 858ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ShowCertExportDialog(web_ui_->tab_contents(), GetParentWindow(), 859ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen cert->os_cert_handle()); 860731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 861731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 862731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::Delete(const ListValue* args) { 863731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::X509Certificate* cert = CallbackArgsToCert(args); 864731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!cert) 865731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return; 866731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool result = certificate_manager_model_->Delete(cert); 867731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!result) { 868731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(mattm): better error messages? 869731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ShowError( 870731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_DELETE_CERT_ERROR_TITLE), 871731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick l10n_util::GetStringUTF8(IDS_CERT_MANAGER_UNKNOWN_ERROR)); 872731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 873731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 874731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 875731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::Populate(const ListValue* args) { 876731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick certificate_manager_model_->Refresh(); 877731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 878731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 879731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::PopulateTree(const std::string& tab_name, 880731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::CertType type) { 881731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string tree_name = tab_name + "-tree"; 882731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 883731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_ptr<icu::Collator> collator; 884731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick UErrorCode error = U_ZERO_ERROR; 885731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick collator.reset( 886731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icu::Collator::createInstance( 887731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick icu::Locale(g_browser_process->GetApplicationLocale().c_str()), 888731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick error)); 889731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (U_FAILURE(error)) 890731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick collator.reset(NULL); 891731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DictionaryIdComparator comparator(collator.get()); 892731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CertificateManagerModel::OrgGroupingMap map; 893731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 894731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick certificate_manager_model_->FilterAndBuildOrgGroupingMap(type, &map); 895731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 896731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick { 897731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ListValue* nodes = new ListValue; 898731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (CertificateManagerModel::OrgGroupingMap::iterator i = map.begin(); 899731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick i != map.end(); ++i) { 900731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Populate first level (org name). 901731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DictionaryValue* dict = new DictionaryValue; 902731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick dict->SetString(kKeyId, OrgNameToId(i->first)); 903731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick dict->SetString(kNameId, i->first); 904731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 905731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Populate second level (certs). 906731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ListValue* subnodes = new ListValue; 907731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (net::CertificateList::const_iterator org_cert_it = i->second.begin(); 908731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick org_cert_it != i->second.end(); ++org_cert_it) { 909731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DictionaryValue* cert_dict = new DictionaryValue; 910731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::X509Certificate* cert = org_cert_it->get(); 911731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cert_dict->SetString(kKeyId, CertToId(*cert)); 912731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cert_dict->SetString(kNameId, certificate_manager_model_->GetColumnText( 913731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *cert, CertificateManagerModel::COL_SUBJECT_NAME)); 914513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch cert_dict->SetBoolean( 915513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch kReadOnlyId, 916513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch certificate_manager_model_->cert_db().IsReadOnly(cert)); 917731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO(mattm): Other columns. 918731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cert_dict->SetString(kIconId, "none"); 919731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick subnodes->Append(cert_dict); 920731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 921731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::sort(subnodes->begin(), subnodes->end(), comparator); 922731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 923731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick dict->Set(kSubNodesId, subnodes); 924731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick nodes->Append(dict); 925731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 926731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::sort(nodes->begin(), nodes->end(), comparator); 927731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 928731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ListValue args; 929731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick args.Append(Value::CreateStringValue(tree_name)); 930731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick args.Append(nodes); 931ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateManager.onPopulateTree", args); 932731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 933731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 934731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 935731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ShowError(const std::string& title, 936731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& error) const { 93772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ScopedVector<const Value> args; 938731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick args.push_back(Value::CreateStringValue(title)); 939731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick args.push_back(Value::CreateStringValue(error)); 94072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen args.push_back(Value::CreateStringValue(l10n_util::GetStringUTF8(IDS_OK))); 94172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen args.push_back(Value::CreateNullValue()); // cancelTitle 942731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick args.push_back(Value::CreateNullValue()); // okCallback 943731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick args.push_back(Value::CreateNullValue()); // cancelCallback 944ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("AlertOverlay.show", args.get()); 945731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 946731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 947731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid CertificateManagerHandler::ShowImportErrors( 948731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& title, 949731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const net::CertDatabase::ImportCertFailureList& not_imported) const { 950731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string error; 951731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (selected_cert_list_.size() == 1) 952731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick error = l10n_util::GetStringUTF8( 953731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IDS_CERT_MANAGER_IMPORT_SINGLE_NOT_IMPORTED); 954731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick else if (not_imported.size() == selected_cert_list_.size()) 955731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick error = l10n_util::GetStringUTF8(IDS_CERT_MANAGER_IMPORT_ALL_NOT_IMPORTED); 956731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick else 957731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick error = l10n_util::GetStringUTF8(IDS_CERT_MANAGER_IMPORT_SOME_NOT_IMPORTED); 958731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 959731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ListValue cert_error_list; 960731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (size_t i = 0; i < not_imported.size(); ++i) { 961731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const net::CertDatabase::ImportCertFailure& failure = not_imported[i]; 962731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DictionaryValue* dict = new DictionaryValue; 963731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick dict->SetString(kNameId, failure.certificate->subject().GetDisplayName()); 964731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick dict->SetString(kErrorId, NetErrorToString(failure.net_error)); 965731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cert_error_list.Append(dict); 966731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 967731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 968731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick StringValue title_value(title); 969731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick StringValue error_value(error); 970ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateImportErrorOverlay.show", 971731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick title_value, 972731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick error_value, 973731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick cert_error_list); 974731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 975731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 976ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_CHROMEOS) 977ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CertificateManagerHandler::CheckTpmTokenReady(const ListValue* args) { 978ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::CryptohomeLibrary* cryptohome = 979ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen chromeos::CrosLibrary::Get()->GetCryptohomeLibrary(); 980ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 981ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // TODO(xiyuan): Use async way when underlying supports it. 982ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FundamentalValue ready(cryptohome->Pkcs11IsTpmTokenReady()); 983ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen web_ui_->CallJavascriptFunction("CertificateManager.onCheckTpmTokenReady", 984ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ready); 985ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 986ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif 987ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 988731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickgfx::NativeWindow CertificateManagerHandler::GetParentWindow() const { 98972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return web_ui_->tab_contents()->view()->GetTopLevelNativeWindow(); 990731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 991