1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/policy/device_cloud_policy_invalidator.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <vector> 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/logging.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/message_loop/message_loop_proxy.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/clock.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/time/default_clock.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/browser_process.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/browser_process_platform_part_chromeos.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chrome_notification_types.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/policy/ticl_device_settings_provider.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/chromeos/profiles/profile_helper.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/settings/device_identity_provider.h" 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/settings/device_oauth2_token_service_factory.h" 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/policy/cloud/cloud_policy_invalidator.h" 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/profiles/profile_manager.h" 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/chrome_content_client.h" 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidation_handler.h" 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidation_service.h" 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidation_state_tracker.h" 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/invalidation/invalidator_state.h" 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/invalidator_storage.h" 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/profile_invalidation_provider.h" 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/ticl_invalidation_service.h" 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/ticl_settings_provider.h" 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/policy/core/common/cloud/cloud_policy_constants.h" 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/user_manager/user.h" 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/notification_details.h" 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/notification_service.h" 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "google_apis/gaia/identity_provider.h" 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "net/url_request/url_request_context_getter.h" 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "policy/proto/device_management_backend.pb.h" 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass Profile; 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace policy { 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass DeviceCloudPolicyInvalidator::InvalidationServiceObserver 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : public syncer::InvalidationHandler { 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch explicit InvalidationServiceObserver( 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceCloudPolicyInvalidator* parent, 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation::InvalidationService* invalidation_service); 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~InvalidationServiceObserver(); 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation::InvalidationService* GetInvalidationService(); 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool IsServiceConnected() const; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // public syncer::InvalidationHandler: 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnInvalidatorStateChange( 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch syncer::InvalidatorState state) OVERRIDE; 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnIncomingInvalidation( 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const syncer::ObjectIdInvalidationMap& invalidation_map) OVERRIDE; 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual std::string GetOwnerName() const OVERRIDE; 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceCloudPolicyInvalidator* parent_; 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation::InvalidationService* invalidation_service_; 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool is_service_connected_; 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(InvalidationServiceObserver); 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 73116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDeviceCloudPolicyInvalidator::InvalidationServiceObserver:: 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InvalidationServiceObserver( 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceCloudPolicyInvalidator* parent, 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation::InvalidationService* invalidation_service) 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : parent_(parent), 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation_service_(invalidation_service), 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch is_service_connected_(invalidation_service->GetInvalidatorState() == 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch syncer::INVALIDATIONS_ENABLED) { 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation_service_->RegisterInvalidationHandler(this); 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 84116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDeviceCloudPolicyInvalidator::InvalidationServiceObserver:: 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ~InvalidationServiceObserver() { 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation_service_->UnregisterInvalidationHandler(this); 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdochinvalidation::InvalidationService* 90116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDeviceCloudPolicyInvalidator::InvalidationServiceObserver:: 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetInvalidationService() { 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return invalidation_service_; 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceCloudPolicyInvalidator::InvalidationServiceObserver:: 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch IsServiceConnected() const { 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return is_service_connected_; 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceCloudPolicyInvalidator::InvalidationServiceObserver:: 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnInvalidatorStateChange(syncer::InvalidatorState state) { 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const bool is_service_connected = (state == syncer::INVALIDATIONS_ENABLED); 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (is_service_connected == is_service_connected_) 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch is_service_connected_ = is_service_connected; 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (is_service_connected_) 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parent_->OnInvalidationServiceConnected(invalidation_service_); 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch parent_->OnInvalidationServiceDisconnected(invalidation_service_); 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceCloudPolicyInvalidator::InvalidationServiceObserver:: 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OnIncomingInvalidation( 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const syncer::ObjectIdInvalidationMap& invalidation_map) { 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstd::string DeviceCloudPolicyInvalidator::InvalidationServiceObserver:: 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetOwnerName() const { 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return "DevicePolicy"; 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 123116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDeviceCloudPolicyInvalidator::DeviceCloudPolicyInvalidator() 1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : invalidation_service_(NULL), 1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) highest_handled_invalidation_version_(0) { 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The DeviceCloudPolicyInvalidator should be created before any user 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Profiles. 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(g_browser_process->profile_manager()->GetLoadedProfiles().empty()); 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Subscribe to notification about new user profiles becoming available. 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch registrar_.Add(this, 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::NotificationService::AllSources()); 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TryToCreateInvalidator(); 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 138116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDeviceCloudPolicyInvalidator::~DeviceCloudPolicyInvalidator() { 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DestroyInvalidator(); 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceCloudPolicyInvalidator::Observe( 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int type, 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const content::NotificationSource& source, 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const content::NotificationDetails& details) { 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK_EQ(chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED, type); 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Profile* profile = content::Details<Profile>(details).ptr(); 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation::ProfileInvalidationProvider* invalidation_provider = 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci invalidation::ProfileInvalidationProviderFactory::GetForProfile(profile); 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!invalidation_provider) { 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If the Profile does not support invalidation (e.g. guest, incognito), 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // ignore it. 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_manager::User* user = 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chromeos::ProfileHelper::Get()->GetUserByProfile(profile); 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!user || 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g_browser_process->platform_part()->browser_policy_connector_chromeos()-> 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetUserAffiliation(user->email()) != USER_AFFILIATION_MANAGED) { 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If the Profile belongs to a user who is not affiliated with the domain 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the device is enrolled into, ignore it. 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Create a state observer for the user's invalidation service. 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch profile_invalidation_service_observers_.push_back( 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new InvalidationServiceObserver( 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this, 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation_provider->GetInvalidationService())); 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TryToCreateInvalidator(); 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceCloudPolicyInvalidator::OnInvalidationServiceConnected( 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation::InvalidationService* invalidation_service) { 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!device_invalidation_service_) { 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The lack of a device-global invalidation service implies that a 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |CloudPolicyInvalidator| backed by another connected service exists 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // already. There is no need to switch from that to the service which just 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // connected. 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (invalidation_service != device_invalidation_service_.get()) { 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If an invalidation service other than the device-global one connected, 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // destroy the device-global service and the |CloudPolicyInvalidator| backed 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // by it, if any. 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DestroyInvalidator(); 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DestroyDeviceInvalidationService(); 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Create a |CloudPolicyInvalidator| backed by the invalidation service which 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // just connected. 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CreateInvalidator(invalidation_service); 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceCloudPolicyInvalidator::OnInvalidationServiceDisconnected( 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation::InvalidationService* invalidation_service) { 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (invalidation_service != invalidation_service_) { 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If the invalidation service which disconnected is not backing the current 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |CloudPolicyInvalidator|, return. 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Destroy the |CloudPolicyInvalidator| backed by the invalidation service 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // which just disconnected. 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DestroyInvalidator(); 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Try to create a |CloudPolicyInvalidator| backed by another invalidation 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // service. 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TryToCreateInvalidator(); 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceCloudPolicyInvalidator::TryToCreateInvalidator() { 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (invalidator_) { 215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If a |CloudPolicyInvalidator| exists already, return. 216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch for (ScopedVector<InvalidationServiceObserver>::const_iterator it = 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch profile_invalidation_service_observers_.begin(); 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch it != profile_invalidation_service_observers_.end(); ++it) { 222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if ((*it)->IsServiceConnected()) { 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If a connected invalidation service belonging to an affiliated 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // logged-in user is found, create a |CloudPolicyInvalidator| backed by 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // that service and destroy the device-global service, if any. 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DestroyDeviceInvalidationService(); 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CreateInvalidator((*it)->GetInvalidationService()); 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!device_invalidation_service_) { 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If no other connected invalidation service was found, ensure that a 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // device-global service is running. 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_invalidation_service_.reset( 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new invalidation::TiclInvalidationService( 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetUserAgent(), 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<IdentityProvider>(new chromeos::DeviceIdentityProvider( 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch chromeos::DeviceOAuth2TokenServiceFactory::Get())), 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<invalidation::TiclSettingsProvider>( 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new TiclDeviceSettingsProvider), 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch g_browser_process->gcm_driver(), 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch g_browser_process->system_request_context())); 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_invalidation_service_->Init( 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<syncer::InvalidationStateTracker>( 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new invalidation::InvalidatorStorage( 247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch g_browser_process->local_state()))); 248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_invalidation_service_observer_.reset( 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new InvalidationServiceObserver( 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch this, 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_invalidation_service_.get())); 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (device_invalidation_service_observer_->IsServiceConnected()) { 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If the device-global invalidation service is connected, create a 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |CloudPolicyInvalidator| backed by it. Otherwise, a 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // |CloudPolicyInvalidator| will be created later when a connected service 258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // becomes available. 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CreateInvalidator(device_invalidation_service_.get()); 260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceCloudPolicyInvalidator::CreateInvalidator( 264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation::InvalidationService* invalidation_service) { 265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation_service_ = invalidation_service; 2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(!invalidator_); 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidator_.reset(new CloudPolicyInvalidator( 2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) enterprise_management::DeviceRegisterRequest::DEVICE, 269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch g_browser_process->platform_part()->browser_policy_connector_chromeos()-> 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetDeviceCloudPolicyManager()->core(), 271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::MessageLoopProxy::current(), 2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<base::Clock>(new base::DefaultClock()), 2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) highest_handled_invalidation_version_)); 274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidator_->Initialize(invalidation_service); 275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 277116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceCloudPolicyInvalidator::DestroyInvalidator() { 2786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (invalidator_) { 2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) highest_handled_invalidation_version_ = 2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) invalidator_->highest_handled_invalidation_version(); 281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidator_->Shutdown(); 2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidator_.reset(); 284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch invalidation_service_ = NULL; 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 287116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceCloudPolicyInvalidator::DestroyDeviceInvalidationService() { 288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_invalidation_service_observer_.reset(); 289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_invalidation_service_.reset(); 290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace policy 293