Chromium Code Reviews| Index: chrome/browser/chromeos/cros/cert_library.cc |
| diff --git a/chrome/browser/chromeos/cros/cert_library.cc b/chrome/browser/chromeos/cros/cert_library.cc |
| index f2e1ee893f5648263d9161c384e5a82afa520da3..ef294ebe2474a1a541fa6aeadd45c7b4ea07cdde 100644 |
| --- a/chrome/browser/chromeos/cros/cert_library.cc |
| +++ b/chrome/browser/chromeos/cros/cert_library.cc |
| @@ -95,97 +95,6 @@ string16 GetDisplayString(net::X509Certificate* cert, bool hardware_backed) { |
| } |
| } |
| -class RealTPMTokenInfoDelegate : public crypto::TPMTokenInfoDelegate { |
| - public: |
| - RealTPMTokenInfoDelegate(); |
| - virtual ~RealTPMTokenInfoDelegate(); |
| - |
| - // TPMTokenInfoDeleagte overrides: |
| - virtual void RequestIsTokenReady( |
| - base::Callback<void(bool result)> callback) const OVERRIDE; |
| - virtual void GetTokenInfo(std::string* token_name, |
| - std::string* user_pin) const OVERRIDE; |
| - |
| - private: |
| - // This method is used to implement RequestIsTokenReady. |
| - void OnPkcs11IsTpmTokenReady(base::Callback<void(bool result)> callback, |
| - DBusMethodCallStatus call_status, |
| - bool is_tpm_token_ready) const; |
| - |
| - // This method is used to implement RequestIsTokenReady. |
| - void OnPkcs11GetTpmTokenInfo(base::Callback<void(bool result)> callback, |
| - DBusMethodCallStatus call_status, |
| - const std::string& token_name, |
| - const std::string& user_pin) const; |
| - |
| - // These are mutable since we need to cache them in IsTokenReady(). |
| - mutable bool token_ready_; |
| - mutable std::string token_name_; |
| - mutable std::string user_pin_; |
| - mutable base::WeakPtrFactory<RealTPMTokenInfoDelegate> weak_ptr_factory_; |
| -}; |
| - |
| -RealTPMTokenInfoDelegate::RealTPMTokenInfoDelegate() : token_ready_(false), |
| - weak_ptr_factory_(this) { |
| -} |
| - |
| -RealTPMTokenInfoDelegate::~RealTPMTokenInfoDelegate() {} |
| - |
| -void RealTPMTokenInfoDelegate::RequestIsTokenReady( |
| - base::Callback<void(bool result)> callback) const { |
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - if (token_ready_) { |
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| - base::Bind(callback, true)); |
| - return; |
| - } |
| - DBusThreadManager::Get()->GetCryptohomeClient()->Pkcs11IsTpmTokenReady( |
| - base::Bind(&RealTPMTokenInfoDelegate::OnPkcs11IsTpmTokenReady, |
| - weak_ptr_factory_.GetWeakPtr(), |
| - callback)); |
| -} |
| - |
| -void RealTPMTokenInfoDelegate::GetTokenInfo(std::string* token_name, |
| - std::string* user_pin) const { |
| - // May be called from a non UI thread, but must only be called after |
| - // IsTokenReady() returns true. |
| - CHECK(token_ready_); |
| - if (token_name) |
| - *token_name = token_name_; |
| - if (user_pin) |
| - *user_pin = user_pin_; |
| -} |
| - |
| -void RealTPMTokenInfoDelegate::OnPkcs11IsTpmTokenReady( |
| - base::Callback<void(bool result)> callback, |
| - DBusMethodCallStatus call_status, |
| - bool is_tpm_token_ready) const { |
| - if (call_status != DBUS_METHOD_CALL_SUCCESS || !is_tpm_token_ready) { |
| - callback.Run(false); |
| - return; |
| - } |
| - |
| - // Retrieve token_name_ and user_pin_ here since they will never change |
| - // and CryptohomeClient calls are not thread safe. |
| - DBusThreadManager::Get()->GetCryptohomeClient()->Pkcs11GetTpmTokenInfo( |
| - base::Bind(&RealTPMTokenInfoDelegate::OnPkcs11GetTpmTokenInfo, |
| - weak_ptr_factory_.GetWeakPtr(), |
| - callback)); |
| -} |
| - |
| -void RealTPMTokenInfoDelegate::OnPkcs11GetTpmTokenInfo( |
| - base::Callback<void(bool result)> callback, |
| - DBusMethodCallStatus call_status, |
| - const std::string& token_name, |
| - const std::string& user_pin) const { |
| - if (call_status == DBUS_METHOD_CALL_SUCCESS) { |
| - token_name_ = token_name; |
| - user_pin_ = user_pin; |
| - token_ready_ = true; |
| - } |
| - callback.Run(token_ready_); |
| -} |
| - |
| } // namespace |
| ////////////////////////////////////////////////////////////////////////////// |
| @@ -201,6 +110,7 @@ class CertLibraryImpl |
| CertLibraryImpl() : |
| observer_list_(new CertLibraryObserverList), |
| + tpm_token_ready_(false), |
| user_logged_in_(false), |
| certificates_requested_(false), |
| certificates_loaded_(false), |
| @@ -246,7 +156,7 @@ class CertLibraryImpl |
| if (CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kLoadOpencryptoki) || |
| CommandLine::ForCurrentProcess()->HasSwitch(switches::kStubCros)) { |
| - crypto::EnableTPMTokenForNSS(new RealTPMTokenInfoDelegate()); |
| + crypto::EnableTPMTokenForNSS(); |
|
Ryan Sleevi
2012/05/16 17:02:16
See comments in crypto/
|
| // Note: this calls crypto::EnsureTPMTokenReady() |
| RequestCertificates(); |
| } |
| @@ -387,14 +297,6 @@ class CertLibraryImpl |
| icu::Collator* collator_; |
| }; |
| - void RequestCertificatesTask() { |
| - CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)) |
| - << __FUNCTION__ << " should be called on UI thread."; |
| - // Reset the task to the initial state so is_null() returns true. |
| - request_task_ = base::Closure(); |
| - RequestCertificates(); |
| - } |
| - |
| void NotifyCertificatesLoaded(bool initial_load) { |
| observer_list_->Notify( |
| &CertLibrary::Observer::OnCertificatesLoaded, initial_load); |
| @@ -506,13 +408,12 @@ class CertLibraryImpl |
| VLOG(1) << "Requesting Certificates."; |
| DBusThreadManager::Get()->GetCryptohomeClient()->TpmIsEnabled( |
| - base::Bind(&CertLibraryImpl::RequestCertificatesInternal, |
| + base::Bind(&CertLibraryImpl::OnTpmIsEnabled, |
| weak_ptr_factory_.GetWeakPtr())); |
| } |
| // This method is used to implement RequestCertificates. |
| - void RequestCertificatesInternal(DBusMethodCallStatus call_status, |
| - bool tpm_is_enabled) { |
| + void OnTpmIsEnabled(DBusMethodCallStatus call_status, bool tpm_is_enabled) { |
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)) |
| << __FUNCTION__ << " should be called on UI thread."; |
| if (call_status != DBUS_METHOD_CALL_SUCCESS || !tpm_is_enabled) { |
| @@ -522,35 +423,51 @@ class CertLibraryImpl |
| BrowserThread::DB, FROM_HERE, |
| base::Bind(&CertLibraryImpl::LoadCertificates, |
| base::Unretained(this))); |
| - } else if (crypto::IsTPMTokenReady()) { |
| - // Need TPM token name to filter user certificates. |
| - const bool tpm_token_ready = true; |
| - GetTPMTokenName(tpm_token_ready); |
| + } else if (tpm_token_ready_) { |
| + InitializeTPMToken(); |
| } else { |
| - crypto::InitializeTPMToken( |
| - base::Bind(&CertLibraryImpl::GetTPMTokenName, |
| + DBusThreadManager::Get()->GetCryptohomeClient()->Pkcs11IsTpmTokenReady( |
| + base::Bind(&CertLibraryImpl::OnPkcs11IsTpmTokenReady, |
| weak_ptr_factory_.GetWeakPtr())); |
| } |
| } |
| // This method is used to implement RequestCertificates. |
| - void GetTPMTokenName(bool tpm_token_ready) { |
| + void OnPkcs11IsTpmTokenReady(DBusMethodCallStatus call_status, |
| + bool is_tpm_token_ready) { |
| + if (call_status != DBUS_METHOD_CALL_SUCCESS || !is_tpm_token_ready) { |
| + MaybeRetryRequestCertificates(); |
| + return; |
| + } |
| + |
| + // Retrieve token_name_ and user_pin_ here since they will never change |
| + // and CryptohomeClient calls are not thread safe. |
| + DBusThreadManager::Get()->GetCryptohomeClient()->Pkcs11GetTpmTokenInfo( |
| + base::Bind(&CertLibraryImpl::OnPkcs11GetTpmTokenInfo, |
| + weak_ptr_factory_.GetWeakPtr())); |
| + } |
| + |
| + // This method is used to implement RequestCertificates. |
| + void OnPkcs11GetTpmTokenInfo(DBusMethodCallStatus call_status, |
| + const std::string& token_name, |
| + const std::string& user_pin) { |
| + if (call_status != DBUS_METHOD_CALL_SUCCESS) { |
| + MaybeRetryRequestCertificates(); |
| + return; |
| + } |
| + tpm_token_name_ = token_name; |
| + tpm_user_pin_ = user_pin; |
| + tpm_token_ready_ = true; |
| + |
| + InitializeTPMToken(); |
| + } |
| + |
| + // This method is used to implement RequestCertificates. |
| + void InitializeTPMToken() { |
| CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)) |
| << __FUNCTION__ << " should be called on UI thread."; |
|
Ryan Sleevi
2012/05/16 17:02:16
nit: These strings will not get optimized out in a
hashimoto
2012/05/17 07:35:07
Agree, CHECK itself is sufficient, removed the str
|
| - if (tpm_token_ready) { |
| - std::string unused_pin; |
| - crypto::GetTPMTokenInfo(&tpm_token_name_, &unused_pin); |
| - } else { |
| - VLOG(1) << "TPM token not ready."; |
| - if (request_task_.is_null()) { |
| - // Cryptohome does not notify us when the token is ready, so call |
| - // this again after a delay. |
| - request_task_ = base::Bind(&CertLibraryImpl::RequestCertificatesTask, |
| - weak_ptr_factory_.GetWeakPtr()); |
| - BrowserThread::PostDelayedTask( |
| - BrowserThread::UI, FROM_HERE, request_task_, |
| - base::TimeDelta::FromMilliseconds(kRequestDelayMs)); |
| - } |
| + if (!crypto::InitializeTPMToken(tpm_token_name_, tpm_user_pin_)) { |
| + MaybeRetryRequestCertificates(); |
| return; |
| } |
| @@ -560,15 +477,40 @@ class CertLibraryImpl |
| base::Bind(&CertLibraryImpl::LoadCertificates, base::Unretained(this))); |
| } |
| + void MaybeRetryRequestCertificates() { |
| + if (!request_task_.is_null()) |
| + return; |
| + // Cryptohome does not notify us when the token is ready, so call |
| + // this again after a delay. |
| + request_task_ = base::Bind(&CertLibraryImpl::RequestCertificatesTask, |
| + weak_ptr_factory_.GetWeakPtr()); |
| + BrowserThread::PostDelayedTask( |
| + BrowserThread::UI, FROM_HERE, request_task_, |
| + base::TimeDelta::FromMilliseconds(kRequestDelayMs)); |
| + } |
| + |
| + void RequestCertificatesTask() { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)) |
| + << __FUNCTION__ << " should be called on UI thread."; |
| + // Reset the task to the initial state so is_null() returns true. |
| + request_task_ = base::Closure(); |
| + RequestCertificates(); |
| + } |
| + |
| // Observers. |
| const scoped_refptr<CertLibraryObserverList> observer_list_; |
| // Active request task for re-requests while waiting for TPM init. |
| base::Closure request_task_; |
| + bool tpm_token_ready_; |
| + |
| // Cached TPM token name. |
| std::string tpm_token_name_; |
| + // Cached TPM user pin. |
| + std::string tpm_user_pin_; |
| + |
| // Supplemental user key. |
| scoped_ptr<crypto::SymmetricKey> supplemental_user_key_; |