diff options
author | mattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-29 21:59:17 +0000 |
---|---|---|
committer | mattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-29 21:59:17 +0000 |
commit | 0fd776c40893cb7c9e02c0060a818a7fe972f1aa (patch) | |
tree | 601700d589a09e12faf4c959d8b2b40bfd3b6432 /chrome/browser/dom_ui | |
parent | 808ae47cffd55a3d761151eb4da93a5befefd922 (diff) | |
download | chromium_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.cc | 6 | ||||
-rw-r--r-- | chrome/browser/dom_ui/advanced_options_handler.h | 2 | ||||
-rw-r--r-- | chrome/browser/dom_ui/advanced_options_utils_gtk.cc | 11 | ||||
-rw-r--r-- | chrome/browser/dom_ui/certificate_manager_handler.cc | 225 | ||||
-rw-r--r-- | chrome/browser/dom_ui/certificate_manager_handler.h | 40 | ||||
-rw-r--r-- | chrome/browser/dom_ui/options_ui.cc | 7 |
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 = |