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