1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/login/login_state.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/command_line.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos { 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// When running a Chrome OS build outside of a device (i.e. on a developer's 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// workstation) and not running as login-manager, pretend like we're always 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// logged in. 191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool AlwaysLoggedInByDefault() { 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return !base::SysInfo::IsRunningOnChromeOS() && 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !CommandLine::ForCurrentProcess()->HasSwitch(switches::kLoginManager); 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static LoginState* g_login_state = NULL; 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginState::Initialize() { 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK(!g_login_state); 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_login_state = new LoginState(); 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginState::Shutdown() { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK(g_login_state); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) delete g_login_state; 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) g_login_state = NULL; 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoginState* LoginState::Get() { 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK(g_login_state) << "LoginState::Get() called before Initialize()"; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return g_login_state; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LoginState::IsInitialized() { 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return g_login_state; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginState::AddObserver(Observer* observer) { 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_list_.AddObserver(observer); 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginState::RemoveObserver(Observer* observer) { 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) observer_list_.RemoveObserver(observer); 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void LoginState::SetLoggedInStateAndPrimaryUser( 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LoggedInState state, 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LoggedInUserType type, 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& primary_user_hash) { 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(type != LOGGED_IN_USER_NONE); 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) primary_user_hash_ = primary_user_hash; 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) VLOG(1) << "LoggedInStateUser: " << primary_user_hash; 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetLoggedInState(state, type); 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void LoginState::SetLoggedInState(LoggedInState state, LoggedInUserType type) { 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (state == logged_in_state_ && type == logged_in_user_type_) 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VLOG(1) << "LoggedInState: " << state << " UserType: " << type; 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) logged_in_state_ = state; 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) logged_in_user_type_ = type; 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NotifyObservers(); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoginState::LoggedInUserType LoginState::GetLoggedInUserType() const { 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return logged_in_user_type_; 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LoginState::IsUserLoggedIn() const { 841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (always_logged_in_) 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return true; 86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return logged_in_state_ == LOGGED_IN_ACTIVE; 87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)bool LoginState::IsInSafeMode() const { 901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DCHECK(!always_logged_in_ || logged_in_state_ != LOGGED_IN_SAFE_MODE); 91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return logged_in_state_ == LOGGED_IN_SAFE_MODE; 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool LoginState::IsGuestSessionUser() const { 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return logged_in_user_type_ == LOGGED_IN_USER_GUEST; 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool LoginState::IsPublicSessionUser() const { 9934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return logged_in_user_type_ == LOGGED_IN_USER_PUBLIC_ACCOUNT || 10034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) logged_in_user_type_ == LOGGED_IN_USER_RETAIL_MODE; 1012385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1022385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool LoginState::IsKioskApp() const { 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return logged_in_user_type_ == LOGGED_IN_USER_KIOSK_APP; 105a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool LoginState::UserHasNetworkProfile() const { 108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!IsUserLoggedIn()) 109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return false; 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return logged_in_user_type_ != LOGGED_IN_USER_PUBLIC_ACCOUNT; 111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool LoginState::IsUserAuthenticated() const { 114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return logged_in_user_type_ == LOGGED_IN_USER_REGULAR || 115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch logged_in_user_type_ == LOGGED_IN_USER_OWNER || 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) logged_in_user_type_ == LOGGED_IN_USER_SUPERVISED; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool LoginState::IsUserGaiaAuthenticated() const { 120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return logged_in_user_type_ == LOGGED_IN_USER_REGULAR || 121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch logged_in_user_type_ == LOGGED_IN_USER_OWNER; 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Private methods 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126116680a4aac90f2aa7413d9095a592090648e557Ben MurdochLoginState::LoginState() : logged_in_state_(LOGGED_IN_NONE), 1271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) logged_in_user_type_(LOGGED_IN_USER_NONE), 1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) always_logged_in_(AlwaysLoggedInByDefault()) { 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LoginState::~LoginState() { 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void LoginState::NotifyObservers() { 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FOR_EACH_OBSERVER(LoginState::Observer, observer_list_, 136d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) LoggedInStateChanged()); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace chromeos 140