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/certificate_manager_model.cc | |
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/certificate_manager_model.cc')
-rw-r--r-- | chrome/browser/certificate_manager_model.cc | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/chrome/browser/certificate_manager_model.cc b/chrome/browser/certificate_manager_model.cc new file mode 100644 index 0000000..170bc7a --- /dev/null +++ b/chrome/browser/certificate_manager_model.cc @@ -0,0 +1,111 @@ +// 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/certificate_manager_model.h" + +#include <cert.h> + +#include "base/i18n/time_formatting.h" +#include "base/logging.h" +#include "base/utf_string_conversions.h" +#include "chrome/third_party/mozilla_security_manager/nsNSSCertHelper.h" +#include "chrome/third_party/mozilla_security_manager/nsNSSCertificate.h" +#include "net/base/x509_certificate.h" + +// TODO(mattm): Try to make this use only X509Certificate stuff rather than NSS +// functions in some places. (Not very important at this time since this is only +// used w/NSS anyway.) + +// PSM = Mozilla's Personal Security Manager. +namespace psm = mozilla_security_manager; + +namespace { + +// Convert a char* return value from NSS into a std::string and free the NSS +// memory. If the arg is NULL, an empty string will be returned instead. +std::string Stringize(char* nss_text) { + std::string s; + if (nss_text) { + s = nss_text; + PORT_Free(nss_text); + } + return s; +} + +std::string GetCertNameOrNickname(CERTCertificate* os_cert) { + std::string name = psm::ProcessIDN( + Stringize(CERT_GetCommonName(&os_cert->subject))); + if (name.empty() && os_cert->nickname) { + name = os_cert->nickname; + // Hack copied from mozilla: Cut off text before first :, which seems to + // just be the token name. + size_t colon_pos = name.find(':'); + if (colon_pos != std::string::npos) + name = name.substr(colon_pos + 1); + } + return name; +} + +} // namespace + +CertificateManagerModel::CertificateManagerModel() { +} + +CertificateManagerModel::~CertificateManagerModel() { +} + +void CertificateManagerModel::Refresh() { + cert_db_.ListCerts(&cert_list_); +} + +void CertificateManagerModel::FilterAndBuildOrgGroupingMap( + net::CertType filter_type, + CertificateManagerModel::OrgGroupingMap* map) const { + for (net::CertificateList::const_iterator i = cert_list_.begin(); + i != cert_list_.end(); ++i) { + net::X509Certificate* cert = i->get(); + net::CertType type = psm::GetCertType(cert->os_cert_handle()); + if (type != filter_type) + continue; + + std::string org; + if (!cert->subject().organization_names.empty()) + org = cert->subject().organization_names[0]; + if (org.empty()) + org = cert->subject().GetDisplayName(); + + (*map)[org].push_back(cert); + } +} + +string16 CertificateManagerModel::GetColumnText( + const net::X509Certificate& cert, + Column column) const { + string16 rv; + switch (column) { + case COL_SUBJECT_NAME: + rv = UTF8ToUTF16(GetCertNameOrNickname(cert.os_cert_handle())); + break; + case COL_CERTIFICATE_STORE: + rv = UTF8ToUTF16(psm::GetCertTokenName(cert.os_cert_handle())); + break; + case COL_SERIAL_NUMBER: + rv = ASCIIToUTF16(Stringize(CERT_Hexify( + &cert.os_cert_handle()->serialNumber, PR_TRUE))); + break; + case COL_EXPIRES_ON: + if (!cert.valid_expiry().is_null()) { + rv = WideToUTF16Hack( + base::TimeFormatShortDateNumeric(cert.valid_expiry())); + } + break; + case COL_EMAIL_ADDRESS: + if (cert.os_cert_handle()->emailAddr) + rv = UTF8ToUTF16(cert.os_cert_handle()->emailAddr); + break; + default: + NOTREACHED(); + } + return rv; +} |