// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromeos/login/login_state.h"
#include "base/command_line.h"
#include "base/logging.h"
#include "base/sys_info.h"
#include "chromeos/chromeos_switches.h"
namespace chromeos {
namespace {
// When running a Chrome OS build outside of a device (i.e. on a developer's
// workstation) and not running as login-manager, pretend like we're always
// logged in.
bool AlwaysLoggedInByDefault() {
return !base::SysInfo::IsRunningOnChromeOS() &&
!CommandLine::ForCurrentProcess()->HasSwitch(switches::kLoginManager);
}
} // namespace
static LoginState* g_login_state = NULL;
// static
void LoginState::Initialize() {
CHECK(!g_login_state);
g_login_state = new LoginState();
}
// static
void LoginState::Shutdown() {
CHECK(g_login_state);
delete g_login_state;
g_login_state = NULL;
}
// static
LoginState* LoginState::Get() {
CHECK(g_login_state) << "LoginState::Get() called before Initialize()";
return g_login_state;
}
// static
bool LoginState::IsInitialized() {
return g_login_state;
}
void LoginState::AddObserver(Observer* observer) {
observer_list_.AddObserver(observer);
}
void LoginState::RemoveObserver(Observer* observer) {
observer_list_.RemoveObserver(observer);
}
void LoginState::SetLoggedInState(LoggedInState state,
LoggedInUserType type) {
if (state == logged_in_state_ && type == logged_in_user_type_)
return;
VLOG(1) << "LoggedInState: " << state << " UserType: " << type;
logged_in_state_ = state;
logged_in_user_type_ = type;
NotifyObservers();
}
LoginState::LoggedInUserType LoginState::GetLoggedInUserType() const {
return logged_in_user_type_;
}
bool LoginState::IsUserLoggedIn() const {
if (always_logged_in_)
return true;
return logged_in_state_ == LOGGED_IN_ACTIVE;
}
bool LoginState::IsInSafeMode() const {
DCHECK(!always_logged_in_ || logged_in_state_ != LOGGED_IN_SAFE_MODE);
return logged_in_state_ == LOGGED_IN_SAFE_MODE;
}
bool LoginState::IsGuestUser() const {
if (!IsUserLoggedIn())
return false;
switch (logged_in_user_type_) {
case LOGGED_IN_USER_NONE:
case LOGGED_IN_USER_REGULAR:
case LOGGED_IN_USER_OWNER:
case LOGGED_IN_USER_LOCALLY_MANAGED:
case LOGGED_IN_USER_KIOSK_APP:
return false;
case LOGGED_IN_USER_GUEST:
case LOGGED_IN_USER_RETAIL_MODE:
case LOGGED_IN_USER_PUBLIC_ACCOUNT:
return true;
}
NOTREACHED();
return false;
}
bool LoginState::IsUserAuthenticated() const {
LoggedInUserType type = logged_in_user_type_;
return type == chromeos::LoginState::LOGGED_IN_USER_REGULAR ||
type == chromeos::LoginState::LOGGED_IN_USER_OWNER ||
type == chromeos::LoginState::LOGGED_IN_USER_LOCALLY_MANAGED;
}
bool LoginState::IsUserGaiaAuthenticated() const {
LoggedInUserType type = logged_in_user_type_;
return type == chromeos::LoginState::LOGGED_IN_USER_REGULAR ||
type == chromeos::LoginState::LOGGED_IN_USER_OWNER;
}
// Private methods
LoginState::LoginState() : logged_in_state_(LOGGED_IN_OOBE),
logged_in_user_type_(LOGGED_IN_USER_NONE),
always_logged_in_(AlwaysLoggedInByDefault()) {
}
LoginState::~LoginState() {
}
void LoginState::NotifyObservers() {
FOR_EACH_OBSERVER(LoginState::Observer, observer_list_,
LoggedInStateChanged());
}
} // namespace chromeos