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