Home | History | Annotate | Download | only in login
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_USER_MANAGER_IMPL_H_
      6 #define CHROME_BROWSER_CHROMEOS_LOGIN_USER_MANAGER_IMPL_H_
      7 
      8 #include <map>
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/basictypes.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "base/observer_list.h"
     15 #include "base/synchronization/lock.h"
     16 #include "base/time/time.h"
     17 #include "chrome/browser/chromeos/login/login_utils.h"
     18 #include "chrome/browser/chromeos/login/multi_profile_user_controller_delegate.h"
     19 #include "chrome/browser/chromeos/login/user.h"
     20 #include "chrome/browser/chromeos/login/user_image_manager_impl.h"
     21 #include "chrome/browser/chromeos/login/user_manager.h"
     22 #include "chrome/browser/chromeos/login/wallpaper_manager.h"
     23 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
     24 #include "chrome/browser/chromeos/settings/cros_settings.h"
     25 #include "chrome/browser/chromeos/settings/device_settings_service.h"
     26 #include "chromeos/dbus/session_manager_client.h"
     27 #include "content/public/browser/notification_observer.h"
     28 #include "content/public/browser/notification_registrar.h"
     29 
     30 class PrefService;
     31 class ProfileSyncService;
     32 
     33 namespace policy {
     34 struct DeviceLocalAccount;
     35 }
     36 
     37 namespace chromeos {
     38 
     39 class MultiProfileFirstRunNotification;
     40 class MultiProfileUserController;
     41 class RemoveUserDelegate;
     42 class SupervisedUserManagerImpl;
     43 class SessionLengthLimiter;
     44 
     45 // Implementation of the UserManager.
     46 class UserManagerImpl
     47     : public UserManager,
     48       public LoginUtils::Delegate,
     49       public content::NotificationObserver,
     50       public policy::DeviceLocalAccountPolicyService::Observer,
     51       public MultiProfileUserControllerDelegate {
     52  public:
     53   virtual ~UserManagerImpl();
     54 
     55   // UserManager implementation:
     56   virtual void Shutdown() OVERRIDE;
     57   virtual UserImageManager* GetUserImageManager() OVERRIDE;
     58   virtual SupervisedUserManager* GetSupervisedUserManager() OVERRIDE;
     59   virtual const UserList& GetUsers() const OVERRIDE;
     60   virtual UserList GetUsersAdmittedForMultiProfile() const OVERRIDE;
     61   virtual const UserList& GetLoggedInUsers() const OVERRIDE;
     62   virtual const UserList& GetLRULoggedInUsers() OVERRIDE;
     63   virtual UserList GetUnlockUsers() const OVERRIDE;
     64   virtual const std::string& GetOwnerEmail() OVERRIDE;
     65   virtual void UserLoggedIn(const std::string& user_id,
     66                             const std::string& user_id_hash,
     67                             bool browser_restart) OVERRIDE;
     68   virtual void SwitchActiveUser(const std::string& user_id) OVERRIDE;
     69   virtual void RestoreActiveSessions() OVERRIDE;
     70   virtual void SessionStarted() OVERRIDE;
     71   virtual void RemoveUser(const std::string& user_id,
     72                           RemoveUserDelegate* delegate) OVERRIDE;
     73   virtual void RemoveUserFromList(const std::string& user_id) OVERRIDE;
     74   virtual bool IsKnownUser(const std::string& user_id) const OVERRIDE;
     75   virtual const User* FindUser(const std::string& user_id) const OVERRIDE;
     76   virtual User* FindUserAndModify(const std::string& user_id) OVERRIDE;
     77   virtual const User* GetLoggedInUser() const OVERRIDE;
     78   virtual User* GetLoggedInUser() OVERRIDE;
     79   virtual const User* GetActiveUser() const OVERRIDE;
     80   virtual User* GetActiveUser() OVERRIDE;
     81   virtual const User* GetPrimaryUser() const OVERRIDE;
     82   virtual User* GetUserByProfile(Profile* profile) const OVERRIDE;
     83   virtual Profile* GetProfileByUser(const User* user) const OVERRIDE;
     84   virtual void SaveUserOAuthStatus(
     85       const std::string& user_id,
     86       User::OAuthTokenStatus oauth_token_status) OVERRIDE;
     87   virtual void SaveUserDisplayName(const std::string& user_id,
     88                                    const base::string16& display_name) OVERRIDE;
     89   virtual base::string16 GetUserDisplayName(
     90       const std::string& user_id) const OVERRIDE;
     91   virtual void SaveUserDisplayEmail(const std::string& user_id,
     92                                     const std::string& display_email) OVERRIDE;
     93   virtual std::string GetUserDisplayEmail(
     94       const std::string& user_id) const OVERRIDE;
     95   virtual void UpdateUserAccountData(
     96       const std::string& user_id,
     97       const UserAccountData& account_data) OVERRIDE;
     98   virtual bool IsCurrentUserOwner() const OVERRIDE;
     99   virtual bool IsCurrentUserNew() const OVERRIDE;
    100   virtual bool IsCurrentUserNonCryptohomeDataEphemeral() const OVERRIDE;
    101   virtual bool CanCurrentUserLock() const OVERRIDE;
    102   virtual bool IsUserLoggedIn() const OVERRIDE;
    103   virtual bool IsLoggedInAsRegularUser() const OVERRIDE;
    104   virtual bool IsLoggedInAsDemoUser() const OVERRIDE;
    105   virtual bool IsLoggedInAsPublicAccount() const OVERRIDE;
    106   virtual bool IsLoggedInAsGuest() const OVERRIDE;
    107   virtual bool IsLoggedInAsLocallyManagedUser() const OVERRIDE;
    108   virtual bool IsLoggedInAsKioskApp() const OVERRIDE;
    109   virtual bool IsLoggedInAsStub() const OVERRIDE;
    110   virtual bool IsSessionStarted() const OVERRIDE;
    111   virtual bool UserSessionsRestored() const OVERRIDE;
    112   virtual bool HasBrowserRestarted() const OVERRIDE;
    113   virtual bool IsUserNonCryptohomeDataEphemeral(
    114       const std::string& user_id) const OVERRIDE;
    115   virtual void AddObserver(UserManager::Observer* obs) OVERRIDE;
    116   virtual void RemoveObserver(UserManager::Observer* obs) OVERRIDE;
    117   virtual void AddSessionStateObserver(
    118       UserManager::UserSessionStateObserver* obs) OVERRIDE;
    119   virtual void RemoveSessionStateObserver(
    120       UserManager::UserSessionStateObserver* obs) OVERRIDE;
    121   virtual void NotifyLocalStateChanged() OVERRIDE;
    122 
    123   virtual UserFlow* GetCurrentUserFlow() const OVERRIDE;
    124   virtual UserFlow* GetUserFlow(const std::string& user_id) const OVERRIDE;
    125   virtual void SetUserFlow(const std::string& user_id, UserFlow* flow) OVERRIDE;
    126   virtual void ResetUserFlow(const std::string& user_id) OVERRIDE;
    127   virtual bool GetAppModeChromeClientOAuthInfo(
    128       std::string* chrome_client_id,
    129       std::string* chrome_client_secret) OVERRIDE;
    130   virtual void SetAppModeChromeClientOAuthInfo(
    131       const std::string& chrome_client_id,
    132       const std::string& chrome_client_secret) OVERRIDE;
    133   virtual bool AreLocallyManagedUsersAllowed() const OVERRIDE;
    134   virtual base::FilePath GetUserProfileDir(
    135       const std::string& user_id) const OVERRIDE;
    136 
    137   // content::NotificationObserver implementation.
    138   virtual void Observe(int type,
    139                        const content::NotificationSource& source,
    140                        const content::NotificationDetails& details) OVERRIDE;
    141 
    142   // policy::DeviceLocalAccountPolicyService::Observer implementation.
    143   virtual void OnPolicyUpdated(const std::string& user_id) OVERRIDE;
    144   virtual void OnDeviceLocalAccountsChanged() OVERRIDE;
    145 
    146   virtual bool RespectLocalePreference(
    147       Profile* profile,
    148       const User* user,
    149       scoped_ptr<locale_util::SwitchLanguageCallback> callback) const OVERRIDE;
    150 
    151  private:
    152   friend class SupervisedUserManagerImpl;
    153   friend class UserManager;
    154   friend class WallpaperManager;
    155   friend class UserManagerTest;
    156   friend class WallpaperManagerTest;
    157 
    158   // Stages of loading user list from preferences. Some methods can have
    159   // different behavior depending on stage.
    160   enum UserLoadStage {
    161     STAGE_NOT_LOADED = 0,
    162     STAGE_LOADING,
    163     STAGE_LOADED
    164   };
    165 
    166   UserManagerImpl();
    167 
    168   // LoginUtils::Delegate implementation:
    169   // Used when restoring user sessions after crash.
    170   virtual void OnProfilePrepared(Profile* profile) OVERRIDE;
    171 
    172   // Loads |users_| from Local State if the list has not been loaded yet.
    173   // Subsequent calls have no effect. Must be called on the UI thread.
    174   void EnsureUsersLoaded();
    175 
    176   // Retrieves trusted device policies and removes users from the persistent
    177   // list if ephemeral users are enabled. Schedules a callback to itself if
    178   // trusted device policies are not yet available.
    179   void RetrieveTrustedDevicePolicies();
    180 
    181   // Returns true if trusted device policies have successfully been retrieved
    182   // and ephemeral users are enabled.
    183   bool AreEphemeralUsersEnabled() const;
    184 
    185   // Returns a list of users who have logged into this device previously.
    186   // Same as GetUsers but used if you need to modify User from that list.
    187   UserList& GetUsersAndModify();
    188 
    189   // Returns the user with the given email address if found in the persistent
    190   // list. Returns |NULL| otherwise.
    191   const User* FindUserInList(const std::string& user_id) const;
    192 
    193   // Returns |true| if user with the given id is found in the persistent list.
    194   // Returns |false| otherwise. Does not trigger user loading.
    195   const bool UserExistsInList(const std::string& user_id) const;
    196 
    197   // Same as FindUserInList but returns non-const pointer to User object.
    198   User* FindUserInListAndModify(const std::string& user_id);
    199 
    200   // Indicates that a user just logged in as guest.
    201   void GuestUserLoggedIn();
    202 
    203   // Indicates that a regular user just logged in.
    204   void RegularUserLoggedIn(const std::string& user_id);
    205 
    206   // Indicates that a regular user just logged in as ephemeral.
    207   void RegularUserLoggedInAsEphemeral(const std::string& user_id);
    208 
    209   // Indicates that a locally managed user just logged in.
    210   void LocallyManagedUserLoggedIn(const std::string& user_id);
    211 
    212   // Indicates that a user just logged into a public session.
    213   void PublicAccountUserLoggedIn(User* user);
    214 
    215   // Indicates that a kiosk app robot just logged in.
    216   void KioskAppLoggedIn(const std::string& app_id);
    217 
    218   // Indicates that a user just logged into a retail mode session.
    219   void RetailModeUserLoggedIn();
    220 
    221   // Notifies that user has logged in.
    222   // Sends NOTIFICATION_LOGIN_USER_CHANGED notification.
    223   void NotifyOnLogin();
    224 
    225   // Reads user's oauth token status from local state preferences.
    226   User::OAuthTokenStatus LoadUserOAuthStatus(const std::string& user_id) const;
    227 
    228   void SetCurrentUserIsOwner(bool is_current_user_owner);
    229 
    230   // Updates current user ownership on UI thread.
    231   void UpdateOwnership();
    232 
    233   // Removes data stored or cached outside the user's cryptohome (wallpaper,
    234   // avatar, OAuth token status, display name, display email).
    235   void RemoveNonCryptohomeData(const std::string& user_id);
    236 
    237   // Removes a regular or locally managed user from the user list.
    238   // Returns the user if found or NULL otherwise.
    239   // Also removes the user from the persistent user list.
    240   User* RemoveRegularOrLocallyManagedUserFromList(const std::string& user_id);
    241 
    242   // If data for a public account is marked as pending removal and the user is
    243   // no longer logged into that account, removes the data.
    244   void CleanUpPublicAccountNonCryptohomeDataPendingRemoval();
    245 
    246   // Removes data belonging to public accounts that are no longer found on the
    247   // user list. If the user is currently logged into one of these accounts, the
    248   // data for that account is not removed immediately but marked as pending
    249   // removal after logout.
    250   void CleanUpPublicAccountNonCryptohomeData(
    251       const std::vector<std::string>& old_public_accounts);
    252 
    253   // Replaces the list of public accounts with those found in
    254   // |device_local_accounts|. Ensures that data belonging to accounts no longer
    255   // on the list is removed. Returns |true| if the list has changed.
    256   // Public accounts are defined by policy. This method is called whenever an
    257   // updated list of public accounts is received from policy.
    258   bool UpdateAndCleanUpPublicAccounts(
    259       const std::vector<policy::DeviceLocalAccount>& device_local_accounts);
    260 
    261   // Updates the display name for public account |username| from policy settings
    262   // associated with that username.
    263   void UpdatePublicAccountDisplayName(const std::string& user_id);
    264 
    265   // Notifies the UI about a change to the user list.
    266   void NotifyUserListChanged();
    267 
    268   // Notifies observers that merge session state had changed.
    269   void NotifyMergeSessionStateChanged();
    270 
    271   // Notifies observers that active user has changed.
    272   void NotifyActiveUserChanged(const User* active_user);
    273 
    274   // Notifies observers that another user was added to the session.
    275   void NotifyUserAddedToSession(const User* added_user);
    276 
    277   // Notifies observers that active user_id hash has changed.
    278   void NotifyActiveUserHashChanged(const std::string& hash);
    279 
    280   // Notifies observers that user pending sessions restore has finished.
    281   void NotifyPendingUserSessionsRestoreFinished();
    282 
    283   // Lazily creates default user flow.
    284   UserFlow* GetDefaultUserFlow() const;
    285 
    286   // Update the global LoginState.
    287   void UpdateLoginState();
    288 
    289   // Insert |user| at the front of the LRU user list..
    290   void SetLRUUser(User* user);
    291 
    292   // Adds |user| to users list, and adds it to front of LRU list. It is assumed
    293   // that there is no user with same id.
    294   void AddUserRecord(User* user);
    295 
    296   // Callback to process RetrieveActiveSessions() request results.
    297   void OnRestoreActiveSessions(
    298       const SessionManagerClient::ActiveSessionsMap& sessions,
    299       bool success);
    300 
    301   // Called by OnRestoreActiveSessions() when there're user sessions in
    302   // |pending_user_sessions_| that has to be restored one by one.
    303   // Also called after first user session from that list is restored and so on.
    304   // Process continues till |pending_user_sessions_| map is not empty.
    305   void RestorePendingUserSessions();
    306 
    307   // Sends metrics in response to a regular user logging in.
    308   void SendRegularUserLoginMetrics(const std::string& user_id);
    309 
    310   // Implementation for RemoveUser method. This is an asynchronous part of the
    311   // method, that verifies that owner will not get deleted, and calls
    312   // |RemoveNonOwnerUserInternal|.
    313   void RemoveUserInternal(const std::string& user_email,
    314                           RemoveUserDelegate* delegate);
    315 
    316   // Implementation for RemoveUser method. It is synchronous. It is called from
    317   // RemoveUserInternal after owner check.
    318   void RemoveNonOwnerUserInternal(const std::string& user_email,
    319                                   RemoveUserDelegate* delegate);
    320 
    321   // MultiProfileUserControllerDelegate implementation:
    322   virtual void OnUserNotAllowed() OVERRIDE;
    323 
    324   // Sets account locale for user with id |user_id|.
    325   virtual void UpdateUserAccountLocale(const std::string& user_id,
    326                                        const std::string& locale);
    327 
    328   // Updates user account after locale was resolved.
    329   void DoUpdateAccountLocale(const std::string& user_id,
    330                              const std::string& resolved_locale);
    331 
    332   // Interface to the signed settings store.
    333   CrosSettings* cros_settings_;
    334 
    335   // Interface to device-local account definitions and associated policy.
    336   policy::DeviceLocalAccountPolicyService* device_local_account_policy_service_;
    337 
    338   // Indicates stage of loading user from prefs.
    339   UserLoadStage user_loading_stage_;
    340 
    341   // List of all known users. User instances are owned by |this|. Regular users
    342   // are removed by |RemoveUserFromList|, public accounts by
    343   // |UpdateAndCleanUpPublicAccounts|.
    344   UserList users_;
    345 
    346   // List of all users that are logged in current session. These point to User
    347   // instances in |users_|. Only one of them could be marked as active.
    348   UserList logged_in_users_;
    349 
    350   // A list of all users that are logged in the current session. In contrast to
    351   // |logged_in_users|, the order of this list is least recently used so that
    352   // the active user should always be the first one in the list.
    353   UserList lru_logged_in_users_;
    354 
    355   // The list which gets reported when the |lru_logged_in_users_| list is empty.
    356   UserList temp_single_logged_in_users_;
    357 
    358   // The logged-in user that is currently active in current session.
    359   // NULL until a user has logged in, then points to one
    360   // of the User instances in |users_|, the |guest_user_| instance or an
    361   // ephemeral user instance.
    362   User* active_user_;
    363 
    364   // The primary user of the current session. It is recorded for the first
    365   // signed-in user and does not change thereafter.
    366   User* primary_user_;
    367 
    368   // True if SessionStarted() has been called.
    369   bool session_started_;
    370 
    371   // True is user sessions has been restored after crash.
    372   // On a normal boot then login into user sessions this will be false.
    373   bool user_sessions_restored_;
    374 
    375   // Cached flag of whether currently logged-in user is owner or not.
    376   // May be accessed on different threads, requires locking.
    377   bool is_current_user_owner_;
    378   mutable base::Lock is_current_user_owner_lock_;
    379 
    380   // Cached flag of whether the currently logged-in user existed before this
    381   // login.
    382   bool is_current_user_new_;
    383 
    384   // Cached flag of whether the currently logged-in user is a regular user who
    385   // logged in as ephemeral. Storage of persistent information is avoided for
    386   // such users by not adding them to the persistent user list, not downloading
    387   // their custom avatars and mounting their cryptohomes using tmpfs. Defaults
    388   // to |false|.
    389   bool is_current_user_ephemeral_regular_user_;
    390 
    391   // Cached flag indicating whether the ephemeral user policy is enabled.
    392   // Defaults to |false| if the value has not been read from trusted device
    393   // policy yet.
    394   bool ephemeral_users_enabled_;
    395 
    396   // Cached name of device owner. Defaults to empty string if the value has not
    397   // been read from trusted device policy yet.
    398   std::string owner_email_;
    399 
    400   // Chrome oauth client id and secret - override values for kiosk mode.
    401   std::string chrome_client_id_;
    402   std::string chrome_client_secret_;
    403 
    404   content::NotificationRegistrar registrar_;
    405 
    406   ObserverList<UserManager::Observer> observer_list_;
    407 
    408   // TODO(nkostylev): Merge with session state refactoring CL.
    409   ObserverList<UserManager::UserSessionStateObserver>
    410       session_state_observer_list_;
    411 
    412   // User avatar manager.
    413   scoped_ptr<UserImageManagerImpl> user_image_manager_;
    414 
    415   // Supervised user manager.
    416   scoped_ptr<SupervisedUserManagerImpl> supervised_user_manager_;
    417 
    418   // Session length limiter.
    419   scoped_ptr<SessionLengthLimiter> session_length_limiter_;
    420 
    421   typedef std::map<std::string, UserFlow*> FlowMap;
    422 
    423   // Lazy-initialized default flow.
    424   mutable scoped_ptr<UserFlow> default_flow_;
    425 
    426   // Specific flows by user e-mail. Keys should be canonicalized before
    427   // access.
    428   FlowMap specific_flows_;
    429 
    430   // User sessions that have to be restored after browser crash.
    431   // [user_id] > [user_id_hash]
    432   SessionManagerClient::ActiveSessionsMap pending_user_sessions_;
    433 
    434   // Time at which this object was created.
    435   base::TimeTicks manager_creation_time_;
    436 
    437   scoped_ptr<CrosSettings::ObserverSubscription>
    438       local_accounts_subscription_;
    439   scoped_ptr<CrosSettings::ObserverSubscription>
    440       supervised_users_subscription_;
    441 
    442   scoped_ptr<MultiProfileUserController> multi_profile_user_controller_;
    443   scoped_ptr<MultiProfileFirstRunNotification>
    444       multi_profile_first_run_notification_;
    445 
    446   DISALLOW_COPY_AND_ASSIGN(UserManagerImpl);
    447 };
    448 
    449 }  // namespace chromeos
    450 
    451 #endif  // CHROME_BROWSER_CHROMEOS_LOGIN_USER_MANAGER_IMPL_H_
    452