• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "chromeos/login/login_state.h"
6 
7 #include "base/command_line.h"
8 #include "base/logging.h"
9 #include "base/sys_info.h"
10 #include "chromeos/chromeos_switches.h"
11 
12 namespace chromeos {
13 
14 namespace {
15 
16 // When running a Chrome OS build outside of a device (i.e. on a developer's
17 // workstation) and not running as login-manager, pretend like we're always
18 // logged in.
AlwaysLoggedInByDefault()19 bool AlwaysLoggedInByDefault() {
20   return !base::SysInfo::IsRunningOnChromeOS() &&
21       !CommandLine::ForCurrentProcess()->HasSwitch(switches::kLoginManager);
22 }
23 
24 }  // namespace
25 
26 static LoginState* g_login_state = NULL;
27 
28 // static
Initialize()29 void LoginState::Initialize() {
30   CHECK(!g_login_state);
31   g_login_state = new LoginState();
32 }
33 
34 // static
Shutdown()35 void LoginState::Shutdown() {
36   CHECK(g_login_state);
37   delete g_login_state;
38   g_login_state = NULL;
39 }
40 
41 // static
Get()42 LoginState* LoginState::Get() {
43   CHECK(g_login_state) << "LoginState::Get() called before Initialize()";
44   return g_login_state;
45 }
46 
47 // static
IsInitialized()48 bool LoginState::IsInitialized() {
49   return g_login_state;
50 }
51 
AddObserver(Observer * observer)52 void LoginState::AddObserver(Observer* observer) {
53   observer_list_.AddObserver(observer);
54 }
55 
RemoveObserver(Observer * observer)56 void LoginState::RemoveObserver(Observer* observer) {
57   observer_list_.RemoveObserver(observer);
58 }
59 
SetLoggedInStateAndPrimaryUser(LoggedInState state,LoggedInUserType type,const std::string & primary_user_hash)60 void LoginState::SetLoggedInStateAndPrimaryUser(
61     LoggedInState state,
62     LoggedInUserType type,
63     const std::string& primary_user_hash) {
64   DCHECK(type != LOGGED_IN_USER_NONE);
65   primary_user_hash_ = primary_user_hash;
66   VLOG(1) << "LoggedInStateUser: " << primary_user_hash;
67   SetLoggedInState(state, type);
68 }
69 
SetLoggedInState(LoggedInState state,LoggedInUserType type)70 void LoginState::SetLoggedInState(LoggedInState state, LoggedInUserType type) {
71   if (state == logged_in_state_ && type == logged_in_user_type_)
72     return;
73   VLOG(1) << "LoggedInState: " << state << " UserType: " << type;
74   logged_in_state_ = state;
75   logged_in_user_type_ = type;
76   NotifyObservers();
77 }
78 
GetLoggedInUserType() const79 LoginState::LoggedInUserType LoginState::GetLoggedInUserType() const {
80   return logged_in_user_type_;
81 }
82 
IsUserLoggedIn() const83 bool LoginState::IsUserLoggedIn() const {
84   if (always_logged_in_)
85     return true;
86   return logged_in_state_ == LOGGED_IN_ACTIVE;
87 }
88 
IsInSafeMode() const89 bool LoginState::IsInSafeMode() const {
90   DCHECK(!always_logged_in_ || logged_in_state_ != LOGGED_IN_SAFE_MODE);
91   return logged_in_state_ == LOGGED_IN_SAFE_MODE;
92 }
93 
IsGuestSessionUser() const94 bool LoginState::IsGuestSessionUser() const {
95   return logged_in_user_type_ == LOGGED_IN_USER_GUEST;
96 }
97 
IsPublicSessionUser() const98 bool LoginState::IsPublicSessionUser() const {
99   return logged_in_user_type_ == LOGGED_IN_USER_PUBLIC_ACCOUNT ||
100          logged_in_user_type_ == LOGGED_IN_USER_RETAIL_MODE;
101 }
102 
IsKioskApp() const103 bool LoginState::IsKioskApp() const {
104   return logged_in_user_type_ == LOGGED_IN_USER_KIOSK_APP;
105 }
106 
UserHasNetworkProfile() const107 bool LoginState::UserHasNetworkProfile() const {
108   if (!IsUserLoggedIn())
109     return false;
110   return logged_in_user_type_ != LOGGED_IN_USER_PUBLIC_ACCOUNT;
111 }
112 
IsUserAuthenticated() const113 bool LoginState::IsUserAuthenticated() const {
114   return logged_in_user_type_ == LOGGED_IN_USER_REGULAR ||
115          logged_in_user_type_ == LOGGED_IN_USER_OWNER ||
116          logged_in_user_type_ == LOGGED_IN_USER_SUPERVISED;
117 }
118 
IsUserGaiaAuthenticated() const119 bool LoginState::IsUserGaiaAuthenticated() const {
120   return logged_in_user_type_ == LOGGED_IN_USER_REGULAR ||
121          logged_in_user_type_ == LOGGED_IN_USER_OWNER;
122 }
123 
124 // Private methods
125 
LoginState()126 LoginState::LoginState() : logged_in_state_(LOGGED_IN_NONE),
127                            logged_in_user_type_(LOGGED_IN_USER_NONE),
128                            always_logged_in_(AlwaysLoggedInByDefault()) {
129 }
130 
~LoginState()131 LoginState::~LoginState() {
132 }
133 
NotifyObservers()134 void LoginState::NotifyObservers() {
135   FOR_EACH_OBSERVER(LoginState::Observer, observer_list_,
136                     LoggedInStateChanged());
137 }
138 
139 }  // namespace chromeos
140