summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ssl/ssl_add_cert_handler.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/ssl/ssl_add_cert_handler.cc')
-rw-r--r--chrome/browser/ssl/ssl_add_cert_handler.cc69
1 files changed, 69 insertions, 0 deletions
diff --git a/chrome/browser/ssl/ssl_add_cert_handler.cc b/chrome/browser/ssl/ssl_add_cert_handler.cc
new file mode 100644
index 0000000..8c75d7d
--- /dev/null
+++ b/chrome/browser/ssl/ssl_add_cert_handler.cc
@@ -0,0 +1,69 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ssl/ssl_add_cert_handler.h"
+
+#include "app/l10n_util.h"
+#include "chrome/browser/browser_list.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/browser_window.h"
+#include "chrome/browser/chrome_thread.h"
+#include "chrome/common/platform_util.h"
+#include "grit/generated_resources.h"
+#include "net/base/cert_database.h"
+#include "net/base/net_errors.h"
+#include "net/base/x509_certificate.h"
+#include "net/url_request/url_request.h"
+
+SSLAddCertHandler::SSLAddCertHandler(URLRequest* request,
+ net::X509Certificate* cert)
+ : cert_(cert) {
+ // Stay alive until the UI completes and Finished() is called.
+ AddRef();
+ ChromeThread::PostTask(
+ ChromeThread::UI, FROM_HERE,
+ NewRunnableMethod(this, &SSLAddCertHandler::RunUI));
+}
+
+void SSLAddCertHandler::RunUI() {
+ int cert_error;
+ {
+ net::CertDatabase db;
+ cert_error = db.CheckUserCert(cert_);
+ }
+ if (cert_error != net::OK) {
+ // TODO(snej): Map cert_error to a more specific error message.
+ ShowError(l10n_util::GetStringUTF16(IDS_ADD_CERT_ERR_INVALID_CERT));
+ Finished(false);
+ return;
+ }
+ AskToAddCert();
+}
+
+#if !defined(OS_MACOSX)
+void SSLAddCertHandler::AskToAddCert() {
+ // TODO(snej): Someone should add Windows and GTK implementations with UI.
+ Finished(true);
+}
+#endif
+
+void SSLAddCertHandler::Finished(bool add_cert) {
+ if (add_cert) {
+ net::CertDatabase db;
+ int cert_error = db.AddUserCert(cert_);
+ if (cert_error != net::OK) {
+ // TODO(snej): Map cert_error to a more specific error message.
+ ShowError(l10n_util::GetStringUTF16(IDS_ADD_CERT_ERR_FAILED));
+ }
+ }
+ Release();
+}
+
+void SSLAddCertHandler::ShowError(const string16& error) {
+ Browser* browser = BrowserList::GetLastActive();
+ platform_util::SimpleErrorBox(
+ browser ? browser->window()->GetNativeHandle() : NULL,
+ l10n_util::GetStringUTF16(IDS_ADD_CERT_FAILURE_TITLE),
+ error);
+}