Chromium Code Reviews| Index: chrome/browser/chromeos/login/parallel_authenticator.cc |
| diff --git a/chrome/browser/chromeos/login/parallel_authenticator.cc b/chrome/browser/chromeos/login/parallel_authenticator.cc |
| index ae27986999282a0261d70a321a30f4f32d2e6ff7..b7f544b2509d174f8105363dfcabddf3e848922b 100644 |
| --- a/chrome/browser/chromeos/login/parallel_authenticator.cc |
| +++ b/chrome/browser/chromeos/login/parallel_authenticator.cc |
| @@ -17,6 +17,7 @@ |
| #include "base/synchronization/lock.h" |
| #include "chrome/browser/chromeos/cros/cert_library.h" |
| #include "chrome/browser/chromeos/cros/cryptohome_library.h" |
| +#include "chrome/browser/chromeos/cros_settings.h" |
| #include "chrome/browser/chromeos/login/auth_response_handler.h" |
| #include "chrome/browser/chromeos/login/authentication_notification_details.h" |
| #include "chrome/browser/chromeos/login/login_status_consumer.h" |
| @@ -53,6 +54,8 @@ const int ParallelAuthenticator::kClientLoginTimeoutMs = 10000; |
| ParallelAuthenticator::ParallelAuthenticator(LoginStatusConsumer* consumer) |
| : Authenticator(consumer), |
| already_reported_success_(false), |
| + owner_is_verified_(false), |
| + user_can_login_(false), |
| using_oauth_( |
| CommandLine::ForCurrentProcess()->HasSwitch( |
| switches::kWebUILogin) && |
| @@ -81,13 +84,18 @@ void ParallelAuthenticator::AuthenticateToLogin( |
| login_token, |
| login_captcha, |
| !UserManager::Get()->IsKnownUser(canonicalized))); |
| + { |
| + LOG(ERROR) << "@@@ Resetting for " << username; |
| + // Reset the verified flag. |
| + base::AutoLock for_this_block(owner_verified_lock_); |
| + owner_is_verified_ = false; |
| + } |
| mounter_ = CryptohomeOp::CreateMountAttempt(current_state_.get(), |
| this, |
| false /* don't create */); |
| // Sadly, this MUST be on the UI thread due to sending DBus traffic :-/ |
| BrowserThread::PostTask( |
| BrowserThread::UI, FROM_HERE, |
| - |
| base::Bind(&CryptohomeOp::Initiate, mounter_.get())); |
| // ClientLogin authentication check should happen immediately here. |
| // We should not try OAuthLogin check until the profile loads. |
| @@ -111,6 +119,12 @@ void ParallelAuthenticator::CompleteLogin(Profile* profile, |
| password, |
| CrosLibrary::Get()->GetCryptohomeLibrary()->HashPassword(password), |
| !UserManager::Get()->IsKnownUser(canonicalized))); |
| + { |
| + LOG(ERROR) << "@@@ Resetting for " << username; |
| + // Reset the verified flag. |
| + base::AutoLock for_this_block(owner_verified_lock_); |
| + owner_is_verified_ = false; |
| + } |
| mounter_ = CryptohomeOp::CreateMountAttempt(current_state_.get(), |
| this, |
| false /* don't create */); |
| @@ -253,6 +267,40 @@ void ParallelAuthenticator::ResyncRecoverHelper(CryptohomeOp* to_initiate) { |
| base::Bind(&CryptohomeOp::Initiate, to_initiate)); |
| } |
| +void ParallelAuthenticator::VerifyOwnerOnUIThread() { |
| + // Check if policy data is fine and continue in safe mode if needed. |
| + bool is_safe_mode = false; |
| + CrosSettings::Get()->GetBoolean(kPolicyMissingMitigationMode, &is_safe_mode); |
| + if (!is_safe_mode) { |
| + base::AutoLock for_this_block(owner_verified_lock_); |
| + // Now we can continue reading the private key. |
| + user_can_login_ = true; |
| + owner_is_verified_ = true; |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&ParallelAuthenticator::Resolve, this)); |
| + return; |
| + } |
| + // First we have to make sure the current user's cert store is available. |
| + UserManager::Get()->LoadKeyStore(); |
| + // Now we can continue reading the private key. |
| + BrowserThread::PostTask( |
| + BrowserThread::FILE, FROM_HERE, |
| + base::Bind(&ParallelAuthenticator::FinishVerifyOwnerOnFileThread, this)); |
| +} |
| + |
| +void ParallelAuthenticator::FinishVerifyOwnerOnFileThread() { |
| + base::AutoLock for_this_block(owner_verified_lock_); |
| + // Now we can continue reading the private key. |
| + user_can_login_ = |
| + OwnershipService::GetSharedInstance()->CurrentUserIsOwner(); |
| + owner_is_verified_ = true; |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&ParallelAuthenticator::Resolve, this)); |
| + LOG(ERROR) << "@@@ Check finished: " << user_can_login_; |
| +} |
| + |
| void ParallelAuthenticator::RetryAuth(Profile* profile, |
| const std::string& username, |
| const std::string& password, |
| @@ -417,6 +465,15 @@ void ParallelAuthenticator::Resolve() { |
| this, |
| current_state_->online_outcome())); |
| break; |
| + case OWNER_REQUIRED: |
| + current_state_->ResetCryptohomeStatus(); |
|
Chris Masone
2012/02/24 18:49:45
Hm. This doesn't actually unmount the user's cryp
pastarmovj
2012/03/13 15:21:55
Done.
|
| + BrowserThread::PostTask(BrowserThread::UI, |
| + FROM_HERE, |
| + base::Bind( |
| + &ParallelAuthenticator::OnLoginFailure, |
| + this, |
| + LoginFailure(LoginFailure::OWNER_REQUIRED))); |
| + break; |
| default: |
| NOTREACHED(); |
| break; |
| @@ -532,7 +589,16 @@ ParallelAuthenticator::ResolveCryptohomeSuccessState() { |
| return RECOVER_MOUNT; |
| if (key_checker_.get()) |
| return UNLOCK; |
| - return OFFLINE_LOGIN; |
| + |
| + base::AutoLock for_this_block(owner_verified_lock_); |
| + LOG(ERROR) << "@@@ cryptohome state " << owner_is_verified_; |
| + if (!owner_is_verified_) { |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&ParallelAuthenticator::VerifyOwnerOnUIThread, this)); |
| + return CONTINUE; |
| + } |
| + return user_can_login_ ? OFFLINE_LOGIN : OWNER_REQUIRED; |
| } |
| namespace { |