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

Side by Side Diff: chrome/browser/chromeos/login/user_manager_impl.cc

Issue 15929005: [CrOS multi-profiles] Restore user sessions after crash (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: nits Created 7 years, 6 months 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/login/user_manager_impl.h" 5 #include "chrome/browser/chromeos/login/user_manager_impl.h"
6 6
7 #include <cstddef> 7 #include <cstddef>
8 #include <set> 8 #include <set>
9 9
10 #include "ash/shell.h" 10 #include "ash/shell.h"
(...skipping 10 matching lines...) Expand all
21 #include "base/string_util.h" 21 #include "base/string_util.h"
22 #include "base/stringprintf.h" 22 #include "base/stringprintf.h"
23 #include "base/utf_string_conversions.h" 23 #include "base/utf_string_conversions.h"
24 #include "base/values.h" 24 #include "base/values.h"
25 #include "chrome/browser/app_mode/app_mode_utils.h" 25 #include "chrome/browser/app_mode/app_mode_utils.h"
26 #include "chrome/browser/browser_process.h" 26 #include "chrome/browser/browser_process.h"
27 #include "chrome/browser/chromeos/cros/cert_library.h" 27 #include "chrome/browser/chromeos/cros/cert_library.h"
28 #include "chrome/browser/chromeos/cros/cros_library.h" 28 #include "chrome/browser/chromeos/cros/cros_library.h"
29 #include "chrome/browser/chromeos/login/default_pinned_apps_field_trial.h" 29 #include "chrome/browser/chromeos/login/default_pinned_apps_field_trial.h"
30 #include "chrome/browser/chromeos/login/login_display.h" 30 #include "chrome/browser/chromeos/login/login_display.h"
31 #include "chrome/browser/chromeos/login/login_utils.h"
31 #include "chrome/browser/chromeos/login/remove_user_delegate.h" 32 #include "chrome/browser/chromeos/login/remove_user_delegate.h"
32 #include "chrome/browser/chromeos/login/user_image_manager_impl.h" 33 #include "chrome/browser/chromeos/login/user_image_manager_impl.h"
33 #include "chrome/browser/chromeos/login/wizard_controller.h" 34 #include "chrome/browser/chromeos/login/wizard_controller.h"
34 #include "chrome/browser/chromeos/policy/device_local_account.h" 35 #include "chrome/browser/chromeos/policy/device_local_account.h"
35 #include "chrome/browser/chromeos/session_length_limiter.h" 36 #include "chrome/browser/chromeos/session_length_limiter.h"
36 #include "chrome/browser/chromeos/settings/cros_settings_names.h" 37 #include "chrome/browser/chromeos/settings/cros_settings_names.h"
37 #include "chrome/browser/policy/browser_policy_connector.h" 38 #include "chrome/browser/policy/browser_policy_connector.h"
38 #include "chrome/browser/prefs/scoped_user_pref_update.h" 39 #include "chrome/browser/prefs/scoped_user_pref_update.h"
39 #include "chrome/browser/profiles/profile_manager.h" 40 #include "chrome/browser/profiles/profile_manager.h"
40 #include "chrome/browser/sync/profile_sync_service.h" 41 #include "chrome/browser/sync/profile_sync_service.h"
(...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 840 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
840 session_state_observer_list_.RemoveObserver(obs); 841 session_state_observer_list_.RemoveObserver(obs);
841 } 842 }
842 843
843 void UserManagerImpl::NotifyLocalStateChanged() { 844 void UserManagerImpl::NotifyLocalStateChanged() {
844 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 845 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
845 FOR_EACH_OBSERVER(UserManager::Observer, observer_list_, 846 FOR_EACH_OBSERVER(UserManager::Observer, observer_list_,
846 LocalStateChanged(this)); 847 LocalStateChanged(this));
847 } 848 }
848 849
850 void UserManagerImpl::OnProfilePrepared(Profile* profile) {
851 LoginUtils::Get()->DoBrowserLaunch(profile,
852 NULL); // host_, not needed here
853
854 if (!CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestName)) {
855 // Did not log in (we crashed or are debugging), need to restore Sync.
856 // TODO(nkostylev): Make sure that OAuth state is restored correctly for all
857 // users once it is fully multi-profile aware. http://crbug.com/238987
858 // For now if we have other user pending sessions they'll override OAuth
859 // session restore for previous users.
860 LoginUtils::Get()->RestoreAuthenticationSession(profile);
861 }
862
863 // Restore other user sessions if any.
864 RestorePendingUserSessions();
865 }
866
849 void UserManagerImpl::EnsureUsersLoaded() { 867 void UserManagerImpl::EnsureUsersLoaded() {
850 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 868 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
851 if (!g_browser_process || !g_browser_process->local_state()) 869 if (!g_browser_process || !g_browser_process->local_state())
852 return; 870 return;
853 871
854 if (users_loaded_) 872 if (users_loaded_)
855 return; 873 return;
856 users_loaded_ = true; 874 users_loaded_ = true;
857 875
858 // Clean up user list first. 876 // Clean up user list first.
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
1538 lru_logged_in_users_.end(), 1556 lru_logged_in_users_.end(),
1539 user); 1557 user);
1540 if (it != lru_logged_in_users_.end()) 1558 if (it != lru_logged_in_users_.end())
1541 lru_logged_in_users_.erase(it); 1559 lru_logged_in_users_.erase(it);
1542 lru_logged_in_users_.insert(lru_logged_in_users_.begin(), user); 1560 lru_logged_in_users_.insert(lru_logged_in_users_.begin(), user);
1543 } 1561 }
1544 1562
1545 void UserManagerImpl::OnRestoreActiveSessions( 1563 void UserManagerImpl::OnRestoreActiveSessions(
1546 const SessionManagerClient::ActiveSessionsMap& sessions, 1564 const SessionManagerClient::ActiveSessionsMap& sessions,
1547 bool success) { 1565 bool success) {
1548 // TODO(nkostylev): Restore all user sessions (in the background). 1566 if (!success) {
1549 // This requires first refactoring this flow out of LoginUtils. 1567 LOG(ERROR) << "Could not get list of active user sessions after crash.";
Dmitry Polukhin 2013/05/27 13:51:04 Should we continue working or force sign out is mo
Nikita (slow) 2013/05/27 14:22:06 Done.
1550 // 1. UserManager::UserLoggedIn() 1568 return;
1551 // 2. InitSessionRestoreStrategy() (OAuth) 1569 }
1552 // 2. ProfileManager::CreateDefaultProfileAsync() 1570
1553 // 3. InitProfilePreferences 1571 // One profile has been already loaded on browser start.
1554 // 4. chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED 1572 DCHECK(GetLoggedInUsers().size() == 1);
1573 DCHECK(GetActiveUser());
1574 std::string active_user_id = GetActiveUser()->email();
1575
1576 SessionManagerClient::ActiveSessionsMap::const_iterator it;
1577 for (it = sessions.begin(); it != sessions.end(); ++it) {
1578 if (active_user_id == it->first)
1579 continue;
1580 pending_user_sessions_[it->first] = it->second;
1581 }
1582 RestorePendingUserSessions();
1583 }
1584
1585 void UserManagerImpl::RestorePendingUserSessions() {
1586 if (pending_user_sessions_.empty())
1587 return;
1588
1589 // Get next user to restore sessions and delete it from list.
1590 SessionManagerClient::ActiveSessionsMap::const_iterator it =
1591 pending_user_sessions_.begin();
1592 std::string user_id = it->first;
1593 std::string user_id_hash = it->second;
1594 DCHECK(!user_id.empty());
1595 DCHECK(!user_id_hash.empty());
1596 pending_user_sessions_.erase(user_id);
1597
1598 // Check that this user is not logged in yet
1599 // i.e. session was not restored twice.
1600 UserList logged_in_users = GetLoggedInUsers();
1601 bool user_already_logged_in = false;
1602 for (UserList::const_iterator it = logged_in_users.begin();
1603 it != logged_in_users.end(); ++it) {
1604 const User* user = (*it);
1605 if (user->email() == user_id) {
1606 user_already_logged_in = true;
1607 break;
1608 }
1609 }
1610 DCHECK(user_already_logged_in);
1611
1612 if (!user_already_logged_in) {
1613 // Will call OnProfilePrepared() once profile has been loaded.
1614 LoginUtils::Get()->PrepareProfile(UserContext(user_id,
1615 std::string(), // password
1616 std::string(), // auth_code
1617 user_id_hash),
1618 std::string(), // display_email
1619 false, // using_oauth
1620 false, // has_cookies
1621 this);
1622 } else {
1623 RestorePendingUserSessions();
1624 }
1555 } 1625 }
1556 1626
1557 } // namespace chromeos 1627 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698