configuration_policy_provider_mac.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
1bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen// found in the LICENSE file. 4bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 5bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "chrome/browser/policy/configuration_policy_provider_mac.h" 6bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 7bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/logging.h" 8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/mac/scoped_cftyperef.h" 9bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen#include "base/sys_string_conversions.h" 10bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 11bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsennamespace policy { 12bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 13bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenConfigurationPolicyProviderMac::ConfigurationPolicyProviderMac( 14bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const StaticPolicyValueMap& policy_map) 15bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : ConfigurationPolicyProvider(policy_map), 16bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen preferences_(new MacPreferences()) { 17bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 18bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 19bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian MonsenConfigurationPolicyProviderMac::ConfigurationPolicyProviderMac( 20bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const StaticPolicyValueMap& policy_map, MacPreferences* preferences) 21bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen : ConfigurationPolicyProvider(policy_map), preferences_(preferences) { 22bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 23bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 24bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsenbool ConfigurationPolicyProviderMac::Provide(ConfigurationPolicyStore* store) { 25bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen const PolicyValueMap& mapping = policy_value_map(); 26bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 27bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (PolicyValueMap::const_iterator current = mapping.begin(); 28bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen current != mapping.end(); ++current) { 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick base::mac::ScopedCFTypeRef<CFStringRef> name( 30bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::SysUTF8ToCFStringRef(current->name)); 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick base::mac::ScopedCFTypeRef<CFPropertyListRef> value( 32bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen preferences_->CopyAppValue(name, kCFPreferencesCurrentApplication)); 33bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!value.get()) 34bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen continue; 35bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (!preferences_->AppValueIsForced(name, kCFPreferencesCurrentApplication)) 36bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen continue; 37bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 38bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen switch (current->value_type) { 39bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case Value::TYPE_STRING: 40bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (CFGetTypeID(value) == CFStringGetTypeID()) { 41bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string string_value = 42bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::SysCFStringRefToUTF8((CFStringRef)value.get()); 43bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen store->Apply( 44bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen current->policy_type, 45bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Value::CreateStringValue(string_value)); 46bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 47bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 48bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case Value::TYPE_BOOLEAN: 49bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (CFGetTypeID(value) == CFBooleanGetTypeID()) { 50bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool bool_value = CFBooleanGetValue((CFBooleanRef)value.get()); 51bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen store->Apply(current->policy_type, 52bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Value::CreateBooleanValue(bool_value)); 53bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 54bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 55bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case Value::TYPE_INTEGER: 56bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (CFGetTypeID(value) == CFNumberGetTypeID()) { 57bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen int int_value; 58bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool cast = CFNumberGetValue((CFNumberRef)value.get(), 59bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen kCFNumberIntType, 60bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen &int_value); 61bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (cast) 62bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen store->Apply(current->policy_type, 63bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen Value::CreateIntegerValue(int_value)); 64bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 65bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 66bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen case Value::TYPE_LIST: 67bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (CFGetTypeID(value) == CFArrayGetTypeID()) { 68bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen scoped_ptr<ListValue> list_value(new ListValue); 69bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen bool valid_array = true; 70bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen CFArrayRef array_value = (CFArrayRef)value.get(); 71bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen for (CFIndex i = 0; i < CFArrayGetCount(array_value); ++i) { 72bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen // For now we assume that all values are strings. 73bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen CFStringRef array_string = 74bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen (CFStringRef)CFArrayGetValueAtIndex(array_value, i); 75bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (CFGetTypeID(array_string) == CFStringGetTypeID()) { 76bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen std::string array_string_value = 77bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen base::SysCFStringRefToUTF8(array_string); 78bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen list_value->Append(Value::CreateStringValue(array_string_value)); 79bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } else { 80bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen valid_array = false; 81bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 82bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 83bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen if (valid_array) 84bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen store->Apply(current->policy_type, list_value.release()); 85bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 86bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen break; 87bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen default: 88bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen NOTREACHED(); 89bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return false; 90bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 91bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen } 92bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 93bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen return true; 94bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} 95bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen 96bda42a81ee5f9b20d2bebedcf0bbef1e30e5b293Kristian Monsen} // namespace policy 97