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#include "chrome/browser/chromeos/login/users/user.h"
6
7#include "base/logging.h"
8#include "base/strings/stringprintf.h"
9#include "base/strings/utf_string_conversions.h"
10#include "base/threading/thread_restrictions.h"
11#include "chrome/browser/chromeos/login/helper.h"
12#include "chrome/browser/chromeos/login/users/avatar/default_user_images.h"
13#include "chrome/browser/chromeos/login/users/user_manager.h"
14#include "google_apis/gaia/gaia_auth_util.h"
15#include "grit/theme_resources.h"
16#include "ui/base/resource/resource_bundle.h"
17
18namespace chromeos {
19
20namespace {
21
22// Returns account name portion of an email.
23std::string GetUserName(const std::string& email) {
24  std::string::size_type i = email.find('@');
25  if (i == 0 || i == std::string::npos) {
26    return email;
27  }
28  return email.substr(0, i);
29}
30
31}  // namespace
32
33const int User::kExternalImageIndex;
34const int User::kProfileImageIndex;
35const int User::kInvalidImageIndex;
36
37class RegularUser : public User {
38 public:
39  explicit RegularUser(const std::string& email);
40  virtual ~RegularUser();
41
42  // Overridden from User:
43  virtual UserType GetType() const OVERRIDE;
44  virtual bool CanSyncImage() const OVERRIDE;
45
46 private:
47  DISALLOW_COPY_AND_ASSIGN(RegularUser);
48};
49
50class GuestUser : public User {
51 public:
52  GuestUser();
53  virtual ~GuestUser();
54
55  // Overridden from User:
56  virtual UserType GetType() const OVERRIDE;
57
58 private:
59  DISALLOW_COPY_AND_ASSIGN(GuestUser);
60};
61
62class KioskAppUser : public User {
63 public:
64  explicit KioskAppUser(const std::string& app_id);
65  virtual ~KioskAppUser();
66
67  // Overridden from User:
68  virtual UserType GetType() const OVERRIDE;
69
70 private:
71  DISALLOW_COPY_AND_ASSIGN(KioskAppUser);
72};
73
74class LocallyManagedUser : public User {
75 public:
76  explicit LocallyManagedUser(const std::string& username);
77  virtual ~LocallyManagedUser();
78
79  // Overridden from User:
80  virtual UserType GetType() const OVERRIDE;
81  virtual std::string display_email() const OVERRIDE;
82
83 private:
84  DISALLOW_COPY_AND_ASSIGN(LocallyManagedUser);
85};
86
87class RetailModeUser : public User {
88 public:
89  RetailModeUser();
90  virtual ~RetailModeUser();
91
92  // Overridden from User:
93  virtual UserType GetType() const OVERRIDE;
94
95 private:
96  DISALLOW_COPY_AND_ASSIGN(RetailModeUser);
97};
98
99class PublicAccountUser : public User {
100 public:
101  explicit PublicAccountUser(const std::string& email);
102  virtual ~PublicAccountUser();
103
104  // Overridden from User:
105  virtual UserType GetType() const OVERRIDE;
106
107 private:
108  DISALLOW_COPY_AND_ASSIGN(PublicAccountUser);
109};
110
111std::string User::GetEmail() const {
112  return display_email();
113}
114
115base::string16 User::GetDisplayName() const {
116  // Fallback to the email account name in case display name haven't been set.
117  return display_name_.empty() ?
118      base::UTF8ToUTF16(GetAccountName(true)) :
119      display_name_;
120}
121
122base::string16 User::GetGivenName() const {
123  return given_name_;
124}
125
126const gfx::ImageSkia& User::GetImage() const {
127  return user_image_.image();
128}
129
130std::string User::GetUserID() const {
131  return gaia::CanonicalizeEmail(gaia::SanitizeEmail(email()));
132}
133
134std::string User::GetAccountName(bool use_display_email) const {
135  if (use_display_email && !display_email_.empty())
136    return GetUserName(display_email_);
137  else
138    return GetUserName(email_);
139}
140
141bool User::HasDefaultImage() const {
142  return image_index_ >= 0 && image_index_ < kDefaultImagesCount;
143}
144
145bool User::CanSyncImage() const {
146  return false;
147}
148
149std::string User::display_email() const {
150  return display_email_;
151}
152
153bool User::can_lock() const {
154  return can_lock_;
155}
156
157std::string User::username_hash() const {
158  return username_hash_;
159}
160
161bool User::is_logged_in() const {
162  return is_logged_in_;
163}
164
165bool User::is_active() const {
166  return is_active_;
167}
168
169User* User::CreateRegularUser(const std::string& email) {
170  return new RegularUser(email);
171}
172
173User* User::CreateGuestUser() {
174  return new GuestUser;
175}
176
177User* User::CreateKioskAppUser(const std::string& kiosk_app_username) {
178  return new KioskAppUser(kiosk_app_username);
179}
180
181User* User::CreateLocallyManagedUser(const std::string& username) {
182  return new LocallyManagedUser(username);
183}
184
185User* User::CreateRetailModeUser() {
186  return new RetailModeUser;
187}
188
189User* User::CreatePublicAccountUser(const std::string& email) {
190  return new PublicAccountUser(email);
191}
192
193User::User(const std::string& email)
194    : email_(email),
195      oauth_token_status_(OAUTH_TOKEN_STATUS_UNKNOWN),
196      force_online_signin_(false),
197      image_index_(kInvalidImageIndex),
198      image_is_stub_(false),
199      image_is_loading_(false),
200      can_lock_(false),
201      is_logged_in_(false),
202      is_active_(false),
203      profile_is_created_(false) {
204}
205
206User::~User() {}
207
208void User::SetAccountLocale(const std::string& resolved_account_locale) {
209  account_locale_.reset(new std::string(resolved_account_locale));
210}
211
212void User::SetImage(const UserImage& user_image, int image_index) {
213  user_image_ = user_image;
214  image_index_ = image_index;
215  image_is_stub_ = false;
216  image_is_loading_ = false;
217  DCHECK(HasDefaultImage() || user_image.has_raw_image());
218}
219
220void User::SetImageURL(const GURL& image_url) {
221  user_image_.set_url(image_url);
222}
223
224void User::SetStubImage(int image_index, bool is_loading) {
225  user_image_ = UserImage(
226      *ResourceBundle::GetSharedInstance().
227          GetImageSkiaNamed(IDR_PROFILE_PICTURE_LOADING));
228  image_index_ = image_index;
229  image_is_stub_ = true;
230  image_is_loading_ = is_loading;
231}
232
233RegularUser::RegularUser(const std::string& email) : User(email) {
234  set_can_lock(true);
235  set_display_email(email);
236}
237
238RegularUser::~RegularUser() {}
239
240User::UserType RegularUser::GetType() const {
241  return USER_TYPE_REGULAR;
242}
243
244bool RegularUser::CanSyncImage() const {
245  return true;
246}
247
248GuestUser::GuestUser() : User(UserManager::kGuestUserName) {
249  set_display_email(std::string());
250}
251
252GuestUser::~GuestUser() {}
253
254User::UserType GuestUser::GetType() const {
255  return USER_TYPE_GUEST;
256}
257
258KioskAppUser::KioskAppUser(const std::string& kiosk_app_username)
259    : User(kiosk_app_username) {
260  set_display_email(kiosk_app_username);
261}
262
263KioskAppUser::~KioskAppUser() {}
264
265User::UserType KioskAppUser::GetType() const {
266  return USER_TYPE_KIOSK_APP;
267}
268
269LocallyManagedUser::LocallyManagedUser(const std::string& username)
270    : User(username) {
271  set_can_lock(true);
272}
273
274LocallyManagedUser::~LocallyManagedUser() {}
275
276User::UserType LocallyManagedUser::GetType() const {
277  return USER_TYPE_LOCALLY_MANAGED;
278}
279
280std::string LocallyManagedUser::display_email() const {
281  return base::UTF16ToUTF8(display_name());
282}
283
284RetailModeUser::RetailModeUser() : User(UserManager::kRetailModeUserName) {
285  set_display_email(std::string());
286}
287
288RetailModeUser::~RetailModeUser() {}
289
290User::UserType RetailModeUser::GetType() const {
291  return USER_TYPE_RETAIL_MODE;
292}
293
294PublicAccountUser::PublicAccountUser(const std::string& email) : User(email) {
295}
296
297PublicAccountUser::~PublicAccountUser() {}
298
299User::UserType PublicAccountUser::GetType() const {
300  return USER_TYPE_PUBLIC_ACCOUNT;
301}
302
303bool User::has_gaia_account() const {
304  COMPILE_ASSERT(NUM_USER_TYPES == 6, num_user_types_unexpected);
305  switch (GetType()) {
306    case USER_TYPE_REGULAR:
307      return true;
308    case USER_TYPE_GUEST:
309    case USER_TYPE_RETAIL_MODE:
310    case USER_TYPE_PUBLIC_ACCOUNT:
311    case USER_TYPE_LOCALLY_MANAGED:
312    case USER_TYPE_KIOSK_APP:
313      return false;
314    default:
315      NOTREACHED();
316  }
317  return false;
318}
319
320}  // namespace chromeos
321