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