1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROMEOS_LOGIN_AUTH_AUTH_STATUS_CONSUMER_H_ 6 #define CHROMEOS_LOGIN_AUTH_AUTH_STATUS_CONSUMER_H_ 7 8 #include <string> 9 10 #include "base/logging.h" 11 #include "chromeos/chromeos_export.h" 12 #include "google_apis/gaia/gaia_auth_consumer.h" 13 #include "google_apis/gaia/google_service_auth_error.h" 14 #include "net/base/net_errors.h" 15 16 namespace chromeos { 17 18 class UserContext; 19 20 class CHROMEOS_EXPORT AuthFailure { 21 public: 22 enum FailureReason { 23 NONE, 24 COULD_NOT_MOUNT_CRYPTOHOME, 25 COULD_NOT_MOUNT_TMPFS, 26 COULD_NOT_UNMOUNT_CRYPTOHOME, 27 DATA_REMOVAL_FAILED, // Could not destroy your old data 28 LOGIN_TIMED_OUT, 29 UNLOCK_FAILED, 30 NETWORK_AUTH_FAILED, // Could not authenticate against Google 31 OWNER_REQUIRED, // Only the device owner can log-in. 32 WHITELIST_CHECK_FAILED, // Login attempt blocked by whitelist. This value 33 // is 34 // synthesized by the ExistingUserController and 35 // passed to the login_status_consumer_ in tests 36 // only. It is never generated or seen by any of the 37 // other authenticator classes. 38 TPM_ERROR, // Critical TPM error encountered. 39 USERNAME_HASH_FAILED, // Could not get username hash. 40 NUM_FAILURE_REASONS, // This has to be the last item. 41 }; 42 43 explicit AuthFailure(FailureReason reason) 44 : reason_(reason), error_(GoogleServiceAuthError::NONE) { 45 DCHECK(reason != NETWORK_AUTH_FAILED); 46 } 47 48 inline bool operator==(const AuthFailure& b) const { 49 if (reason_ != b.reason_) { 50 return false; 51 } 52 if (reason_ == NETWORK_AUTH_FAILED) { 53 return error_ == b.error_; 54 } 55 return true; 56 } 57 58 static AuthFailure FromNetworkAuthFailure( 59 const GoogleServiceAuthError& error) { 60 return AuthFailure(NETWORK_AUTH_FAILED, error); 61 } 62 63 static AuthFailure AuthFailureNone() { return AuthFailure(NONE); } 64 65 const std::string GetErrorString() const { 66 switch (reason_) { 67 case DATA_REMOVAL_FAILED: 68 return "Could not destroy your old data."; 69 case COULD_NOT_MOUNT_CRYPTOHOME: 70 return "Could not mount cryptohome."; 71 case COULD_NOT_UNMOUNT_CRYPTOHOME: 72 return "Could not unmount cryptohome."; 73 case COULD_NOT_MOUNT_TMPFS: 74 return "Could not mount tmpfs."; 75 case LOGIN_TIMED_OUT: 76 return "Login timed out. Please try again."; 77 case UNLOCK_FAILED: 78 return "Unlock failed."; 79 case NETWORK_AUTH_FAILED: 80 if (error_.state() == GoogleServiceAuthError::CONNECTION_FAILED) { 81 return net::ErrorToString(error_.network_error()); 82 } 83 return "Google authentication failed."; 84 case OWNER_REQUIRED: 85 return "Login is restricted to the owner's account only."; 86 case WHITELIST_CHECK_FAILED: 87 return "Login attempt blocked by whitelist."; 88 default: 89 NOTREACHED(); 90 return std::string(); 91 } 92 } 93 94 const GoogleServiceAuthError& error() const { return error_; } 95 const FailureReason& reason() const { return reason_; } 96 97 private: 98 AuthFailure(FailureReason reason, GoogleServiceAuthError error) 99 : reason_(reason), error_(error) {} 100 101 FailureReason reason_; 102 GoogleServiceAuthError error_; 103 }; 104 105 // An interface that defines the callbacks for objects that the 106 // Authenticator class will call to report the success/failure of 107 // authentication for Chromium OS. 108 class CHROMEOS_EXPORT AuthStatusConsumer { 109 public: 110 virtual ~AuthStatusConsumer() {} 111 // The current login attempt has ended in failure, with error |error|. 112 virtual void OnAuthFailure(const AuthFailure& error) = 0; 113 114 // The current retail mode login attempt has succeeded. 115 // Unless overridden for special processing, this should always call 116 // OnLoginSuccess with the magic |kRetailModeUserEMail| constant. 117 virtual void OnRetailModeAuthSuccess(const UserContext& user_context); 118 // The current login attempt has succeeded for |user_context|. 119 virtual void OnAuthSuccess(const UserContext& user_context) = 0; 120 // The current guest login attempt has succeeded. 121 virtual void OnOffTheRecordAuthSuccess() {} 122 // The same password didn't work both online and offline. 123 virtual void OnPasswordChangeDetected(); 124 }; 125 126 } // namespace chromeos 127 128 #endif // CHROMEOS_LOGIN_AUTH_AUTH_STATUS_CONSUMER_H_ 129