Index: chrome/browser/certificate_manager_model.cc |
diff --git a/chrome/browser/certificate_manager_model.cc b/chrome/browser/certificate_manager_model.cc |
index b4a670125a205f14b480fc6662bc3341a08a0d7e..da460702a03f80eb005d2a9b6d6ece285684adc7 100644 |
--- a/chrome/browser/certificate_manager_model.cc |
+++ b/chrome/browser/certificate_manager_model.cc |
@@ -10,6 +10,10 @@ |
#include "base/strings/utf_string_conversions.h" |
#include "chrome/browser/ui/crypto_module_password_dialog.h" |
#include "chrome/common/net/x509_certificate_model.h" |
+#include "content/public/browser/browser_context.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/nss_context.h" |
+#include "content/public/browser/resource_context.h" |
#include "net/base/crypto_module.h" |
#include "net/base/net_errors.h" |
#include "net/cert/x509_certificate.h" |
@@ -22,15 +26,44 @@ |
#include "ui/base/l10n/l10n_util.h" |
#endif |
-CertificateManagerModel::CertificateManagerModel(Observer* observer) |
- : cert_db_(net::NSSCertDatabase::GetInstance()), |
- observer_(observer) { |
+using content::BrowserThread; |
+ |
+namespace { |
+ |
+void GotCertDBOnIOThread( |
+ const base::Callback<void(net::NSSCertDatabase*)>& callback, |
+ net::NSSCertDatabase* cert_db) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, base::Bind(callback, cert_db)); |
+} |
+ |
+} // namespace |
+ |
+CertificateManagerModel::CertificateManagerModel( |
+ content::BrowserContext* browser_context, |
+ Observer* observer) |
+ : observer_(observer), |
+ weak_ptr_factory_(this) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ VLOG(1) << "Getting cert_db for profile..."; |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&content::GetNSSCertDatabaseForResourceContext, |
+ browser_context->GetResourceContext(), |
+ base::Bind(GotCertDBOnIOThread, |
+ base::Bind(&CertificateManagerModel::GotCertDB, |
+ weak_ptr_factory_.GetWeakPtr())))); |
} |
CertificateManagerModel::~CertificateManagerModel() { |
} |
void CertificateManagerModel::Refresh() { |
+ // XXX should the rest of the NSS stuff also be on IO thread? or a worker |
+ // thread? |
VLOG(1) << "refresh started"; |
net::CryptoModuleList modules; |
cert_db_->ListModules(&modules, false); |
@@ -43,6 +76,14 @@ void CertificateManagerModel::Refresh() { |
base::Unretained(this))); |
} |
+void CertificateManagerModel::GotCertDB(net::NSSCertDatabase* cert_db) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(cert_db); |
+ VLOG(1) << "Got cert_db"; |
+ cert_db_ = cert_db; |
+ observer_->CertificateManagerModelReady(); |
+} |
+ |
void CertificateManagerModel::RefreshSlotsUnlocked() { |
VLOG(1) << "refresh listing certs..."; |
cert_db_->ListCerts(&cert_list_); |
@@ -157,9 +198,12 @@ bool CertificateManagerModel::Delete(net::X509Certificate* cert) { |
bool CertificateManagerModel::IsHardwareBacked( |
const net::X509Certificate* cert) const { |
#if defined(OS_CHROMEOS) |
- return crypto::IsTPMTokenReady() && |
- cert->os_cert_handle()->slot == |
- cert_db_->GetPrivateModule()->os_module_handle(); |
+ // XXX should we actually do the opposite check and make sure the cert doesn't |
+ // exist in any non-tpm slots? |
+ return crypto::IsTPMTokenEnabledForNSS() && |
+ PK11_FindCertInSlot(cert_db_->GetPrivateModule()->os_module_handle(), |
+ cert->os_cert_handle(), |
+ NULL) != CK_INVALID_HANDLE; |
#else |
return false; |
#endif |