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