user.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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 COMPONENTS_USER_MANAGER_USER_H_
6#define COMPONENTS_USER_MANAGER_USER_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/strings/string16.h"
13#include "components/user_manager/user_image/user_image.h"
14#include "components/user_manager/user_info.h"
15#include "components/user_manager/user_manager_export.h"
16#include "components/user_manager/user_type.h"
17#include "third_party/skia/include/core/SkBitmap.h"
18#include "ui/gfx/image/image_skia.h"
19
20namespace chromeos {
21class ChromeUserManagerImpl;
22class FakeLoginUtils;
23class FakeUserManager;
24class MockUserManager;
25class SupervisedUserManagerImpl;
26class UserAddingScreenTest;
27class UserImageManagerImpl;
28class UserSessionManager;
29}
30
31namespace user_manager {
32
33class UserManagerBase;
34
35// A class representing information about a previously logged in user.
36// Each user has a canonical email (username), returned by |email()| and
37// may have a different displayed email (in the raw form as entered by user),
38// returned by |displayed_email()|.
39// Displayed emails are for use in UI only, anywhere else users must be referred
40// to by |email()|.
41class USER_MANAGER_EXPORT User : public UserInfo {
42 public:
43  // User OAuth token status according to the last check.
44  // Please note that enum values 1 and 2 were used for OAuth1 status and are
45  // deprecated now.
46  typedef enum {
47    OAUTH_TOKEN_STATUS_UNKNOWN = 0,
48    OAUTH2_TOKEN_STATUS_INVALID = 3,
49    OAUTH2_TOKEN_STATUS_VALID = 4,
50  } OAuthTokenStatus;
51
52  // These special values are used instead of actual default image indices.
53  typedef enum {
54    USER_IMAGE_INVALID = -3,
55
56    // Returned as |image_index| when user profile image is used as user image.
57    USER_IMAGE_PROFILE = -2,
58
59    // Returned as |image_index| when user-selected file or photo is used as
60    // user image.
61    USER_IMAGE_EXTERNAL = -1,
62  } UserImageType;
63
64  // This enum is used to define the buckets for an enumerated UMA histogram.
65  // Hence,
66  //   (a) existing enumerated constants should never be deleted or reordered,
67  //   (b) new constants should only be appended at the end of the enumeration.
68  enum WallpaperType {
69    /* DAILY = 0 */    // Removed.
70    CUSTOMIZED = 1,    // Selected by user.
71    DEFAULT = 2,       // Default.
72    /* UNKNOWN = 3 */  // Removed.
73    ONLINE = 4,        // WallpaperInfo.location denotes an URL.
74    POLICY = 5,        // Controlled by policy, can't be changed by the user.
75    WALLPAPER_TYPE_COUNT = 6
76  };
77
78  // Returns the user type.
79  virtual UserType GetType() const = 0;
80
81  // The email the user used to log in.
82  const std::string& email() const { return email_; }
83
84  // The displayed user name.
85  base::string16 display_name() const { return display_name_; }
86
87  // UserInfo
88  virtual std::string GetEmail() const OVERRIDE;
89  virtual base::string16 GetDisplayName() const OVERRIDE;
90  virtual base::string16 GetGivenName() const OVERRIDE;
91  virtual const gfx::ImageSkia& GetImage() const OVERRIDE;
92  virtual std::string GetUserID() const OVERRIDE;
93
94  // Is user supervised.
95  virtual bool IsSupervised() const;
96  virtual void SetIsSupervised(bool is_supervised);
97
98  // Returns the account name part of the email. Use the display form of the
99  // email if available and use_display_name == true. Otherwise use canonical.
100  std::string GetAccountName(bool use_display_email) const;
101
102  // Whether the user has a default image.
103  bool HasDefaultImage() const;
104
105  // True if user image can be synced.
106  virtual bool CanSyncImage() const;
107
108  int image_index() const { return image_index_; }
109  bool has_raw_image() const { return user_image_.has_raw_image(); }
110  // Returns raw representation of static user image.
111  const UserImage::RawImage& raw_image() const {
112    return user_image_.raw_image();
113  }
114
115  // Whether |raw_image| contains data in format that is considered safe to
116  // decode in sensitive environment (on Login screen).
117  bool image_is_safe_format() const { return user_image_.is_safe_format(); }
118
119  // Returns the URL of user image, if there is any. Currently only the profile
120  // image has a URL, for other images empty URL is returned.
121  GURL image_url() const { return user_image_.url(); }
122
123  // True if user image is a stub (while real image is being loaded from file).
124  bool image_is_stub() const { return image_is_stub_; }
125
126  // True if image is being loaded from file.
127  bool image_is_loading() const { return image_is_loading_; }
128
129  // The displayed (non-canonical) user email.
130  virtual std::string display_email() const;
131
132  // OAuth token status for this user.
133  OAuthTokenStatus oauth_token_status() const { return oauth_token_status_; }
134
135  // Whether online authentication against GAIA should be enforced during the
136  // user's next sign-in.
137  bool force_online_signin() const { return force_online_signin_; }
138
139  // True if the user's session can be locked (i.e. the user has a password with
140  // which to unlock the session).
141  bool can_lock() const;
142
143  // Returns empty string when home dir hasn't been mounted yet.
144  std::string username_hash() const;
145
146  // True if current user is logged in.
147  bool is_logged_in() const;
148
149  // True if current user is active within the current session.
150  bool is_active() const;
151
152  // True if the user Profile is created.
153  bool is_profile_created() const { return profile_is_created_; }
154
155 protected:
156  friend class UserManagerBase;
157  friend class chromeos::ChromeUserManagerImpl;
158  friend class chromeos::SupervisedUserManagerImpl;
159  friend class chromeos::UserImageManagerImpl;
160  friend class chromeos::UserSessionManager;
161
162  // For testing:
163  friend class chromeos::MockUserManager;
164  friend class chromeos::FakeLoginUtils;
165  friend class chromeos::FakeUserManager;
166  friend class chromeos::UserAddingScreenTest;
167
168  // Do not allow anyone else to create new User instances.
169  static User* CreateRegularUser(const std::string& email);
170  static User* CreateGuestUser();
171  static User* CreateKioskAppUser(const std::string& kiosk_app_username);
172  static User* CreateSupervisedUser(const std::string& username);
173  static User* CreateRetailModeUser();
174  static User* CreatePublicAccountUser(const std::string& email);
175
176  explicit User(const std::string& email);
177  virtual ~User();
178
179  const std::string* GetAccountLocale() const { return account_locale_.get(); }
180
181  // Setters are private so only UserManager can call them.
182  void SetAccountLocale(const std::string& resolved_account_locale);
183
184  void SetImage(const UserImage& user_image, int image_index);
185
186  void SetImageURL(const GURL& image_url);
187
188  // Sets a stub image until the next |SetImage| call. |image_index| may be
189  // one of |USER_IMAGE_EXTERNAL| or |USER_IMAGE_PROFILE|.
190  // If |is_loading| is |true|, that means user image is being loaded from file.
191  void SetStubImage(const UserImage& stub_user_image,
192                    int image_index,
193                    bool is_loading);
194
195  void set_display_name(const base::string16& display_name) {
196    display_name_ = display_name;
197  }
198
199  void set_given_name(const base::string16& given_name) {
200    given_name_ = given_name;
201  }
202
203  void set_display_email(const std::string& display_email) {
204    display_email_ = display_email;
205  }
206
207  const UserImage& user_image() const { return user_image_; }
208
209  void set_oauth_token_status(OAuthTokenStatus status) {
210    oauth_token_status_ = status;
211  }
212
213  void set_force_online_signin(bool force_online_signin) {
214    force_online_signin_ = force_online_signin;
215  }
216
217  void set_username_hash(const std::string& username_hash) {
218    username_hash_ = username_hash;
219  }
220
221  void set_is_logged_in(bool is_logged_in) { is_logged_in_ = is_logged_in; }
222
223  void set_can_lock(bool can_lock) { can_lock_ = can_lock; }
224
225  void set_is_active(bool is_active) { is_active_ = is_active; }
226
227  void set_profile_is_created() { profile_is_created_ = true; }
228
229  // True if user has google account (not a guest or managed user).
230  bool has_gaia_account() const;
231
232 private:
233  std::string email_;
234  base::string16 display_name_;
235  base::string16 given_name_;
236  // The displayed user email, defaults to |email_|.
237  std::string display_email_;
238  UserImage user_image_;
239  OAuthTokenStatus oauth_token_status_;
240  bool force_online_signin_;
241
242  // This is set to chromeos locale if account data has been downloaded.
243  // (Or failed to download, but at least one download attempt finished).
244  // An empty string indicates error in data load, or in
245  // translation of Account locale to chromeos locale.
246  scoped_ptr<std::string> account_locale_;
247
248  // Used to identify homedir mount point.
249  std::string username_hash_;
250
251  // Either index of a default image for the user, |USER_IMAGE_EXTERNAL| or
252  // |USER_IMAGE_PROFILE|.
253  int image_index_;
254
255  // True if current user image is a stub set by a |SetStubImage| call.
256  bool image_is_stub_;
257
258  // True if current user image is being loaded from file.
259  bool image_is_loading_;
260
261  // True if user is able to lock screen.
262  bool can_lock_;
263
264  // True if user is currently logged in in current session.
265  bool is_logged_in_;
266
267  // True if user is currently logged in and active in current session.
268  bool is_active_;
269
270  // True if user Profile is created
271  bool profile_is_created_;
272
273  DISALLOW_COPY_AND_ASSIGN(User);
274};
275
276// List of known users.
277typedef std::vector<User*> UserList;
278
279}  // namespace user_manager
280
281#endif  // COMPONENTS_USER_MANAGER_USER_H_
282