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)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef CHROMEOS_LOGIN_AUTH_AUTH_STATUS_CONSUMER_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define CHROMEOS_LOGIN_AUTH_AUTH_STATUS_CONSUMER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/chromeos_export.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/gaia_auth_consumer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class UserContext;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass CHROMEOS_EXPORT AuthFailure {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum FailureReason {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NONE,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COULD_NOT_MOUNT_CRYPTOHOME,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COULD_NOT_MOUNT_TMPFS,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COULD_NOT_UNMOUNT_CRYPTOHOME,
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DATA_REMOVAL_FAILED,  // Could not destroy your old data
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LOGIN_TIMED_OUT,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNLOCK_FAILED,
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NETWORK_AUTH_FAILED,     // Could not authenticate against Google
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    OWNER_REQUIRED,          // Only the device owner can log-in.
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WHITELIST_CHECK_FAILED,  // Login attempt blocked by whitelist. This value
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             // is
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             // synthesized by the ExistingUserController and
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             // passed to the login_status_consumer_ in tests
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // only. It is never generated or seen by any of the
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // other authenticator classes.
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    TPM_ERROR,             // Critical TPM error encountered.
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    USERNAME_HASH_FAILED,  // Could not get username hash.
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NUM_FAILURE_REASONS,   // This has to be the last item.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  explicit AuthFailure(FailureReason reason)
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : reason_(reason), error_(GoogleServiceAuthError::NONE) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(reason != NETWORK_AUTH_FAILED);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  inline bool operator==(const AuthFailure& b) const {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reason_ != b.reason_) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reason_ == NETWORK_AUTH_FAILED) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return error_ == b.error_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static AuthFailure FromNetworkAuthFailure(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GoogleServiceAuthError& error) {
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return AuthFailure(NETWORK_AUTH_FAILED, error);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static AuthFailure AuthFailureNone() { return AuthFailure(NONE); }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string GetErrorString() const {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (reason_) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case DATA_REMOVAL_FAILED:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return "Could not destroy your old data.";
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case COULD_NOT_MOUNT_CRYPTOHOME:
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return "Could not mount cryptohome.";
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case COULD_NOT_UNMOUNT_CRYPTOHOME:
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return "Could not unmount cryptohome.";
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case COULD_NOT_MOUNT_TMPFS:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return "Could not mount tmpfs.";
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case LOGIN_TIMED_OUT:
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return "Login timed out. Please try again.";
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case UNLOCK_FAILED:
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return "Unlock failed.";
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case NETWORK_AUTH_FAILED:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (error_.state() == GoogleServiceAuthError::CONNECTION_FAILED) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return net::ErrorToString(error_.network_error());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return "Google authentication failed.";
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case OWNER_REQUIRED:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return "Login is restricted to the owner's account only.";
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case WHITELIST_CHECK_FAILED:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return "Login attempt blocked by whitelist.";
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NOTREACHED();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return std::string();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GoogleServiceAuthError& error() const { return error_; }
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const FailureReason& reason() const { return reason_; }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AuthFailure(FailureReason reason, GoogleServiceAuthError error)
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : reason_(reason), error_(error) {}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FailureReason reason_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GoogleServiceAuthError error_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface that defines the callbacks for objects that the
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Authenticator class will call to report the success/failure of
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// authentication for Chromium OS.
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass CHROMEOS_EXPORT AuthStatusConsumer {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~AuthStatusConsumer() {}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The current login attempt has ended in failure, with error |error|.
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnAuthFailure(const AuthFailure& error) = 0;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The current retail mode login attempt has succeeded.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unless overridden for special processing, this should always call
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // OnLoginSuccess with the magic |kRetailModeUserEMail| constant.
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnRetailModeAuthSuccess(const UserContext& user_context);
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The current login attempt has succeeded for |user_context|.
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnAuthSuccess(const UserContext& user_context) = 0;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The current guest login attempt has succeeded.
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnOffTheRecordAuthSuccess() {}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The same password didn't work both online and offline.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPasswordChangeDetected();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // CHROMEOS_LOGIN_AUTH_AUTH_STATUS_CONSUMER_H_
129