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

Side by Side Diff: chrome/browser/policy/configuration_policy_handler_chromeos.cc

Issue 12189011: Split up chrome/browser/policy subdirectory (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase, add chrome/browser/chromeos/policy/OWNERS Created 7 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
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "chrome/browser/policy/configuration_policy_handler_chromeos.h"
6
7 #include <string>
8
9 #include "base/json/json_reader.h"
10 #include "base/json/json_writer.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/prefs/pref_value_map.h"
13 #include "base/string_util.h"
14 #include "base/values.h"
15 #include "chrome/browser/policy/policy_error_map.h"
16 #include "chrome/browser/policy/policy_map.h"
17 #include "chrome/browser/ui/ash/chrome_launcher_prefs.h"
18 #include "chrome/common/pref_names.h"
19 #include "chromeos/network/onc/onc_constants.h"
20 #include "chromeos/network/onc/onc_signature.h"
21 #include "chromeos/network/onc/onc_utils.h"
22 #include "chromeos/network/onc/onc_validator.h"
23 #include "grit/generated_resources.h"
24 #include "policy/policy_constants.h"
25
26 namespace onc = chromeos::onc;
27
28 namespace {
29
30 } // namespace
31
32 namespace policy {
33
34 NetworkConfigurationPolicyHandler::NetworkConfigurationPolicyHandler(
35 const char* policy_name,
36 chromeos::onc::ONCSource onc_source)
37 : TypeCheckingPolicyHandler(policy_name, base::Value::TYPE_STRING),
38 onc_source_(onc_source) {}
39
40 NetworkConfigurationPolicyHandler::~NetworkConfigurationPolicyHandler() {}
41
42 bool NetworkConfigurationPolicyHandler::CheckPolicySettings(
43 const PolicyMap& policies,
44 PolicyErrorMap* errors) {
45 const base::Value* value;
46 if (!CheckAndGetValue(policies, errors, &value))
47 return false;
48
49 if (value) {
50 std::string onc_blob;
51 value->GetAsString(&onc_blob);
52 scoped_ptr<base::DictionaryValue> root_dict =
53 onc::ReadDictionaryFromJson(onc_blob);
54 if (root_dict.get() == NULL) {
55 errors->AddError(policy_name(), IDS_POLICY_NETWORK_CONFIG_PARSE_FAILED);
56 return false;
57 }
58
59 // Validate the ONC dictionary. We are liberal and ignore unknown field
60 // names and ignore invalid field names in kRecommended arrays.
61 onc::Validator validator(false, // Ignore unknown fields.
62 false, // Ignore invalid recommended field names.
63 true, // Fail on missing fields.
64 true); // Validate for managed ONC
65 validator.SetOncSource(onc_source_);
66
67 // ONC policies are always unencrypted.
68 onc::Validator::Result validation_result;
69 root_dict = validator.ValidateAndRepairObject(
70 &onc::kToplevelConfigurationSignature, *root_dict, &validation_result);
71 if (validation_result == onc::Validator::VALID_WITH_WARNINGS) {
72 errors->AddError(policy_name(),
73 IDS_POLICY_NETWORK_CONFIG_IMPORT_PARTIAL);
74 } else if (validation_result == onc::Validator::INVALID) {
75 errors->AddError(policy_name(), IDS_POLICY_NETWORK_CONFIG_IMPORT_FAILED);
76 }
77
78 // In any case, don't reject the policy as some networks or certificates
79 // could still be applied.
80 }
81
82 return true;
83 }
84
85 void NetworkConfigurationPolicyHandler::ApplyPolicySettings(
86 const PolicyMap& policies,
87 PrefValueMap* prefs) {
88 // Network policy is read directly from the provider and injected into
89 // NetworkLibrary, so no need to convert the policy settings into prefs.
90 }
91
92 void NetworkConfigurationPolicyHandler::PrepareForDisplaying(
93 PolicyMap* policies) const {
94 const PolicyMap::Entry* entry = policies->Get(policy_name());
95 if (!entry)
96 return;
97 base::Value* sanitized_config = SanitizeNetworkConfig(entry->value);
98 if (!sanitized_config)
99 sanitized_config = base::Value::CreateNullValue();
100
101 policies->Set(policy_name(), entry->level, entry->scope, sanitized_config);
102 }
103
104 // static
105 base::Value* NetworkConfigurationPolicyHandler::SanitizeNetworkConfig(
106 const base::Value* config) {
107 std::string json_string;
108 if (!config->GetAsString(&json_string))
109 return NULL;
110
111 scoped_ptr<base::Value> json_value(
112 base::JSONReader::Read(json_string, base::JSON_ALLOW_TRAILING_COMMAS));
113 if (!json_value.get() || !json_value->IsType(base::Value::TYPE_DICTIONARY))
114 return NULL;
115
116 base::DictionaryValue* config_dict =
117 static_cast<base::DictionaryValue*>(json_value.get());
118
119 // Strip any sensitive information from the JSON dictionary.
120 base::ListValue* config_list = NULL;
121 if (config_dict->GetList("NetworkConfigurations", &config_list)) {
122 for (base::ListValue::const_iterator network_entry = config_list->begin();
123 network_entry != config_list->end();
124 ++network_entry) {
125 if ((*network_entry) &&
126 (*network_entry)->IsType(base::Value::TYPE_DICTIONARY)) {
127 MaskSensitiveValues(
128 static_cast<base::DictionaryValue*>(*network_entry));
129 }
130 }
131 }
132
133 // Convert back to a string, pretty printing the contents.
134 base::JSONWriter::WriteWithOptions(config_dict,
135 base::JSONWriter::OPTIONS_DO_NOT_ESCAPE |
136 base::JSONWriter::OPTIONS_PRETTY_PRINT,
137 &json_string);
138 return base::Value::CreateStringValue(json_string);
139 }
140
141 // static
142 void NetworkConfigurationPolicyHandler::MaskSensitiveValues(
143 base::DictionaryValue* network_dict) {
144 // Paths of the properties to be replaced by the placeholder. Each entry
145 // specifies dictionary key paths.
146 static const int kMaxComponents = 3;
147 static const char* kFilteredSettings[][kMaxComponents] = {
148 { onc::network_config::kEthernet, onc::ethernet::kEAP,
149 onc::eap::kPassword },
150 { onc::network_config::kVPN, onc::vpn::kIPsec, onc::vpn::kPSK },
151 { onc::network_config::kVPN, onc::vpn::kL2TP, onc::vpn::kPassword },
152 { onc::network_config::kVPN, onc::vpn::kOpenVPN, onc::vpn::kPassword },
153 { onc::network_config::kVPN, onc::vpn::kOpenVPN,
154 onc::vpn::kTLSAuthContents },
155 { onc::network_config::kWiFi, onc::wifi::kEAP, onc::eap::kPassword },
156 { onc::network_config::kWiFi, onc::wifi::kPassphrase },
157 };
158
159 // Placeholder to insert in place of the filtered setting.
160 static const char kPlaceholder[] = "********";
161
162 for (size_t i = 0; i < arraysize(kFilteredSettings); ++i) {
163 const char** path = kFilteredSettings[i];
164 base::DictionaryValue* dict = network_dict;
165 int j = 0;
166 for (j = 0; path[j + 1] != NULL && j + 1 < kMaxComponents; ++j) {
167 if (!dict->GetDictionaryWithoutPathExpansion(path[j], &dict)) {
168 dict = NULL;
169 break;
170 }
171 }
172 if (dict && dict->RemoveWithoutPathExpansion(path[j], NULL)) {
173 dict->SetWithoutPathExpansion(
174 path[j], base::Value::CreateStringValue(kPlaceholder));
175 }
176 }
177 }
178
179 PinnedLauncherAppsPolicyHandler::PinnedLauncherAppsPolicyHandler()
180 : ExtensionListPolicyHandler(key::kPinnedLauncherApps,
181 prefs::kPinnedLauncherApps,
182 false) {}
183
184 PinnedLauncherAppsPolicyHandler::~PinnedLauncherAppsPolicyHandler() {}
185
186 void PinnedLauncherAppsPolicyHandler::ApplyPolicySettings(
187 const PolicyMap& policies,
188 PrefValueMap* prefs) {
189 PolicyErrorMap errors;
190 const base::Value* policy_value = policies.GetValue(policy_name());
191 const base::ListValue* policy_list = NULL;
192 if (policy_value && policy_value->GetAsList(&policy_list) && policy_list) {
193 base::ListValue* pinned_apps_list = new base::ListValue();
194 for (base::ListValue::const_iterator entry(policy_list->begin());
195 entry != policy_list->end(); ++entry) {
196 std::string id;
197 if ((*entry)->GetAsString(&id)) {
198 base::DictionaryValue* app_dict = new base::DictionaryValue();
199 app_dict->SetString(ash::kPinnedAppsPrefAppIDPath, id);
200 pinned_apps_list->Append(app_dict);
201 }
202 }
203 prefs->SetValue(pref_path(), pinned_apps_list);
204 }
205 }
206
207 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698