diff options
Diffstat (limited to 'chrome/browser/certificate_manager_model.cc')
-rw-r--r-- | chrome/browser/certificate_manager_model.cc | 132 |
1 files changed, 132 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..be4a21f --- /dev/null +++ b/chrome/browser/certificate_manager_model.cc @@ -0,0 +1,132 @@ +// 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 "base/callback_old.h" +#include "base/i18n/time_formatting.h" +#include "base/logging.h" +#include "base/utf_string_conversions.h" +#include "chrome/browser/ui/crypto_module_password_dialog.h" +#include "chrome/common/net/x509_certificate_model.h" +#include "net/base/crypto_module.h" +#include "net/base/net_errors.h" +#include "net/base/x509_certificate.h" + +CertificateManagerModel::CertificateManagerModel(Observer* observer) + : observer_(observer) { +} + +CertificateManagerModel::~CertificateManagerModel() { +} + +void CertificateManagerModel::Refresh() { + VLOG(1) << "refresh started"; + net::CryptoModuleList modules; + cert_db_.ListModules(&modules, false); + VLOG(1) << "refresh waiting for unlocking..."; + browser::UnlockSlotsIfNecessary( + modules, + browser::kCryptoModulePasswordListCerts, + "", // unused. + NewCallback(this, + &CertificateManagerModel::RefreshSlotsUnlocked)); +} + +void CertificateManagerModel::RefreshSlotsUnlocked() { + VLOG(1) << "refresh listing certs..."; + cert_db_.ListCerts(&cert_list_); + observer_->CertificatesRefreshed(); + VLOG(1) << "refresh finished"; +} + +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 = + x509_certificate_model::GetType(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( + x509_certificate_model::GetCertNameOrNickname(cert.os_cert_handle())); + break; + case COL_CERTIFICATE_STORE: + rv = UTF8ToUTF16( + x509_certificate_model::GetTokenName(cert.os_cert_handle())); + break; + case COL_SERIAL_NUMBER: + rv = ASCIIToUTF16( + x509_certificate_model::GetSerialNumberHexified( + cert.os_cert_handle(), "")); + break; + case COL_EXPIRES_ON: + if (!cert.valid_expiry().is_null()) + rv = base::TimeFormatShortDateNumeric(cert.valid_expiry()); + break; + default: + NOTREACHED(); + } + return rv; +} + +int CertificateManagerModel::ImportFromPKCS12(net::CryptoModule* module, + const std::string& data, + const string16& password) { + int result = cert_db_.ImportFromPKCS12(module, data, password); + if (result == net::OK) + Refresh(); + return result; +} + +bool CertificateManagerModel::ImportCACerts( + const net::CertificateList& certificates, + unsigned int trust_bits, + net::CertDatabase::ImportCertFailureList* not_imported) { + bool result = cert_db_.ImportCACerts(certificates, trust_bits, not_imported); + if (result && not_imported->size() != certificates.size()) + Refresh(); + return result; +} + +bool CertificateManagerModel::ImportServerCert( + const net::CertificateList& certificates, + net::CertDatabase::ImportCertFailureList* not_imported) { + bool result = cert_db_.ImportServerCert(certificates, not_imported); + if (result && not_imported->size() != certificates.size()) + Refresh(); + return result; +} + +bool CertificateManagerModel::SetCertTrust(const net::X509Certificate* cert, + net::CertType type, + unsigned int trust_bits) { + return cert_db_.SetCertTrust(cert, type, trust_bits); +} + +bool CertificateManagerModel::Delete(net::X509Certificate* cert) { + bool result = cert_db_.DeleteCertAndKey(cert); + if (result) + Refresh(); + return result; +} |