summaryrefslogtreecommitdiffstats
path: root/chrome/browser/dom_ui
diff options
context:
space:
mode:
authormattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-29 21:59:17 +0000
committermattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-29 21:59:17 +0000
commit0fd776c40893cb7c9e02c0060a818a7fe972f1aa (patch)
tree601700d589a09e12faf4c959d8b2b40bfd3b6432 /chrome/browser/dom_ui
parent808ae47cffd55a3d761151eb4da93a5befefd922 (diff)
downloadchromium_src-0fd776c40893cb7c9e02c0060a818a7fe972f1aa.zip
chromium_src-0fd776c40893cb7c9e02c0060a818a7fe972f1aa.tar.gz
chromium_src-0fd776c40893cb7c9e02c0060a818a7fe972f1aa.tar.bz2
DOMUI options: NSS Certificate manager part 1 (read only)
BUG=19991 TEST=run with --enable-tabbed-options, click certificate manager button in options Review URL: http://codereview.chromium.org/3389001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@60996 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/dom_ui')
-rw-r--r--chrome/browser/dom_ui/advanced_options_handler.cc6
-rw-r--r--chrome/browser/dom_ui/advanced_options_handler.h2
-rw-r--r--chrome/browser/dom_ui/advanced_options_utils_gtk.cc11
-rw-r--r--chrome/browser/dom_ui/certificate_manager_handler.cc225
-rw-r--r--chrome/browser/dom_ui/certificate_manager_handler.h40
-rw-r--r--chrome/browser/dom_ui/options_ui.cc7
6 files changed, 279 insertions, 12 deletions
diff --git a/chrome/browser/dom_ui/advanced_options_handler.cc b/chrome/browser/dom_ui/advanced_options_handler.cc
index b64f736..778dab6 100644
--- a/chrome/browser/dom_ui/advanced_options_handler.cc
+++ b/chrome/browser/dom_ui/advanced_options_handler.cc
@@ -205,10 +205,12 @@ void AdvancedOptionsHandler::RegisterMessages() {
dom_ui_->RegisterMessageCallback("metricsReportingCheckboxAction",
NewCallback(this,
&AdvancedOptionsHandler::HandleMetricsReportingCheckbox));
-#if !defined(OS_CHROMEOS)
+#if !defined(USE_NSS)
dom_ui_->RegisterMessageCallback("showManageSSLCertificates",
NewCallback(this,
&AdvancedOptionsHandler::ShowManageSSLCertificates));
+#endif
+#if !defined(OS_CHROMEOS)
dom_ui_->RegisterMessageCallback("showNetworkProxySettings",
NewCallback(this,
&AdvancedOptionsHandler::ShowNetworkProxySettings));
@@ -322,7 +324,9 @@ void AdvancedOptionsHandler::ShowNetworkProxySettings(const ListValue* args) {
UserMetricsRecordAction(UserMetricsAction("Options_ShowProxySettings"));
AdvancedOptionsUtilities::ShowNetworkProxySettings(dom_ui_->tab_contents());
}
+#endif
+#if !defined(USE_NSS)
void AdvancedOptionsHandler::ShowManageSSLCertificates(const ListValue* args) {
UserMetricsRecordAction(UserMetricsAction("Options_ManageSSLCertificates"));
AdvancedOptionsUtilities::ShowManageSSLCertificates(dom_ui_->tab_contents());
diff --git a/chrome/browser/dom_ui/advanced_options_handler.h b/chrome/browser/dom_ui/advanced_options_handler.h
index 2896d97..f85ec2a 100644
--- a/chrome/browser/dom_ui/advanced_options_handler.h
+++ b/chrome/browser/dom_ui/advanced_options_handler.h
@@ -70,7 +70,9 @@ class AdvancedOptionsHandler
// Callback for the "showNetworkProxySettings" message. This will invoke
// an appropriate dialog for configuring proxy settings.
void ShowNetworkProxySettings(const ListValue* args);
+#endif
+#if !defined(USE_NSS)
// Callback for the "showManageSSLCertificates" message. This will invoke
// an appropriate certificate management action based on the platform.
void ShowManageSSLCertificates(const ListValue* args);
diff --git a/chrome/browser/dom_ui/advanced_options_utils_gtk.cc b/chrome/browser/dom_ui/advanced_options_utils_gtk.cc
index 7226f61..b471616 100644
--- a/chrome/browser/dom_ui/advanced_options_utils_gtk.cc
+++ b/chrome/browser/dom_ui/advanced_options_utils_gtk.cc
@@ -29,11 +29,6 @@ const char* kKDE4ProxyConfigCommand[] = {"kcmshell4", "proxy", NULL};
// supported desktop environment.
const char kLinuxProxyConfigUrl[] = "about:linux-proxy-config";
-// The URL for Linux ssl certificate configuration help.
-const char* const kLinuxCertificatesConfigUrl =
- "http://code.google.com/p/chromium/wiki/LinuxCertManagement";
-
-
struct ProxyConfigCommand {
std::string binary;
const char** argv;
@@ -123,10 +118,4 @@ void AdvancedOptionsUtilities::ShowNetworkProxySettings(
}
}
-void AdvancedOptionsUtilities::ShowManageSSLCertificates(
- TabContents* tab_contents) {
- tab_contents->OpenURL(GURL(kLinuxCertificatesConfigUrl), GURL(),
- NEW_FOREGROUND_TAB, PageTransition::LINK);
-}
-
#endif // !defined(OS_CHROMEOS)
diff --git a/chrome/browser/dom_ui/certificate_manager_handler.cc b/chrome/browser/dom_ui/certificate_manager_handler.cc
new file mode 100644
index 0000000..08d5641
--- /dev/null
+++ b/chrome/browser/dom_ui/certificate_manager_handler.cc
@@ -0,0 +1,225 @@
+// 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/dom_ui/certificate_manager_handler.h"
+
+#include "app/l10n_util.h"
+#include "app/l10n_util_collator.h"
+#include "base/string_number_conversions.h"
+#include "base/values.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/certificate_manager_model.h"
+#include "chrome/browser/certificate_viewer.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "chrome/browser/tab_contents/tab_contents_view.h"
+#include "grit/generated_resources.h"
+#include "net/base/x509_certificate.h"
+
+namespace {
+
+static const char kKeyId[] = "id";
+static const char kSubNodesId[] = "subnodes";
+static const char kNameId[] = "name";
+static const char kIconId[] = "icon";
+static const char kSecurityDeviceId[] = "device";
+
+// TODO(mattm): These are duplicated from cookies_view_handler.cc
+// Encodes a pointer value into a hex string.
+std::string PointerToHexString(const void* pointer) {
+ return base::HexEncode(&pointer, sizeof(pointer));
+}
+
+// Decodes a pointer from a hex string.
+void* HexStringToPointer(const std::string& str) {
+ std::vector<uint8> buffer;
+ if (!base::HexStringToBytes(str, &buffer) ||
+ buffer.size() != sizeof(void*)) {
+ return NULL;
+ }
+
+ return *reinterpret_cast<void**>(&buffer[0]);
+}
+
+std::string OrgNameToId(const std::string& org) {
+ return "org-" + org;
+}
+
+std::string CertToId(const net::X509Certificate& cert) {
+ return "cert-" + PointerToHexString(&cert);
+}
+
+net::X509Certificate* IdToCert(const std::string& id) {
+ if (!StartsWithASCII(id, "cert-", true))
+ return NULL;
+ return reinterpret_cast<net::X509Certificate*>(HexStringToPointer(id.substr(5)));
+}
+
+struct DictionaryIdComparator {
+ DictionaryIdComparator(icu::Collator* collator) : collator_(collator) {
+ }
+
+ bool operator()(const Value* a,
+ const Value* b) const {
+ DCHECK(a->GetType() == Value::TYPE_DICTIONARY);
+ DCHECK(b->GetType() == Value::TYPE_DICTIONARY);
+ const DictionaryValue* a_dict = reinterpret_cast<const DictionaryValue*>(a);
+ const DictionaryValue* b_dict = reinterpret_cast<const DictionaryValue*>(b);
+ string16 a_str;
+ string16 b_str;
+ a_dict->GetString(kNameId, &a_str);
+ b_dict->GetString(kNameId, &b_str);
+ if (collator_ == NULL)
+ return a_str < b_str;
+ return l10n_util::CompareString16WithCollator(
+ collator_, a_str, b_str) == UCOL_LESS;
+ }
+
+ icu::Collator* collator_;
+};
+
+} // namespace
+
+CertificateManagerHandler::CertificateManagerHandler() {
+ certificate_manager_model_.reset(new CertificateManagerModel);
+}
+
+CertificateManagerHandler::~CertificateManagerHandler() {
+}
+
+void CertificateManagerHandler::GetLocalizedValues(
+ DictionaryValue* localized_strings) {
+ DCHECK(localized_strings);
+
+ localized_strings->SetString("certificateManagerPage",
+ l10n_util::GetStringUTF16(IDS_CERTIFICATE_MANAGER_TITLE));
+
+ // Tabs.
+ localized_strings->SetString("personalCertsTabTitle",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_PERSONAL_CERTS_TAB_LABEL));
+ localized_strings->SetString("emailCertsTabTitle",
+ l10n_util::GetStringUTF16(
+ IDS_CERT_MANAGER_OTHER_PEOPLES_CERTS_TAB_LABEL));
+ localized_strings->SetString("serverCertsTabTitle",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_SERVER_CERTS_TAB_LABEL));
+ localized_strings->SetString("caCertsTabTitle",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_CERT_AUTHORITIES_TAB_LABEL));
+ localized_strings->SetString("unknownCertsTabTitle",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_UNKNOWN_TAB_LABEL));
+
+ // Tab descriptions.
+ localized_strings->SetString("personalCertsTabDescription",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_USER_TREE_DESCRIPTION));
+ localized_strings->SetString("emailCertsTabDescription",
+ l10n_util::GetStringUTF16(
+ IDS_CERT_MANAGER_OTHER_PEOPLE_TREE_DESCRIPTION));
+ localized_strings->SetString("serverCertsTabDescription",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_SERVER_TREE_DESCRIPTION));
+ localized_strings->SetString("caCertsTabDescription",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_AUTHORITIES_TREE_DESCRIPTION));
+ localized_strings->SetString("unknownCertsTabDescription",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_UNKNOWN_TREE_DESCRIPTION));
+
+ // Tree columns.
+ localized_strings->SetString("certNameColumn",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_NAME_COLUMN_LABEL));
+ localized_strings->SetString("certDeviceColumn",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_DEVICE_COLUMN_LABEL));
+ localized_strings->SetString("certSerialColumn",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_SERIAL_NUMBER_COLUMN_LABEL));
+ localized_strings->SetString("certExpiresColumn",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EXPIRES_COLUMN_LABEL));
+ localized_strings->SetString("certEmailColumn",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_EMAIL_ADDRESS_COLUMN_LABEL));
+
+ // Buttons.
+ localized_strings->SetString("view_certificate",
+ l10n_util::GetStringUTF16(IDS_CERT_MANAGER_VIEW_CERT_BUTTON));
+}
+
+void CertificateManagerHandler::RegisterMessages() {
+ dom_ui_->RegisterMessageCallback("viewCertificate",
+ NewCallback(this, &CertificateManagerHandler::View));
+
+ dom_ui_->RegisterMessageCallback("populateCertificateManager",
+ NewCallback(this, &CertificateManagerHandler::Populate));
+}
+
+void CertificateManagerHandler::View(const ListValue* args) {
+ std::string node_id;
+ if (!args->GetString(0, &node_id)){
+ return;
+ }
+ net::X509Certificate* cert = IdToCert(node_id);
+ if (!cert) {
+ NOTREACHED();
+ return;
+ }
+ ShowCertificateViewer(
+ dom_ui_->tab_contents()->view()->GetTopLevelNativeWindow(), cert);
+}
+
+void CertificateManagerHandler::Populate(const ListValue* args) {
+ certificate_manager_model_->Refresh();
+
+ PopulateTree("personalCertsTab", net::USER_CERT);
+ PopulateTree("emailCertsTab", net::EMAIL_CERT);
+ PopulateTree("serverCertsTab", net::SERVER_CERT);
+ PopulateTree("caCertsTab", net::CA_CERT);
+ PopulateTree("otherCertsTab", net::UNKNOWN_CERT);
+}
+
+void CertificateManagerHandler::PopulateTree(const std::string& tab_name,
+ net::CertType type) {
+ const std::string tree_name = tab_name + "-tree";
+
+ scoped_ptr<icu::Collator> collator;
+ UErrorCode error = U_ZERO_ERROR;
+ collator.reset(
+ icu::Collator::createInstance(
+ icu::Locale(g_browser_process->GetApplicationLocale().c_str()),
+ error));
+ if (U_FAILURE(error))
+ collator.reset(NULL);
+ DictionaryIdComparator comparator(collator.get());
+ CertificateManagerModel::OrgGroupingMap map;
+
+ certificate_manager_model_->FilterAndBuildOrgGroupingMap(type, &map);
+
+ {
+ ListValue* nodes = new ListValue;
+ for (CertificateManagerModel::OrgGroupingMap::iterator i = map.begin();
+ i != map.end(); ++i) {
+ // Populate first level (org name).
+ DictionaryValue* dict = new DictionaryValue;
+ dict->SetString(kKeyId, OrgNameToId(i->first));
+ dict->SetString(kNameId, i->first);
+
+ // Populate second level (certs).
+ ListValue* subnodes = new ListValue;
+ for (net::CertificateList::const_iterator org_cert_it = i->second.begin();
+ org_cert_it != i->second.end(); ++org_cert_it) {
+ DictionaryValue* cert_dict = new DictionaryValue;
+ net::X509Certificate* cert = org_cert_it->get();
+ cert_dict->SetString(kKeyId, CertToId(*cert));
+ cert_dict->SetString(kNameId, certificate_manager_model_->GetColumnText(
+ *cert, CertificateManagerModel::COL_SUBJECT_NAME));
+ // TODO(mattm): Other columns.
+ // TODO(mattm): Get a real icon (or figure out how to make the domui
+ // tree not use icons at all).
+ cert_dict->SetString(kIconId, "chrome://theme/IDR_COOKIE_ICON");
+ subnodes->Append(cert_dict);
+ }
+ std::sort(subnodes->begin(), subnodes->end(), comparator);
+
+ dict->Set(kSubNodesId, subnodes);
+ nodes->Append(dict);
+ }
+ std::sort(nodes->begin(), nodes->end(), comparator);
+
+ ListValue args;
+ args.Append(Value::CreateStringValue(tree_name));
+ args.Append(nodes);
+ dom_ui_->CallJavascriptFunction(L"CertificateManager.onPopulateTree", args);
+ }
+}
diff --git a/chrome/browser/dom_ui/certificate_manager_handler.h b/chrome/browser/dom_ui/certificate_manager_handler.h
new file mode 100644
index 0000000..265dba4
--- /dev/null
+++ b/chrome/browser/dom_ui/certificate_manager_handler.h
@@ -0,0 +1,40 @@
+// 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.
+
+#ifndef CHROME_BROWSER_DOM_UI_CERTIFICATE_MANAGER_HANDLER_H_
+#define CHROME_BROWSER_DOM_UI_CERTIFICATE_MANAGER_HANDLER_H_
+#pragma once
+
+#include "base/scoped_ptr.h"
+#include "chrome/browser/dom_ui/options_ui.h"
+#include "net/base/cert_database.h"
+
+class CertificateManagerModel;
+
+class CertificateManagerHandler : public OptionsPageUIHandler {
+ public:
+ CertificateManagerHandler();
+ virtual ~CertificateManagerHandler();
+
+ // OptionsUIHandler implementation.
+ virtual void GetLocalizedValues(DictionaryValue* localized_strings);
+ virtual void RegisterMessages();
+
+ private:
+ // View certificate.
+ void View(const ListValue* args);
+
+ // Populate the trees in all the tabs.
+ void Populate(const ListValue* args);
+
+ // Populate the given tab's tree.
+ void PopulateTree(const std::string& tab_name, net::CertType type);
+
+ // The Certificates Manager model
+ scoped_ptr<CertificateManagerModel> certificate_manager_model_;
+
+ DISALLOW_COPY_AND_ASSIGN(CertificateManagerHandler);
+};
+
+#endif // CHROME_BROWSER_DOM_UI_CERTIFICATE_MANAGER_HANDLER_H_
diff --git a/chrome/browser/dom_ui/options_ui.cc b/chrome/browser/dom_ui/options_ui.cc
index cb7830a..0ebeba8 100644
--- a/chrome/browser/dom_ui/options_ui.cc
+++ b/chrome/browser/dom_ui/options_ui.cc
@@ -65,6 +65,10 @@
#include "chrome/browser/chromeos/dom_ui/system_options_handler.h"
#endif
+#if defined(USE_NSS)
+#include "chrome/browser/dom_ui/certificate_manager_handler.h"
+#endif
+
////////////////////////////////////////////////////////////////////////////////
//
// OptionsUIHTMLSource
@@ -162,6 +166,9 @@ OptionsUI::OptionsUI(TabContents* contents) : DOMUI(contents) {
AddOptionsPageUIHandler(localized_strings, new chromeos::ProxyHandler());
AddOptionsPageUIHandler(localized_strings, new SystemOptionsHandler());
#endif
+#if defined(USE_NSS)
+ AddOptionsPageUIHandler(localized_strings, new CertificateManagerHandler());
+#endif
// |localized_strings| ownership is taken over by this constructor.
OptionsUIHTMLSource* html_source =