- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / login / login_status_consumer.h
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_