Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Side by Side Diff: components/policy/core/common/policy_loader_mac.cc

Issue 179813008: Move PolicyLoaderMac::CreateValueFromProperty to a generic file. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: POLICY_EXPORT Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/policy/core/common/policy_loader_mac.h" 5 #include "components/policy/core/common/policy_loader_mac.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
11 #include "base/mac/foundation_util.h" 11 #include "base/mac/foundation_util.h"
12 #include "base/mac/scoped_cftyperef.h" 12 #include "base/mac/scoped_cftyperef.h"
13 #include "base/path_service.h" 13 #include "base/path_service.h"
14 #include "base/platform_file.h" 14 #include "base/platform_file.h"
15 #include "base/sequenced_task_runner.h" 15 #include "base/sequenced_task_runner.h"
16 #include "base/strings/sys_string_conversions.h" 16 #include "base/strings/sys_string_conversions.h"
17 #include "base/values.h" 17 #include "base/values.h"
18 #include "components/policy/core/common/external_data_fetcher.h" 18 #include "components/policy/core/common/external_data_fetcher.h"
19 #include "components/policy/core/common/mac_util.h"
19 #include "components/policy/core/common/policy_bundle.h" 20 #include "components/policy/core/common/policy_bundle.h"
20 #include "components/policy/core/common/policy_load_status.h" 21 #include "components/policy/core/common/policy_load_status.h"
21 #include "components/policy/core/common/policy_map.h" 22 #include "components/policy/core/common/policy_map.h"
22 #include "components/policy/core/common/preferences_mac.h" 23 #include "components/policy/core/common/preferences_mac.h"
23 #include "components/policy/core/common/schema.h" 24 #include "components/policy/core/common/schema.h"
24 #include "components/policy/core/common/schema_map.h" 25 #include "components/policy/core/common/schema_map.h"
25 26
26 using base::mac::CFCast;
27 using base::ScopedCFTypeRef; 27 using base::ScopedCFTypeRef;
28 28
29 namespace policy { 29 namespace policy {
30 30
31 namespace {
32
33 // Callback function for CFDictionaryApplyFunction. |key| and |value| are an
34 // entry of the CFDictionary that should be converted into an equivalent entry
35 // in the DictionaryValue in |context|.
36 void DictionaryEntryToValue(const void* key, const void* value, void* context) {
37 if (CFStringRef cf_key = CFCast<CFStringRef>(key)) {
38 base::Value* converted =
39 PolicyLoaderMac::CreateValueFromProperty(
40 static_cast<CFPropertyListRef>(value));
41 if (converted) {
42 const std::string string = base::SysCFStringRefToUTF8(cf_key);
43 static_cast<base::DictionaryValue *>(context)->Set(string, converted);
44 }
45 }
46 }
47
48 // Callback function for CFArrayApplyFunction. |value| is an entry of the
49 // CFArray that should be converted into an equivalent entry in the ListValue
50 // in |context|.
51 void ArrayEntryToValue(const void* value, void* context) {
52 base::Value* converted =
53 PolicyLoaderMac::CreateValueFromProperty(
54 static_cast<CFPropertyListRef>(value));
55 if (converted)
56 static_cast<base::ListValue *>(context)->Append(converted);
57 }
58
59 } // namespace
60
61 PolicyLoaderMac::PolicyLoaderMac( 31 PolicyLoaderMac::PolicyLoaderMac(
62 scoped_refptr<base::SequencedTaskRunner> task_runner, 32 scoped_refptr<base::SequencedTaskRunner> task_runner,
63 const base::FilePath& managed_policy_path, 33 const base::FilePath& managed_policy_path,
64 MacPreferences* preferences) 34 MacPreferences* preferences)
65 : AsyncPolicyLoader(task_runner), 35 : AsyncPolicyLoader(task_runner),
66 preferences_(preferences), 36 preferences_(preferences),
67 managed_policy_path_(managed_policy_path) {} 37 managed_policy_path_(managed_policy_path) {}
68 38
69 PolicyLoaderMac::~PolicyLoaderMac() {} 39 PolicyLoaderMac::~PolicyLoaderMac() {}
70 40
(...skipping 24 matching lines...) Expand all
95 base::ScopedCFTypeRef<CFPropertyListRef> value( 65 base::ScopedCFTypeRef<CFPropertyListRef> value(
96 preferences_->CopyAppValue(name, kCFPreferencesCurrentApplication)); 66 preferences_->CopyAppValue(name, kCFPreferencesCurrentApplication));
97 if (!value.get()) 67 if (!value.get())
98 continue; 68 continue;
99 policy_present = true; 69 policy_present = true;
100 bool forced = 70 bool forced =
101 preferences_->AppValueIsForced(name, kCFPreferencesCurrentApplication); 71 preferences_->AppValueIsForced(name, kCFPreferencesCurrentApplication);
102 PolicyLevel level = forced ? POLICY_LEVEL_MANDATORY : 72 PolicyLevel level = forced ? POLICY_LEVEL_MANDATORY :
103 POLICY_LEVEL_RECOMMENDED; 73 POLICY_LEVEL_RECOMMENDED;
104 // TODO(joaodasilva): figure the policy scope. 74 // TODO(joaodasilva): figure the policy scope.
105 base::Value* policy = CreateValueFromProperty(value); 75 scoped_ptr<base::Value> policy = PropertyToValue(value);
106 if (policy) 76 if (policy) {
107 chrome_policy.Set(it.key(), level, POLICY_SCOPE_USER, policy, NULL); 77 chrome_policy.Set(
108 else 78 it.key(), level, POLICY_SCOPE_USER, policy.release(), NULL);
79 } else {
109 status.Add(POLICY_LOAD_STATUS_PARSE_ERROR); 80 status.Add(POLICY_LOAD_STATUS_PARSE_ERROR);
81 }
110 } 82 }
111 83
112 if (!policy_present) 84 if (!policy_present)
113 status.Add(POLICY_LOAD_STATUS_NO_POLICY); 85 status.Add(POLICY_LOAD_STATUS_NO_POLICY);
114 86
115 // Load policy for the registered components. 87 // Load policy for the registered components.
116 LoadPolicyForDomain(POLICY_DOMAIN_EXTENSIONS, "extensions", bundle.get()); 88 LoadPolicyForDomain(POLICY_DOMAIN_EXTENSIONS, "extensions", bundle.get());
117 89
118 return bundle.Pass(); 90 return bundle.Pass();
119 } 91 }
120 92
121 base::Time PolicyLoaderMac::LastModificationTime() { 93 base::Time PolicyLoaderMac::LastModificationTime() {
122 base::File::Info file_info; 94 base::File::Info file_info;
123 if (!base::GetFileInfo(managed_policy_path_, &file_info) || 95 if (!base::GetFileInfo(managed_policy_path_, &file_info) ||
124 file_info.is_directory) { 96 file_info.is_directory) {
125 return base::Time(); 97 return base::Time();
126 } 98 }
127 99
128 return file_info.last_modified; 100 return file_info.last_modified;
129 } 101 }
130 102
131 // static
132 base::Value* PolicyLoaderMac::CreateValueFromProperty(
133 CFPropertyListRef property) {
134 if (CFCast<CFNullRef>(property))
135 return base::Value::CreateNullValue();
136
137 if (CFBooleanRef boolean = CFCast<CFBooleanRef>(property))
138 return base::Value::CreateBooleanValue(CFBooleanGetValue(boolean));
139
140 if (CFNumberRef number = CFCast<CFNumberRef>(property)) {
141 // CFNumberGetValue() converts values implicitly when the conversion is not
142 // lossy. Check the type before trying to convert.
143 if (CFNumberIsFloatType(number)) {
144 double double_value;
145 if (CFNumberGetValue(number, kCFNumberDoubleType, &double_value))
146 return base::Value::CreateDoubleValue(double_value);
147 } else {
148 int int_value;
149 if (CFNumberGetValue(number, kCFNumberIntType, &int_value))
150 return base::Value::CreateIntegerValue(int_value);
151 }
152 }
153
154 if (CFStringRef string = CFCast<CFStringRef>(property))
155 return base::Value::CreateStringValue(base::SysCFStringRefToUTF8(string));
156
157 if (CFDictionaryRef dict = CFCast<CFDictionaryRef>(property)) {
158 base::DictionaryValue* dict_value = new base::DictionaryValue();
159 CFDictionaryApplyFunction(dict, DictionaryEntryToValue, dict_value);
160 return dict_value;
161 }
162
163 if (CFArrayRef array = CFCast<CFArrayRef>(property)) {
164 base::ListValue* list_value = new base::ListValue();
165 CFArrayApplyFunction(array,
166 CFRangeMake(0, CFArrayGetCount(array)),
167 ArrayEntryToValue,
168 list_value);
169 return list_value;
170 }
171
172 return NULL;
173 }
174
175 void PolicyLoaderMac::LoadPolicyForDomain( 103 void PolicyLoaderMac::LoadPolicyForDomain(
176 PolicyDomain domain, 104 PolicyDomain domain,
177 const std::string& domain_name, 105 const std::string& domain_name,
178 PolicyBundle* bundle) { 106 PolicyBundle* bundle) {
179 std::string id_prefix(base::mac::BaseBundleID()); 107 std::string id_prefix(base::mac::BaseBundleID());
180 id_prefix.append(".").append(domain_name).append("."); 108 id_prefix.append(".").append(domain_name).append(".");
181 109
182 const ComponentMap* components = schema_map()->GetComponents(domain); 110 const ComponentMap* components = schema_map()->GetComponents(domain);
183 if (!components) 111 if (!components)
184 return; 112 return;
(...skipping 26 matching lines...) Expand all
211 base::ScopedCFTypeRef<CFStringRef> pref_name( 139 base::ScopedCFTypeRef<CFStringRef> pref_name(
212 base::SysUTF8ToCFStringRef(it.key())); 140 base::SysUTF8ToCFStringRef(it.key()));
213 base::ScopedCFTypeRef<CFPropertyListRef> value( 141 base::ScopedCFTypeRef<CFPropertyListRef> value(
214 preferences_->CopyAppValue(pref_name, bundle_id)); 142 preferences_->CopyAppValue(pref_name, bundle_id));
215 if (!value.get()) 143 if (!value.get())
216 continue; 144 continue;
217 bool forced = 145 bool forced =
218 preferences_->AppValueIsForced(pref_name, bundle_id); 146 preferences_->AppValueIsForced(pref_name, bundle_id);
219 PolicyLevel level = forced ? POLICY_LEVEL_MANDATORY : 147 PolicyLevel level = forced ? POLICY_LEVEL_MANDATORY :
220 POLICY_LEVEL_RECOMMENDED; 148 POLICY_LEVEL_RECOMMENDED;
221 scoped_ptr<base::Value> policy_value(CreateValueFromProperty(value)); 149 scoped_ptr<base::Value> policy_value = PropertyToValue(value);
222 if (policy_value) { 150 if (policy_value) {
223 policy->Set(it.key(), level, POLICY_SCOPE_USER, 151 policy->Set(it.key(), level, POLICY_SCOPE_USER,
224 policy_value.release(), NULL); 152 policy_value.release(), NULL);
225 } 153 }
226 } 154 }
227 } 155 }
228 156
229 void PolicyLoaderMac::OnFileUpdated(const base::FilePath& path, bool error) { 157 void PolicyLoaderMac::OnFileUpdated(const base::FilePath& path, bool error) {
230 if (!error) 158 if (!error)
231 Reload(false); 159 Reload(false);
232 } 160 }
233 161
234 } // namespace policy 162 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698