login_profile_policy_provider.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
1// Copyright 2013 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/login_profile_policy_provider.h"
6
7#include <string>
8
9#include "base/bind.h"
10#include "base/callback.h"
11#include "base/memory/scoped_ptr.h"
12#include "base/values.h"
13#include "chrome/browser/policy/external_data_fetcher.h"
14#include "chrome/browser/policy/policy_bundle.h"
15#include "chrome/browser/policy/policy_map.h"
16#include "chrome/browser/policy/policy_types.h"
17#include "policy/policy_constants.h"
18
19namespace policy {
20
21namespace {
22
23// Applies the value of |device_policy| in |device_policy_map| as the
24// recommended value of |user_policy| in |user_policy_map|. If the value of
25// |device_policy| is unset, does nothing.
26void ApplyDevicePolicy(const std::string& device_policy,
27                       const std::string& user_policy,
28                       const PolicyMap& device_policy_map,
29                       PolicyMap* user_policy_map) {
30  const base::Value* value = device_policy_map.GetValue(device_policy);
31  if (value) {
32    user_policy_map->Set(user_policy,
33                         POLICY_LEVEL_RECOMMENDED,
34                         POLICY_SCOPE_USER,
35                         value->DeepCopy(),
36                         NULL);
37  }
38}
39
40}  // namespace
41
42LoginProfilePolicyProvider::LoginProfilePolicyProvider(
43    PolicyService* device_policy_service)
44    : device_policy_service_(device_policy_service),
45      waiting_for_device_policy_refresh_(false),
46      weak_factory_(this) {
47}
48
49LoginProfilePolicyProvider::~LoginProfilePolicyProvider() {
50}
51
52void LoginProfilePolicyProvider::Init() {
53  ConfigurationPolicyProvider::Init();
54  device_policy_service_->AddObserver(POLICY_DOMAIN_CHROME, this);
55  if (device_policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME))
56    UpdateFromDevicePolicy();
57}
58
59void LoginProfilePolicyProvider::Shutdown() {
60  device_policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, this);
61  weak_factory_.InvalidateWeakPtrs();
62  ConfigurationPolicyProvider::Shutdown();
63}
64
65void LoginProfilePolicyProvider::RefreshPolicies() {
66  waiting_for_device_policy_refresh_ = true;
67  weak_factory_.InvalidateWeakPtrs();
68  device_policy_service_->RefreshPolicies(base::Bind(
69      &LoginProfilePolicyProvider::OnDevicePolicyRefreshDone,
70      weak_factory_.GetWeakPtr()));
71}
72
73void LoginProfilePolicyProvider::OnPolicyUpdated(const PolicyNamespace& ns,
74                                                 const PolicyMap& previous,
75                                                 const PolicyMap& current) {
76  if (ns == PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
77    UpdateFromDevicePolicy();
78}
79
80void LoginProfilePolicyProvider::OnPolicyServiceInitialized(
81    PolicyDomain domain) {
82  if (domain == POLICY_DOMAIN_CHROME)
83    UpdateFromDevicePolicy();
84}
85
86void LoginProfilePolicyProvider::OnDevicePolicyRefreshDone() {
87  waiting_for_device_policy_refresh_ = false;
88  UpdateFromDevicePolicy();
89}
90
91void LoginProfilePolicyProvider::UpdateFromDevicePolicy() {
92  // If a policy refresh is in progress, wait for it to finish.
93  if (waiting_for_device_policy_refresh_)
94    return;
95
96  const PolicyNamespace chrome_namespaces(POLICY_DOMAIN_CHROME, std::string());
97  const PolicyMap& device_policy_map =
98      device_policy_service_->GetPolicies(chrome_namespaces);
99  scoped_ptr<PolicyBundle> bundle(new PolicyBundle);
100  PolicyMap& user_policy_map = bundle->Get(chrome_namespaces);
101
102  ApplyDevicePolicy(key::kDeviceLoginScreenDefaultLargeCursorEnabled,
103                    key::kLargeCursorEnabled,
104                    device_policy_map, &user_policy_map);
105  ApplyDevicePolicy(key::kDeviceLoginScreenDefaultSpokenFeedbackEnabled,
106                    key::kSpokenFeedbackEnabled,
107                    device_policy_map, &user_policy_map);
108  ApplyDevicePolicy(key::kDeviceLoginScreenDefaultHighContrastEnabled,
109                    key::kHighContrastEnabled,
110                    device_policy_map, &user_policy_map);
111  ApplyDevicePolicy(key::kDeviceLoginScreenDefaultScreenMagnifierType,
112                    key::kScreenMagnifierType,
113                    device_policy_map, &user_policy_map);
114  UpdatePolicy(bundle.Pass());
115}
116
117}  // namespace policy
118