OLD | NEW |
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 "chrome/browser/policy/configuration_policy_handler_chromeos.h" | 5 #include "chrome/browser/policy/configuration_policy_handler_chromeos.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/json/json_reader.h" | 9 #include "base/json/json_reader.h" |
10 #include "base/json/json_writer.h" | 10 #include "base/json/json_writer.h" |
11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
12 #include "base/string_util.h" | 12 #include "base/string_util.h" |
| 13 #include "base/values.h" |
| 14 #include "chrome/browser/chromeos/cros/onc_constants.h" |
13 #include "chrome/browser/chromeos/cros/onc_network_parser.h" | 15 #include "chrome/browser/chromeos/cros/onc_network_parser.h" |
14 #include "chrome/browser/policy/policy_error_map.h" | 16 #include "chrome/browser/policy/policy_error_map.h" |
15 #include "chrome/browser/policy/policy_map.h" | 17 #include "chrome/browser/policy/policy_map.h" |
16 #include "chrome/browser/prefs/pref_value_map.h" | 18 #include "chrome/browser/prefs/pref_value_map.h" |
17 #include "chrome/browser/ui/ash/chrome_launcher_prefs.h" | 19 #include "chrome/browser/ui/ash/chrome_launcher_prefs.h" |
18 #include "chrome/common/pref_names.h" | 20 #include "chrome/common/pref_names.h" |
19 #include "grit/generated_resources.h" | 21 #include "grit/generated_resources.h" |
20 #include "policy/policy_constants.h" | 22 #include "policy/policy_constants.h" |
21 | 23 |
| 24 namespace onc = chromeos::onc; |
| 25 |
22 namespace policy { | 26 namespace policy { |
23 | 27 |
24 NetworkConfigurationPolicyHandler::NetworkConfigurationPolicyHandler( | 28 NetworkConfigurationPolicyHandler::NetworkConfigurationPolicyHandler( |
25 const char* policy_name, | 29 const char* policy_name, |
26 chromeos::NetworkUIData::ONCSource onc_source) | 30 chromeos::NetworkUIData::ONCSource onc_source) |
27 : TypeCheckingPolicyHandler(policy_name, Value::TYPE_STRING), | 31 : TypeCheckingPolicyHandler(policy_name, base::Value::TYPE_STRING), |
28 onc_source_(onc_source) {} | 32 onc_source_(onc_source) {} |
29 | 33 |
30 NetworkConfigurationPolicyHandler::~NetworkConfigurationPolicyHandler() {} | 34 NetworkConfigurationPolicyHandler::~NetworkConfigurationPolicyHandler() {} |
31 | 35 |
32 bool NetworkConfigurationPolicyHandler::CheckPolicySettings( | 36 bool NetworkConfigurationPolicyHandler::CheckPolicySettings( |
33 const PolicyMap& policies, | 37 const PolicyMap& policies, |
34 PolicyErrorMap* errors) { | 38 PolicyErrorMap* errors) { |
35 const Value* value; | 39 const base::Value* value; |
36 if (!CheckAndGetValue(policies, errors, &value)) | 40 if (!CheckAndGetValue(policies, errors, &value)) |
37 return false; | 41 return false; |
38 | 42 |
39 if (value) { | 43 if (value) { |
40 std::string onc_blob; | 44 std::string onc_blob; |
41 value->GetAsString(&onc_blob); | 45 value->GetAsString(&onc_blob); |
42 // Policy-based ONC blobs cannot have a passphrase. | 46 // Policy-based ONC blobs cannot have a passphrase. |
43 chromeos::OncNetworkParser parser(onc_blob, "", onc_source_); | 47 chromeos::OncNetworkParser parser(onc_blob, "", onc_source_); |
44 if (!parser.parse_error().empty()) { | 48 if (!parser.parse_error().empty()) { |
45 errors->AddError(policy_name(), | 49 errors->AddError(policy_name(), |
(...skipping 11 matching lines...) Expand all Loading... |
57 PrefValueMap* prefs) { | 61 PrefValueMap* prefs) { |
58 // Network policy is read directly from the provider and injected into | 62 // Network policy is read directly from the provider and injected into |
59 // NetworkLibrary, so no need to convert the policy settings into prefs. | 63 // NetworkLibrary, so no need to convert the policy settings into prefs. |
60 } | 64 } |
61 | 65 |
62 void NetworkConfigurationPolicyHandler::PrepareForDisplaying( | 66 void NetworkConfigurationPolicyHandler::PrepareForDisplaying( |
63 PolicyMap* policies) const { | 67 PolicyMap* policies) const { |
64 const PolicyMap::Entry* entry = policies->Get(policy_name()); | 68 const PolicyMap::Entry* entry = policies->Get(policy_name()); |
65 if (!entry) | 69 if (!entry) |
66 return; | 70 return; |
67 Value* sanitized_config = SanitizeNetworkConfig(entry->value); | 71 base::Value* sanitized_config = SanitizeNetworkConfig(entry->value); |
68 if (!sanitized_config) | 72 if (!sanitized_config) |
69 sanitized_config = Value::CreateNullValue(); | 73 sanitized_config = base::Value::CreateNullValue(); |
70 | 74 |
71 policies->Set(policy_name(), entry->level, entry->scope, sanitized_config); | 75 policies->Set(policy_name(), entry->level, entry->scope, sanitized_config); |
72 } | 76 } |
73 | 77 |
74 // static | 78 // static |
75 Value* NetworkConfigurationPolicyHandler::SanitizeNetworkConfig( | 79 base::Value* NetworkConfigurationPolicyHandler::SanitizeNetworkConfig( |
76 const Value* config) { | 80 const base::Value* config) { |
77 std::string json_string; | 81 std::string json_string; |
78 if (!config->GetAsString(&json_string)) | 82 if (!config->GetAsString(&json_string)) |
79 return NULL; | 83 return NULL; |
80 | 84 |
81 scoped_ptr<Value> json_value( | 85 scoped_ptr<base::Value> json_value( |
82 base::JSONReader::Read(json_string, base::JSON_ALLOW_TRAILING_COMMAS)); | 86 base::JSONReader::Read(json_string, base::JSON_ALLOW_TRAILING_COMMAS)); |
83 if (!json_value.get() || !json_value->IsType(base::Value::TYPE_DICTIONARY)) | 87 if (!json_value.get() || !json_value->IsType(base::Value::TYPE_DICTIONARY)) |
84 return NULL; | 88 return NULL; |
85 | 89 |
86 DictionaryValue* config_dict = | 90 base::DictionaryValue* config_dict = |
87 static_cast<DictionaryValue*>(json_value.get()); | 91 static_cast<base::DictionaryValue*>(json_value.get()); |
88 | 92 |
89 // Strip any sensitive information from the JSON dictionary. | 93 // Strip any sensitive information from the JSON dictionary. |
90 base::ListValue* config_list = NULL; | 94 base::ListValue* config_list = NULL; |
91 if (config_dict->GetList("NetworkConfigurations", &config_list)) { | 95 if (config_dict->GetList("NetworkConfigurations", &config_list)) { |
92 for (base::ListValue::const_iterator network_entry = config_list->begin(); | 96 for (base::ListValue::const_iterator network_entry = config_list->begin(); |
93 network_entry != config_list->end(); | 97 network_entry != config_list->end(); |
94 ++network_entry) { | 98 ++network_entry) { |
95 if ((*network_entry) && | 99 if ((*network_entry) && |
96 (*network_entry)->IsType(base::Value::TYPE_DICTIONARY)) { | 100 (*network_entry)->IsType(base::Value::TYPE_DICTIONARY)) { |
97 StripSensitiveValues(static_cast<DictionaryValue*>(*network_entry)); | 101 MaskSensitiveValues( |
| 102 static_cast<base::DictionaryValue*>(*network_entry)); |
98 } | 103 } |
99 } | 104 } |
100 } | 105 } |
101 | 106 |
102 // Convert back to a string, pretty printing the contents. | 107 // Convert back to a string, pretty printing the contents. |
103 base::JSONWriter::WriteWithOptions(config_dict, | 108 base::JSONWriter::WriteWithOptions(config_dict, |
104 base::JSONWriter::OPTIONS_DO_NOT_ESCAPE | | 109 base::JSONWriter::OPTIONS_DO_NOT_ESCAPE | |
105 base::JSONWriter::OPTIONS_PRETTY_PRINT, | 110 base::JSONWriter::OPTIONS_PRETTY_PRINT, |
106 &json_string); | 111 &json_string); |
107 return Value::CreateStringValue(json_string); | 112 return base::Value::CreateStringValue(json_string); |
108 } | 113 } |
109 | 114 |
110 // static | 115 // static |
111 void NetworkConfigurationPolicyHandler::StripSensitiveValues( | 116 void NetworkConfigurationPolicyHandler::MaskSensitiveValues( |
112 DictionaryValue* network_dict) { | 117 base::DictionaryValue* network_dict) { |
113 // List of settings we filter from the network dictionary. | 118 // Paths of the properties to be replaced by the placeholder. Each entry |
114 static const char* kFilteredSettings[] = { | 119 // specifies dictionary key paths. |
115 "WiFi.Passphrase", | 120 static const int kMaxComponents = 3; |
116 "IPsec.EAP.Password", | 121 static const char* kFilteredSettings[][kMaxComponents] = { |
117 "IPsec.EAP.Password", | 122 { onc::kEthernet, onc::ethernet::kEAP, onc::eap::kPassword }, |
118 "IPsec.XAUTH.Password", | 123 { onc::kVPN, onc::vpn::kIPsec, onc::vpn::kPSK }, |
119 "L2TP.Password", | 124 { onc::kVPN, onc::vpn::kL2TP, onc::vpn::kPassword }, |
| 125 { onc::kVPN, onc::vpn::kOpenVPN, onc::vpn::kPassword }, |
| 126 { onc::kWiFi, onc::wifi::kEAP, onc::eap::kPassword }, |
| 127 { onc::kWiFi, onc::wifi::kPassphrase }, |
120 }; | 128 }; |
| 129 |
121 // Placeholder to insert in place of the filtered setting. | 130 // Placeholder to insert in place of the filtered setting. |
122 static const char kPlaceholder[] = "********"; | 131 static const char kPlaceholder[] = "********"; |
123 | 132 |
124 for (size_t i = 0; i < arraysize(kFilteredSettings); ++i) { | 133 for (size_t i = 0; i < arraysize(kFilteredSettings); ++i) { |
125 if (network_dict->Remove(kFilteredSettings[i], NULL)) { | 134 const char** path = kFilteredSettings[i]; |
126 network_dict->Set(kFilteredSettings[i], | 135 base::DictionaryValue* dict = network_dict; |
127 Value::CreateStringValue(kPlaceholder)); | 136 int j = 0; |
| 137 for (j = 0; path[j + 1] != NULL && j + 1 < kMaxComponents; ++j) { |
| 138 if (!dict->GetDictionaryWithoutPathExpansion(path[j], &dict)) { |
| 139 dict = NULL; |
| 140 break; |
| 141 } |
| 142 } |
| 143 if (dict && dict->RemoveWithoutPathExpansion(path[j], NULL)) { |
| 144 dict->SetWithoutPathExpansion( |
| 145 path[j], base::Value::CreateStringValue(kPlaceholder)); |
128 } | 146 } |
129 } | 147 } |
130 } | 148 } |
131 | 149 |
132 PinnedLauncherAppsPolicyHandler::PinnedLauncherAppsPolicyHandler() | 150 PinnedLauncherAppsPolicyHandler::PinnedLauncherAppsPolicyHandler() |
133 : ExtensionListPolicyHandler(key::kPinnedLauncherApps, | 151 : ExtensionListPolicyHandler(key::kPinnedLauncherApps, |
134 prefs::kPinnedLauncherApps, | 152 prefs::kPinnedLauncherApps, |
135 false) {} | 153 false) {} |
136 | 154 |
137 PinnedLauncherAppsPolicyHandler::~PinnedLauncherAppsPolicyHandler() {} | 155 PinnedLauncherAppsPolicyHandler::~PinnedLauncherAppsPolicyHandler() {} |
(...skipping 13 matching lines...) Expand all Loading... |
151 base::DictionaryValue* app_dict = new base::DictionaryValue(); | 169 base::DictionaryValue* app_dict = new base::DictionaryValue(); |
152 app_dict->SetString(ash::kPinnedAppsPrefAppIDPath, id); | 170 app_dict->SetString(ash::kPinnedAppsPrefAppIDPath, id); |
153 pinned_apps_list->Append(app_dict); | 171 pinned_apps_list->Append(app_dict); |
154 } | 172 } |
155 } | 173 } |
156 prefs->SetValue(pref_path(), pinned_apps_list); | 174 prefs->SetValue(pref_path(), pinned_apps_list); |
157 } | 175 } |
158 } | 176 } |
159 | 177 |
160 } // namespace policy | 178 } // namespace policy |
OLD | NEW |