| Index: net/cert/nss_cert_database.cc
|
| diff --git a/net/cert/nss_cert_database.cc b/net/cert/nss_cert_database.cc
|
| index 8e9ef4e6f0159078fc8462002d53f5e0f4b3a592..126016b4057545ace624476d44b40ebace671b9e 100644
|
| --- a/net/cert/nss_cert_database.cc
|
| +++ b/net/cert/nss_cert_database.cc
|
| @@ -13,9 +13,10 @@
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/memory/singleton.h"
|
| -#include "base/observer_list_threadsafe.h"
|
| #include "crypto/nss_util.h"
|
| #include "crypto/nss_util_internal.h"
|
| +#include "crypto/scoped_nss_types.h"
|
| +#include "net/cert/cert_database.h"
|
| #include "net/base/crypto_module.h"
|
| #include "net/base/net_errors.h"
|
| #include "net/cert/cert_database.h"
|
| @@ -47,8 +48,7 @@ NSSCertDatabase* NSSCertDatabase::GetInstance() {
|
| LeakySingletonTraits<NSSCertDatabase> >::get();
|
| }
|
|
|
| -NSSCertDatabase::NSSCertDatabase()
|
| - : observer_list_(new ObserverListThreadSafe<Observer>) {
|
| +NSSCertDatabase::NSSCertDatabase() {
|
| crypto::EnsureNSSInit();
|
| psm::EnsurePKCS12Init();
|
| }
|
| @@ -70,21 +70,15 @@ void NSSCertDatabase::ListCerts(CertificateList* certs) {
|
| }
|
|
|
| CryptoModule* NSSCertDatabase::GetPublicModule() const {
|
| - CryptoModule* module =
|
| - CryptoModule::CreateFromHandle(crypto::GetPublicNSSKeySlot());
|
| - // The module is already referenced when returned from
|
| - // GetPublicNSSKeySlot, so we need to deref it once.
|
| - PK11_FreeSlot(module->os_module_handle());
|
| + crypto::ScopedPK11Slot slot(GetPublicSlot());
|
| + CryptoModule* module = CryptoModule::CreateFromHandle(slot.get());
|
|
|
| return module;
|
| }
|
|
|
| CryptoModule* NSSCertDatabase::GetPrivateModule() const {
|
| - CryptoModule* module =
|
| - CryptoModule::CreateFromHandle(crypto::GetPrivateNSSKeySlot());
|
| - // The module is already referenced when returned from
|
| - // GetPrivateNSSKeySlot, so we need to deref it once.
|
| - PK11_FreeSlot(module->os_module_handle());
|
| + crypto::ScopedPK11Slot slot(GetPrivateSlot());
|
| + CryptoModule* module = CryptoModule::CreateFromHandle(slot.get());
|
|
|
| return module;
|
| }
|
| @@ -93,25 +87,23 @@ void NSSCertDatabase::ListModules(CryptoModuleList* modules,
|
| bool need_rw) const {
|
| modules->clear();
|
|
|
| - PK11SlotList* slot_list = NULL;
|
| // The wincx arg is unused since we don't call PK11_SetIsLoggedInFunc.
|
| - slot_list = PK11_GetAllTokens(CKM_INVALID_MECHANISM,
|
| - need_rw ? PR_TRUE : PR_FALSE, // needRW
|
| - PR_TRUE, // loadCerts (unused)
|
| - NULL); // wincx
|
| + crypto::ScopedPK11SlotList slot_list(
|
| + PK11_GetAllTokens(CKM_INVALID_MECHANISM,
|
| + need_rw ? PR_TRUE : PR_FALSE, // needRW
|
| + PR_TRUE, // loadCerts (unused)
|
| + NULL)); // wincx
|
| if (!slot_list) {
|
| LOG(ERROR) << "PK11_GetAllTokens failed: " << PORT_GetError();
|
| return;
|
| }
|
|
|
| - PK11SlotListElement* slot_element = PK11_GetFirstSafe(slot_list);
|
| + PK11SlotListElement* slot_element = PK11_GetFirstSafe(slot_list.get());
|
| while (slot_element) {
|
| modules->push_back(CryptoModule::CreateFromHandle(slot_element->slot));
|
| - slot_element = PK11_GetNextSafe(slot_list, slot_element,
|
| + slot_element = PK11_GetNextSafe(slot_list.get(), slot_element,
|
| PR_FALSE); // restart
|
| }
|
| -
|
| - PK11_FreeSlotList(slot_list);
|
| }
|
|
|
| int NSSCertDatabase::ImportFromPKCS12(
|
| @@ -120,6 +112,9 @@ int NSSCertDatabase::ImportFromPKCS12(
|
| const base::string16& password,
|
| bool is_extractable,
|
| net::CertificateList* imported_certs) {
|
| + VLOG(1) << __func__ << " "
|
| + << PK11_GetModuleID(module->os_module_handle()) << ":"
|
| + << PK11_GetSlotID(module->os_module_handle());
|
| int result = psm::nsPKCS12Blob_Import(module->os_module_handle(),
|
| data.data(), data.size(),
|
| password,
|
| @@ -165,8 +160,12 @@ bool NSSCertDatabase::ImportCACerts(const CertificateList& certificates,
|
| TrustBits trust_bits,
|
| ImportCertFailureList* not_imported) {
|
| X509Certificate* root = FindRootInList(certificates);
|
| - bool success = psm::ImportCACerts(certificates, root, trust_bits,
|
| - not_imported);
|
| + bool success = psm::ImportCACerts(
|
| + GetPublicSlot(),
|
| + certificates,
|
| + root,
|
| + trust_bits,
|
| + not_imported);
|
| if (success)
|
| NotifyObserversOfCertTrustChanged(NULL);
|
|
|
| @@ -176,7 +175,11 @@ bool NSSCertDatabase::ImportCACerts(const CertificateList& certificates,
|
| bool NSSCertDatabase::ImportServerCert(const CertificateList& certificates,
|
| TrustBits trust_bits,
|
| ImportCertFailureList* not_imported) {
|
| - return psm::ImportServerCert(certificates, trust_bits, not_imported);
|
| + return psm::ImportServerCert(
|
| + GetPublicSlot(),
|
| + certificates,
|
| + trust_bits,
|
| + not_imported);
|
| }
|
|
|
| NSSCertDatabase::TrustBits NSSCertDatabase::GetCertTrust(
|
| @@ -319,27 +322,26 @@ bool NSSCertDatabase::IsReadOnly(const X509Certificate* cert) const {
|
| return slot && PK11_IsReadOnly(slot);
|
| }
|
|
|
| -void NSSCertDatabase::AddObserver(Observer* observer) {
|
| - observer_list_->AddObserver(observer);
|
| +crypto::ScopedPK11Slot NSSCertDatabase::GetPublicSlot() const {
|
| + return crypto::ScopedPK11Slot(crypto::GetPublicNSSKeySlot());
|
| }
|
|
|
| -void NSSCertDatabase::RemoveObserver(Observer* observer) {
|
| - observer_list_->RemoveObserver(observer);
|
| +crypto::ScopedPK11Slot NSSCertDatabase::GetPrivateSlot() const {
|
| + return crypto::ScopedPK11Slot(crypto::GetPrivateNSSKeySlot());
|
| }
|
|
|
| void NSSCertDatabase::NotifyObserversOfCertAdded(const X509Certificate* cert) {
|
| - observer_list_->Notify(&Observer::OnCertAdded, make_scoped_refptr(cert));
|
| + CertDatabase::GetInstance()->NotifyObserversOfCertAdded(cert);
|
| }
|
|
|
| void NSSCertDatabase::NotifyObserversOfCertRemoved(
|
| const X509Certificate* cert) {
|
| - observer_list_->Notify(&Observer::OnCertRemoved, make_scoped_refptr(cert));
|
| + CertDatabase::GetInstance()->NotifyObserversOfCertRemoved(cert);
|
| }
|
|
|
| void NSSCertDatabase::NotifyObserversOfCertTrustChanged(
|
| const X509Certificate* cert) {
|
| - observer_list_->Notify(
|
| - &Observer::OnCertTrustChanged, make_scoped_refptr(cert));
|
| + CertDatabase::GetInstance()->NotifyObserversOfCertTrustChanged(cert);
|
| }
|
|
|
| } // namespace net
|
|
|