| Index: chromeos/tpm_token_loader.cc
|
| diff --git a/chromeos/tpm_token_loader.cc b/chromeos/tpm_token_loader.cc
|
| index a469b845c9c444ad8d5bcdb563d6af87bddf67ef..531e12a451059b4e7547b60860ec73d9602bf444 100644
|
| --- a/chromeos/tpm_token_loader.cc
|
| +++ b/chromeos/tpm_token_loader.cc
|
| @@ -50,6 +50,8 @@ static TPMTokenLoader* g_tpm_token_loader = NULL;
|
|
|
| // static
|
| void TPMTokenLoader::Initialize() {
|
| + if (g_tpm_token_loader && g_tpm_token_loader->initialized_for_test_)
|
| + return;
|
| CHECK(!g_tpm_token_loader);
|
| g_tpm_token_loader = new TPMTokenLoader(false /*for_test*/);
|
| }
|
| @@ -106,17 +108,24 @@ TPMTokenLoader::~TPMTokenLoader() {
|
| LoginState::Get()->RemoveObserver(this);
|
| }
|
|
|
| -void TPMTokenLoader::AddObserver(TPMTokenLoader::Observer* observer) {
|
| - observers_.AddObserver(observer);
|
| -}
|
| -
|
| -void TPMTokenLoader::RemoveObserver(TPMTokenLoader::Observer* observer) {
|
| - observers_.RemoveObserver(observer);
|
| +TPMTokenLoader::TPMTokenStatus TPMTokenLoader::IsTPMTokenEnabled(
|
| + const TPMReadyCallback& callback) {
|
| + if (tpm_token_state_ == TPM_TOKEN_INITIALIZED)
|
| + return TPM_TOKEN_STATUS_ENABLED;
|
| + if (!IsTPMLoadingEnabled() || tpm_token_state_ == TPM_DISABLED)
|
| + return TPM_TOKEN_STATUS_DISABLED;
|
| + // Status is not known yet.
|
| + if (!callback.is_null())
|
| + tpm_ready_callback_list_.push_back(callback);
|
| + return TPM_TOKEN_STATUS_UNDETERMINED;
|
| }
|
|
|
| -bool TPMTokenLoader::IsTPMTokenReady() const {
|
| - return tpm_token_state_ == TPM_DISABLED ||
|
| - tpm_token_state_ == TPM_TOKEN_INITIALIZED;
|
| +bool TPMTokenLoader::IsTPMLoadingEnabled() const {
|
| + // TPM loading is enabled on non-ChromeOS environments, e.g. when running
|
| + // tests on Linux.
|
| + // Treat TPM as disabled for guest users since they do not store certs.
|
| + return initialized_for_test_ || (base::SysInfo::IsRunningOnChromeOS() &&
|
| + LoginState::Get()->IsGuestSessionUser());
|
| }
|
|
|
| void TPMTokenLoader::MaybeStartTokenInitialization() {
|
| @@ -136,11 +145,7 @@ void TPMTokenLoader::MaybeStartTokenInitialization() {
|
| if (!start_initialization)
|
| return;
|
|
|
| - if (!base::SysInfo::IsRunningOnChromeOS())
|
| - tpm_token_state_ = TPM_DISABLED;
|
| -
|
| - // Treat TPM as disabled for guest users since they do not store certs.
|
| - if (LoginState::Get()->IsGuestSessionUser())
|
| + if (!IsTPMLoadingEnabled())
|
| tpm_token_state_ = TPM_DISABLED;
|
|
|
| ContinueTokenInitialization();
|
| @@ -240,7 +245,7 @@ void TPMTokenLoader::OnTpmIsEnabled(DBusMethodCallStatus call_status,
|
| }
|
|
|
| void TPMTokenLoader::OnPkcs11IsTpmTokenReady(DBusMethodCallStatus call_status,
|
| - bool is_tpm_token_ready) {
|
| + bool is_tpm_token_ready) {
|
| VLOG(1) << "OnPkcs11IsTpmTokenReady: " << is_tpm_token_ready;
|
|
|
| if (call_status == DBUS_METHOD_CALL_FAILURE || !is_tpm_token_ready) {
|
| @@ -281,7 +286,15 @@ void TPMTokenLoader::OnTPMTokenInitialized(bool success) {
|
| }
|
|
|
| void TPMTokenLoader::NotifyTPMTokenReady() {
|
| - FOR_EACH_OBSERVER(Observer, observers_, OnTPMTokenReady());
|
| + DCHECK(tpm_token_state_ == TPM_DISABLED ||
|
| + tpm_token_state_ == TPM_TOKEN_INITIALIZED);
|
| + bool tpm_status = tpm_token_state_ == TPM_TOKEN_INITIALIZED;
|
| + for (TPMReadyCallbackList::iterator i = tpm_ready_callback_list_.begin();
|
| + i != tpm_ready_callback_list_.end();
|
| + ++i) {
|
| + i->Run(tpm_status);
|
| + }
|
| + tpm_ready_callback_list_.clear();
|
| }
|
|
|
| void TPMTokenLoader::LoggedInStateChanged() {
|
|
|