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