1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be 3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file. 4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/policy/user_policy_identity_strategy.h" 6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/file_util.h" 8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/browser_signin.h" 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/net/gaia/token_service.h" 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/policy/proto/device_management_backend.pb.h" 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/policy/proto/device_management_constants.h" 12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/policy/proto/device_management_local.pb.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/profiles/profile.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/guid.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/net/gaia/gaia_constants.h" 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h" 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h" 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/chromeos/login/user_manager.h" 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace policy { 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace em = enterprise_management; 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Responsible for managing the on-disk token cache. 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass UserPolicyIdentityStrategy::TokenCache 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : public base::RefCountedThreadSafe< 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen UserPolicyIdentityStrategy::TokenCache> { 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen TokenCache(const base::WeakPtr<UserPolicyIdentityStrategy>& identity_strategy, 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const FilePath& cache_file); 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void Load(); 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void Store(const std::string& token, const std::string& device_id); 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private: 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen friend class base::RefCountedThreadSafe< 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen UserPolicyIdentityStrategy::TokenCache>; 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ~TokenCache() {} 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void LoadOnFileThread(); 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void NotifyOnUIThread(const std::string& token, 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& device_id); 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void StoreOnFileThread(const std::string& token, 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& device_id); 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const base::WeakPtr<UserPolicyIdentityStrategy> identity_strategy_; 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const FilePath cache_file_; 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DISALLOW_COPY_AND_ASSIGN(TokenCache); 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 56dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenUserPolicyIdentityStrategy::TokenCache::TokenCache( 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const base::WeakPtr<UserPolicyIdentityStrategy>& identity_strategy, 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const FilePath& cache_file) 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : identity_strategy_(identity_strategy), 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cache_file_(cache_file) {} 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::TokenCache::Load() { 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::PostTask( 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::FILE, FROM_HERE, 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NewRunnableMethod( 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen this, &UserPolicyIdentityStrategy::TokenCache::LoadOnFileThread)); 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::TokenCache::Store( 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& token, 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& device_id) { 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::PostTask( 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::FILE, FROM_HERE, 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NewRunnableMethod( 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen this, 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen &UserPolicyIdentityStrategy::TokenCache::StoreOnFileThread, 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen token, 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_id)); 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::TokenCache::LoadOnFileThread() { 84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string device_token; 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string device_id; 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (file_util::PathExists(cache_file_)) { 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string data; 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen em::DeviceCredentials device_credentials; 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (file_util::ReadFileToString(cache_file_, &data) && 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_credentials.ParseFromArray(data.c_str(), data.size())) { 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_token = device_credentials.device_token(); 94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_id = device_credentials.device_id(); 95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::PostTask( 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BrowserThread::UI, FROM_HERE, 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NewRunnableMethod( 101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen this, 102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen &UserPolicyIdentityStrategy::TokenCache::NotifyOnUIThread, 103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_token, 104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_id)); 105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::TokenCache::NotifyOnUIThread( 108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& token, 109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& device_id) { 110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (identity_strategy_.get()) 112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen identity_strategy_->OnCacheLoaded(token, device_id); 113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::TokenCache::StoreOnFileThread( 116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& token, 117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& device_id) { 118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); 119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen em::DeviceCredentials device_credentials; 120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_credentials.set_device_token(token); 121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_credentials.set_device_id(device_id); 122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string data; 123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool success = device_credentials.SerializeToString(&data); 124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!success) { 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LOG(WARNING) << "Failed serialize device token data, will not write " 126dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen << cache_file_.value(); 127dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return; 128dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen file_util::WriteFile(cache_file_, data.c_str(), data.length()); 131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 133dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenUserPolicyIdentityStrategy::UserPolicyIdentityStrategy( 134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Profile* profile, 135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const FilePath& cache_file) 136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : profile_(profile), 137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ALLOW_THIS_IN_INITIALIZER_LIST(weak_ptr_factory_(this)) { 138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cache_ = new TokenCache(weak_ptr_factory_.GetWeakPtr(), cache_file); 139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen registrar_.Add(this, 140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotificationType::TOKEN_AVAILABLE, 141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Source<TokenService>(profile->GetTokenService())); 142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Register for the event of user login. The device management token won't 144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // be fetched until we know the domain of the currently logged in user. 145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen registrar_.Add(this, 147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotificationType::LOGIN_USER_CHANGED, 148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotificationService::AllSources()); 149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#else 150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen registrar_.Add(this, 151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotificationType::GOOGLE_SIGNIN_SUCCESSFUL, 152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Source<Profile>(profile_)); 153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cache_->Load(); 156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 158dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenUserPolicyIdentityStrategy::~UserPolicyIdentityStrategy() {} 159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string UserPolicyIdentityStrategy::GetDeviceToken() { 161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return device_token_; 162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string UserPolicyIdentityStrategy::GetDeviceID() { 165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return device_id_; 166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string UserPolicyIdentityStrategy::GetMachineID() { 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return std::string(); 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstd::string UserPolicyIdentityStrategy::GetMachineModel() { 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return std::string(); 174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenem::DeviceRegisterRequest_Type 177dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenUserPolicyIdentityStrategy::GetPolicyRegisterType() { 178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return em::DeviceRegisterRequest::USER; 179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string UserPolicyIdentityStrategy::GetPolicyType() { 182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return kChromeUserPolicyType; 183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool UserPolicyIdentityStrategy::GetCredentials(std::string* username, 186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen std::string* auth_token) { 187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen *username = GetCurrentUser(); 188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen *auth_token = profile_->GetTokenService()->GetTokenForService( 189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen GaiaConstants::kDeviceManagementService); 190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 191dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return !username->empty() && !auth_token->empty() && !device_id_.empty(); 192dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 194dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::OnDeviceTokenAvailable( 195dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& token) { 196dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(!device_id_.empty()); 197dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_token_ = token; 198dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen cache_->Store(device_token_, device_id_); 199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotifyDeviceTokenChanged(); 200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string UserPolicyIdentityStrategy::GetCurrentUser() { 203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // TODO(mnissler) On CrOS it seems impossible to figure out what user belongs 205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // to a profile. Revisit after multi-profile support landed. 206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return chromeos::UserManager::Get()->logged_in_user().email(); 207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#else 208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return profile_->GetBrowserSignin()->GetSignedInUsername(); 209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::CheckAndTriggerFetch() { 213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!GetCurrentUser().empty() && 214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen profile_->GetTokenService()->HasTokenForService( 215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen GaiaConstants::kDeviceManagementService)) { 216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // For user tokens, there is no actual identifier. We generate a random 217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // identifier instead each time we ask for the token. 218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_id_ = guid::GenerateGUID(); 219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotifyAuthChanged(); 220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::OnCacheLoaded(const std::string& token, 224dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& device_id) { 225dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!token.empty() && !device_id.empty()) { 226dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_token_ = token; 227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen device_id_ = device_id; 228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NotifyDeviceTokenChanged(); 229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else { 230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CheckAndTriggerFetch(); 231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid UserPolicyIdentityStrategy::Observe(NotificationType type, 235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const NotificationSource& source, 236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const NotificationDetails& details) { 237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (type == NotificationType::TOKEN_AVAILABLE) { 239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (Source<TokenService>(source).ptr() == profile_->GetTokenService()) { 240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const TokenService::TokenAvailableDetails* token_details = 241dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Details<const TokenService::TokenAvailableDetails>(details).ptr(); 242dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (token_details->service() == GaiaConstants::kDeviceManagementService) 243dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (device_token_.empty()) { 244dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Request a new device management server token, but only in case we 245dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // don't already have it. 246dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CheckAndTriggerFetch(); 247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else if (type == NotificationType::LOGIN_USER_CHANGED) { 251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CheckAndTriggerFetch(); 252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#else 253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else if (type == NotificationType::GOOGLE_SIGNIN_SUCCESSFUL) { 254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (profile_ == Source<Profile>(source).ptr()) 255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen CheckAndTriggerFetch(); 256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else { 258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen NOTREACHED(); 259dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 260dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 262dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} // namespace policy 263