login_profile_policy_provider.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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 "components/policy/core/browser/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 ApplyDevicePolicyAsRecommendedPolicy( 135 key::kDeviceLoginScreenDefaultVirtualKeyboardEnabled, 136 key::kVirtualKeyboardEnabled, 137 device_policy_map, &user_policy_map); 138 139 // TODO(bartfab): Consolidate power management user policies into a single 140 // JSON policy, allowing the value of the device policy to be simply forwarded 141 // here. http://crbug.com/258339 142 const base::Value* value = 143 device_policy_map.GetValue(key::kDeviceLoginScreenPowerManagement); 144 std::string json; 145 if (value && value->GetAsString(&json)) { 146 LoginScreenPowerManagementPolicy power_management_policy; 147 power_management_policy.Init(json, NULL); 148 ApplyValueAsMandatoryPolicy(power_management_policy.GetScreenDimDelayAC(), 149 key::kScreenDimDelayAC, 150 &user_policy_map); 151 ApplyValueAsMandatoryPolicy(power_management_policy.GetScreenOffDelayAC(), 152 key::kScreenOffDelayAC, 153 &user_policy_map); 154 ApplyValueAsMandatoryPolicy(power_management_policy.GetIdleDelayAC(), 155 key::kIdleDelayAC, 156 &user_policy_map); 157 ApplyValueAsMandatoryPolicy( 158 power_management_policy.GetScreenDimDelayBattery(), 159 key::kScreenDimDelayBattery, 160 &user_policy_map); 161 ApplyValueAsMandatoryPolicy( 162 power_management_policy.GetScreenOffDelayBattery(), 163 key::kScreenOffDelayBattery, 164 &user_policy_map); 165 ApplyValueAsMandatoryPolicy(power_management_policy.GetIdleDelayBattery(), 166 key::kIdleDelayBattery, 167 &user_policy_map); 168 ApplyValueAsMandatoryPolicy(power_management_policy.GetIdleActionAC(), 169 key::kIdleActionAC, 170 &user_policy_map); 171 ApplyValueAsMandatoryPolicy(power_management_policy.GetIdleActionBattery(), 172 key::kIdleActionBattery, 173 &user_policy_map); 174 ApplyValueAsMandatoryPolicy(power_management_policy.GetLidCloseAction(), 175 key::kLidCloseAction, 176 &user_policy_map); 177 ApplyValueAsMandatoryPolicy( 178 power_management_policy.GetUserActivityScreenDimDelayScale(), 179 key::kUserActivityScreenDimDelayScale, 180 &user_policy_map); 181 } 182 183 UpdatePolicy(bundle.Pass()); 184} 185 186} // namespace policy 187