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