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      &not_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      &not_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