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