login_profile_policy_provider.cc revision f2477e01787aa58f445919b809d89e252beef54f
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/chromeos/policy/login_screen_power_management_policy.h"
14#include "chrome/browser/policy/policy_error_map.h"
15#include "components/policy/core/common/external_data_fetcher.h"
16#include "components/policy/core/common/policy_bundle.h"
17#include "components/policy/core/common/policy_map.h"
18#include "components/policy/core/common/policy_types.h"
19#include "policy/policy_constants.h"
20
21namespace policy {
22
23namespace {
24
25// Applies the value of |device_policy| in |device_policy_map| as the
26// recommended value of |user_policy| in |user_policy_map|. If the value of
27// |device_policy| is unset, does nothing.
28void ApplyDevicePolicyAsRecommendedPolicy(const std::string& device_policy,
29                                          const std::string& user_policy,
30                                          const PolicyMap& device_policy_map,
31                                          PolicyMap* user_policy_map) {
32  const base::Value* value = device_policy_map.GetValue(device_policy);
33  if (value) {
34    user_policy_map->Set(user_policy,
35                         POLICY_LEVEL_RECOMMENDED,
36                         POLICY_SCOPE_USER,
37                         value->DeepCopy(),
38                         NULL);
39  }
40}
41
42// Applies |value| as the mandatory value of |user_policy| in |user_policy_map|.
43// If |value| is NULL, does nothing.
44void ApplyValueAsMandatoryPolicy(const base::Value* value,
45                                 const std::string& user_policy,
46                                 PolicyMap* user_policy_map) {
47  if (value) {
48    user_policy_map->Set(user_policy,
49                         POLICY_LEVEL_MANDATORY,
50                         POLICY_SCOPE_USER,
51                         value->DeepCopy(),
52                         NULL);
53  }
54}
55
56}  // namespace
57
58LoginProfilePolicyProvider::LoginProfilePolicyProvider(
59    PolicyService* device_policy_service)
60    : device_policy_service_(device_policy_service),
61      waiting_for_device_policy_refresh_(false),
62      weak_factory_(this) {
63}
64
65LoginProfilePolicyProvider::~LoginProfilePolicyProvider() {
66}
67
68void LoginProfilePolicyProvider::Init(SchemaRegistry* registry) {
69  ConfigurationPolicyProvider::Init(registry);
70  device_policy_service_->AddObserver(POLICY_DOMAIN_CHROME, this);
71  if (device_policy_service_->IsInitializationComplete(POLICY_DOMAIN_CHROME))
72    UpdateFromDevicePolicy();
73}
74
75void LoginProfilePolicyProvider::Shutdown() {
76  device_policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, this);
77  weak_factory_.InvalidateWeakPtrs();
78  ConfigurationPolicyProvider::Shutdown();
79}
80
81void LoginProfilePolicyProvider::RefreshPolicies() {
82  waiting_for_device_policy_refresh_ = true;
83  weak_factory_.InvalidateWeakPtrs();
84  device_policy_service_->RefreshPolicies(base::Bind(
85      &LoginProfilePolicyProvider::OnDevicePolicyRefreshDone,
86      weak_factory_.GetWeakPtr()));
87}
88
89void LoginProfilePolicyProvider::OnPolicyUpdated(const PolicyNamespace& ns,
90                                                 const PolicyMap& previous,
91                                                 const PolicyMap& current) {
92  if (ns == PolicyNamespace(POLICY_DOMAIN_CHROME, std::string()))
93    UpdateFromDevicePolicy();
94}
95
96void LoginProfilePolicyProvider::OnPolicyServiceInitialized(
97    PolicyDomain domain) {
98  if (domain == POLICY_DOMAIN_CHROME)
99    UpdateFromDevicePolicy();
100}
101
102void LoginProfilePolicyProvider::OnDevicePolicyRefreshDone() {
103  waiting_for_device_policy_refresh_ = false;
104  UpdateFromDevicePolicy();
105}
106
107void LoginProfilePolicyProvider::UpdateFromDevicePolicy() {
108  // If a policy refresh is in progress, wait for it to finish.
109  if (waiting_for_device_policy_refresh_)
110    return;
111
112  const PolicyNamespace chrome_namespaces(POLICY_DOMAIN_CHROME, std::string());
113  const PolicyMap& device_policy_map =
114      device_policy_service_->GetPolicies(chrome_namespaces);
115  scoped_ptr<PolicyBundle> bundle(new PolicyBundle);
116  PolicyMap& user_policy_map = bundle->Get(chrome_namespaces);
117
118  ApplyDevicePolicyAsRecommendedPolicy(
119      key::kDeviceLoginScreenDefaultLargeCursorEnabled,
120      key::kLargeCursorEnabled,
121      device_policy_map, &user_policy_map);
122  ApplyDevicePolicyAsRecommendedPolicy(
123      key::kDeviceLoginScreenDefaultSpokenFeedbackEnabled,
124      key::kSpokenFeedbackEnabled,
125      device_policy_map, &user_policy_map);
126  ApplyDevicePolicyAsRecommendedPolicy(
127      key::kDeviceLoginScreenDefaultHighContrastEnabled,
128      key::kHighContrastEnabled,
129      device_policy_map, &user_policy_map);
130  ApplyDevicePolicyAsRecommendedPolicy(
131      key::kDeviceLoginScreenDefaultScreenMagnifierType,
132      key::kScreenMagnifierType,
133      device_policy_map, &user_policy_map);
134
135  // TODO(bartfab): Consolidate power management user policies into a single
136  // JSON policy, allowing the value of the device policy to be simply forwarded
137  // here. http://crbug.com/258339
138  const base::Value* value =
139      device_policy_map.GetValue(key::kDeviceLoginScreenPowerManagement);
140  std::string json;
141  if (value && value->GetAsString(&json)) {
142    LoginScreenPowerManagementPolicy power_management_policy;
143    power_management_policy.Init(json, NULL);
144    ApplyValueAsMandatoryPolicy(power_management_policy.GetScreenDimDelayAC(),
145                                key::kScreenDimDelayAC,
146                                &user_policy_map);
147    ApplyValueAsMandatoryPolicy(power_management_policy.GetScreenOffDelayAC(),
148                                key::kScreenOffDelayAC,
149                                &user_policy_map);
150    ApplyValueAsMandatoryPolicy(power_management_policy.GetIdleDelayAC(),
151                                key::kIdleDelayAC,
152                                &user_policy_map);
153    ApplyValueAsMandatoryPolicy(
154        power_management_policy.GetScreenDimDelayBattery(),
155        key::kScreenDimDelayBattery,
156        &user_policy_map);
157    ApplyValueAsMandatoryPolicy(
158        power_management_policy.GetScreenOffDelayBattery(),
159        key::kScreenOffDelayBattery,
160        &user_policy_map);
161    ApplyValueAsMandatoryPolicy(power_management_policy.GetIdleDelayBattery(),
162                                key::kIdleDelayBattery,
163                                &user_policy_map);
164    ApplyValueAsMandatoryPolicy(power_management_policy.GetIdleActionAC(),
165                                key::kIdleActionAC,
166                                &user_policy_map);
167    ApplyValueAsMandatoryPolicy(power_management_policy.GetIdleActionBattery(),
168                                key::kIdleActionBattery,
169                                &user_policy_map);
170    ApplyValueAsMandatoryPolicy(power_management_policy.GetLidCloseAction(),
171                                key::kLidCloseAction,
172                                &user_policy_map);
173    ApplyValueAsMandatoryPolicy(
174        power_management_policy.GetUserActivityScreenDimDelayScale(),
175        key::kUserActivityScreenDimDelayScale,
176        &user_policy_map);
177  }
178
179  UpdatePolicy(bundle.Pass());
180}
181
182}  // namespace policy
183