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