| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/chromeos/login/user_manager_impl.h" | 5 #include "chrome/browser/chromeos/login/user_manager_impl.h" |
| 6 | 6 |
| 7 #include <cstddef> | 7 #include <cstddef> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 registry->RegisterDictionaryPref(kUserOAuthTokenStatus); | 183 registry->RegisterDictionaryPref(kUserOAuthTokenStatus); |
| 184 registry->RegisterDictionaryPref(kUserDisplayName); | 184 registry->RegisterDictionaryPref(kUserDisplayName); |
| 185 registry->RegisterDictionaryPref(kUserDisplayEmail); | 185 registry->RegisterDictionaryPref(kUserDisplayEmail); |
| 186 SessionLengthLimiter::RegisterPrefs(registry); | 186 SessionLengthLimiter::RegisterPrefs(registry); |
| 187 } | 187 } |
| 188 | 188 |
| 189 UserManagerImpl::UserManagerImpl() | 189 UserManagerImpl::UserManagerImpl() |
| 190 : cros_settings_(CrosSettings::Get()), | 190 : cros_settings_(CrosSettings::Get()), |
| 191 device_local_account_policy_service_(NULL), | 191 device_local_account_policy_service_(NULL), |
| 192 users_loaded_(false), | 192 users_loaded_(false), |
| 193 logged_in_user_(NULL), | 193 active_user_(NULL), |
| 194 session_started_(false), | 194 session_started_(false), |
| 195 is_current_user_owner_(false), | 195 is_current_user_owner_(false), |
| 196 is_current_user_new_(false), | 196 is_current_user_new_(false), |
| 197 is_current_user_ephemeral_regular_user_(false), | 197 is_current_user_ephemeral_regular_user_(false), |
| 198 ephemeral_users_enabled_(false), | 198 ephemeral_users_enabled_(false), |
| 199 merge_session_state_(MERGE_STATUS_NOT_STARTED), | 199 merge_session_state_(MERGE_STATUS_NOT_STARTED), |
| 200 observed_sync_service_(NULL), | 200 observed_sync_service_(NULL), |
| 201 user_image_manager_(new UserImageManagerImpl) { | 201 user_image_manager_(new UserImageManagerImpl) { |
| 202 // UserManager instance should be used only on UI thread. | 202 // UserManager instance should be used only on UI thread. |
| 203 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 203 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 204 registrar_.Add(this, chrome::NOTIFICATION_OWNERSHIP_STATUS_CHANGED, | 204 registrar_.Add(this, chrome::NOTIFICATION_OWNERSHIP_STATUS_CHANGED, |
| 205 content::NotificationService::AllSources()); | 205 content::NotificationService::AllSources()); |
| 206 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_ADDED, | 206 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_ADDED, |
| 207 content::NotificationService::AllSources()); | 207 content::NotificationService::AllSources()); |
| 208 RetrieveTrustedDevicePolicies(); | 208 RetrieveTrustedDevicePolicies(); |
| 209 } | 209 } |
| 210 | 210 |
| 211 UserManagerImpl::~UserManagerImpl() { | 211 UserManagerImpl::~UserManagerImpl() { |
| 212 // Can't use STLDeleteElements because of the private destructor of User. | 212 // Can't use STLDeleteElements because of the private destructor of User. |
| 213 for (UserList::iterator it = users_.begin(); it != users_.end(); | 213 for (UserList::iterator it = users_.begin(); it != users_.end(); |
| 214 it = users_.erase(it)) { | 214 it = users_.erase(it)) { |
| 215 if (logged_in_user_ == *it) | 215 if (active_user_ == *it) |
| 216 logged_in_user_ = NULL; | 216 active_user_ = NULL; |
| 217 delete *it; | 217 delete *it; |
| 218 } | 218 } |
| 219 delete logged_in_user_; | 219 // These are pointers to the same User instances that were in users_ list. |
| 220 logged_in_users_.clear(); |
| 221 delete active_user_; |
| 220 } | 222 } |
| 221 | 223 |
| 222 void UserManagerImpl::Shutdown() { | 224 void UserManagerImpl::Shutdown() { |
| 223 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 225 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 224 cros_settings_->RemoveSettingsObserver(kAccountsPrefDeviceLocalAccounts, | 226 cros_settings_->RemoveSettingsObserver(kAccountsPrefDeviceLocalAccounts, |
| 225 this); | 227 this); |
| 226 // Stop the session length limiter. | 228 // Stop the session length limiter. |
| 227 session_length_limiter_.reset(); | 229 session_length_limiter_.reset(); |
| 228 | 230 |
| 229 if (device_local_account_policy_service_) | 231 if (device_local_account_policy_service_) |
| 230 device_local_account_policy_service_->RemoveObserver(this); | 232 device_local_account_policy_service_->RemoveObserver(this); |
| 231 } | 233 } |
| 232 | 234 |
| 233 UserImageManager* UserManagerImpl::GetUserImageManager() { | 235 UserImageManager* UserManagerImpl::GetUserImageManager() { |
| 234 return user_image_manager_.get(); | 236 return user_image_manager_.get(); |
| 235 } | 237 } |
| 236 | 238 |
| 237 const UserList& UserManagerImpl::GetUsers() const { | 239 const UserList& UserManagerImpl::GetUsers() const { |
| 238 const_cast<UserManagerImpl*>(this)->EnsureUsersLoaded(); | 240 const_cast<UserManagerImpl*>(this)->EnsureUsersLoaded(); |
| 239 return users_; | 241 return users_; |
| 240 } | 242 } |
| 241 | 243 |
| 244 const UserList& UserManagerImpl::GetLoggedInUsers() const { |
| 245 return logged_in_users_; |
| 246 } |
| 247 |
| 242 void UserManagerImpl::UserLoggedIn(const std::string& email, | 248 void UserManagerImpl::UserLoggedIn(const std::string& email, |
| 243 const std::string& username_hash, | 249 const std::string& username_hash, |
| 244 bool browser_restart) { | 250 bool browser_restart) { |
| 245 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 251 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 246 | 252 |
| 247 if (!CommandLine::ForCurrentProcess()->HasSwitch(::switches::kMultiProfiles)) | 253 if (!CommandLine::ForCurrentProcess()->HasSwitch(::switches::kMultiProfiles)) |
| 248 DCHECK(!IsUserLoggedIn()); | 254 DCHECK(!IsUserLoggedIn()); |
| 249 | 255 |
| 256 if (active_user_) |
| 257 active_user_->set_is_active(false); |
| 258 |
| 250 if (email == kGuestUserEMail) { | 259 if (email == kGuestUserEMail) { |
| 251 GuestUserLoggedIn(); | 260 GuestUserLoggedIn(); |
| 252 } else if (email == kRetailModeUserEMail) { | 261 } else if (email == kRetailModeUserEMail) { |
| 253 RetailModeUserLoggedIn(); | 262 RetailModeUserLoggedIn(); |
| 254 } else if (gaia::ExtractDomainName(email) == kKioskAppUserDomain) { | 263 } else if (gaia::ExtractDomainName(email) == kKioskAppUserDomain) { |
| 255 KioskAppLoggedIn(email); | 264 KioskAppLoggedIn(email); |
| 256 } else { | 265 } else { |
| 257 EnsureUsersLoaded(); | 266 EnsureUsersLoaded(); |
| 258 | 267 |
| 259 User* user = const_cast<User*>(FindUserInList(email)); | 268 User* user = FindUserInListAndModify(email); |
| 260 if (user && user->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT) { | 269 if (user && user->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT) { |
| 261 PublicAccountUserLoggedIn(user); | 270 PublicAccountUserLoggedIn(user); |
| 262 } else if ((user && | 271 } else if ((user && |
| 263 user->GetType() == User::USER_TYPE_LOCALLY_MANAGED) || | 272 user->GetType() == User::USER_TYPE_LOCALLY_MANAGED) || |
| 264 (!user && | 273 (!user && |
| 265 gaia::ExtractDomainName(email) == | 274 gaia::ExtractDomainName(email) == |
| 266 UserManager::kLocallyManagedUserDomain)) { | 275 UserManager::kLocallyManagedUserDomain)) { |
| 267 LocallyManagedUserLoggedIn(email); | 276 LocallyManagedUserLoggedIn(email); |
| 268 } else if (browser_restart && email == g_browser_process->local_state()-> | 277 } else if (browser_restart && email == g_browser_process->local_state()-> |
| 269 GetString(kPublicAccountPendingDataRemoval)) { | 278 GetString(kPublicAccountPendingDataRemoval)) { |
| 270 PublicAccountUserLoggedIn(User::CreatePublicAccountUser(email)); | 279 PublicAccountUserLoggedIn(User::CreatePublicAccountUser(email)); |
| 271 } else if (email != owner_email_ && !user && | 280 } else if (email != owner_email_ && !user && |
| 272 (AreEphemeralUsersEnabled() || browser_restart)) { | 281 (AreEphemeralUsersEnabled() || browser_restart)) { |
| 273 RegularUserLoggedInAsEphemeral(email); | 282 RegularUserLoggedInAsEphemeral(email); |
| 274 } else { | 283 } else { |
| 275 RegularUserLoggedIn(email, browser_restart); | 284 RegularUserLoggedIn(email, browser_restart); |
| 276 } | 285 } |
| 277 | 286 |
| 278 // Initialize the session length limiter and start it only if | 287 // Initialize the session length limiter and start it only if |
| 279 // session limit is defined by the policy. | 288 // session limit is defined by the policy. |
| 280 session_length_limiter_.reset(new SessionLengthLimiter(NULL, | 289 session_length_limiter_.reset(new SessionLengthLimiter(NULL, |
| 281 browser_restart)); | 290 browser_restart)); |
| 282 } | 291 } |
| 283 DCHECK(logged_in_user_); | 292 DCHECK(active_user_); |
| 284 logged_in_user_->set_username_hash(username_hash); | 293 active_user_->set_is_logged_in(true); |
| 294 active_user_->set_is_active(true); |
| 295 active_user_->set_username_hash(username_hash); |
| 296 |
| 297 // Place user who just signed in to the top of the logged in users. |
| 298 logged_in_users_.insert(logged_in_users_.begin(), active_user_); |
| 285 | 299 |
| 286 NotifyOnLogin(); | 300 NotifyOnLogin(); |
| 287 } | 301 } |
| 288 | 302 |
| 303 void UserManagerImpl::SwitchActiveUser(const std::string& email) { |
| 304 if (!CommandLine::ForCurrentProcess()->HasSwitch(::switches::kMultiProfiles)) |
| 305 return; |
| 306 |
| 307 User* user = FindUserAndModify(email); |
| 308 if (!user) { |
| 309 NOTREACHED() << "Switching to a non-existing user"; |
| 310 return; |
| 311 } |
| 312 if (user == active_user_) { |
| 313 NOTREACHED() << "Switching to a user who is already active"; |
| 314 return; |
| 315 } |
| 316 if (!user->is_logged_in()) { |
| 317 NOTREACHED() << "Switching to a user that is not logged in"; |
| 318 return; |
| 319 } |
| 320 if (user->GetType() != User::USER_TYPE_REGULAR) { |
| 321 NOTREACHED() << "Switching to a non-regular user"; |
| 322 return; |
| 323 } |
| 324 if (user->username_hash().empty()) { |
| 325 NOTREACHED() << "Switching to a user that doesn't have username_hash set"; |
| 326 return; |
| 327 } |
| 328 |
| 329 DCHECK(active_user_); |
| 330 active_user_->set_is_active(false); |
| 331 user->set_is_active(true); |
| 332 active_user_ = user; |
| 333 |
| 334 // TODO(nkostylev): Notify session_manager on active user change. |
| 335 // http://crbug.com/230857 |
| 336 content::NotificationService::current()->Notify( |
| 337 chrome::NOTIFICATION_ACTIVE_USER_CHANGED, |
| 338 content::Source<UserManager>(this), |
| 339 content::Details<const User>(active_user_)); |
| 340 } |
| 341 |
| 289 void UserManagerImpl::RetailModeUserLoggedIn() { | 342 void UserManagerImpl::RetailModeUserLoggedIn() { |
| 290 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 343 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 291 is_current_user_new_ = true; | 344 is_current_user_new_ = true; |
| 292 logged_in_user_ = User::CreateRetailModeUser(); | 345 active_user_ = User::CreateRetailModeUser(); |
| 293 user_image_manager_->UserLoggedIn(kRetailModeUserEMail, | 346 user_image_manager_->UserLoggedIn(kRetailModeUserEMail, |
| 294 is_current_user_new_, | 347 is_current_user_new_, |
| 295 true); | 348 true); |
| 296 WallpaperManager::Get()->SetInitialUserWallpaper(kRetailModeUserEMail, false); | 349 WallpaperManager::Get()->SetInitialUserWallpaper(kRetailModeUserEMail, false); |
| 297 } | 350 } |
| 298 | 351 |
| 299 void UserManagerImpl::GuestUserLoggedIn() { | 352 void UserManagerImpl::GuestUserLoggedIn() { |
| 300 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 353 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 301 WallpaperManager::Get()->SetInitialUserWallpaper(kGuestUserEMail, false); | 354 WallpaperManager::Get()->SetInitialUserWallpaper(kGuestUserEMail, false); |
| 302 logged_in_user_ = User::CreateGuestUser(); | 355 active_user_ = User::CreateGuestUser(); |
| 303 // TODO(nkostylev): Add support for passing guest session cryptohome | 356 // TODO(nkostylev): Add support for passing guest session cryptohome |
| 304 // mount point. Legacy (--login-profile) value will be used for now. | 357 // mount point. Legacy (--login-profile) value will be used for now. |
| 305 logged_in_user_->SetStubImage(User::kInvalidImageIndex, false); | 358 // http://crosbug.com/230859 |
| 359 active_user_->SetStubImage(User::kInvalidImageIndex, false); |
| 306 } | 360 } |
| 307 | 361 |
| 308 void UserManagerImpl::KioskAppLoggedIn(const std::string& username) { | 362 void UserManagerImpl::KioskAppLoggedIn(const std::string& username) { |
| 309 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 363 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 310 DCHECK_EQ(gaia::ExtractDomainName(username), kKioskAppUserDomain); | 364 DCHECK_EQ(gaia::ExtractDomainName(username), kKioskAppUserDomain); |
| 311 | 365 |
| 312 WallpaperManager::Get()->SetInitialUserWallpaper(username, false); | 366 WallpaperManager::Get()->SetInitialUserWallpaper(username, false); |
| 313 logged_in_user_ = User::CreateKioskAppUser(username); | 367 active_user_ = User::CreateKioskAppUser(username); |
| 314 logged_in_user_->SetStubImage(User::kInvalidImageIndex, false); | 368 active_user_->SetStubImage(User::kInvalidImageIndex, false); |
| 315 | 369 |
| 316 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 370 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 317 command_line->AppendSwitch(::switches::kForceAppMode); | 371 command_line->AppendSwitch(::switches::kForceAppMode); |
| 318 command_line->AppendSwitchASCII(::switches::kAppId, | 372 command_line->AppendSwitchASCII(::switches::kAppId, |
| 319 logged_in_user_->GetAccountName(false)); | 373 active_user_->GetAccountName(false)); |
| 320 } | 374 } |
| 321 | 375 |
| 322 void UserManagerImpl::LocallyManagedUserLoggedIn( | 376 void UserManagerImpl::LocallyManagedUserLoggedIn( |
| 323 const std::string& username) { | 377 const std::string& username) { |
| 324 // TODO(nkostylev): Refactor, share code with RegularUserLoggedIn(). | 378 // TODO(nkostylev): Refactor, share code with RegularUserLoggedIn(). |
| 325 | 379 |
| 326 // Remove the user from the user list. | 380 // Remove the user from the user list. |
| 327 logged_in_user_ = RemoveRegularOrLocallyManagedUserFromList(username); | 381 active_user_ = RemoveRegularOrLocallyManagedUserFromList(username); |
| 328 // If the user was not found on the user list, create a new user. | 382 // If the user was not found on the user list, create a new user. |
| 329 if (!logged_in_user_) { | 383 if (!active_user_) { |
| 330 is_current_user_new_ = true; | 384 is_current_user_new_ = true; |
| 331 logged_in_user_ = User::CreateLocallyManagedUser(username); | 385 active_user_ = User::CreateLocallyManagedUser(username); |
| 332 // Leaving OAuth token status at the default state = unknown. | 386 // Leaving OAuth token status at the default state = unknown. |
| 333 WallpaperManager::Get()->SetInitialUserWallpaper(username, true); | 387 WallpaperManager::Get()->SetInitialUserWallpaper(username, true); |
| 334 } else { | 388 } else { |
| 335 ListPrefUpdate prefs_new_users_update(g_browser_process->local_state(), | 389 ListPrefUpdate prefs_new_users_update(g_browser_process->local_state(), |
| 336 kLocallyManagedUsersFirstRun); | 390 kLocallyManagedUsersFirstRun); |
| 337 if (prefs_new_users_update->Remove(base::StringValue(username), NULL)) { | 391 if (prefs_new_users_update->Remove(base::StringValue(username), NULL)) { |
| 338 is_current_user_new_ = true; | 392 is_current_user_new_ = true; |
| 339 WallpaperManager::Get()->SetInitialUserWallpaper(username, true); | 393 WallpaperManager::Get()->SetInitialUserWallpaper(username, true); |
| 340 } | 394 } |
| 341 } | 395 } |
| 342 | 396 |
| 343 // Add the user to the front of the user list. | 397 // Add the user to the front of the user list. |
| 344 ListPrefUpdate prefs_users_update(g_browser_process->local_state(), | 398 ListPrefUpdate prefs_users_update(g_browser_process->local_state(), |
| 345 kRegularUsers); | 399 kRegularUsers); |
| 346 prefs_users_update->Insert(0, new base::StringValue(username)); | 400 prefs_users_update->Insert(0, new base::StringValue(username)); |
| 347 users_.insert(users_.begin(), logged_in_user_); | 401 users_.insert(users_.begin(), active_user_); |
| 348 | 402 |
| 349 // Now that user is in the list, save display name. | 403 // Now that user is in the list, save display name. |
| 350 if (is_current_user_new_) { | 404 if (is_current_user_new_) { |
| 351 SaveUserDisplayName(logged_in_user_->email(), | 405 SaveUserDisplayName(active_user_->email(), |
| 352 logged_in_user_->GetDisplayName()); | 406 active_user_->GetDisplayName()); |
| 353 } | 407 } |
| 354 | 408 |
| 355 user_image_manager_->UserLoggedIn(username, is_current_user_new_, true); | 409 user_image_manager_->UserLoggedIn(username, is_current_user_new_, true); |
| 356 WallpaperManager::Get()->EnsureLoggedInUserWallpaperLoaded(); | 410 WallpaperManager::Get()->EnsureLoggedInUserWallpaperLoaded(); |
| 357 | 411 |
| 358 // Make sure that new data is persisted to Local State. | 412 // Make sure that new data is persisted to Local State. |
| 359 g_browser_process->local_state()->CommitPendingWrite(); | 413 g_browser_process->local_state()->CommitPendingWrite(); |
| 360 } | 414 } |
| 361 | 415 |
| 362 void UserManagerImpl::PublicAccountUserLoggedIn(User* user) { | 416 void UserManagerImpl::PublicAccountUserLoggedIn(User* user) { |
| 363 is_current_user_new_ = true; | 417 is_current_user_new_ = true; |
| 364 logged_in_user_ = user; | 418 active_user_ = user; |
| 365 // The UserImageManager chooses a random avatar picture when a user logs in | 419 // The UserImageManager chooses a random avatar picture when a user logs in |
| 366 // for the first time. Tell the UserImageManager that this user is not new to | 420 // for the first time. Tell the UserImageManager that this user is not new to |
| 367 // prevent the avatar from getting changed. | 421 // prevent the avatar from getting changed. |
| 368 user_image_manager_->UserLoggedIn(user->email(), false, true); | 422 user_image_manager_->UserLoggedIn(user->email(), false, true); |
| 369 WallpaperManager::Get()->EnsureLoggedInUserWallpaperLoaded(); | 423 WallpaperManager::Get()->EnsureLoggedInUserWallpaperLoaded(); |
| 370 } | 424 } |
| 371 | 425 |
| 372 void UserManagerImpl::RegularUserLoggedIn(const std::string& email, | 426 void UserManagerImpl::RegularUserLoggedIn(const std::string& email, |
| 373 bool browser_restart) { | 427 bool browser_restart) { |
| 374 // Remove the user from the user list. | 428 // Remove the user from the user list. |
| 375 logged_in_user_ = RemoveRegularOrLocallyManagedUserFromList(email); | 429 active_user_ = RemoveRegularOrLocallyManagedUserFromList(email); |
| 376 | 430 |
| 377 // If the user was not found on the user list, create a new user. | 431 // If the user was not found on the user list, create a new user. |
| 378 if (!logged_in_user_) { | 432 if (!active_user_) { |
| 379 is_current_user_new_ = true; | 433 is_current_user_new_ = true; |
| 380 logged_in_user_ = User::CreateRegularUser(email); | 434 active_user_ = User::CreateRegularUser(email); |
| 381 logged_in_user_->set_oauth_token_status(LoadUserOAuthStatus(email)); | 435 active_user_->set_oauth_token_status(LoadUserOAuthStatus(email)); |
| 382 SaveUserDisplayName(logged_in_user_->email(), | 436 SaveUserDisplayName(active_user_->email(), |
| 383 UTF8ToUTF16(logged_in_user_->GetAccountName(true))); | 437 UTF8ToUTF16(active_user_->GetAccountName(true))); |
| 384 WallpaperManager::Get()->SetInitialUserWallpaper(email, true); | 438 WallpaperManager::Get()->SetInitialUserWallpaper(email, true); |
| 385 } | 439 } |
| 386 | 440 |
| 387 // Add the user to the front of the user list. | 441 // Add the user to the front of the user list. |
| 388 ListPrefUpdate prefs_users_update(g_browser_process->local_state(), | 442 ListPrefUpdate prefs_users_update(g_browser_process->local_state(), |
| 389 kRegularUsers); | 443 kRegularUsers); |
| 390 prefs_users_update->Insert(0, new base::StringValue(email)); | 444 prefs_users_update->Insert(0, new base::StringValue(email)); |
| 391 users_.insert(users_.begin(), logged_in_user_); | 445 users_.insert(users_.begin(), active_user_); |
| 392 | 446 |
| 393 user_image_manager_->UserLoggedIn(email, is_current_user_new_, false); | 447 user_image_manager_->UserLoggedIn(email, is_current_user_new_, false); |
| 394 | 448 |
| 395 if (!browser_restart) { | 449 if (!browser_restart) { |
| 396 // For GAIA login flow, logged in user wallpaper may not be loaded. | 450 // For GAIA login flow, logged in user wallpaper may not be loaded. |
| 397 WallpaperManager::Get()->EnsureLoggedInUserWallpaperLoaded(); | 451 WallpaperManager::Get()->EnsureLoggedInUserWallpaperLoaded(); |
| 398 } | 452 } |
| 399 | 453 |
| 400 // Make sure that new data is persisted to Local State. | 454 // Make sure that new data is persisted to Local State. |
| 401 g_browser_process->local_state()->CommitPendingWrite(); | 455 g_browser_process->local_state()->CommitPendingWrite(); |
| 402 } | 456 } |
| 403 | 457 |
| 404 void UserManagerImpl::RegularUserLoggedInAsEphemeral(const std::string& email) { | 458 void UserManagerImpl::RegularUserLoggedInAsEphemeral(const std::string& email) { |
| 405 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 459 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 406 is_current_user_new_ = true; | 460 is_current_user_new_ = true; |
| 407 is_current_user_ephemeral_regular_user_ = true; | 461 is_current_user_ephemeral_regular_user_ = true; |
| 408 logged_in_user_ = User::CreateRegularUser(email); | 462 active_user_ = User::CreateRegularUser(email); |
| 409 user_image_manager_->UserLoggedIn(email, is_current_user_new_, false); | 463 user_image_manager_->UserLoggedIn(email, is_current_user_new_, false); |
| 410 WallpaperManager::Get()->SetInitialUserWallpaper(email, false); | 464 WallpaperManager::Get()->SetInitialUserWallpaper(email, false); |
| 411 } | 465 } |
| 412 | 466 |
| 413 void UserManagerImpl::SessionStarted() { | 467 void UserManagerImpl::SessionStarted() { |
| 414 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 468 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 415 session_started_ = true; | 469 session_started_ = true; |
| 416 content::NotificationService::current()->Notify( | 470 content::NotificationService::current()->Notify( |
| 417 chrome::NOTIFICATION_SESSION_STARTED, | 471 chrome::NOTIFICATION_SESSION_STARTED, |
| 418 content::NotificationService::AllSources(), | 472 content::Source<UserManager>(this), |
| 419 content::NotificationService::NoDetails()); | 473 content::Details<const User>(active_user_)); |
| 420 if (is_current_user_new_) { | 474 if (is_current_user_new_) { |
| 421 // Make sure that the new user's data is persisted to Local State. | 475 // Make sure that the new user's data is persisted to Local State. |
| 422 g_browser_process->local_state()->CommitPendingWrite(); | 476 g_browser_process->local_state()->CommitPendingWrite(); |
| 423 } | 477 } |
| 424 } | 478 } |
| 425 | 479 |
| 426 std::string UserManagerImpl::GenerateUniqueLocallyManagedUserId() { | 480 std::string UserManagerImpl::GenerateUniqueLocallyManagedUserId() { |
| 427 int counter = g_browser_process->local_state()-> | 481 int counter = g_browser_process->local_state()-> |
| 428 GetInteger(kLocallyManagedUsersNextId); | 482 GetInteger(kLocallyManagedUsersNextId); |
| 429 std::string id; | 483 std::string id; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 477 return; | 531 return; |
| 478 | 532 |
| 479 // Sanity check: we must not remove single user. This check may seem | 533 // Sanity check: we must not remove single user. This check may seem |
| 480 // redundant at a first sight because this single user must be an owner and | 534 // redundant at a first sight because this single user must be an owner and |
| 481 // we perform special check later in order not to remove an owner. However | 535 // we perform special check later in order not to remove an owner. However |
| 482 // due to non-instant nature of ownership assignment this later check may | 536 // due to non-instant nature of ownership assignment this later check may |
| 483 // sometimes fail. See http://crosbug.com/12723 | 537 // sometimes fail. See http://crosbug.com/12723 |
| 484 if (users_.size() < 2) | 538 if (users_.size() < 2) |
| 485 return; | 539 return; |
| 486 | 540 |
| 487 // Sanity check: do not allow the logged-in user to remove himself. | 541 // Sanity check: do not allow any of the the logged in users to be removed. |
| 488 if (logged_in_user_ && logged_in_user_->email() == email) | 542 for (UserList::const_iterator it = logged_in_users_.begin(); |
| 489 return; | 543 it != logged_in_users_.end(); ++it) { |
| 544 if ((*it)->email() == email) |
| 545 return; |
| 546 } |
| 490 | 547 |
| 491 RemoveUserInternal(email, delegate); | 548 RemoveUserInternal(email, delegate); |
| 492 } | 549 } |
| 493 | 550 |
| 494 void UserManagerImpl::RemoveUserFromList(const std::string& email) { | 551 void UserManagerImpl::RemoveUserFromList(const std::string& email) { |
| 495 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 552 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 496 EnsureUsersLoaded(); | 553 EnsureUsersLoaded(); |
| 497 RemoveNonCryptohomeData(email); | 554 RemoveNonCryptohomeData(email); |
| 498 delete RemoveRegularOrLocallyManagedUserFromList(email); | 555 delete RemoveRegularOrLocallyManagedUserFromList(email); |
| 499 // Make sure that new data is persisted to Local State. | 556 // Make sure that new data is persisted to Local State. |
| 500 g_browser_process->local_state()->CommitPendingWrite(); | 557 g_browser_process->local_state()->CommitPendingWrite(); |
| 501 } | 558 } |
| 502 | 559 |
| 503 bool UserManagerImpl::IsKnownUser(const std::string& email) const { | 560 bool UserManagerImpl::IsKnownUser(const std::string& email) const { |
| 504 return FindUser(email) != NULL; | 561 return FindUser(email) != NULL; |
| 505 } | 562 } |
| 506 | 563 |
| 507 const User* UserManagerImpl::FindUser(const std::string& email) const { | 564 const User* UserManagerImpl::FindUser(const std::string& email) const { |
| 508 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 565 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 509 if (logged_in_user_ && logged_in_user_->email() == email) | 566 if (active_user_ && active_user_->email() == email) |
| 510 return logged_in_user_; | 567 return active_user_; |
| 511 return FindUserInList(email); | 568 return FindUserInList(email); |
| 512 } | 569 } |
| 513 | 570 |
| 514 const User* UserManagerImpl::FindLocallyManagedUser( | 571 const User* UserManagerImpl::FindLocallyManagedUser( |
| 515 const string16& display_name) const { | 572 const string16& display_name) const { |
| 516 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 573 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 517 const UserList& users = GetUsers(); | 574 const UserList& users = GetUsers(); |
| 518 for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) { | 575 for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) { |
| 519 if (((*it)->GetType() == User::USER_TYPE_LOCALLY_MANAGED) && | 576 if (((*it)->GetType() == User::USER_TYPE_LOCALLY_MANAGED) && |
| 520 ((*it)->display_name() == display_name)) { | 577 ((*it)->display_name() == display_name)) { |
| 521 return *it; | 578 return *it; |
| 522 } | 579 } |
| 523 } | 580 } |
| 524 return NULL; | 581 return NULL; |
| 525 } | 582 } |
| 526 | 583 |
| 527 const User* UserManagerImpl::GetLoggedInUser() const { | 584 const User* UserManagerImpl::GetLoggedInUser() const { |
| 528 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 585 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 529 return logged_in_user_; | 586 return active_user_; |
| 530 } | 587 } |
| 531 | 588 |
| 532 User* UserManagerImpl::GetLoggedInUser() { | 589 User* UserManagerImpl::GetLoggedInUser() { |
| 533 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 590 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 534 return logged_in_user_; | 591 return active_user_; |
| 592 } |
| 593 |
| 594 const User* UserManagerImpl::GetActiveUser() const { |
| 595 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 596 return active_user_; |
| 597 } |
| 598 |
| 599 User* UserManagerImpl::GetActiveUser() { |
| 600 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 601 return active_user_; |
| 535 } | 602 } |
| 536 | 603 |
| 537 void UserManagerImpl::SaveUserOAuthStatus( | 604 void UserManagerImpl::SaveUserOAuthStatus( |
| 538 const std::string& username, | 605 const std::string& username, |
| 539 User::OAuthTokenStatus oauth_token_status) { | 606 User::OAuthTokenStatus oauth_token_status) { |
| 540 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 607 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 541 | 608 |
| 542 DVLOG(1) << "Saving user OAuth token status in Local State"; | 609 DVLOG(1) << "Saving user OAuth token status in Local State"; |
| 543 User* user = const_cast<User*>(FindUser(username)); | 610 User* user = FindUserAndModify(username); |
| 544 if (user) | 611 if (user) |
| 545 user->set_oauth_token_status(oauth_token_status); | 612 user->set_oauth_token_status(oauth_token_status); |
| 546 | 613 |
| 547 GetUserFlow(username)->HandleOAuthTokenStatusChange(oauth_token_status); | 614 GetUserFlow(username)->HandleOAuthTokenStatusChange(oauth_token_status); |
| 548 | 615 |
| 549 // Do not update local store if data stored or cached outside the user's | 616 // Do not update local store if data stored or cached outside the user's |
| 550 // cryptohome is to be treated as ephemeral. | 617 // cryptohome is to be treated as ephemeral. |
| 551 if (IsUserNonCryptohomeDataEphemeral(username)) | 618 if (IsUserNonCryptohomeDataEphemeral(username)) |
| 552 return; | 619 return; |
| 553 | 620 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 575 GetUserFlow(username)->HandleOAuthTokenStatusChange(result); | 642 GetUserFlow(username)->HandleOAuthTokenStatusChange(result); |
| 576 return result; | 643 return result; |
| 577 } | 644 } |
| 578 return User::OAUTH_TOKEN_STATUS_UNKNOWN; | 645 return User::OAUTH_TOKEN_STATUS_UNKNOWN; |
| 579 } | 646 } |
| 580 | 647 |
| 581 void UserManagerImpl::SaveUserDisplayName(const std::string& username, | 648 void UserManagerImpl::SaveUserDisplayName(const std::string& username, |
| 582 const string16& display_name) { | 649 const string16& display_name) { |
| 583 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 650 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 584 | 651 |
| 585 User* user = const_cast<User*>(FindUser(username)); | 652 User* user = FindUserAndModify(username); |
| 586 if (!user) | 653 if (!user) |
| 587 return; // Ignore if there is no such user. | 654 return; // Ignore if there is no such user. |
| 588 | 655 |
| 589 user->set_display_name(display_name); | 656 user->set_display_name(display_name); |
| 590 | 657 |
| 591 // Do not update local store if data stored or cached outside the user's | 658 // Do not update local store if data stored or cached outside the user's |
| 592 // cryptohome is to be treated as ephemeral. | 659 // cryptohome is to be treated as ephemeral. |
| 593 if (IsUserNonCryptohomeDataEphemeral(username)) | 660 if (IsUserNonCryptohomeDataEphemeral(username)) |
| 594 return; | 661 return; |
| 595 | 662 |
| 596 PrefService* local_state = g_browser_process->local_state(); | 663 PrefService* local_state = g_browser_process->local_state(); |
| 597 | 664 |
| 598 DictionaryPrefUpdate display_name_update(local_state, kUserDisplayName); | 665 DictionaryPrefUpdate display_name_update(local_state, kUserDisplayName); |
| 599 display_name_update->SetWithoutPathExpansion( | 666 display_name_update->SetWithoutPathExpansion( |
| 600 username, | 667 username, |
| 601 new base::StringValue(display_name)); | 668 new base::StringValue(display_name)); |
| 602 } | 669 } |
| 603 | 670 |
| 604 string16 UserManagerImpl::GetUserDisplayName( | 671 string16 UserManagerImpl::GetUserDisplayName( |
| 605 const std::string& username) const { | 672 const std::string& username) const { |
| 606 const User* user = FindUser(username); | 673 const User* user = FindUser(username); |
| 607 return user ? user->display_name() : string16(); | 674 return user ? user->display_name() : string16(); |
| 608 } | 675 } |
| 609 | 676 |
| 610 void UserManagerImpl::SaveUserDisplayEmail(const std::string& username, | 677 void UserManagerImpl::SaveUserDisplayEmail(const std::string& username, |
| 611 const std::string& display_email) { | 678 const std::string& display_email) { |
| 612 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 679 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 613 | 680 |
| 614 User* user = const_cast<User*>(FindUser(username)); | 681 User* user = FindUserAndModify(username); |
| 615 if (!user) | 682 if (!user) |
| 616 return; // Ignore if there is no such user. | 683 return; // Ignore if there is no such user. |
| 617 | 684 |
| 618 user->set_display_email(display_email); | 685 user->set_display_email(display_email); |
| 619 | 686 |
| 620 // Do not update local store if data stored or cached outside the user's | 687 // Do not update local store if data stored or cached outside the user's |
| 621 // cryptohome is to be treated as ephemeral. | 688 // cryptohome is to be treated as ephemeral. |
| 622 if (IsUserNonCryptohomeDataEphemeral(username)) | 689 if (IsUserNonCryptohomeDataEphemeral(username)) |
| 623 return; | 690 return; |
| 624 | 691 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 observed_sync_service_->GetAuthError().state(); | 748 observed_sync_service_->GetAuthError().state(); |
| 682 if (state != GoogleServiceAuthError::NONE && | 749 if (state != GoogleServiceAuthError::NONE && |
| 683 state != GoogleServiceAuthError::CONNECTION_FAILED && | 750 state != GoogleServiceAuthError::CONNECTION_FAILED && |
| 684 state != GoogleServiceAuthError::SERVICE_UNAVAILABLE && | 751 state != GoogleServiceAuthError::SERVICE_UNAVAILABLE && |
| 685 state != GoogleServiceAuthError::REQUEST_CANCELED) { | 752 state != GoogleServiceAuthError::REQUEST_CANCELED) { |
| 686 // Invalidate OAuth token to force Gaia sign-in flow. This is needed | 753 // Invalidate OAuth token to force Gaia sign-in flow. This is needed |
| 687 // because sign-out/sign-in solution is suggested to the user. | 754 // because sign-out/sign-in solution is suggested to the user. |
| 688 // TODO(altimofeev): this code isn't needed after crosbug.com/25978 is | 755 // TODO(altimofeev): this code isn't needed after crosbug.com/25978 is |
| 689 // implemented. | 756 // implemented. |
| 690 DVLOG(1) << "Invalidate OAuth token because of a sync error."; | 757 DVLOG(1) << "Invalidate OAuth token because of a sync error."; |
| 758 // http://crbug.com/230860 |
| 759 // TODO(nkostylev): Figure out whether we want to have observers |
| 760 // for each logged in user. |
| 761 // TODO(nkostyelv): Change observer after active user has changed. |
| 691 SaveUserOAuthStatus( | 762 SaveUserOAuthStatus( |
| 692 logged_in_user_->email(), | 763 active_user_->email(), |
| 693 User::OAUTH2_TOKEN_STATUS_INVALID); | 764 User::OAUTH2_TOKEN_STATUS_INVALID); |
| 694 } | 765 } |
| 695 } | 766 } |
| 696 | 767 |
| 697 void UserManagerImpl::OnPolicyUpdated(const std::string& account_id) { | 768 void UserManagerImpl::OnPolicyUpdated(const std::string& account_id) { |
| 698 UpdatePublicAccountDisplayName(account_id); | 769 UpdatePublicAccountDisplayName(account_id); |
| 699 NotifyUserListChanged(); | 770 NotifyUserListChanged(); |
| 700 } | 771 } |
| 701 | 772 |
| 702 void UserManagerImpl::OnDeviceLocalAccountsChanged() { | 773 void UserManagerImpl::OnDeviceLocalAccountsChanged() { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 722 } | 793 } |
| 723 | 794 |
| 724 bool UserManagerImpl::IsCurrentUserNonCryptohomeDataEphemeral() const { | 795 bool UserManagerImpl::IsCurrentUserNonCryptohomeDataEphemeral() const { |
| 725 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 796 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 726 return IsUserLoggedIn() && | 797 return IsUserLoggedIn() && |
| 727 IsUserNonCryptohomeDataEphemeral(GetLoggedInUser()->email()); | 798 IsUserNonCryptohomeDataEphemeral(GetLoggedInUser()->email()); |
| 728 } | 799 } |
| 729 | 800 |
| 730 bool UserManagerImpl::CanCurrentUserLock() const { | 801 bool UserManagerImpl::CanCurrentUserLock() const { |
| 731 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 802 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 732 return IsUserLoggedIn() && logged_in_user_->can_lock(); | 803 return IsUserLoggedIn() && active_user_->can_lock(); |
| 733 } | 804 } |
| 734 | 805 |
| 735 bool UserManagerImpl::IsUserLoggedIn() const { | 806 bool UserManagerImpl::IsUserLoggedIn() const { |
| 736 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 807 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 737 return logged_in_user_; | 808 return active_user_; |
| 738 } | 809 } |
| 739 | 810 |
| 740 bool UserManagerImpl::IsLoggedInAsRegularUser() const { | 811 bool UserManagerImpl::IsLoggedInAsRegularUser() const { |
| 741 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 812 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 742 return IsUserLoggedIn() && | 813 return IsUserLoggedIn() && |
| 743 logged_in_user_->GetType() == User::USER_TYPE_REGULAR; | 814 active_user_->GetType() == User::USER_TYPE_REGULAR; |
| 744 } | 815 } |
| 745 | 816 |
| 746 bool UserManagerImpl::IsLoggedInAsDemoUser() const { | 817 bool UserManagerImpl::IsLoggedInAsDemoUser() const { |
| 747 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 818 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 748 return IsUserLoggedIn() && | 819 return IsUserLoggedIn() && |
| 749 logged_in_user_->GetType() == User::USER_TYPE_RETAIL_MODE; | 820 active_user_->GetType() == User::USER_TYPE_RETAIL_MODE; |
| 750 } | 821 } |
| 751 | 822 |
| 752 bool UserManagerImpl::IsLoggedInAsPublicAccount() const { | 823 bool UserManagerImpl::IsLoggedInAsPublicAccount() const { |
| 753 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 824 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 754 return IsUserLoggedIn() && | 825 return IsUserLoggedIn() && |
| 755 logged_in_user_->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT; | 826 active_user_->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT; |
| 756 } | 827 } |
| 757 | 828 |
| 758 bool UserManagerImpl::IsLoggedInAsGuest() const { | 829 bool UserManagerImpl::IsLoggedInAsGuest() const { |
| 759 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 830 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 760 return IsUserLoggedIn() && | 831 return IsUserLoggedIn() && |
| 761 logged_in_user_->GetType() == User::USER_TYPE_GUEST; | 832 active_user_->GetType() == User::USER_TYPE_GUEST; |
| 762 } | 833 } |
| 763 | 834 |
| 764 bool UserManagerImpl::IsLoggedInAsLocallyManagedUser() const { | 835 bool UserManagerImpl::IsLoggedInAsLocallyManagedUser() const { |
| 765 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 836 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 766 return IsUserLoggedIn() && | 837 return IsUserLoggedIn() && |
| 767 logged_in_user_->GetType() == User::USER_TYPE_LOCALLY_MANAGED; | 838 active_user_->GetType() == User::USER_TYPE_LOCALLY_MANAGED; |
| 768 } | 839 } |
| 769 | 840 |
| 770 bool UserManagerImpl::IsLoggedInAsKioskApp() const { | 841 bool UserManagerImpl::IsLoggedInAsKioskApp() const { |
| 771 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 842 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 772 return IsUserLoggedIn() && | 843 return IsUserLoggedIn() && |
| 773 logged_in_user_->GetType() == User::USER_TYPE_KIOSK_APP; | 844 active_user_->GetType() == User::USER_TYPE_KIOSK_APP; |
| 774 } | 845 } |
| 775 | 846 |
| 776 bool UserManagerImpl::IsLoggedInAsStub() const { | 847 bool UserManagerImpl::IsLoggedInAsStub() const { |
| 777 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 848 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 778 return IsUserLoggedIn() && logged_in_user_->email() == kStubUser; | 849 return IsUserLoggedIn() && active_user_->email() == kStubUser; |
| 779 } | 850 } |
| 780 | 851 |
| 781 bool UserManagerImpl::IsSessionStarted() const { | 852 bool UserManagerImpl::IsSessionStarted() const { |
| 782 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 853 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 783 return session_started_; | 854 return session_started_; |
| 784 } | 855 } |
| 785 | 856 |
| 786 UserManager::MergeSessionState UserManagerImpl::GetMergeSessionState() const { | 857 UserManager::MergeSessionState UserManagerImpl::GetMergeSessionState() const { |
| 787 return merge_session_state_; | 858 return merge_session_state_; |
| 788 } | 859 } |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 969 cros_settings_->AddSettingsObserver(kAccountsPrefDeviceLocalAccounts, | 1040 cros_settings_->AddSettingsObserver(kAccountsPrefDeviceLocalAccounts, |
| 970 this); | 1041 this); |
| 971 } | 1042 } |
| 972 | 1043 |
| 973 bool UserManagerImpl::AreEphemeralUsersEnabled() const { | 1044 bool UserManagerImpl::AreEphemeralUsersEnabled() const { |
| 974 return ephemeral_users_enabled_ && | 1045 return ephemeral_users_enabled_ && |
| 975 (g_browser_process->browser_policy_connector()->IsEnterpriseManaged() || | 1046 (g_browser_process->browser_policy_connector()->IsEnterpriseManaged() || |
| 976 !owner_email_.empty()); | 1047 !owner_email_.empty()); |
| 977 } | 1048 } |
| 978 | 1049 |
| 1050 UserList& UserManagerImpl::GetUsersAndModify() { |
| 1051 EnsureUsersLoaded(); |
| 1052 return users_; |
| 1053 } |
| 1054 |
| 1055 User* UserManagerImpl::FindUserAndModify(const std::string& email) { |
| 1056 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1057 if (active_user_ && active_user_->email() == email) |
| 1058 return active_user_; |
| 1059 return FindUserInListAndModify(email); |
| 1060 } |
| 1061 |
| 979 const User* UserManagerImpl::FindUserInList(const std::string& email) const { | 1062 const User* UserManagerImpl::FindUserInList(const std::string& email) const { |
| 980 const UserList& users = GetUsers(); | 1063 const UserList& users = GetUsers(); |
| 981 for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) { | 1064 for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) { |
| 982 if ((*it)->email() == email) | 1065 if ((*it)->email() == email) |
| 983 return *it; | 1066 return *it; |
| 984 } | 1067 } |
| 985 return NULL; | 1068 return NULL; |
| 986 } | 1069 } |
| 987 | 1070 |
| 1071 User* UserManagerImpl::FindUserInListAndModify(const std::string& email) { |
| 1072 UserList& users = GetUsersAndModify(); |
| 1073 for (UserList::iterator it = users.begin(); it != users.end(); ++it) { |
| 1074 if ((*it)->email() == email) |
| 1075 return *it; |
| 1076 } |
| 1077 return NULL; |
| 1078 } |
| 1079 |
| 988 void UserManagerImpl::NotifyOnLogin() { | 1080 void UserManagerImpl::NotifyOnLogin() { |
| 989 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1081 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 990 content::NotificationService::current()->Notify( | 1082 content::NotificationService::current()->Notify( |
| 991 chrome::NOTIFICATION_LOGIN_USER_CHANGED, | 1083 chrome::NOTIFICATION_LOGIN_USER_CHANGED, |
| 992 content::Source<UserManager>(this), | 1084 content::Source<UserManager>(this), |
| 993 content::Details<const User>(logged_in_user_)); | 1085 content::Details<const User>(active_user_)); |
| 994 | 1086 |
| 995 CrosLibrary::Get()->GetCertLibrary()->LoadKeyStore(); | 1087 CrosLibrary::Get()->GetCertLibrary()->LoadKeyStore(); |
| 996 | 1088 |
| 997 // Indicate to DeviceSettingsService that the owner key may have become | 1089 // Indicate to DeviceSettingsService that the owner key may have become |
| 998 // available. | 1090 // available. |
| 999 DeviceSettingsService::Get()->SetUsername(logged_in_user_->email()); | 1091 DeviceSettingsService::Get()->SetUsername(active_user_->email()); |
| 1000 } | 1092 } |
| 1001 | 1093 |
| 1002 void UserManagerImpl::UpdateOwnership( | 1094 void UserManagerImpl::UpdateOwnership( |
| 1003 DeviceSettingsService::OwnershipStatus status, | 1095 DeviceSettingsService::OwnershipStatus status, |
| 1004 bool is_owner) { | 1096 bool is_owner) { |
| 1005 VLOG(1) << "Current user " << (is_owner ? "is owner" : "is not owner"); | 1097 VLOG(1) << "Current user " << (is_owner ? "is owner" : "is not owner"); |
| 1006 | 1098 |
| 1007 SetCurrentUserIsOwner(is_owner); | 1099 SetCurrentUserIsOwner(is_owner); |
| 1008 } | 1100 } |
| 1009 | 1101 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1053 } | 1145 } |
| 1054 } | 1146 } |
| 1055 return user; | 1147 return user; |
| 1056 } | 1148 } |
| 1057 | 1149 |
| 1058 bool UserManagerImpl::UpdateAndCleanUpPublicAccounts( | 1150 bool UserManagerImpl::UpdateAndCleanUpPublicAccounts( |
| 1059 const base::ListValue& public_accounts) { | 1151 const base::ListValue& public_accounts) { |
| 1060 PrefService* local_state = g_browser_process->local_state(); | 1152 PrefService* local_state = g_browser_process->local_state(); |
| 1061 | 1153 |
| 1062 // Determine the currently logged-in user's email. | 1154 // Determine the currently logged-in user's email. |
| 1063 std::string logged_in_user_email; | 1155 std::string active_user_email; |
| 1064 if (IsUserLoggedIn()) | 1156 if (IsUserLoggedIn()) |
| 1065 logged_in_user_email = GetLoggedInUser()->email(); | 1157 active_user_email = GetLoggedInUser()->email(); |
| 1066 | 1158 |
| 1067 // If there is a public account whose data is pending removal and the user is | 1159 // If there is a public account whose data is pending removal and the user is |
| 1068 // not currently logged in with that account, take this opportunity to remove | 1160 // not currently logged in with that account, take this opportunity to remove |
| 1069 // the data. | 1161 // the data. |
| 1070 std::string public_account_pending_data_removal = | 1162 std::string public_account_pending_data_removal = |
| 1071 local_state->GetString(kPublicAccountPendingDataRemoval); | 1163 local_state->GetString(kPublicAccountPendingDataRemoval); |
| 1072 if (!public_account_pending_data_removal.empty() && | 1164 if (!public_account_pending_data_removal.empty() && |
| 1073 public_account_pending_data_removal != logged_in_user_email) { | 1165 public_account_pending_data_removal != active_user_email) { |
| 1074 RemoveNonCryptohomeData(public_account_pending_data_removal); | 1166 RemoveNonCryptohomeData(public_account_pending_data_removal); |
| 1075 local_state->ClearPref(kPublicAccountPendingDataRemoval); | 1167 local_state->ClearPref(kPublicAccountPendingDataRemoval); |
| 1076 } | 1168 } |
| 1077 | 1169 |
| 1078 // Split the current user list public accounts and regular users. | 1170 // Split the current user list public accounts and regular users. |
| 1079 std::vector<std::string> old_public_accounts; | 1171 std::vector<std::string> old_public_accounts; |
| 1080 std::set<std::string> regular_users; | 1172 std::set<std::string> regular_users; |
| 1081 for (UserList::const_iterator it = users_.begin(); it != users_.end(); ++it) { | 1173 for (UserList::const_iterator it = users_.begin(); it != users_.end(); ++it) { |
| 1082 if ((*it)->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT) | 1174 if ((*it)->GetType() == User::USER_TYPE_PUBLIC_ACCOUNT) |
| 1083 old_public_accounts.push_back((*it)->email()); | 1175 old_public_accounts.push_back((*it)->email()); |
| 1084 else | 1176 else |
| 1085 regular_users.insert((*it)->email()); | 1177 regular_users.insert((*it)->email()); |
| 1086 } | 1178 } |
| 1087 | 1179 |
| 1088 // Get the new list of public accounts from policy. | 1180 // Get the new list of public accounts from policy. |
| 1089 std::vector<std::string> new_public_accounts; | 1181 std::vector<std::string> new_public_accounts; |
| 1090 std::set<std::string> new_public_accounts_set; | 1182 std::set<std::string> new_public_accounts_set; |
| 1091 if (!ParseUserList(public_accounts, regular_users, logged_in_user_email, | 1183 if (!ParseUserList(public_accounts, regular_users, active_user_email, |
| 1092 &new_public_accounts, &new_public_accounts_set) && | 1184 &new_public_accounts, &new_public_accounts_set) && |
| 1093 IsLoggedInAsPublicAccount()) { | 1185 IsLoggedInAsPublicAccount()) { |
| 1094 // If the user is currently logged into a public account that has been | 1186 // If the user is currently logged into a public account that has been |
| 1095 // removed from the list, mark the account's data as pending removal after | 1187 // removed from the list, mark the account's data as pending removal after |
| 1096 // logout. | 1188 // logout. |
| 1097 local_state->SetString(kPublicAccountPendingDataRemoval, | 1189 local_state->SetString(kPublicAccountPendingDataRemoval, |
| 1098 logged_in_user_email); | 1190 active_user_email); |
| 1099 } | 1191 } |
| 1100 | 1192 |
| 1101 // Persist the new list of public accounts in a pref. | 1193 // Persist the new list of public accounts in a pref. |
| 1102 ListPrefUpdate prefs_public_accounts_update(local_state, kPublicAccounts); | 1194 ListPrefUpdate prefs_public_accounts_update(local_state, kPublicAccounts); |
| 1103 scoped_ptr<base::ListValue> prefs_public_accounts(public_accounts.DeepCopy()); | 1195 scoped_ptr<base::ListValue> prefs_public_accounts(public_accounts.DeepCopy()); |
| 1104 prefs_public_accounts_update->Swap(prefs_public_accounts.get()); | 1196 prefs_public_accounts_update->Swap(prefs_public_accounts.get()); |
| 1105 | 1197 |
| 1106 // If the list of public accounts has not changed, return. | 1198 // If the list of public accounts has not changed, return. |
| 1107 if (new_public_accounts.size() == old_public_accounts.size()) { | 1199 if (new_public_accounts.size() == old_public_accounts.size()) { |
| 1108 bool changed = false; | 1200 bool changed = false; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1124 it = users_.erase(it); | 1216 it = users_.erase(it); |
| 1125 } else { | 1217 } else { |
| 1126 ++it; | 1218 ++it; |
| 1127 } | 1219 } |
| 1128 } | 1220 } |
| 1129 | 1221 |
| 1130 // Add the new public accounts to the front of the user list. | 1222 // Add the new public accounts to the front of the user list. |
| 1131 for (std::vector<std::string>::const_reverse_iterator | 1223 for (std::vector<std::string>::const_reverse_iterator |
| 1132 it = new_public_accounts.rbegin(); | 1224 it = new_public_accounts.rbegin(); |
| 1133 it != new_public_accounts.rend(); ++it) { | 1225 it != new_public_accounts.rend(); ++it) { |
| 1134 if (IsLoggedInAsPublicAccount() && *it == logged_in_user_email) | 1226 if (IsLoggedInAsPublicAccount() && *it == active_user_email) |
| 1135 users_.insert(users_.begin(), GetLoggedInUser()); | 1227 users_.insert(users_.begin(), GetLoggedInUser()); |
| 1136 else | 1228 else |
| 1137 users_.insert(users_.begin(), User::CreatePublicAccountUser(*it)); | 1229 users_.insert(users_.begin(), User::CreatePublicAccountUser(*it)); |
| 1138 UpdatePublicAccountDisplayName(*it); | 1230 UpdatePublicAccountDisplayName(*it); |
| 1139 } | 1231 } |
| 1140 | 1232 |
| 1141 user_image_manager_->LoadUserImages( | 1233 user_image_manager_->LoadUserImages( |
| 1142 UserList(users_.begin(), users_.begin() + new_public_accounts.size())); | 1234 UserList(users_.begin(), users_.begin() + new_public_accounts.size())); |
| 1143 | 1235 |
| 1144 return true; | 1236 return true; |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1294 content::NotificationService::NoDetails()); | 1386 content::NotificationService::NoDetails()); |
| 1295 } | 1387 } |
| 1296 | 1388 |
| 1297 void UserManagerImpl::NotifyMergeSessionStateChanged() { | 1389 void UserManagerImpl::NotifyMergeSessionStateChanged() { |
| 1298 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1390 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1299 FOR_EACH_OBSERVER(UserManager::Observer, observer_list_, | 1391 FOR_EACH_OBSERVER(UserManager::Observer, observer_list_, |
| 1300 MergeSessionStateChanged(merge_session_state_)); | 1392 MergeSessionStateChanged(merge_session_state_)); |
| 1301 } | 1393 } |
| 1302 | 1394 |
| 1303 } // namespace chromeos | 1395 } // namespace chromeos |
| OLD | NEW |