1 // Copyright (c) 2012 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 "chrome/browser/chromeos/policy/device_local_account_policy_provider.h" 6 7 #include "base/bind.h" 8 #include "chrome/browser/chromeos/policy/device_local_account_external_data_manager.h" 9 #include "components/policy/core/common/cloud/cloud_policy_core.h" 10 #include "components/policy/core/common/cloud/cloud_policy_service.h" 11 #include "components/policy/core/common/policy_bundle.h" 12 #include "components/policy/core/common/policy_namespace.h" 13 14 namespace policy { 15 DeviceLocalAccountPolicyProvider(const std::string & user_id,DeviceLocalAccountPolicyService * service)16DeviceLocalAccountPolicyProvider::DeviceLocalAccountPolicyProvider( 17 const std::string& user_id, 18 DeviceLocalAccountPolicyService* service) 19 : user_id_(user_id), 20 service_(service), 21 store_initialized_(false), 22 waiting_for_policy_refresh_(false), 23 weak_factory_(this) { 24 service_->AddObserver(this); 25 UpdateFromBroker(); 26 } 27 ~DeviceLocalAccountPolicyProvider()28DeviceLocalAccountPolicyProvider::~DeviceLocalAccountPolicyProvider() { 29 service_->RemoveObserver(this); 30 } 31 IsInitializationComplete(PolicyDomain domain) const32bool DeviceLocalAccountPolicyProvider::IsInitializationComplete( 33 PolicyDomain domain) const { 34 if (domain == POLICY_DOMAIN_CHROME) 35 return store_initialized_; 36 return true; 37 } 38 RefreshPolicies()39void DeviceLocalAccountPolicyProvider::RefreshPolicies() { 40 DeviceLocalAccountPolicyBroker* broker = GetBroker(); 41 if (broker && broker->core()->service()) { 42 waiting_for_policy_refresh_ = true; 43 broker->core()->service()->RefreshPolicy( 44 base::Bind(&DeviceLocalAccountPolicyProvider::ReportPolicyRefresh, 45 weak_factory_.GetWeakPtr())); 46 } else { 47 UpdateFromBroker(); 48 } 49 } 50 OnPolicyUpdated(const std::string & user_id)51void DeviceLocalAccountPolicyProvider::OnPolicyUpdated( 52 const std::string& user_id) { 53 if (user_id == user_id_) 54 UpdateFromBroker(); 55 } 56 OnDeviceLocalAccountsChanged()57void DeviceLocalAccountPolicyProvider::OnDeviceLocalAccountsChanged() { 58 UpdateFromBroker(); 59 } 60 GetBroker()61DeviceLocalAccountPolicyBroker* DeviceLocalAccountPolicyProvider::GetBroker() { 62 return service_->GetBrokerForUser(user_id_); 63 } 64 ReportPolicyRefresh(bool success)65void DeviceLocalAccountPolicyProvider::ReportPolicyRefresh(bool success) { 66 waiting_for_policy_refresh_ = false; 67 UpdateFromBroker(); 68 } 69 UpdateFromBroker()70void DeviceLocalAccountPolicyProvider::UpdateFromBroker() { 71 DeviceLocalAccountPolicyBroker* broker = GetBroker(); 72 scoped_ptr<PolicyBundle> bundle(new PolicyBundle()); 73 if (broker) { 74 store_initialized_ |= broker->core()->store()->is_initialized(); 75 if (!waiting_for_policy_refresh_) { 76 // Copy policy from the broker. 77 bundle->Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) 78 .CopyFrom(broker->core()->store()->policy_map()); 79 external_data_manager_ = broker->external_data_manager(); 80 } else { 81 // Wait for the refresh to finish. 82 return; 83 } 84 } else { 85 // Keep existing policy, but do send an update. 86 waiting_for_policy_refresh_ = false; 87 weak_factory_.InvalidateWeakPtrs(); 88 bundle->CopyFrom(policies()); 89 } 90 UpdatePolicy(bundle.Pass()); 91 } 92 93 } // namespace policy 94