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