Index: chromeos/login/auth/cryptohome_authenticator.cc |
diff --git a/chromeos/login/auth/cryptohome_authenticator.cc b/chromeos/login/auth/cryptohome_authenticator.cc |
index 2795b308543933b04e66c6624e493cc2b1cb13b0..e6513f2098569191e28fd20613da1dd052ce2f6f 100644 |
--- a/chromeos/login/auth/cryptohome_authenticator.cc |
+++ b/chromeos/login/auth/cryptohome_authenticator.cc |
@@ -149,7 +149,8 @@ void OnMount(const base::WeakPtr<AuthAttemptState>& attempt, |
void DoMount(const base::WeakPtr<AuthAttemptState>& attempt, |
scoped_refptr<CryptohomeAuthenticator> resolver, |
bool ephemeral, |
- bool create_if_nonexistent) { |
+ bool create_if_nonexistent, |
+ bool force_dircrypto_if_available) { |
xiyuan
2017/04/05 21:15:11
I don't think we need this extra arg. |attempt| ho
fukino
2017/04/06 14:22:17
Done.
I didn't noticed that we can use |attempt|.
|
const Key* key = attempt->user_context.GetKey(); |
// If the |key| is a plain text password, crash rather than attempting to |
// mount the cryptohome with a plain text password. |
@@ -174,6 +175,7 @@ void DoMount(const base::WeakPtr<AuthAttemptState>& attempt, |
kCryptohomeGAIAKeyLabel, |
cryptohome::PRIV_DEFAULT)); |
} |
+ mount.force_dircrypto_if_available = force_dircrypto_if_available; |
cryptohome::HomedirMethods::GetInstance()->MountEx( |
cryptohome::Identification(attempt->user_context.GetAccountId()), |
@@ -186,6 +188,7 @@ void OnCryptohomeRenamed(const base::WeakPtr<AuthAttemptState>& attempt, |
scoped_refptr<CryptohomeAuthenticator> resolver, |
bool ephemeral, |
bool create_if_nonexistent, |
+ bool force_dircrypto_if_available, |
bool success, |
cryptohome::MountError return_code) { |
chromeos::LoginEventRecorder::Get()->AddLoginTimeMarker( |
@@ -202,7 +205,8 @@ void OnCryptohomeRenamed(const base::WeakPtr<AuthAttemptState>& attempt, |
// Proceed to DoMount. |
UMACryptohomeMigrationToGaiaId(CryptohomeMigrationToGaiaId::FAILURE); |
} |
- DoMount(attempt, resolver, ephemeral, create_if_nonexistent); |
+ DoMount(attempt, resolver, ephemeral, create_if_nonexistent, |
+ force_dircrypto_if_available); |
} |
// This method migrates cryptohome identifier to gaia id (if needed), |
@@ -211,7 +215,8 @@ void EnsureCryptohomeMigratedToGaiaId( |
const base::WeakPtr<AuthAttemptState>& attempt, |
scoped_refptr<CryptohomeAuthenticator> resolver, |
bool ephemeral, |
- bool create_if_nonexistent) { |
+ bool create_if_nonexistent, |
+ bool force_dircrypto_if_available) { |
if (attempt->user_context.GetAccountId().GetAccountType() == |
AccountType::ACTIVE_DIRECTORY) { |
cryptohome::SetGaiaIdMigrationStatusDone( |
@@ -220,7 +225,8 @@ void EnsureCryptohomeMigratedToGaiaId( |
const bool is_gaiaid_migration_started = switches::IsGaiaIdMigrationStarted(); |
if (!is_gaiaid_migration_started) { |
UMACryptohomeMigrationToGaiaId(CryptohomeMigrationToGaiaId::NOT_STARTED); |
- DoMount(attempt, resolver, ephemeral, create_if_nonexistent); |
+ DoMount(attempt, resolver, ephemeral, create_if_nonexistent, |
+ force_dircrypto_if_available); |
return; |
} |
const bool already_migrated = cryptohome::GetGaiaIdMigrationStatus( |
@@ -250,7 +256,7 @@ void EnsureCryptohomeMigratedToGaiaId( |
cryptohome::Identification::FromString(cryptohome_id_from), |
cryptohome::Identification::FromString(cryptohome_id_to), |
base::Bind(&OnCryptohomeRenamed, attempt, resolver, ephemeral, |
- create_if_nonexistent)); |
+ create_if_nonexistent, force_dircrypto_if_available)); |
return; |
} |
if (!already_migrated && has_account_key) { |
@@ -263,7 +269,8 @@ void EnsureCryptohomeMigratedToGaiaId( |
CryptohomeMigrationToGaiaId::ALREADY_MIGRATED); |
} |
- DoMount(attempt, resolver, ephemeral, create_if_nonexistent); |
+ DoMount(attempt, resolver, ephemeral, create_if_nonexistent, |
+ force_dircrypto_if_available); |
} |
// Callback invoked when the system salt has been retrieved. Transforms the key |
@@ -273,6 +280,7 @@ void OnGetSystemSalt(const base::WeakPtr<AuthAttemptState>& attempt, |
scoped_refptr<CryptohomeAuthenticator> resolver, |
bool ephemeral, |
bool create_if_nonexistent, |
+ bool force_dircrypto_if_available, |
const std::string& system_salt) { |
DCHECK_EQ(Key::KEY_TYPE_PASSWORD_PLAIN, |
attempt->user_context.GetKey()->GetKeyType()); |
@@ -282,7 +290,8 @@ void OnGetSystemSalt(const base::WeakPtr<AuthAttemptState>& attempt, |
system_salt); |
EnsureCryptohomeMigratedToGaiaId(attempt, resolver, ephemeral, |
- create_if_nonexistent); |
+ create_if_nonexistent, |
+ force_dircrypto_if_available); |
} |
// Callback invoked when cryptohome's GetKeyDataEx() method has finished. |
@@ -298,6 +307,7 @@ void OnGetKeyDataEx( |
scoped_refptr<CryptohomeAuthenticator> resolver, |
bool ephemeral, |
bool create_if_nonexistent, |
+ bool force_dircrypto_if_available, |
bool success, |
cryptohome::MountError return_code, |
const std::vector<cryptohome::KeyDefinition>& key_definitions) { |
@@ -342,7 +352,8 @@ void OnGetKeyDataEx( |
static_cast<Key::KeyType>(*type), |
*salt); |
EnsureCryptohomeMigratedToGaiaId(attempt, resolver, ephemeral, |
- create_if_nonexistent); |
+ create_if_nonexistent, |
+ force_dircrypto_if_available); |
return; |
} |
} else { |
@@ -351,11 +362,9 @@ void OnGetKeyDataEx( |
} |
} |
- SystemSaltGetter::Get()->GetSystemSalt(base::Bind(&OnGetSystemSalt, |
- attempt, |
- resolver, |
- ephemeral, |
- create_if_nonexistent)); |
+ SystemSaltGetter::Get()->GetSystemSalt( |
+ base::Bind(&OnGetSystemSalt, attempt, resolver, ephemeral, |
+ create_if_nonexistent, force_dircrypto_if_available)); |
} |
// Starts the process that will mount a user's cryptohome. |
@@ -369,21 +378,24 @@ void OnGetKeyDataEx( |
void StartMount(const base::WeakPtr<AuthAttemptState>& attempt, |
scoped_refptr<CryptohomeAuthenticator> resolver, |
bool ephemeral, |
- bool create_if_nonexistent) { |
+ bool create_if_nonexistent, |
+ bool force_dircrypto_if_available) { |
chromeos::LoginEventRecorder::Get()->AddLoginTimeMarker( |
"CryptohomeMount-Start", false); |
if (attempt->user_context.GetKey()->GetKeyType() != |
Key::KEY_TYPE_PASSWORD_PLAIN) { |
EnsureCryptohomeMigratedToGaiaId(attempt, resolver, ephemeral, |
- create_if_nonexistent); |
+ create_if_nonexistent, |
+ force_dircrypto_if_available); |
return; |
} |
cryptohome::HomedirMethods::GetInstance()->GetKeyDataEx( |
cryptohome::Identification(attempt->user_context.GetAccountId()), |
- kCryptohomeGAIAKeyLabel, base::Bind(&OnGetKeyDataEx, attempt, resolver, |
- ephemeral, create_if_nonexistent)); |
+ kCryptohomeGAIAKeyLabel, |
+ base::Bind(&OnGetKeyDataEx, attempt, resolver, ephemeral, |
+ create_if_nonexistent, force_dircrypto_if_available)); |
} |
// Calls cryptohome's mount method for guest and also get the user hash from |
@@ -501,7 +513,8 @@ void CryptohomeAuthenticator::AuthenticateToLogin( |
StartMount(current_state_->AsWeakPtr(), |
scoped_refptr<CryptohomeAuthenticator>(this), |
- false /* ephemeral */, false /* create_if_nonexistent */); |
+ false /* ephemeral */, false /* create_if_nonexistent */, |
+ user_context.IsForcingDircrypto()); |
} |
void CryptohomeAuthenticator::CompleteLogin(content::BrowserContext* context, |
@@ -520,7 +533,8 @@ void CryptohomeAuthenticator::CompleteLogin(content::BrowserContext* context, |
StartMount(current_state_->AsWeakPtr(), |
scoped_refptr<CryptohomeAuthenticator>(this), |
- false /* ephemeral */, false /* create_if_nonexistent */); |
+ false /* ephemeral */, false /* create_if_nonexistent */, |
+ user_context.IsForcingDircrypto()); |
// For login completion from extension, we just need to resolve the current |
// auth attempt state, the rest of OAuth related tasks will be done in |
@@ -557,7 +571,8 @@ void CryptohomeAuthenticator::LoginAsSupervisedUser( |
remove_user_data_on_failure_ = false; |
StartMount(current_state_->AsWeakPtr(), |
scoped_refptr<CryptohomeAuthenticator>(this), |
- false /* ephemeral */, false /* create_if_nonexistent */); |
+ false /* ephemeral */, false /* create_if_nonexistent */, |
+ user_context.IsForcingDircrypto()); |
} |
void CryptohomeAuthenticator::LoginOffTheRecord() { |
@@ -588,7 +603,8 @@ void CryptohomeAuthenticator::LoginAsPublicSession( |
ephemeral_mount_attempted_ = true; |
StartMount(current_state_->AsWeakPtr(), |
scoped_refptr<CryptohomeAuthenticator>(this), true /* ephemeral */, |
- true /* create_if_nonexistent */); |
+ true /* create_if_nonexistent */, |
+ user_context.IsForcingDircrypto()); |
fukino
2017/04/05 15:59:56
If the cryptohome is ephemeral, IsForcingDircrypto
xiyuan
2017/04/05 21:15:11
IMHO, not making much sense to force dircrypto for
fukino
2017/04/06 14:22:17
I updated the code to use the UserContext in AuthA
|
} |
void CryptohomeAuthenticator::LoginAsKioskAccount( |
@@ -800,7 +816,8 @@ void CryptohomeAuthenticator::Resolve() { |
current_state_->ResetCryptohomeStatus(); |
StartMount(current_state_->AsWeakPtr(), |
scoped_refptr<CryptohomeAuthenticator>(this), |
- false /*ephemeral*/, create_if_nonexistent); |
+ false /*ephemeral*/, create_if_nonexistent, |
+ false /*force_dircrypto_if_available*/); |
break; |
case NEED_OLD_PW: |
task_runner_->PostTask( |