Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(92)

Side by Side Diff: components/user_manager/user_manager_base.cc

Issue 1425093004: Revert of This CL replaces user_manager::UserID with AccountId. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@468875--Chrome-OS-handles-deletion-of-Gmail-account-poorly--Create-AccountID-structure-part2--user_names
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 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 "components/user_manager/user_manager_base.h" 5 #include "components/user_manager/user_manager_base.h"
6 6
7 #include <cstddef> 7 #include <cstddef>
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 << " failed, return code: " << return_code; 108 << " failed, return code: " << return_code;
109 } 109 }
110 } 110 }
111 111
112 // Runs on SequencedWorkerPool thread. Passes resolved locale to UI thread. 112 // Runs on SequencedWorkerPool thread. Passes resolved locale to UI thread.
113 void ResolveLocale(const std::string& raw_locale, 113 void ResolveLocale(const std::string& raw_locale,
114 std::string* resolved_locale) { 114 std::string* resolved_locale) {
115 ignore_result(l10n_util::CheckAndResolveLocale(raw_locale, resolved_locale)); 115 ignore_result(l10n_util::CheckAndResolveLocale(raw_locale, resolved_locale));
116 } 116 }
117 117
118 // Checks if values in |dict| correspond with |account_id| identity. 118 // Checks if values in |dict| correspond with |user_id| identity.
119 bool UserMatches(const AccountId& account_id, 119 bool UserMatches(const UserID& user_id, const base::DictionaryValue& dict) {
120 const base::DictionaryValue& dict) {
121 std::string value; 120 std::string value;
122 121
123 bool has_email = dict.GetString(kCanonicalEmail, &value); 122 bool has_email = dict.GetString(kCanonicalEmail, &value);
124 if (has_email && account_id.GetUserEmail() == value) 123 if (has_email && user_id == value)
125 return true; 124 return true;
126 125
127 // TODO(antrim): update code once user id is really a struct. 126 // TODO(antrim): update code once user id is really a struct.
128 bool has_gaia_id = dict.GetString(kGAIAIdKey, &value); 127 bool has_gaia_id = dict.GetString(kGAIAIdKey, &value);
129 if (has_gaia_id && account_id.GetUserEmail() == value) 128 if (has_gaia_id && user_id == value)
130 return true; 129 return true;
131 130
132 return false; 131 return false;
133 } 132 }
134 133
135 // Fills relevant |dict| values based on |account_id|. 134 // Fills relevant |dict| values based on |user_id|.
136 void UpdateIdentity(const AccountId& account_id, base::DictionaryValue& dict) { 135 void UpdateIdentity(const UserID& user_id, base::DictionaryValue& dict) {
137 dict.SetString(kCanonicalEmail, account_id.GetUserEmail()); 136 dict.SetString(kCanonicalEmail, user_id);
138 } 137 }
139 138
140 } // namespace 139 } // namespace
141 140
142 // static 141 // static
143 void UserManagerBase::RegisterPrefs(PrefRegistrySimple* registry) { 142 void UserManagerBase::RegisterPrefs(PrefRegistrySimple* registry) {
144 registry->RegisterListPref(kRegularUsers); 143 registry->RegisterListPref(kRegularUsers);
145 registry->RegisterListPref(kKnownUsers); 144 registry->RegisterListPref(kKnownUsers);
146 registry->RegisterStringPref(kLastLoggedInGaiaUser, std::string()); 145 registry->RegisterStringPref(kLastLoggedInGaiaUser, std::string());
147 registry->RegisterDictionaryPref(kUserDisplayName); 146 registry->RegisterDictionaryPref(kUserDisplayName);
148 registry->RegisterDictionaryPref(kUserGivenName); 147 registry->RegisterDictionaryPref(kUserGivenName);
149 registry->RegisterDictionaryPref(kUserDisplayEmail); 148 registry->RegisterDictionaryPref(kUserDisplayEmail);
150 registry->RegisterDictionaryPref(kUserOAuthTokenStatus); 149 registry->RegisterDictionaryPref(kUserOAuthTokenStatus);
151 registry->RegisterDictionaryPref(kUserForceOnlineSignin); 150 registry->RegisterDictionaryPref(kUserForceOnlineSignin);
152 registry->RegisterDictionaryPref(kUserType); 151 registry->RegisterDictionaryPref(kUserType);
153 registry->RegisterStringPref(kLastActiveUser, std::string()); 152 registry->RegisterStringPref(kLastActiveUser, std::string());
154 } 153 }
155 154
156 UserManagerBase::UserManagerBase( 155 UserManagerBase::UserManagerBase(
157 scoped_refptr<base::TaskRunner> task_runner, 156 scoped_refptr<base::TaskRunner> task_runner,
158 scoped_refptr<base::TaskRunner> blocking_task_runner) 157 scoped_refptr<base::TaskRunner> blocking_task_runner)
159 : task_runner_(task_runner), 158 : active_user_(NULL),
159 primary_user_(NULL),
160 user_loading_stage_(STAGE_NOT_LOADED),
161 session_started_(false),
162 is_current_user_owner_(false),
163 is_current_user_new_(false),
164 is_current_user_ephemeral_regular_user_(false),
165 ephemeral_users_enabled_(false),
166 manager_creation_time_(base::TimeTicks::Now()),
167 last_session_active_user_initialized_(false),
168 task_runner_(task_runner),
160 blocking_task_runner_(blocking_task_runner), 169 blocking_task_runner_(blocking_task_runner),
161 weak_factory_(this) { 170 weak_factory_(this) {
162 UpdateLoginState(); 171 UpdateLoginState();
163 } 172 }
164 173
165 UserManagerBase::~UserManagerBase() { 174 UserManagerBase::~UserManagerBase() {
166 // Can't use STLDeleteElements because of the private destructor of User. 175 // Can't use STLDeleteElements because of the private destructor of User.
167 for (UserList::iterator it = users_.begin(); it != users_.end(); 176 for (UserList::iterator it = users_.begin(); it != users_.end();
168 it = users_.erase(it)) { 177 it = users_.erase(it)) {
169 DeleteUser(*it); 178 DeleteUser(*it);
(...skipping 15 matching lines...) Expand all
185 } 194 }
186 195
187 const UserList& UserManagerBase::GetLoggedInUsers() const { 196 const UserList& UserManagerBase::GetLoggedInUsers() const {
188 return logged_in_users_; 197 return logged_in_users_;
189 } 198 }
190 199
191 const UserList& UserManagerBase::GetLRULoggedInUsers() const { 200 const UserList& UserManagerBase::GetLRULoggedInUsers() const {
192 return lru_logged_in_users_; 201 return lru_logged_in_users_;
193 } 202 }
194 203
195 const AccountId& UserManagerBase::GetOwnerAccountId() const { 204 const std::string& UserManagerBase::GetOwnerEmail() const {
196 return owner_account_id_; 205 return owner_email_;
197 } 206 }
198 207
199 void UserManagerBase::UserLoggedIn(const AccountId& account_id, 208 void UserManagerBase::UserLoggedIn(const std::string& user_id,
200 const std::string& username_hash, 209 const std::string& username_hash,
201 bool browser_restart) { 210 bool browser_restart) {
202 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 211 DCHECK(task_runner_->RunsTasksOnCurrentThread());
203 212
204 if (!last_session_active_account_id_initialized_) { 213 if (!last_session_active_user_initialized_) {
205 last_session_active_account_id_ = 214 last_session_active_user_ = GetLocalState()->GetString(kLastActiveUser);
206 AccountId::FromUserEmail(GetLocalState()->GetString(kLastActiveUser)); 215 last_session_active_user_initialized_ = true;
207 last_session_active_account_id_initialized_ = true;
208 } 216 }
209 217
210 User* user = FindUserInListAndModify(account_id); 218 User* user = FindUserInListAndModify(user_id);
211 if (active_user_ && user) { 219 if (active_user_ && user) {
212 user->set_is_logged_in(true); 220 user->set_is_logged_in(true);
213 user->set_username_hash(username_hash); 221 user->set_username_hash(username_hash);
214 logged_in_users_.push_back(user); 222 logged_in_users_.push_back(user);
215 lru_logged_in_users_.push_back(user); 223 lru_logged_in_users_.push_back(user);
216 224
217 // Reset the new user flag if the user already exists. 225 // Reset the new user flag if the user already exists.
218 SetIsCurrentUserNew(false); 226 SetIsCurrentUserNew(false);
219 NotifyUserAddedToSession(user, true /* user switch pending */); 227 NotifyUserAddedToSession(user, true /* user switch pending */);
220 228
221 return; 229 return;
222 } 230 }
223 231
224 if (account_id == chromeos::login::GuestAccountId()) { 232 if (user_id == chromeos::login::kGuestUserName) {
225 GuestUserLoggedIn(); 233 GuestUserLoggedIn();
226 } else if (IsKioskApp(account_id)) { 234 } else if (IsKioskApp(user_id)) {
227 KioskAppLoggedIn(account_id); 235 KioskAppLoggedIn(user_id);
228 } else if (IsDemoApp(account_id)) { 236 } else if (IsDemoApp(user_id)) {
229 DemoAccountLoggedIn(); 237 DemoAccountLoggedIn();
230 } else { 238 } else {
231 EnsureUsersLoaded(); 239 EnsureUsersLoaded();
232 240
233 if (user && user->GetType() == USER_TYPE_PUBLIC_ACCOUNT) { 241 if (user && user->GetType() == USER_TYPE_PUBLIC_ACCOUNT) {
234 PublicAccountUserLoggedIn(user); 242 PublicAccountUserLoggedIn(user);
235 } else if ((user && user->GetType() == USER_TYPE_SUPERVISED) || 243 } else if ((user && user->GetType() == USER_TYPE_SUPERVISED) ||
236 (!user && 244 (!user &&
237 gaia::ExtractDomainName(account_id.GetUserEmail()) == 245 gaia::ExtractDomainName(user_id) ==
238 chromeos::login::kSupervisedUserDomain)) { 246 chromeos::login::kSupervisedUserDomain)) {
239 SupervisedUserLoggedIn(account_id); 247 SupervisedUserLoggedIn(user_id);
240 } else if (browser_restart && IsPublicAccountMarkedForRemoval(account_id)) { 248 } else if (browser_restart && IsPublicAccountMarkedForRemoval(user_id)) {
241 PublicAccountUserLoggedIn(User::CreatePublicAccountUser(account_id)); 249 PublicAccountUserLoggedIn(User::CreatePublicAccountUser(user_id));
242 } else if (account_id != GetOwnerAccountId() && !user && 250 } else if (user_id != GetOwnerEmail() && !user &&
243 (AreEphemeralUsersEnabled() || browser_restart)) { 251 (AreEphemeralUsersEnabled() || browser_restart)) {
244 RegularUserLoggedInAsEphemeral(account_id); 252 RegularUserLoggedInAsEphemeral(user_id);
245 } else { 253 } else {
246 RegularUserLoggedIn(account_id); 254 RegularUserLoggedIn(user_id);
247 } 255 }
248 } 256 }
249 257
250 DCHECK(active_user_); 258 DCHECK(active_user_);
251 active_user_->set_is_logged_in(true); 259 active_user_->set_is_logged_in(true);
252 active_user_->set_is_active(true); 260 active_user_->set_is_active(true);
253 active_user_->set_username_hash(username_hash); 261 active_user_->set_username_hash(username_hash);
254 262
255 // Place user who just signed in to the top of the logged in users. 263 // Place user who just signed in to the top of the logged in users.
256 logged_in_users_.insert(logged_in_users_.begin(), active_user_); 264 logged_in_users_.insert(logged_in_users_.begin(), active_user_);
257 SetLRUUser(active_user_); 265 SetLRUUser(active_user_);
258 266
259 if (!primary_user_) { 267 if (!primary_user_) {
260 primary_user_ = active_user_; 268 primary_user_ = active_user_;
261 if (primary_user_->HasGaiaAccount()) 269 if (primary_user_->HasGaiaAccount())
262 SendGaiaUserLoginMetrics(account_id); 270 SendGaiaUserLoginMetrics(user_id);
263 } 271 }
264 272
265 UMA_HISTOGRAM_ENUMERATION( 273 UMA_HISTOGRAM_ENUMERATION(
266 "UserManager.LoginUserType", active_user_->GetType(), NUM_USER_TYPES); 274 "UserManager.LoginUserType", active_user_->GetType(), NUM_USER_TYPES);
267 275
268 GetLocalState()->SetString( 276 GetLocalState()->SetString(
269 kLastLoggedInGaiaUser, 277 kLastLoggedInGaiaUser, active_user_->HasGaiaAccount() ? user_id : "");
270 active_user_->HasGaiaAccount() ? account_id.GetUserEmail() : "");
271 278
272 NotifyOnLogin(); 279 NotifyOnLogin();
273 PerformPostUserLoggedInActions(browser_restart); 280 PerformPostUserLoggedInActions(browser_restart);
274 } 281 }
275 282
276 void UserManagerBase::SwitchActiveUser(const AccountId& account_id) { 283 void UserManagerBase::SwitchActiveUser(const std::string& user_id) {
277 User* user = FindUserAndModify(account_id); 284 User* user = FindUserAndModify(user_id);
278 if (!user) { 285 if (!user) {
279 NOTREACHED() << "Switching to a non-existing user"; 286 NOTREACHED() << "Switching to a non-existing user";
280 return; 287 return;
281 } 288 }
282 if (user == active_user_) { 289 if (user == active_user_) {
283 NOTREACHED() << "Switching to a user who is already active"; 290 NOTREACHED() << "Switching to a user who is already active";
284 return; 291 return;
285 } 292 }
286 if (!user->is_logged_in()) { 293 if (!user->is_logged_in()) {
287 NOTREACHED() << "Switching to a user that is not logged in"; 294 NOTREACHED() << "Switching to a user that is not logged in";
(...skipping 15 matching lines...) Expand all
303 active_user_ = user; 310 active_user_ = user;
304 311
305 // Move the user to the front. 312 // Move the user to the front.
306 SetLRUUser(active_user_); 313 SetLRUUser(active_user_);
307 314
308 NotifyActiveUserHashChanged(active_user_->username_hash()); 315 NotifyActiveUserHashChanged(active_user_->username_hash());
309 NotifyActiveUserChanged(active_user_); 316 NotifyActiveUserChanged(active_user_);
310 } 317 }
311 318
312 void UserManagerBase::SwitchToLastActiveUser() { 319 void UserManagerBase::SwitchToLastActiveUser() {
313 if (!last_session_active_account_id_.is_valid()) 320 if (last_session_active_user_.empty())
314 return; 321 return;
315 322
316 if (AccountId::FromUserEmail(GetActiveUser()->email()) != 323 if (GetActiveUser()->email() != last_session_active_user_)
317 last_session_active_account_id_) 324 SwitchActiveUser(last_session_active_user_);
318 SwitchActiveUser(last_session_active_account_id_);
319 325
320 // Make sure that this function gets run only once. 326 // Make sure that this function gets run only once.
321 last_session_active_account_id_.clear(); 327 last_session_active_user_.clear();
322 } 328 }
323 329
324 void UserManagerBase::SessionStarted() { 330 void UserManagerBase::SessionStarted() {
325 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 331 DCHECK(task_runner_->RunsTasksOnCurrentThread());
326 session_started_ = true; 332 session_started_ = true;
327 333
328 UpdateLoginState(); 334 UpdateLoginState();
329 session_manager::SessionManager::Get()->SetSessionState( 335 session_manager::SessionManager::Get()->SetSessionState(
330 session_manager::SESSION_STATE_ACTIVE); 336 session_manager::SESSION_STATE_ACTIVE);
331 337
332 if (IsCurrentUserNew()) { 338 if (IsCurrentUserNew()) {
333 // Make sure that the new user's data is persisted to Local State. 339 // Make sure that the new user's data is persisted to Local State.
334 GetLocalState()->CommitPendingWrite(); 340 GetLocalState()->CommitPendingWrite();
335 } 341 }
336 } 342 }
337 343
338 void UserManagerBase::RemoveUser(const AccountId& account_id, 344 void UserManagerBase::RemoveUser(const std::string& user_id,
339 RemoveUserDelegate* delegate) { 345 RemoveUserDelegate* delegate) {
340 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 346 DCHECK(task_runner_->RunsTasksOnCurrentThread());
341 347
342 if (!CanUserBeRemoved(FindUser(account_id))) 348 if (!CanUserBeRemoved(FindUser(user_id)))
343 return; 349 return;
344 350
345 RemoveUserInternal(account_id, delegate); 351 RemoveUserInternal(user_id, delegate);
346 } 352 }
347 353
348 void UserManagerBase::RemoveUserInternal(const AccountId& account_id, 354 void UserManagerBase::RemoveUserInternal(const std::string& user_email,
349 RemoveUserDelegate* delegate) { 355 RemoveUserDelegate* delegate) {
350 RemoveNonOwnerUserInternal(account_id, delegate); 356 RemoveNonOwnerUserInternal(user_email, delegate);
351 } 357 }
352 358
353 void UserManagerBase::RemoveNonOwnerUserInternal(const AccountId& account_id, 359 void UserManagerBase::RemoveNonOwnerUserInternal(const std::string& user_email,
354 RemoveUserDelegate* delegate) { 360 RemoveUserDelegate* delegate) {
355 if (delegate) 361 if (delegate)
356 delegate->OnBeforeUserRemoved(account_id.GetUserEmail()); 362 delegate->OnBeforeUserRemoved(user_email);
357 RemoveUserFromList(account_id); 363 RemoveUserFromList(user_email);
358 cryptohome::AsyncMethodCaller::GetInstance()->AsyncRemove( 364 cryptohome::AsyncMethodCaller::GetInstance()->AsyncRemove(
359 account_id.GetUserEmail(), 365 user_email, base::Bind(&OnRemoveUserComplete, user_email));
360 base::Bind(&OnRemoveUserComplete, account_id.GetUserEmail()));
361 366
362 if (delegate) 367 if (delegate)
363 delegate->OnUserRemoved(account_id.GetUserEmail()); 368 delegate->OnUserRemoved(user_email);
364 } 369 }
365 370
366 void UserManagerBase::RemoveUserFromList(const AccountId& account_id) { 371 void UserManagerBase::RemoveUserFromList(const std::string& user_id) {
367 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 372 DCHECK(task_runner_->RunsTasksOnCurrentThread());
368 RemoveNonCryptohomeData(account_id); 373 RemoveNonCryptohomeData(user_id);
369 if (user_loading_stage_ == STAGE_LOADED) { 374 if (user_loading_stage_ == STAGE_LOADED) {
370 DeleteUser(RemoveRegularOrSupervisedUserFromList(account_id)); 375 DeleteUser(RemoveRegularOrSupervisedUserFromList(user_id));
371 } else if (user_loading_stage_ == STAGE_LOADING) { 376 } else if (user_loading_stage_ == STAGE_LOADING) {
372 DCHECK(gaia::ExtractDomainName(account_id.GetUserEmail()) == 377 DCHECK(gaia::ExtractDomainName(user_id) ==
373 chromeos::login::kSupervisedUserDomain || 378 chromeos::login::kSupervisedUserDomain ||
374 HasPendingBootstrap(account_id)); 379 HasPendingBootstrap(user_id));
375 // Special case, removing partially-constructed supervised user or 380 // Special case, removing partially-constructed supervised user or
376 // boostrapping user during user list loading. 381 // boostrapping user during user list loading.
377 ListPrefUpdate users_update(GetLocalState(), kRegularUsers); 382 ListPrefUpdate users_update(GetLocalState(), kRegularUsers);
378 users_update->Remove(base::StringValue(account_id.GetUserEmail()), nullptr); 383 users_update->Remove(base::StringValue(user_id), NULL);
379 OnUserRemoved(account_id); 384 OnUserRemoved(user_id);
380 } else { 385 } else {
381 NOTREACHED() << "Users are not loaded yet."; 386 NOTREACHED() << "Users are not loaded yet.";
382 return; 387 return;
383 } 388 }
384 389
385 // Make sure that new data is persisted to Local State. 390 // Make sure that new data is persisted to Local State.
386 GetLocalState()->CommitPendingWrite(); 391 GetLocalState()->CommitPendingWrite();
387 } 392 }
388 393
389 bool UserManagerBase::IsKnownUser(const AccountId& account_id) const { 394 bool UserManagerBase::IsKnownUser(const std::string& user_id) const {
390 return FindUser(account_id) != nullptr; 395 return FindUser(user_id) != NULL;
391 } 396 }
392 397
393 const User* UserManagerBase::FindUser(const AccountId& account_id) const { 398 const User* UserManagerBase::FindUser(const std::string& user_id) const {
394 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 399 DCHECK(task_runner_->RunsTasksOnCurrentThread());
395 if (active_user_ && active_user_->GetAccountId() == account_id) 400 if (active_user_ && active_user_->email() == user_id)
396 return active_user_; 401 return active_user_;
397 return FindUserInList(account_id); 402 return FindUserInList(user_id);
398 } 403 }
399 404
400 User* UserManagerBase::FindUserAndModify(const AccountId& account_id) { 405 User* UserManagerBase::FindUserAndModify(const std::string& user_id) {
401 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 406 DCHECK(task_runner_->RunsTasksOnCurrentThread());
402 if (active_user_ && active_user_->GetAccountId() == account_id) 407 if (active_user_ && active_user_->email() == user_id)
403 return active_user_; 408 return active_user_;
404 return FindUserInListAndModify(account_id); 409 return FindUserInListAndModify(user_id);
405 } 410 }
406 411
407 const User* UserManagerBase::GetLoggedInUser() const { 412 const User* UserManagerBase::GetLoggedInUser() const {
408 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 413 DCHECK(task_runner_->RunsTasksOnCurrentThread());
409 return active_user_; 414 return active_user_;
410 } 415 }
411 416
412 User* UserManagerBase::GetLoggedInUser() { 417 User* UserManagerBase::GetLoggedInUser() {
413 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 418 DCHECK(task_runner_->RunsTasksOnCurrentThread());
414 return active_user_; 419 return active_user_;
415 } 420 }
416 421
417 const User* UserManagerBase::GetActiveUser() const { 422 const User* UserManagerBase::GetActiveUser() const {
418 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 423 DCHECK(task_runner_->RunsTasksOnCurrentThread());
419 return active_user_; 424 return active_user_;
420 } 425 }
421 426
422 User* UserManagerBase::GetActiveUser() { 427 User* UserManagerBase::GetActiveUser() {
423 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 428 DCHECK(task_runner_->RunsTasksOnCurrentThread());
424 return active_user_; 429 return active_user_;
425 } 430 }
426 431
427 const User* UserManagerBase::GetPrimaryUser() const { 432 const User* UserManagerBase::GetPrimaryUser() const {
428 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 433 DCHECK(task_runner_->RunsTasksOnCurrentThread());
429 return primary_user_; 434 return primary_user_;
430 } 435 }
431 436
432 void UserManagerBase::SaveUserOAuthStatus( 437 void UserManagerBase::SaveUserOAuthStatus(
433 const AccountId& account_id, 438 const std::string& user_id,
434 User::OAuthTokenStatus oauth_token_status) { 439 User::OAuthTokenStatus oauth_token_status) {
435 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 440 DCHECK(task_runner_->RunsTasksOnCurrentThread());
436 441
437 DVLOG(1) << "Saving user OAuth token status in Local State"; 442 DVLOG(1) << "Saving user OAuth token status in Local State";
438 User* user = FindUserAndModify(account_id); 443 User* user = FindUserAndModify(user_id);
439 if (user) 444 if (user)
440 user->set_oauth_token_status(oauth_token_status); 445 user->set_oauth_token_status(oauth_token_status);
441 446
442 // Do not update local state if data stored or cached outside the user's 447 // Do not update local state if data stored or cached outside the user's
443 // cryptohome is to be treated as ephemeral. 448 // cryptohome is to be treated as ephemeral.
444 if (IsUserNonCryptohomeDataEphemeral(account_id)) 449 if (IsUserNonCryptohomeDataEphemeral(user_id))
445 return; 450 return;
446 451
447 DictionaryPrefUpdate oauth_status_update(GetLocalState(), 452 DictionaryPrefUpdate oauth_status_update(GetLocalState(),
448 kUserOAuthTokenStatus); 453 kUserOAuthTokenStatus);
449 oauth_status_update->SetWithoutPathExpansion( 454 oauth_status_update->SetWithoutPathExpansion(
450 account_id.GetUserEmail(), 455 user_id,
451 new base::FundamentalValue(static_cast<int>(oauth_token_status))); 456 new base::FundamentalValue(static_cast<int>(oauth_token_status)));
452 } 457 }
453 458
454 void UserManagerBase::SaveForceOnlineSignin(const AccountId& account_id, 459 void UserManagerBase::SaveForceOnlineSignin(const std::string& user_id,
455 bool force_online_signin) { 460 bool force_online_signin) {
456 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 461 DCHECK(task_runner_->RunsTasksOnCurrentThread());
457 462
458 // Do not update local state if data stored or cached outside the user's 463 // Do not update local state if data stored or cached outside the user's
459 // cryptohome is to be treated as ephemeral. 464 // cryptohome is to be treated as ephemeral.
460 if (IsUserNonCryptohomeDataEphemeral(account_id)) 465 if (IsUserNonCryptohomeDataEphemeral(user_id))
461 return; 466 return;
462 467
463 DictionaryPrefUpdate force_online_update(GetLocalState(), 468 DictionaryPrefUpdate force_online_update(GetLocalState(),
464 kUserForceOnlineSignin); 469 kUserForceOnlineSignin);
465 force_online_update->SetBooleanWithoutPathExpansion(account_id.GetUserEmail(), 470 force_online_update->SetBooleanWithoutPathExpansion(user_id,
466 force_online_signin); 471 force_online_signin);
467 } 472 }
468 473
469 void UserManagerBase::SaveUserDisplayName(const AccountId& account_id, 474 void UserManagerBase::SaveUserDisplayName(const std::string& user_id,
470 const base::string16& display_name) { 475 const base::string16& display_name) {
471 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 476 DCHECK(task_runner_->RunsTasksOnCurrentThread());
472 477
473 if (User* user = FindUserAndModify(account_id)) { 478 if (User* user = FindUserAndModify(user_id)) {
474 user->set_display_name(display_name); 479 user->set_display_name(display_name);
475 480
476 // Do not update local state if data stored or cached outside the user's 481 // Do not update local state if data stored or cached outside the user's
477 // cryptohome is to be treated as ephemeral. 482 // cryptohome is to be treated as ephemeral.
478 if (!IsUserNonCryptohomeDataEphemeral(account_id)) { 483 if (!IsUserNonCryptohomeDataEphemeral(user_id)) {
479 DictionaryPrefUpdate display_name_update(GetLocalState(), 484 DictionaryPrefUpdate display_name_update(GetLocalState(),
480 kUserDisplayName); 485 kUserDisplayName);
481 display_name_update->SetWithoutPathExpansion( 486 display_name_update->SetWithoutPathExpansion(
482 account_id.GetUserEmail(), new base::StringValue(display_name)); 487 user_id, new base::StringValue(display_name));
483 } 488 }
484 } 489 }
485 } 490 }
486 491
487 base::string16 UserManagerBase::GetUserDisplayName( 492 base::string16 UserManagerBase::GetUserDisplayName(
488 const AccountId& account_id) const { 493 const std::string& user_id) const {
489 const User* user = FindUser(account_id); 494 const User* user = FindUser(user_id);
490 return user ? user->display_name() : base::string16(); 495 return user ? user->display_name() : base::string16();
491 } 496 }
492 497
493 void UserManagerBase::SaveUserDisplayEmail(const AccountId& account_id, 498 void UserManagerBase::SaveUserDisplayEmail(const std::string& user_id,
494 const std::string& display_email) { 499 const std::string& display_email) {
495 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 500 DCHECK(task_runner_->RunsTasksOnCurrentThread());
496 501
497 User* user = FindUserAndModify(account_id); 502 User* user = FindUserAndModify(user_id);
498 if (!user) { 503 if (!user) {
499 LOG(ERROR) << "User not found: " << account_id.GetUserEmail(); 504 LOG(ERROR) << "User not found: " << user_id;
500 return; // Ignore if there is no such user. 505 return; // Ignore if there is no such user.
501 } 506 }
502 507
503 user->set_display_email(display_email); 508 user->set_display_email(display_email);
504 509
505 // Do not update local state if data stored or cached outside the user's 510 // Do not update local state if data stored or cached outside the user's
506 // cryptohome is to be treated as ephemeral. 511 // cryptohome is to be treated as ephemeral.
507 if (IsUserNonCryptohomeDataEphemeral(account_id)) 512 if (IsUserNonCryptohomeDataEphemeral(user_id))
508 return; 513 return;
509 514
510 DictionaryPrefUpdate display_email_update(GetLocalState(), kUserDisplayEmail); 515 DictionaryPrefUpdate display_email_update(GetLocalState(), kUserDisplayEmail);
511 display_email_update->SetWithoutPathExpansion( 516 display_email_update->SetWithoutPathExpansion(
512 account_id.GetUserEmail(), new base::StringValue(display_email)); 517 user_id, new base::StringValue(display_email));
513 } 518 }
514 519
515 std::string UserManagerBase::GetUserDisplayEmail( 520 std::string UserManagerBase::GetUserDisplayEmail(
516 const AccountId& account_id) const { 521 const std::string& user_id) const {
517 const User* user = FindUser(account_id); 522 const User* user = FindUser(user_id);
518 return user ? user->display_email() : account_id.GetUserEmail(); 523 return user ? user->display_email() : user_id;
519 } 524 }
520 525
521 void UserManagerBase::SaveUserType(const AccountId& account_id, 526 void UserManagerBase::SaveUserType(const std::string& user_id,
522 const UserType& user_type) { 527 const UserType& user_type) {
523 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 528 DCHECK(task_runner_->RunsTasksOnCurrentThread());
524 529
525 User* user = FindUserAndModify(account_id); 530 User* user = FindUserAndModify(user_id);
526 if (!user) { 531 if (!user) {
527 LOG(ERROR) << "User not found: " << account_id.GetUserEmail(); 532 LOG(ERROR) << "User not found: " << user_id;
528 return; // Ignore if there is no such user. 533 return; // Ignore if there is no such user.
529 } 534 }
530 535
531 // Do not update local state if data stored or cached outside the user's 536 // Do not update local state if data stored or cached outside the user's
532 // cryptohome is to be treated as ephemeral. 537 // cryptohome is to be treated as ephemeral.
533 if (IsUserNonCryptohomeDataEphemeral(account_id)) 538 if (IsUserNonCryptohomeDataEphemeral(user_id))
534 return; 539 return;
535 540
536 DictionaryPrefUpdate user_type_update(GetLocalState(), kUserType); 541 DictionaryPrefUpdate user_type_update(GetLocalState(), kUserType);
537 user_type_update->SetWithoutPathExpansion( 542 user_type_update->SetWithoutPathExpansion(
538 account_id.GetUserEmail(), 543 user_id, new base::FundamentalValue(static_cast<int>(user_type)));
539 new base::FundamentalValue(static_cast<int>(user_type)));
540 GetLocalState()->CommitPendingWrite(); 544 GetLocalState()->CommitPendingWrite();
541 } 545 }
542 546
543 void UserManagerBase::UpdateUsingSAML(const AccountId& account_id, 547 void UserManagerBase::UpdateUsingSAML(const std::string& user_id,
544 const bool using_saml) { 548 const bool using_saml) {
545 SetKnownUserBooleanPref(account_id, kUsingSAMLKey, using_saml); 549 SetKnownUserBooleanPref(user_id, kUsingSAMLKey, using_saml);
546 } 550 }
547 551
548 bool UserManagerBase::FindUsingSAML(const AccountId& account_id) { 552 bool UserManagerBase::FindUsingSAML(const std::string& user_id) {
549 bool using_saml; 553 bool using_saml;
550 if (GetKnownUserBooleanPref(account_id, kUsingSAMLKey, &using_saml)) 554 if (GetKnownUserBooleanPref(user_id, kUsingSAMLKey, &using_saml))
551 return using_saml; 555 return using_saml;
552 return false; 556 return false;
553 } 557 }
554 558
555 void UserManagerBase::UpdateReauthReason(const AccountId& account_id, 559 void UserManagerBase::UpdateReauthReason(const std::string& user_id,
556 const int reauth_reason) { 560 const int reauth_reason) {
557 SetKnownUserIntegerPref(account_id, kReauthReasonKey, reauth_reason); 561 SetKnownUserIntegerPref(user_id, kReauthReasonKey, reauth_reason);
558 } 562 }
559 563
560 bool UserManagerBase::FindReauthReason(const AccountId& account_id, 564 bool UserManagerBase::FindReauthReason(const std::string& user_id,
561 int* out_value) { 565 int* out_value) {
562 return GetKnownUserIntegerPref(account_id, kReauthReasonKey, out_value); 566 return GetKnownUserIntegerPref(user_id, kReauthReasonKey, out_value);
563 } 567 }
564 568
565 void UserManagerBase::UpdateUserAccountData( 569 void UserManagerBase::UpdateUserAccountData(
566 const AccountId& account_id, 570 const std::string& user_id,
567 const UserAccountData& account_data) { 571 const UserAccountData& account_data) {
568 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 572 DCHECK(task_runner_->RunsTasksOnCurrentThread());
569 573
570 SaveUserDisplayName(account_id, account_data.display_name()); 574 SaveUserDisplayName(user_id, account_data.display_name());
571 575
572 if (User* user = FindUserAndModify(account_id)) { 576 if (User* user = FindUserAndModify(user_id)) {
573 base::string16 given_name = account_data.given_name(); 577 base::string16 given_name = account_data.given_name();
574 user->set_given_name(given_name); 578 user->set_given_name(given_name);
575 if (!IsUserNonCryptohomeDataEphemeral(account_id)) { 579 if (!IsUserNonCryptohomeDataEphemeral(user_id)) {
576 DictionaryPrefUpdate given_name_update(GetLocalState(), kUserGivenName); 580 DictionaryPrefUpdate given_name_update(GetLocalState(), kUserGivenName);
577 given_name_update->SetWithoutPathExpansion( 581 given_name_update->SetWithoutPathExpansion(
578 account_id.GetUserEmail(), new base::StringValue(given_name)); 582 user_id, new base::StringValue(given_name));
579 } 583 }
580 } 584 }
581 585
582 UpdateUserAccountLocale(account_id, account_data.locale()); 586 UpdateUserAccountLocale(user_id, account_data.locale());
583 } 587 }
584 588
585 // static 589 // static
586 void UserManagerBase::ParseUserList(const base::ListValue& users_list, 590 void UserManagerBase::ParseUserList(const base::ListValue& users_list,
587 const std::set<AccountId>& existing_users, 591 const std::set<std::string>& existing_users,
588 std::vector<AccountId>* users_vector, 592 std::vector<std::string>* users_vector,
589 std::set<AccountId>* users_set) { 593 std::set<std::string>* users_set) {
590 users_vector->clear(); 594 users_vector->clear();
591 users_set->clear(); 595 users_set->clear();
592 for (size_t i = 0; i < users_list.GetSize(); ++i) { 596 for (size_t i = 0; i < users_list.GetSize(); ++i) {
593 std::string email; 597 std::string email;
594 if (!users_list.GetString(i, &email) || email.empty()) { 598 if (!users_list.GetString(i, &email) || email.empty()) {
595 LOG(ERROR) << "Corrupt entry in user list at index " << i << "."; 599 LOG(ERROR) << "Corrupt entry in user list at index " << i << ".";
596 continue; 600 continue;
597 } 601 }
598 const AccountId account_id(AccountId::FromUserEmail(email)); 602 if (existing_users.find(email) != existing_users.end() ||
599 if (existing_users.find(account_id) != existing_users.end() || 603 !users_set->insert(email).second) {
600 !users_set->insert(account_id).second) {
601 LOG(ERROR) << "Duplicate user: " << email; 604 LOG(ERROR) << "Duplicate user: " << email;
602 continue; 605 continue;
603 } 606 }
604 users_vector->push_back(account_id); 607 users_vector->push_back(email);
605 } 608 }
606 } 609 }
607 610
608 bool UserManagerBase::IsCurrentUserOwner() const { 611 bool UserManagerBase::IsCurrentUserOwner() const {
609 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 612 DCHECK(task_runner_->RunsTasksOnCurrentThread());
610 base::AutoLock lk(is_current_user_owner_lock_); 613 base::AutoLock lk(is_current_user_owner_lock_);
611 return is_current_user_owner_; 614 return is_current_user_owner_;
612 } 615 }
613 616
614 void UserManagerBase::SetCurrentUserIsOwner(bool is_current_user_owner) { 617 void UserManagerBase::SetCurrentUserIsOwner(bool is_current_user_owner) {
615 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 618 DCHECK(task_runner_->RunsTasksOnCurrentThread());
616 { 619 {
617 base::AutoLock lk(is_current_user_owner_lock_); 620 base::AutoLock lk(is_current_user_owner_lock_);
618 is_current_user_owner_ = is_current_user_owner; 621 is_current_user_owner_ = is_current_user_owner;
619 } 622 }
620 UpdateLoginState(); 623 UpdateLoginState();
621 } 624 }
622 625
623 bool UserManagerBase::IsCurrentUserNew() const { 626 bool UserManagerBase::IsCurrentUserNew() const {
624 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 627 DCHECK(task_runner_->RunsTasksOnCurrentThread());
625 return is_current_user_new_; 628 return is_current_user_new_;
626 } 629 }
627 630
628 bool UserManagerBase::IsCurrentUserNonCryptohomeDataEphemeral() const { 631 bool UserManagerBase::IsCurrentUserNonCryptohomeDataEphemeral() const {
629 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 632 DCHECK(task_runner_->RunsTasksOnCurrentThread());
630 return IsUserLoggedIn() && 633 return IsUserLoggedIn() &&
631 IsUserNonCryptohomeDataEphemeral(GetLoggedInUser()->GetAccountId()); 634 IsUserNonCryptohomeDataEphemeral(GetLoggedInUser()->email());
632 } 635 }
633 636
634 bool UserManagerBase::CanCurrentUserLock() const { 637 bool UserManagerBase::CanCurrentUserLock() const {
635 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 638 DCHECK(task_runner_->RunsTasksOnCurrentThread());
636 return IsUserLoggedIn() && active_user_->can_lock(); 639 return IsUserLoggedIn() && active_user_->can_lock();
637 } 640 }
638 641
639 bool UserManagerBase::IsUserLoggedIn() const { 642 bool UserManagerBase::IsUserLoggedIn() const {
640 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 643 DCHECK(task_runner_->RunsTasksOnCurrentThread());
641 return active_user_; 644 return active_user_;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 return IsUserLoggedIn() && 680 return IsUserLoggedIn() &&
678 active_user_->email() == chromeos::login::kStubUser; 681 active_user_->email() == chromeos::login::kStubUser;
679 } 682 }
680 683
681 bool UserManagerBase::IsSessionStarted() const { 684 bool UserManagerBase::IsSessionStarted() const {
682 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 685 DCHECK(task_runner_->RunsTasksOnCurrentThread());
683 return session_started_; 686 return session_started_;
684 } 687 }
685 688
686 bool UserManagerBase::IsUserNonCryptohomeDataEphemeral( 689 bool UserManagerBase::IsUserNonCryptohomeDataEphemeral(
687 const AccountId& account_id) const { 690 const std::string& user_id) const {
688 // Data belonging to the guest and stub users is always ephemeral. 691 // Data belonging to the guest and stub users is always ephemeral.
689 if (account_id == chromeos::login::GuestAccountId() || 692 if (user_id == chromeos::login::kGuestUserName ||
690 account_id == chromeos::login::StubAccountId()) { 693 user_id == chromeos::login::kStubUser) {
691 return true; 694 return true;
692 } 695 }
693 696
694 // Data belonging to the owner, anyone found on the user list and obsolete 697 // Data belonging to the owner, anyone found on the user list and obsolete
695 // public accounts whose data has not been removed yet is not ephemeral. 698 // public accounts whose data has not been removed yet is not ephemeral.
696 if (account_id == GetOwnerAccountId() || UserExistsInList(account_id) || 699 if (user_id == GetOwnerEmail() || UserExistsInList(user_id) ||
697 IsPublicAccountMarkedForRemoval(account_id)) { 700 IsPublicAccountMarkedForRemoval(user_id)) {
698 return false; 701 return false;
699 } 702 }
700 703
701 // Data belonging to the currently logged-in user is ephemeral when: 704 // Data belonging to the currently logged-in user is ephemeral when:
702 // a) The user logged into a regular gaia account while the ephemeral users 705 // a) The user logged into a regular gaia account while the ephemeral users
703 // policy was enabled. 706 // policy was enabled.
704 // - or - 707 // - or -
705 // b) The user logged into any other account type. 708 // b) The user logged into any other account type.
706 if (IsUserLoggedIn() && (account_id == GetLoggedInUser()->GetAccountId()) && 709 if (IsUserLoggedIn() && (user_id == GetLoggedInUser()->email()) &&
707 (is_current_user_ephemeral_regular_user_ || 710 (is_current_user_ephemeral_regular_user_ ||
708 !IsLoggedInAsUserWithGaiaAccount())) { 711 !IsLoggedInAsUserWithGaiaAccount())) {
709 return true; 712 return true;
710 } 713 }
711 714
712 // Data belonging to any other user is ephemeral when: 715 // Data belonging to any other user is ephemeral when:
713 // a) Going through the regular login flow and the ephemeral users policy is 716 // a) Going through the regular login flow and the ephemeral users policy is
714 // enabled. 717 // enabled.
715 // - or - 718 // - or -
716 // b) The browser is restarting after a crash. 719 // b) The browser is restarting after a crash.
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 } 779 }
777 780
778 void UserManagerBase::SetEphemeralUsersEnabled(bool enabled) { 781 void UserManagerBase::SetEphemeralUsersEnabled(bool enabled) {
779 ephemeral_users_enabled_ = enabled; 782 ephemeral_users_enabled_ = enabled;
780 } 783 }
781 784
782 void UserManagerBase::SetIsCurrentUserNew(bool is_new) { 785 void UserManagerBase::SetIsCurrentUserNew(bool is_new) {
783 is_current_user_new_ = is_new; 786 is_current_user_new_ = is_new;
784 } 787 }
785 788
786 bool UserManagerBase::HasPendingBootstrap(const AccountId& account_id) const { 789 bool UserManagerBase::HasPendingBootstrap(const std::string& user_id) const {
787 return false; 790 return false;
788 } 791 }
789 792
790 void UserManagerBase::SetOwnerId(const AccountId& owner_account_id) { 793 void UserManagerBase::SetOwnerEmail(const std::string& owner_user_id) {
791 owner_account_id_ = owner_account_id; 794 owner_email_ = owner_user_id;
792 } 795 }
793 796
794 const AccountId& UserManagerBase::GetPendingUserSwitchID() const { 797 const std::string& UserManagerBase::GetPendingUserSwitchID() const {
795 return pending_user_switch_; 798 return pending_user_switch_;
796 } 799 }
797 800
798 void UserManagerBase::SetPendingUserSwitchId(const AccountId& account_id) { 801 void UserManagerBase::SetPendingUserSwitchID(const std::string& user_id) {
799 pending_user_switch_ = account_id; 802 pending_user_switch_ = user_id;
800 } 803 }
801 804
802 void UserManagerBase::EnsureUsersLoaded() { 805 void UserManagerBase::EnsureUsersLoaded() {
803 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 806 DCHECK(task_runner_->RunsTasksOnCurrentThread());
804 if (!GetLocalState()) 807 if (!GetLocalState())
805 return; 808 return;
806 809
807 if (user_loading_stage_ != STAGE_NOT_LOADED) 810 if (user_loading_stage_ != STAGE_NOT_LOADED)
808 return; 811 return;
809 user_loading_stage_ = STAGE_LOADING; 812 user_loading_stage_ = STAGE_LOADING;
810 813
811 PerformPreUserListLoadingActions(); 814 PerformPreUserListLoadingActions();
812 815
813 PrefService* local_state = GetLocalState(); 816 PrefService* local_state = GetLocalState();
814 const base::ListValue* prefs_regular_users = 817 const base::ListValue* prefs_regular_users =
815 local_state->GetList(kRegularUsers); 818 local_state->GetList(kRegularUsers);
816 819
817 const base::DictionaryValue* prefs_display_names = 820 const base::DictionaryValue* prefs_display_names =
818 local_state->GetDictionary(kUserDisplayName); 821 local_state->GetDictionary(kUserDisplayName);
819 const base::DictionaryValue* prefs_given_names = 822 const base::DictionaryValue* prefs_given_names =
820 local_state->GetDictionary(kUserGivenName); 823 local_state->GetDictionary(kUserGivenName);
821 const base::DictionaryValue* prefs_display_emails = 824 const base::DictionaryValue* prefs_display_emails =
822 local_state->GetDictionary(kUserDisplayEmail); 825 local_state->GetDictionary(kUserDisplayEmail);
823 const base::DictionaryValue* prefs_user_types = 826 const base::DictionaryValue* prefs_user_types =
824 local_state->GetDictionary(kUserType); 827 local_state->GetDictionary(kUserType);
825 828
826 // Load public sessions first. 829 // Load public sessions first.
827 std::set<AccountId> public_sessions_set; 830 std::set<std::string> public_sessions_set;
828 LoadPublicAccounts(&public_sessions_set); 831 LoadPublicAccounts(&public_sessions_set);
829 832
830 // Load regular users and supervised users. 833 // Load regular users and supervised users.
831 std::vector<AccountId> regular_users; 834 std::vector<std::string> regular_users;
832 std::set<AccountId> regular_users_set; 835 std::set<std::string> regular_users_set;
833 ParseUserList(*prefs_regular_users, 836 ParseUserList(*prefs_regular_users,
834 public_sessions_set, 837 public_sessions_set,
835 &regular_users, 838 &regular_users,
836 &regular_users_set); 839 &regular_users_set);
837 for (std::vector<AccountId>::const_iterator it = regular_users.begin(); 840 for (std::vector<std::string>::const_iterator it = regular_users.begin();
838 it != regular_users.end(); ++it) { 841 it != regular_users.end();
839 User* user = nullptr; 842 ++it) {
840 const std::string domain = gaia::ExtractDomainName(it->GetUserEmail()); 843 User* user = NULL;
844 const std::string domain = gaia::ExtractDomainName(*it);
841 if (domain == chromeos::login::kSupervisedUserDomain) { 845 if (domain == chromeos::login::kSupervisedUserDomain) {
842 user = User::CreateSupervisedUser(*it); 846 user = User::CreateSupervisedUser(*it);
843 } else { 847 } else {
844 user = User::CreateRegularUser(*it); 848 user = User::CreateRegularUser(*it);
845 int user_type; 849 int user_type;
846 if (prefs_user_types->GetIntegerWithoutPathExpansion(it->GetUserEmail(), 850 if (prefs_user_types->GetIntegerWithoutPathExpansion(*it, &user_type) &&
847 &user_type) &&
848 user_type == USER_TYPE_CHILD) { 851 user_type == USER_TYPE_CHILD) {
849 ChangeUserChildStatus(user, true /* is child */); 852 ChangeUserChildStatus(user, true /* is child */);
850 } 853 }
851 } 854 }
852 user->set_oauth_token_status(LoadUserOAuthStatus(*it)); 855 user->set_oauth_token_status(LoadUserOAuthStatus(*it));
853 user->set_force_online_signin(LoadForceOnlineSignin(*it)); 856 user->set_force_online_signin(LoadForceOnlineSignin(*it));
854 user->set_using_saml(FindUsingSAML(*it)); 857 user->set_using_saml(FindUsingSAML(*it));
855 users_.push_back(user); 858 users_.push_back(user);
856 859
857 base::string16 display_name; 860 base::string16 display_name;
858 if (prefs_display_names->GetStringWithoutPathExpansion(it->GetUserEmail(), 861 if (prefs_display_names->GetStringWithoutPathExpansion(*it,
859 &display_name)) { 862 &display_name)) {
860 user->set_display_name(display_name); 863 user->set_display_name(display_name);
861 } 864 }
862 865
863 base::string16 given_name; 866 base::string16 given_name;
864 if (prefs_given_names->GetStringWithoutPathExpansion(it->GetUserEmail(), 867 if (prefs_given_names->GetStringWithoutPathExpansion(*it, &given_name)) {
865 &given_name)) {
866 user->set_given_name(given_name); 868 user->set_given_name(given_name);
867 } 869 }
868 870
869 std::string display_email; 871 std::string display_email;
870 if (prefs_display_emails->GetStringWithoutPathExpansion(it->GetUserEmail(), 872 if (prefs_display_emails->GetStringWithoutPathExpansion(*it,
871 &display_email)) { 873 &display_email)) {
872 user->set_display_email(display_email); 874 user->set_display_email(display_email);
873 } 875 }
874 } 876 }
875 877
876 user_loading_stage_ = STAGE_LOADED; 878 user_loading_stage_ = STAGE_LOADED;
877 879
878 PerformPostUserListLoadingActions(); 880 PerformPostUserListLoadingActions();
879 } 881 }
880 882
881 UserList& UserManagerBase::GetUsersAndModify() { 883 UserList& UserManagerBase::GetUsersAndModify() {
882 EnsureUsersLoaded(); 884 EnsureUsersLoaded();
883 return users_; 885 return users_;
884 } 886 }
885 887
886 const User* UserManagerBase::FindUserInList(const AccountId& account_id) const { 888 const User* UserManagerBase::FindUserInList(const std::string& user_id) const {
887 const UserList& users = GetUsers(); 889 const UserList& users = GetUsers();
888 for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) { 890 for (UserList::const_iterator it = users.begin(); it != users.end(); ++it) {
889 if ((*it)->GetAccountId() == account_id) 891 if ((*it)->email() == user_id)
890 return *it; 892 return *it;
891 } 893 }
892 return nullptr; 894 return NULL;
893 } 895 }
894 896
895 bool UserManagerBase::UserExistsInList(const AccountId& account_id) const { 897 bool UserManagerBase::UserExistsInList(const std::string& user_id) const {
896 const base::ListValue* user_list = GetLocalState()->GetList(kRegularUsers); 898 const base::ListValue* user_list = GetLocalState()->GetList(kRegularUsers);
897 for (size_t i = 0; i < user_list->GetSize(); ++i) { 899 for (size_t i = 0; i < user_list->GetSize(); ++i) {
898 std::string email; 900 std::string email;
899 if (user_list->GetString(i, &email) && (account_id.GetUserEmail() == email)) 901 if (user_list->GetString(i, &email) && (user_id == email))
900 return true; 902 return true;
901 } 903 }
902 return false; 904 return false;
903 } 905 }
904 906
905 User* UserManagerBase::FindUserInListAndModify(const AccountId& account_id) { 907 User* UserManagerBase::FindUserInListAndModify(const std::string& user_id) {
906 UserList& users = GetUsersAndModify(); 908 UserList& users = GetUsersAndModify();
907 for (UserList::iterator it = users.begin(); it != users.end(); ++it) { 909 for (UserList::iterator it = users.begin(); it != users.end(); ++it) {
908 if ((*it)->GetAccountId() == account_id) 910 if ((*it)->email() == user_id)
909 return *it; 911 return *it;
910 } 912 }
911 return nullptr; 913 return NULL;
912 } 914 }
913 915
914 void UserManagerBase::GuestUserLoggedIn() { 916 void UserManagerBase::GuestUserLoggedIn() {
915 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 917 DCHECK(task_runner_->RunsTasksOnCurrentThread());
916 active_user_ = User::CreateGuestUser(); 918 active_user_ = User::CreateGuestUser();
917 } 919 }
918 920
919 void UserManagerBase::AddUserRecord(User* user) { 921 void UserManagerBase::AddUserRecord(User* user) {
920 // Add the user to the front of the user list. 922 // Add the user to the front of the user list.
921 ListPrefUpdate prefs_users_update(GetLocalState(), kRegularUsers); 923 ListPrefUpdate prefs_users_update(GetLocalState(), kRegularUsers);
922 prefs_users_update->Insert(0, new base::StringValue(user->email())); 924 prefs_users_update->Insert(0, new base::StringValue(user->email()));
923 users_.insert(users_.begin(), user); 925 users_.insert(users_.begin(), user);
924 } 926 }
925 927
926 void UserManagerBase::RegularUserLoggedIn(const AccountId& account_id) { 928 void UserManagerBase::RegularUserLoggedIn(const std::string& user_id) {
927 // Remove the user from the user list. 929 // Remove the user from the user list.
928 active_user_ = RemoveRegularOrSupervisedUserFromList(account_id); 930 active_user_ = RemoveRegularOrSupervisedUserFromList(user_id);
929 931
930 // If the user was not found on the user list, create a new user. 932 // If the user was not found on the user list, create a new user.
931 SetIsCurrentUserNew(!active_user_); 933 SetIsCurrentUserNew(!active_user_);
932 if (IsCurrentUserNew()) { 934 if (IsCurrentUserNew()) {
933 active_user_ = User::CreateRegularUser(account_id); 935 active_user_ = User::CreateRegularUser(user_id);
934 active_user_->set_oauth_token_status(LoadUserOAuthStatus(account_id)); 936 active_user_->set_oauth_token_status(LoadUserOAuthStatus(user_id));
935 SaveUserDisplayName(active_user_->GetAccountId(), 937 SaveUserDisplayName(active_user_->email(),
936 base::UTF8ToUTF16(active_user_->GetAccountName(true))); 938 base::UTF8ToUTF16(active_user_->GetAccountName(true)));
937 } 939 }
938 940
939 AddUserRecord(active_user_); 941 AddUserRecord(active_user_);
940 942
941 // Make sure that new data is persisted to Local State. 943 // Make sure that new data is persisted to Local State.
942 GetLocalState()->CommitPendingWrite(); 944 GetLocalState()->CommitPendingWrite();
943 } 945 }
944 946
945 void UserManagerBase::RegularUserLoggedInAsEphemeral( 947 void UserManagerBase::RegularUserLoggedInAsEphemeral(
946 const AccountId& account_id) { 948 const std::string& user_id) {
947 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 949 DCHECK(task_runner_->RunsTasksOnCurrentThread());
948 SetIsCurrentUserNew(true); 950 SetIsCurrentUserNew(true);
949 is_current_user_ephemeral_regular_user_ = true; 951 is_current_user_ephemeral_regular_user_ = true;
950 active_user_ = User::CreateRegularUser(account_id); 952 active_user_ = User::CreateRegularUser(user_id);
951 } 953 }
952 954
953 void UserManagerBase::NotifyOnLogin() { 955 void UserManagerBase::NotifyOnLogin() {
954 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 956 DCHECK(task_runner_->RunsTasksOnCurrentThread());
955 957
956 NotifyActiveUserHashChanged(active_user_->username_hash()); 958 NotifyActiveUserHashChanged(active_user_->username_hash());
957 NotifyActiveUserChanged(active_user_); 959 NotifyActiveUserChanged(active_user_);
958 UpdateLoginState(); 960 UpdateLoginState();
959 } 961 }
960 962
961 User::OAuthTokenStatus UserManagerBase::LoadUserOAuthStatus( 963 User::OAuthTokenStatus UserManagerBase::LoadUserOAuthStatus(
962 const AccountId& account_id) const { 964 const std::string& user_id) const {
963 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 965 DCHECK(task_runner_->RunsTasksOnCurrentThread());
964 966
965 const base::DictionaryValue* prefs_oauth_status = 967 const base::DictionaryValue* prefs_oauth_status =
966 GetLocalState()->GetDictionary(kUserOAuthTokenStatus); 968 GetLocalState()->GetDictionary(kUserOAuthTokenStatus);
967 int oauth_token_status = User::OAUTH_TOKEN_STATUS_UNKNOWN; 969 int oauth_token_status = User::OAUTH_TOKEN_STATUS_UNKNOWN;
968 if (prefs_oauth_status && 970 if (prefs_oauth_status &&
969 prefs_oauth_status->GetIntegerWithoutPathExpansion( 971 prefs_oauth_status->GetIntegerWithoutPathExpansion(user_id,
970 account_id.GetUserEmail(), &oauth_token_status)) { 972 &oauth_token_status)) {
971 User::OAuthTokenStatus status = 973 User::OAuthTokenStatus status =
972 static_cast<User::OAuthTokenStatus>(oauth_token_status); 974 static_cast<User::OAuthTokenStatus>(oauth_token_status);
973 HandleUserOAuthTokenStatusChange(account_id, status); 975 HandleUserOAuthTokenStatusChange(user_id, status);
974 976
975 return status; 977 return status;
976 } 978 }
977 return User::OAUTH_TOKEN_STATUS_UNKNOWN; 979 return User::OAUTH_TOKEN_STATUS_UNKNOWN;
978 } 980 }
979 981
980 bool UserManagerBase::LoadForceOnlineSignin(const AccountId& account_id) const { 982 bool UserManagerBase::LoadForceOnlineSignin(const std::string& user_id) const {
981 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 983 DCHECK(task_runner_->RunsTasksOnCurrentThread());
982 984
983 const base::DictionaryValue* prefs_force_online = 985 const base::DictionaryValue* prefs_force_online =
984 GetLocalState()->GetDictionary(kUserForceOnlineSignin); 986 GetLocalState()->GetDictionary(kUserForceOnlineSignin);
985 bool force_online_signin = false; 987 bool force_online_signin = false;
986 if (prefs_force_online) { 988 if (prefs_force_online) {
987 prefs_force_online->GetBooleanWithoutPathExpansion( 989 prefs_force_online->GetBooleanWithoutPathExpansion(user_id,
988 account_id.GetUserEmail(), &force_online_signin); 990 &force_online_signin);
989 } 991 }
990 return force_online_signin; 992 return force_online_signin;
991 } 993 }
992 994
993 void UserManagerBase::RemoveNonCryptohomeData(const AccountId& account_id) { 995 void UserManagerBase::RemoveNonCryptohomeData(const std::string& user_id) {
994 PrefService* prefs = GetLocalState(); 996 PrefService* prefs = GetLocalState();
995 DictionaryPrefUpdate prefs_display_name_update(prefs, kUserDisplayName); 997 DictionaryPrefUpdate prefs_display_name_update(prefs, kUserDisplayName);
996 prefs_display_name_update->RemoveWithoutPathExpansion( 998 prefs_display_name_update->RemoveWithoutPathExpansion(user_id, NULL);
997 account_id.GetUserEmail(), nullptr);
998 999
999 DictionaryPrefUpdate prefs_given_name_update(prefs, kUserGivenName); 1000 DictionaryPrefUpdate prefs_given_name_update(prefs, kUserGivenName);
1000 prefs_given_name_update->RemoveWithoutPathExpansion(account_id.GetUserEmail(), 1001 prefs_given_name_update->RemoveWithoutPathExpansion(user_id, NULL);
1001 nullptr);
1002 1002
1003 DictionaryPrefUpdate prefs_display_email_update(prefs, kUserDisplayEmail); 1003 DictionaryPrefUpdate prefs_display_email_update(prefs, kUserDisplayEmail);
1004 prefs_display_email_update->RemoveWithoutPathExpansion( 1004 prefs_display_email_update->RemoveWithoutPathExpansion(user_id, NULL);
1005 account_id.GetUserEmail(), nullptr);
1006 1005
1007 DictionaryPrefUpdate prefs_oauth_update(prefs, kUserOAuthTokenStatus); 1006 DictionaryPrefUpdate prefs_oauth_update(prefs, kUserOAuthTokenStatus);
1008 prefs_oauth_update->RemoveWithoutPathExpansion(account_id.GetUserEmail(), 1007 prefs_oauth_update->RemoveWithoutPathExpansion(user_id, NULL);
1009 nullptr);
1010 1008
1011 DictionaryPrefUpdate prefs_force_online_update(prefs, kUserForceOnlineSignin); 1009 DictionaryPrefUpdate prefs_force_online_update(prefs, kUserForceOnlineSignin);
1012 prefs_force_online_update->RemoveWithoutPathExpansion( 1010 prefs_force_online_update->RemoveWithoutPathExpansion(user_id, NULL);
1013 account_id.GetUserEmail(), nullptr);
1014 1011
1015 RemoveKnownUserPrefs(account_id); 1012 RemoveKnownUserPrefs(user_id);
1016 1013
1017 const AccountId last_active_user = 1014 std::string last_active_user = GetLocalState()->GetString(kLastActiveUser);
1018 AccountId::FromUserEmail(GetLocalState()->GetString(kLastActiveUser)); 1015 if (user_id == last_active_user)
1019 if (account_id == last_active_user)
1020 GetLocalState()->SetString(kLastActiveUser, std::string()); 1016 GetLocalState()->SetString(kLastActiveUser, std::string());
1021 } 1017 }
1022 1018
1023 bool UserManagerBase::FindKnownUserPrefs( 1019 bool UserManagerBase::FindKnownUserPrefs(
1024 const AccountId& account_id, 1020 const UserID& user_id,
1025 const base::DictionaryValue** out_value) { 1021 const base::DictionaryValue** out_value) {
1026 PrefService* local_state = GetLocalState(); 1022 PrefService* local_state = GetLocalState();
1027 1023
1028 // Local State may not be initialized in tests. 1024 // Local State may not be initialized in tests.
1029 if (!local_state) 1025 if (!local_state)
1030 return false; 1026 return false;
1031 if (IsUserNonCryptohomeDataEphemeral(account_id)) 1027 if (IsUserNonCryptohomeDataEphemeral(user_id))
1032 return false; 1028 return false;
1033 1029
1034 const base::ListValue* known_users = local_state->GetList(kKnownUsers); 1030 const base::ListValue* known_users = local_state->GetList(kKnownUsers);
1035 for (size_t i = 0; i < known_users->GetSize(); ++i) { 1031 for (size_t i = 0; i < known_users->GetSize(); ++i) {
1036 const base::DictionaryValue* element = nullptr; 1032 const base::DictionaryValue* element = nullptr;
1037 if (known_users->GetDictionary(i, &element)) { 1033 if (known_users->GetDictionary(i, &element)) {
1038 if (UserMatches(account_id, *element)) { 1034 if (UserMatches(user_id, *element)) {
1039 known_users->GetDictionary(i, out_value); 1035 known_users->GetDictionary(i, out_value);
1040 return true; 1036 return true;
1041 } 1037 }
1042 } 1038 }
1043 } 1039 }
1044 return false; 1040 return false;
1045 } 1041 }
1046 1042
1047 void UserManagerBase::UpdateKnownUserPrefs(const AccountId& account_id, 1043 void UserManagerBase::UpdateKnownUserPrefs(const UserID& user_id,
1048 const base::DictionaryValue& values, 1044 const base::DictionaryValue& values,
1049 bool clear) { 1045 bool clear) {
1050 PrefService* local_state = GetLocalState(); 1046 PrefService* local_state = GetLocalState();
1051 1047
1052 // Local State may not be initialized in tests. 1048 // Local State may not be initialized in tests.
1053 if (!local_state) 1049 if (!local_state)
1054 return; 1050 return;
1055 1051
1056 if (IsUserNonCryptohomeDataEphemeral(account_id)) 1052 if (IsUserNonCryptohomeDataEphemeral(user_id))
1057 return; 1053 return;
1058 1054
1059 ListPrefUpdate update(local_state, kKnownUsers); 1055 ListPrefUpdate update(local_state, kKnownUsers);
1060 for (size_t i = 0; i < update->GetSize(); ++i) { 1056 for (size_t i = 0; i < update->GetSize(); ++i) {
1061 base::DictionaryValue* element = nullptr; 1057 base::DictionaryValue* element = nullptr;
1062 if (update->GetDictionary(i, &element)) { 1058 if (update->GetDictionary(i, &element)) {
1063 if (UserMatches(account_id, *element)) { 1059 if (UserMatches(user_id, *element)) {
1064 if (clear) 1060 if (clear)
1065 element->Clear(); 1061 element->Clear();
1066 element->MergeDictionary(&values); 1062 element->MergeDictionary(&values);
1067 UpdateIdentity(account_id, *element); 1063 UpdateIdentity(user_id, *element);
1068 return; 1064 return;
1069 } 1065 }
1070 } 1066 }
1071 } 1067 }
1072 scoped_ptr<base::DictionaryValue> new_value(new base::DictionaryValue()); 1068 scoped_ptr<base::DictionaryValue> new_value(new base::DictionaryValue());
1073 new_value->MergeDictionary(&values); 1069 new_value->MergeDictionary(&values);
1074 UpdateIdentity(account_id, *new_value); 1070 UpdateIdentity(user_id, *new_value);
1075 update->Append(new_value.release()); 1071 update->Append(new_value.release());
1076 } 1072 }
1077 1073
1078 bool UserManagerBase::GetKnownUserStringPref(const AccountId& account_id, 1074 bool UserManagerBase::GetKnownUserStringPref(const UserID& user_id,
1079 const std::string& path, 1075 const std::string& path,
1080 std::string* out_value) { 1076 std::string* out_value) {
1081 const base::DictionaryValue* user_pref_dict = nullptr; 1077 const base::DictionaryValue* user_pref_dict = nullptr;
1082 if (!FindKnownUserPrefs(account_id, &user_pref_dict)) 1078 if (!FindKnownUserPrefs(user_id, &user_pref_dict))
1083 return false; 1079 return false;
1084 1080
1085 return user_pref_dict->GetString(path, out_value); 1081 return user_pref_dict->GetString(path, out_value);
1086 } 1082 }
1087 1083
1088 void UserManagerBase::SetKnownUserStringPref(const AccountId& account_id, 1084 void UserManagerBase::SetKnownUserStringPref(const UserID& user_id,
1089 const std::string& path, 1085 const std::string& path,
1090 const std::string& in_value) { 1086 const std::string& in_value) {
1091 PrefService* local_state = GetLocalState(); 1087 PrefService* local_state = GetLocalState();
1092 1088
1093 // Local State may not be initialized in tests. 1089 // Local State may not be initialized in tests.
1094 if (!local_state) 1090 if (!local_state)
1095 return; 1091 return;
1096 1092
1097 ListPrefUpdate update(local_state, kKnownUsers); 1093 ListPrefUpdate update(local_state, kKnownUsers);
1098 base::DictionaryValue dict; 1094 base::DictionaryValue dict;
1099 dict.SetString(path, in_value); 1095 dict.SetString(path, in_value);
1100 UpdateKnownUserPrefs(account_id, dict, false); 1096 UpdateKnownUserPrefs(user_id, dict, false);
1101 } 1097 }
1102 1098
1103 bool UserManagerBase::GetKnownUserBooleanPref(const AccountId& account_id, 1099 bool UserManagerBase::GetKnownUserBooleanPref(const UserID& user_id,
1104 const std::string& path, 1100 const std::string& path,
1105 bool* out_value) { 1101 bool* out_value) {
1106 const base::DictionaryValue* user_pref_dict = nullptr; 1102 const base::DictionaryValue* user_pref_dict = nullptr;
1107 if (!FindKnownUserPrefs(account_id, &user_pref_dict)) 1103 if (!FindKnownUserPrefs(user_id, &user_pref_dict))
1108 return false; 1104 return false;
1109 1105
1110 return user_pref_dict->GetBoolean(path, out_value); 1106 return user_pref_dict->GetBoolean(path, out_value);
1111 } 1107 }
1112 1108
1113 void UserManagerBase::SetKnownUserBooleanPref(const AccountId& account_id, 1109 void UserManagerBase::SetKnownUserBooleanPref(const UserID& user_id,
1114 const std::string& path, 1110 const std::string& path,
1115 const bool in_value) { 1111 const bool in_value) {
1116 PrefService* local_state = GetLocalState(); 1112 PrefService* local_state = GetLocalState();
1117 1113
1118 // Local State may not be initialized in tests. 1114 // Local State may not be initialized in tests.
1119 if (!local_state) 1115 if (!local_state)
1120 return; 1116 return;
1121 1117
1122 ListPrefUpdate update(local_state, kKnownUsers); 1118 ListPrefUpdate update(local_state, kKnownUsers);
1123 base::DictionaryValue dict; 1119 base::DictionaryValue dict;
1124 dict.SetBoolean(path, in_value); 1120 dict.SetBoolean(path, in_value);
1125 UpdateKnownUserPrefs(account_id, dict, false); 1121 UpdateKnownUserPrefs(user_id, dict, false);
1126 } 1122 }
1127 1123
1128 bool UserManagerBase::GetKnownUserIntegerPref(const AccountId& account_id, 1124 bool UserManagerBase::GetKnownUserIntegerPref(const UserID& user_id,
1129 const std::string& path, 1125 const std::string& path,
1130 int* out_value) { 1126 int* out_value) {
1131 const base::DictionaryValue* user_pref_dict = nullptr; 1127 const base::DictionaryValue* user_pref_dict = nullptr;
1132 if (!FindKnownUserPrefs(account_id, &user_pref_dict)) 1128 if (!FindKnownUserPrefs(user_id, &user_pref_dict))
1133 return false; 1129 return false;
1134 return user_pref_dict->GetInteger(path, out_value); 1130 return user_pref_dict->GetInteger(path, out_value);
1135 } 1131 }
1136 1132
1137 void UserManagerBase::SetKnownUserIntegerPref(const AccountId& account_id, 1133 void UserManagerBase::SetKnownUserIntegerPref(const UserID& user_id,
1138 const std::string& path, 1134 const std::string& path,
1139 const int in_value) { 1135 const int in_value) {
1140 PrefService* local_state = GetLocalState(); 1136 PrefService* local_state = GetLocalState();
1141 1137
1142 // Local State may not be initialized in tests. 1138 // Local State may not be initialized in tests.
1143 if (!local_state) 1139 if (!local_state)
1144 return; 1140 return;
1145 1141
1146 ListPrefUpdate update(local_state, kKnownUsers); 1142 ListPrefUpdate update(local_state, kKnownUsers);
1147 base::DictionaryValue dict; 1143 base::DictionaryValue dict;
1148 dict.SetInteger(path, in_value); 1144 dict.SetInteger(path, in_value);
1149 UpdateKnownUserPrefs(account_id, dict, false); 1145 UpdateKnownUserPrefs(user_id, dict, false);
1150 } 1146 }
1151 1147
1152 bool UserManagerBase::GetKnownUserAccountId( 1148 bool UserManagerBase::GetKnownUserCanonicalEmail(const UserID& user_id,
1153 const AccountId& authenticated_account_id, 1149 std::string* out_email) {
1154 AccountId* out_account_id) { 1150 return GetKnownUserStringPref(user_id, kCanonicalEmail, out_email);
1155 DCHECK(!authenticated_account_id.GetGaiaId().empty());
1156 std::string canonical_email;
1157 if (!GetKnownUserStringPref(
1158 AccountId::FromGaiaId(authenticated_account_id.GetGaiaId()),
1159 kCanonicalEmail, &canonical_email))
1160 return false;
1161
1162 *out_account_id = authenticated_account_id;
1163 out_account_id->SetUserEmail(canonical_email);
1164 return true;
1165 } 1151 }
1166 1152
1167 void UserManagerBase::UpdateGaiaID(const AccountId& account_id, 1153 void UserManagerBase::UpdateGaiaID(const UserID& user_id,
1168 const std::string& gaia_id) { 1154 const std::string& gaia_id) {
1169 SetKnownUserStringPref(account_id, kGAIAIdKey, gaia_id); 1155 SetKnownUserStringPref(user_id, kGAIAIdKey, gaia_id);
1170 } 1156 }
1171 1157
1172 bool UserManagerBase::FindGaiaID(const AccountId& account_id, 1158 bool UserManagerBase::FindGaiaID(const UserID& user_id,
1173 std::string* out_value) { 1159 std::string* out_value) {
1174 return GetKnownUserStringPref(account_id, kGAIAIdKey, out_value); 1160 return GetKnownUserStringPref(user_id, kGAIAIdKey, out_value);
1175 } 1161 }
1176 1162
1177 void UserManagerBase::SetKnownUserDeviceId(const AccountId& account_id, 1163 void UserManagerBase::SetKnownUserDeviceId(const UserID& user_id,
1178 const std::string& device_id) { 1164 const std::string& device_id) {
1179 const std::string known_device_id = GetKnownUserDeviceId(account_id); 1165 const std::string known_device_id = GetKnownUserDeviceId(user_id);
1180 if (!known_device_id.empty() && device_id != known_device_id) { 1166 if (!known_device_id.empty() && device_id != known_device_id) {
1181 NOTREACHED() << "Trying to change device ID for known user."; 1167 NOTREACHED() << "Trying to change device ID for known user.";
1182 } 1168 }
1183 SetKnownUserStringPref(account_id, kDeviceId, device_id); 1169 SetKnownUserStringPref(user_id, kDeviceId, device_id);
1184 } 1170 }
1185 1171
1186 std::string UserManagerBase::GetKnownUserDeviceId(const AccountId& account_id) { 1172 std::string UserManagerBase::GetKnownUserDeviceId(const UserID& user_id) {
1187 std::string device_id; 1173 std::string device_id;
1188 if (GetKnownUserStringPref(account_id, kDeviceId, &device_id)) { 1174 if (GetKnownUserStringPref(user_id, kDeviceId, &device_id)) {
1189 return device_id; 1175 return device_id;
1190 } 1176 }
1191 return std::string(); 1177 return std::string();
1192 } 1178 }
1193 1179
1194 void UserManagerBase::SetKnownUserGAPSCookie(const AccountId& account_id, 1180 void UserManagerBase::SetKnownUserGAPSCookie(const UserID& user_id,
1195 const std::string& gaps_cookie) { 1181 const std::string& gaps_cookie) {
1196 SetKnownUserStringPref(account_id, kGAPSCookie, gaps_cookie); 1182 SetKnownUserStringPref(user_id, kGAPSCookie, gaps_cookie);
1197 } 1183 }
1198 1184
1199 std::string UserManagerBase::GetKnownUserGAPSCookie( 1185 std::string UserManagerBase::GetKnownUserGAPSCookie(const UserID& user_id) {
1200 const AccountId& account_id) {
1201 std::string gaps_cookie; 1186 std::string gaps_cookie;
1202 if (GetKnownUserStringPref(account_id, kGAPSCookie, &gaps_cookie)) { 1187 if (GetKnownUserStringPref(user_id, kGAPSCookie, &gaps_cookie)) {
1203 return gaps_cookie; 1188 return gaps_cookie;
1204 } 1189 }
1205 return std::string(); 1190 return std::string();
1206 } 1191 }
1207 1192
1208 User* UserManagerBase::RemoveRegularOrSupervisedUserFromList( 1193 User* UserManagerBase::RemoveRegularOrSupervisedUserFromList(
1209 const AccountId& account_id) { 1194 const std::string& user_id) {
1210 ListPrefUpdate prefs_users_update(GetLocalState(), kRegularUsers); 1195 ListPrefUpdate prefs_users_update(GetLocalState(), kRegularUsers);
1211 prefs_users_update->Clear(); 1196 prefs_users_update->Clear();
1212 User* user = nullptr; 1197 User* user = NULL;
1213 for (UserList::iterator it = users_.begin(); it != users_.end();) { 1198 for (UserList::iterator it = users_.begin(); it != users_.end();) {
1214 if ((*it)->GetAccountId() == account_id) { 1199 const std::string user_email = (*it)->email();
1200 if (user_email == user_id) {
1215 user = *it; 1201 user = *it;
1216 it = users_.erase(it); 1202 it = users_.erase(it);
1217 } else { 1203 } else {
1218 if ((*it)->HasGaiaAccount() || (*it)->IsSupervised()) { 1204 if ((*it)->HasGaiaAccount() || (*it)->IsSupervised())
1219 const std::string user_email = (*it)->email();
1220 prefs_users_update->Append(new base::StringValue(user_email)); 1205 prefs_users_update->Append(new base::StringValue(user_email));
1221 }
1222 ++it; 1206 ++it;
1223 } 1207 }
1224 } 1208 }
1225 OnUserRemoved(account_id); 1209 OnUserRemoved(user_id);
1226 return user; 1210 return user;
1227 } 1211 }
1228 1212
1229 void UserManagerBase::RemoveKnownUserPrefs(const AccountId& account_id) { 1213 void UserManagerBase::RemoveKnownUserPrefs(const UserID& user_id) {
1230 ListPrefUpdate update(GetLocalState(), kKnownUsers); 1214 ListPrefUpdate update(GetLocalState(), kKnownUsers);
1231 for (size_t i = 0; i < update->GetSize(); ++i) { 1215 for (size_t i = 0; i < update->GetSize(); ++i) {
1232 base::DictionaryValue* element = nullptr; 1216 base::DictionaryValue* element = nullptr;
1233 if (update->GetDictionary(i, &element)) { 1217 if (update->GetDictionary(i, &element)) {
1234 if (UserMatches(account_id, *element)) { 1218 if (UserMatches(user_id, *element)) {
1235 update->Remove(i, nullptr); 1219 update->Remove(i, nullptr);
1236 break; 1220 break;
1237 } 1221 }
1238 } 1222 }
1239 } 1223 }
1240 } 1224 }
1241 1225
1242 void UserManagerBase::NotifyActiveUserChanged(const User* active_user) { 1226 void UserManagerBase::NotifyActiveUserChanged(const User* active_user) {
1243 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 1227 DCHECK(task_runner_->RunsTasksOnCurrentThread());
1244 FOR_EACH_OBSERVER(UserManager::UserSessionStateObserver, 1228 FOR_EACH_OBSERVER(UserManager::UserSessionStateObserver,
(...skipping 14 matching lines...) Expand all
1259 FOR_EACH_OBSERVER(UserManager::UserSessionStateObserver, 1243 FOR_EACH_OBSERVER(UserManager::UserSessionStateObserver,
1260 session_state_observer_list_, 1244 session_state_observer_list_,
1261 ActiveUserHashChanged(hash)); 1245 ActiveUserHashChanged(hash));
1262 } 1246 }
1263 1247
1264 void UserManagerBase::ChangeUserChildStatus(User* user, bool is_child) { 1248 void UserManagerBase::ChangeUserChildStatus(User* user, bool is_child) {
1265 DCHECK(task_runner_->RunsTasksOnCurrentThread()); 1249 DCHECK(task_runner_->RunsTasksOnCurrentThread());
1266 if (user->IsSupervised() == is_child) 1250 if (user->IsSupervised() == is_child)
1267 return; 1251 return;
1268 user->SetIsChild(is_child); 1252 user->SetIsChild(is_child);
1269 SaveUserType(user->GetAccountId(), is_child 1253 SaveUserType(user->email(), is_child ? user_manager::USER_TYPE_CHILD
1270 ? user_manager::USER_TYPE_CHILD 1254 : user_manager::USER_TYPE_REGULAR);
1271 : user_manager::USER_TYPE_REGULAR);
1272 FOR_EACH_OBSERVER(UserManager::UserSessionStateObserver, 1255 FOR_EACH_OBSERVER(UserManager::UserSessionStateObserver,
1273 session_state_observer_list_, 1256 session_state_observer_list_,
1274 UserChangedChildStatus(user)); 1257 UserChangedChildStatus(user));
1275 } 1258 }
1276 1259
1277 void UserManagerBase::UpdateLoginState() { 1260 void UserManagerBase::UpdateLoginState() {
1278 if (!chromeos::LoginState::IsInitialized()) 1261 if (!chromeos::LoginState::IsInitialized())
1279 return; // LoginState may not be initialized in tests. 1262 return; // LoginState may not be initialized in tests.
1280 1263
1281 chromeos::LoginState::LoggedInState logged_in_state; 1264 chromeos::LoginState::LoggedInState logged_in_state;
(...skipping 29 matching lines...) Expand all
1311 GetLocalState()->SetString(kLastActiveUser, user->email()); 1294 GetLocalState()->SetString(kLastActiveUser, user->email());
1312 GetLocalState()->CommitPendingWrite(); 1295 GetLocalState()->CommitPendingWrite();
1313 1296
1314 UserList::iterator it = 1297 UserList::iterator it =
1315 std::find(lru_logged_in_users_.begin(), lru_logged_in_users_.end(), user); 1298 std::find(lru_logged_in_users_.begin(), lru_logged_in_users_.end(), user);
1316 if (it != lru_logged_in_users_.end()) 1299 if (it != lru_logged_in_users_.end())
1317 lru_logged_in_users_.erase(it); 1300 lru_logged_in_users_.erase(it);
1318 lru_logged_in_users_.insert(lru_logged_in_users_.begin(), user); 1301 lru_logged_in_users_.insert(lru_logged_in_users_.begin(), user);
1319 } 1302 }
1320 1303
1321 void UserManagerBase::SendGaiaUserLoginMetrics(const AccountId& account_id) { 1304 void UserManagerBase::SendGaiaUserLoginMetrics(const std::string& user_id) {
1322 // If this isn't the first time Chrome was run after the system booted, 1305 // If this isn't the first time Chrome was run after the system booted,
1323 // assume that Chrome was restarted because a previous session ended. 1306 // assume that Chrome was restarted because a previous session ended.
1324 if (!base::CommandLine::ForCurrentProcess()->HasSwitch( 1307 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
1325 chromeos::switches::kFirstExecAfterBoot)) { 1308 chromeos::switches::kFirstExecAfterBoot)) {
1326 const std::string last_email = 1309 const std::string last_email =
1327 GetLocalState()->GetString(kLastLoggedInGaiaUser); 1310 GetLocalState()->GetString(kLastLoggedInGaiaUser);
1328 const base::TimeDelta time_to_login = 1311 const base::TimeDelta time_to_login =
1329 base::TimeTicks::Now() - manager_creation_time_; 1312 base::TimeTicks::Now() - manager_creation_time_;
1330 if (!last_email.empty() && 1313 if (!last_email.empty() && user_id != last_email &&
1331 account_id != AccountId::FromUserEmail(last_email) &&
1332 time_to_login.InSeconds() <= kLogoutToLoginDelayMaxSec) { 1314 time_to_login.InSeconds() <= kLogoutToLoginDelayMaxSec) {
1333 UMA_HISTOGRAM_CUSTOM_COUNTS("UserManager.LogoutToLoginDelay", 1315 UMA_HISTOGRAM_CUSTOM_COUNTS("UserManager.LogoutToLoginDelay",
1334 time_to_login.InSeconds(), 1316 time_to_login.InSeconds(),
1335 0, 1317 0,
1336 kLogoutToLoginDelayMaxSec, 1318 kLogoutToLoginDelayMaxSec,
1337 50); 1319 50);
1338 } 1320 }
1339 } 1321 }
1340 } 1322 }
1341 1323
1342 void UserManagerBase::UpdateUserAccountLocale(const AccountId& account_id, 1324 void UserManagerBase::UpdateUserAccountLocale(const std::string& user_id,
1343 const std::string& locale) { 1325 const std::string& locale) {
1344 scoped_ptr<std::string> resolved_locale(new std::string()); 1326 scoped_ptr<std::string> resolved_locale(new std::string());
1345 if (!locale.empty() && locale != GetApplicationLocale()) { 1327 if (!locale.empty() && locale != GetApplicationLocale()) {
1346 // base::Pased will nullptr out |resolved_locale|, so cache the underlying 1328 // base::Pased will NULL out |resolved_locale|, so cache the underlying ptr.
1347 // ptr.
1348 std::string* raw_resolved_locale = resolved_locale.get(); 1329 std::string* raw_resolved_locale = resolved_locale.get();
1349 blocking_task_runner_->PostTaskAndReply( 1330 blocking_task_runner_->PostTaskAndReply(
1350 FROM_HERE, base::Bind(ResolveLocale, locale, 1331 FROM_HERE,
1351 base::Unretained(raw_resolved_locale)), 1332 base::Bind(ResolveLocale,
1333 locale,
1334 base::Unretained(raw_resolved_locale)),
1352 base::Bind(&UserManagerBase::DoUpdateAccountLocale, 1335 base::Bind(&UserManagerBase::DoUpdateAccountLocale,
1353 weak_factory_.GetWeakPtr(), account_id, 1336 weak_factory_.GetWeakPtr(),
1337 user_id,
1354 base::Passed(&resolved_locale))); 1338 base::Passed(&resolved_locale)));
1355 } else { 1339 } else {
1356 resolved_locale.reset(new std::string(locale)); 1340 resolved_locale.reset(new std::string(locale));
1357 DoUpdateAccountLocale(account_id, resolved_locale.Pass()); 1341 DoUpdateAccountLocale(user_id, resolved_locale.Pass());
1358 } 1342 }
1359 } 1343 }
1360 1344
1361 void UserManagerBase::DoUpdateAccountLocale( 1345 void UserManagerBase::DoUpdateAccountLocale(
1362 const AccountId& account_id, 1346 const std::string& user_id,
1363 scoped_ptr<std::string> resolved_locale) { 1347 scoped_ptr<std::string> resolved_locale) {
1364 User* user = FindUserAndModify(account_id); 1348 User* user = FindUserAndModify(user_id);
1365 if (user && resolved_locale) 1349 if (user && resolved_locale)
1366 user->SetAccountLocale(*resolved_locale); 1350 user->SetAccountLocale(*resolved_locale);
1367 } 1351 }
1368 1352
1369 void UserManagerBase::DeleteUser(User* user) { 1353 void UserManagerBase::DeleteUser(User* user) {
1370 const bool is_active_user = (user == active_user_); 1354 const bool is_active_user = (user == active_user_);
1371 delete user; 1355 delete user;
1372 if (is_active_user) 1356 if (is_active_user)
1373 active_user_ = nullptr; 1357 active_user_ = NULL;
1374 } 1358 }
1375 1359
1376 } // namespace user_manager 1360 } // namespace user_manager
OLDNEW
« no previous file with comments | « components/user_manager/user_manager_base.h ('k') | components/wallpaper/wallpaper_manager_base.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698