device_local_account_policy_provider.cc revision f2477e01787aa58f445919b809d89e252beef54f
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 "chrome/browser/policy/cloud/cloud_policy_core.h"
10#include "chrome/browser/policy/cloud/cloud_policy_service.h"
11#include "components/policy/core/common/policy_bundle.h"
12#include "components/policy/core/common/policy_namespace.h"
13
14namespace policy {
15
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
28DeviceLocalAccountPolicyProvider::~DeviceLocalAccountPolicyProvider() {
29  service_->RemoveObserver(this);
30}
31
32bool DeviceLocalAccountPolicyProvider::IsInitializationComplete(
33    PolicyDomain domain) const {
34  if (domain == POLICY_DOMAIN_CHROME)
35    return store_initialized_;
36  return true;
37}
38
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
51void DeviceLocalAccountPolicyProvider::OnPolicyUpdated(
52    const std::string& user_id) {
53  if (user_id == user_id_)
54    UpdateFromBroker();
55}
56
57void DeviceLocalAccountPolicyProvider::OnDeviceLocalAccountsChanged() {
58  UpdateFromBroker();
59}
60
61DeviceLocalAccountPolicyBroker* DeviceLocalAccountPolicyProvider::GetBroker() {
62  return service_->GetBrokerForUser(user_id_);
63}
64
65void DeviceLocalAccountPolicyProvider::ReportPolicyRefresh(bool success) {
66  waiting_for_policy_refresh_ = false;
67  UpdateFromBroker();
68}
69
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