1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#ifndef CHROMEOS_LOGIN_AUTH_CRYPTOHOME_AUTHENTICATOR_H_ 603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#define CHROMEOS_LOGIN_AUTH_CRYPTOHOME_AUTHENTICATOR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/macros.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/task_runner.h" 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chromeos/chromeos_export.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/login/auth/auth_attempt_state.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/login/auth/auth_attempt_state_resolver.h" 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/login/auth/authenticator.h" 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chromeos/login/auth/test_attempt_state.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass AuthFailure; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass AuthStatusConsumer; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Authenticates a Chromium OS user against cryptohome. 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Relies on the fact that online authentications has been already performed 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// (i.e. using_oauth_ is true). 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// At a high, level, here's what happens: 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// AuthenticateToLogin() calls a Cryptohome's method to perform offline login. 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Resultes are stored in a AuthAttemptState owned by CryptohomeAuthenticator 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// and then call Resolve(). Resolve() will attempt to 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determine which AuthState we're in, based on the info at hand. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It then triggers further action based on the calculated AuthState; this 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// further action might include calling back the passed-in AuthStatusConsumer 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to signal that login succeeded or failed, waiting for more outstanding 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// operations to complete, or triggering some more Cryptohome method calls. 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Typical flows 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// ------------- 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Add new user: CONTINUE > CONTINUE > CREATE_NEW > CONTINUE > ONLINE_LOGIN 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Login as existing user: CONTINUE > OFFLINE_LOGIN 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Login as existing user (failure): CONTINUE > FAILED_MOUNT 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Change password detected: 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// GAIA online ok: CONTINUE > CONTINUE > NEED_OLD_PW 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Recreate: CREATE_NEW > CONTINUE > ONLINE_LOGIN 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Old password failure: NEED_OLD_PW 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Old password ok: RECOVER_MOUNT > CONTINUE > ONLINE_LOGIN 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// 5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class CHROMEOS_EXPORT CryptohomeAuthenticator 5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : public Authenticator, 5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public AuthAttemptStateResolver { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum AuthState { 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CONTINUE = 0, // State indeterminate; try again with more info. 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NO_MOUNT = 1, // Cryptohome doesn't exist yet. 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAILED_MOUNT = 2, // Failed to mount existing cryptohome. 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAILED_REMOVE = 3, // Failed to remove existing cryptohome. 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAILED_TMPFS = 4, // Failed to mount tmpfs for guest user. 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FAILED_TPM = 5, // Failed to mount/create cryptohome, TPM error. 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CREATE_NEW = 6, // Need to create cryptohome for a new user. 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RECOVER_MOUNT = 7, // After RecoverEncryptedData, mount cryptohome. 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch POSSIBLE_PW_CHANGE = 8, // Offline login failed, user may have changed pw. 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NEED_NEW_PW = 9, // Obsolete (ClientLogin): user changed pw, 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // we have the old one. 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch NEED_OLD_PW = 10, // User changed pw, and we have the new one 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // (GAIA auth is OK). 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HAVE_NEW_PW = 11, // Obsolete (ClientLogin): We have verified new pw, 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // time to migrate key. 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch OFFLINE_LOGIN = 12, // Login succeeded offline. 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DEMO_LOGIN = 13, // Logged in as the demo user. 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ONLINE_LOGIN = 14, // Offline and online login succeeded. 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch UNLOCK = 15, // Screen unlock succeeded. 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ONLINE_FAILED = 16, // Obsolete (ClientLogin): Online login disallowed, 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // but offline succeeded. 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GUEST_LOGIN = 17, // Logged in guest mode. 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch PUBLIC_ACCOUNT_LOGIN = 18, // Logged into a public account. 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SUPERVISED_USER_LOGIN = 19, // Logged in as a supervised user. 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) LOGIN_FAILED = 20, // Login denied. 8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) OWNER_REQUIRED = 21, // Login is restricted to the owner only. 86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) FAILED_USERNAME_HASH = 22, // Failed GetSanitizedUsername request. 87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) KIOSK_ACCOUNT_LOGIN = 23, // Logged into a kiosk account. 88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) REMOVED_DATA_AFTER_FAILURE = 24, // Successfully removed the user's 89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // cryptohome after a login failure. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) CryptohomeAuthenticator(scoped_refptr<base::TaskRunner> task_runner, 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) AuthStatusConsumer* consumer); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Authenticator overrides. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CompleteLogin(Profile* profile, 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const UserContext& user_context) OVERRIDE; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Given |user_context|, this method attempts to authenticate to your 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Chrome OS device. As soon as we have successfully mounted the encrypted 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // home directory for the user, we will call consumer_->OnAuthSuccess() 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // with the username. 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Upon failure to login consumer_->OnAuthFailure() is called 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with an error message. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uses |profile| when doing URL fetches. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AuthenticateToLogin(Profile* profile, 1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const UserContext& user_context) OVERRIDE; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Given |user_context|, this method attempts to authenticate to the cached 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // user_context. This will never contact the server even if it's online. 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The auth result is sent to AuthStatusConsumer in a same way as 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // AuthenticateToLogin does. 1148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual void AuthenticateToUnlock(const UserContext& user_context) OVERRIDE; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Initiates supervised user login. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Creates cryptohome if missing or mounts existing one and 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // notifies consumer on the success/failure. 11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void LoginAsSupervisedUser(const UserContext& user_context) OVERRIDE; 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Initiates retail mode login. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mounts tmpfs and notifies consumer on the success/failure. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void LoginRetailMode() OVERRIDE; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initiates incognito ("browse without signing in") login. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mounts tmpfs and notifies consumer on the success/failure. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void LoginOffTheRecord() OVERRIDE; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Initiates login into a public session. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Mounts an ephemeral cryptohome and notifies consumer on the 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // success/failure. 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void LoginAsPublicSession(const UserContext& user_context) OVERRIDE; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 134424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Initiates login into the kiosk mode account identified by |app_user_id|. 135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Mounts an ephemeral guest cryptohome if |use_guest_mount| is |true|. 136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Otherwise, mounts a public cryptohome, which will be ephemeral if the 137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // |DeviceEphemeralUsersEnabled| policy is enabled and non-ephemeral 138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // otherwise. 139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void LoginAsKioskAccount(const std::string& app_user_id, 140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch bool use_guest_mount) OVERRIDE; 141424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These methods must be called on the UI thread, as they make DBus calls 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and also call back to the login UI. 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnRetailModeAuthSuccess() OVERRIDE; 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnAuthSuccess() OVERRIDE; 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnAuthFailure(const AuthFailure& error) OVERRIDE; 14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void RecoverEncryptedData(const std::string& old_password) OVERRIDE; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ResyncEncryptedData() OVERRIDE; 1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AuthAttemptStateResolver overrides. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempts to make a decision and call back |consumer_| based on 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the state we have gathered at the time of call. If a decision 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can't be made, defers until the next time this is called. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When a decision is made, will call back to |consumer_| on the UI thread. 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called on the UI thread. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Resolve() OVERRIDE; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnOffTheRecordAuthSuccess(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnPasswordChangeDetected(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual ~CryptohomeAuthenticator(); 16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) typedef base::Callback<void(bool is_owner)> IsOwnerCallback; 16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Method to be implemented in child. Return |true| if user specified in 16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // |context| exists on device. 16903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual bool IsKnownUser(const UserContext& context) = 0; 17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Method to be implemented in child. Return |true| if device is running 17203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // in safe mode. 17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual bool IsSafeMode() = 0; 17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Method to be implemented in child. Have to call |callback| with boolean 17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // parameter that indicates if user in |context| can act as an owner in 17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // safe mode. 17803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void CheckSafeModeOwnership(const UserContext& context, 17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const IsOwnerCallback& callback) = 0; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) friend class CryptohomeAuthenticatorTest; 18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(CryptohomeAuthenticatorTest, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResolveOwnerNeededDirectFailedMount); 18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(CryptohomeAuthenticatorTest, 18603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) ResolveOwnerNeededMount); 18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(CryptohomeAuthenticatorTest, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResolveOwnerNeededFailedMount); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 190424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Removes the cryptohome of the user. 191424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void RemoveEncryptedData(); 192424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the AuthState we're in, given the status info we have at 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the time of call. 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called on the IO thread. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthState ResolveState(); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper for ResolveState(). 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given that some cryptohome operation has failed, determine which of the 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // possible failure states we're in. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called on the IO thread. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthState ResolveCryptohomeFailureState(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper for ResolveState(). 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given that some cryptohome operation has succeeded, determine which of 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the possible states we're in. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called on the IO thread. 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthState ResolveCryptohomeSuccessState(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper for ResolveState(). 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Given that some online auth operation has succeeded, determine which of 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the possible success states we're in. 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Must be called on the IO thread. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AuthState ResolveOnlineSuccessState(AuthState offline_state); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for testing. 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_attempt_state(TestAttemptState* new_state) { // takes ownership. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_state_.reset(new_state); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used for testing to set the expected state of an owner check. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetOwnerState(bool owner_check_finished, bool check_result); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // checks if the current mounted home contains the owner case and either 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // continues or fails the log-in. Used for policy lost mitigation "safe-mode". 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the owner check has been successful or if it is not needed. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool VerifyOwner(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles completion of the ownership check and continues login. 230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void OnOwnershipChecked(bool is_owner); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signal login completion status for cases when a new user is added via 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an external authentication provider (i.e. GAIA extension). 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ResolveLoginCompletionStatus(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<base::TaskRunner> task_runner_; 23703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AuthAttemptState> current_state_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool migrate_attempted_; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool remove_attempted_; 241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool resync_attempted_; 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool ephemeral_mount_attempted_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool check_key_attempted_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the user has changed her password, but gives us the old one, we will 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be able to mount her cryptohome, but online authentication will fail. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This allows us to present the same behavior to the caller, regardless 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the order in which we receive these results. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool already_reported_success_; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock success_lock_; // A lock around |already_reported_success_|. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flags signaling whether the owner verification has been done and the result 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of it. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool owner_is_verified_; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_can_login_; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 257424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Flag indicating to delete the user's cryptohome the login fails. 258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool remove_user_data_on_failure_; 259424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // When |remove_user_data_on_failure_| is set, we delay calling 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // consumer_->OnAuthFailure() until we removed the user cryptohome. 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const AuthFailure* delayed_login_failure_; 263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 26403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CryptohomeAuthenticator); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chromeos 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif // CHROMEOS_LOGIN_AUTH_CRYPTOHOME_AUTHENTICATOR_H_ 270