OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chromeos/network/managed_network_configuration_handler_impl.h" | 5 #include "chromeos/network/managed_network_configuration_handler_impl.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/guid.h" | 10 #include "base/guid.h" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
69 } | 69 } |
70 | 70 |
71 void LogErrorWithDict(const tracked_objects::Location& from_where, | 71 void LogErrorWithDict(const tracked_objects::Location& from_where, |
72 const std::string& error_name, | 72 const std::string& error_name, |
73 scoped_ptr<base::DictionaryValue> error_data) { | 73 scoped_ptr<base::DictionaryValue> error_data) { |
74 device_event_log::AddEntry(from_where.file_name(), from_where.line_number(), | 74 device_event_log::AddEntry(from_where.file_name(), from_where.line_number(), |
75 device_event_log::LOG_TYPE_NETWORK, | 75 device_event_log::LOG_TYPE_NETWORK, |
76 device_event_log::LOG_LEVEL_ERROR, error_name); | 76 device_event_log::LOG_LEVEL_ERROR, error_name); |
77 } | 77 } |
78 | 78 |
79 const base::DictionaryValue* GetByGUID(const GuidToPolicyMap& policies, | 79 const base::DictionaryValue* GetPolicyByGUID(const GuidToPolicyMap& policies, |
80 const std::string& guid) { | 80 const std::string& guid) { |
81 GuidToPolicyMap::const_iterator it = policies.find(guid); | 81 GuidToPolicyMap::const_iterator it = policies.find(guid); |
82 if (it == policies.end()) | 82 if (it == policies.end()) |
83 return NULL; | 83 return NULL; |
84 return it->second; | 84 return it->second; |
85 } | 85 } |
86 | 86 |
87 scoped_ptr<base::DictionaryValue> ExtractShillDeviceSettings( | |
88 base::DictionaryValue* user_settings) { | |
89 scoped_ptr<base::DictionaryValue> shill_device_settings( | |
90 new base::DictionaryValue); | |
91 // Only extract specific properties that can be set in Shill. | |
92 base::DictionaryValue* cellular; | |
93 if (user_settings->GetDictionaryWithoutPathExpansion( | |
94 ::onc::network_config::kCellular, &cellular)) { | |
95 scoped_ptr<base::Value> value; | |
96 if (cellular->RemoveWithoutPathExpansion(::onc::cellular::kCarrier, | |
97 &value)) { | |
98 shill_device_settings->SetWithoutPathExpansion(shill::kCarrierProperty, | |
99 value.Pass()); | |
100 } | |
101 if (cellular->RemoveWithoutPathExpansion(::onc::cellular::kAllowRoaming, | |
102 &value)) { | |
103 shill_device_settings->SetWithoutPathExpansion( | |
104 shill::kCellularAllowRoamingProperty, value.Pass()); | |
105 } | |
106 } | |
107 return shill_device_settings.Pass(); | |
108 } | |
109 | |
87 } // namespace | 110 } // namespace |
88 | 111 |
89 struct ManagedNetworkConfigurationHandlerImpl::Policies { | 112 struct ManagedNetworkConfigurationHandlerImpl::Policies { |
90 ~Policies(); | 113 ~Policies(); |
91 | 114 |
92 GuidToPolicyMap per_network_config; | 115 GuidToPolicyMap per_network_config; |
93 base::DictionaryValue global_network_config; | 116 base::DictionaryValue global_network_config; |
94 }; | 117 }; |
95 | 118 |
96 ManagedNetworkConfigurationHandlerImpl::Policies::~Policies() { | 119 ManagedNetworkConfigurationHandlerImpl::Policies::~Policies() { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
171 const base::DictionaryValue* network_policy = NULL; | 194 const base::DictionaryValue* network_policy = NULL; |
172 const base::DictionaryValue* global_policy = NULL; | 195 const base::DictionaryValue* global_policy = NULL; |
173 if (profile) { | 196 if (profile) { |
174 const Policies* policies = GetPoliciesForProfile(*profile); | 197 const Policies* policies = GetPoliciesForProfile(*profile); |
175 if (!policies) { | 198 if (!policies) { |
176 InvokeErrorCallback( | 199 InvokeErrorCallback( |
177 service_path, error_callback, kPoliciesNotInitialized); | 200 service_path, error_callback, kPoliciesNotInitialized); |
178 return; | 201 return; |
179 } | 202 } |
180 if (!guid.empty()) | 203 if (!guid.empty()) |
181 network_policy = GetByGUID(policies->per_network_config, guid); | 204 network_policy = GetPolicyByGUID(policies->per_network_config, guid); |
182 global_policy = &policies->global_network_config; | 205 global_policy = &policies->global_network_config; |
183 } | 206 } |
184 | 207 |
185 scoped_ptr<base::DictionaryValue> augmented_properties( | 208 scoped_ptr<base::DictionaryValue> augmented_properties( |
186 policy_util::CreateManagedONC(global_policy, | 209 policy_util::CreateManagedONC(global_policy, |
187 network_policy, | 210 network_policy, |
188 user_settings, | 211 user_settings, |
189 active_settings.get(), | 212 active_settings.get(), |
190 profile)); | 213 profile)); |
191 callback.Run(service_path, *augmented_properties); | 214 callback.Run(service_path, *augmented_properties); |
(...skipping 27 matching lines...) Expand all Loading... | |
219 &onc::kNetworkWithStateSignature)); | 242 &onc::kNetworkWithStateSignature)); |
220 callback.Run(service_path, *onc_network); | 243 callback.Run(service_path, *onc_network); |
221 } | 244 } |
222 | 245 |
223 // SetProperties | 246 // SetProperties |
224 | 247 |
225 void ManagedNetworkConfigurationHandlerImpl::SetProperties( | 248 void ManagedNetworkConfigurationHandlerImpl::SetProperties( |
226 const std::string& service_path, | 249 const std::string& service_path, |
227 const base::DictionaryValue& user_settings, | 250 const base::DictionaryValue& user_settings, |
228 const base::Closure& callback, | 251 const base::Closure& callback, |
229 const network_handler::ErrorCallback& error_callback) const { | 252 const network_handler::ErrorCallback& error_callback) { |
230 const NetworkState* state = | 253 const NetworkState* state = |
231 network_state_handler_->GetNetworkStateFromServicePath( | 254 network_state_handler_->GetNetworkStateFromServicePath( |
232 service_path, true /* configured_only */); | 255 service_path, true /* configured_only */); |
233 if (!state) { | 256 if (!state) { |
234 InvokeErrorCallback(service_path, error_callback, kUnknownNetwork); | 257 InvokeErrorCallback(service_path, error_callback, kUnknownNetwork); |
235 return; | 258 return; |
236 } | 259 } |
237 | 260 |
238 std::string guid = state->guid(); | 261 std::string guid = state->guid(); |
239 DCHECK(!guid.empty()); | 262 DCHECK(!guid.empty()); |
(...skipping 20 matching lines...) Expand all Loading... | |
260 | 283 |
261 // We need to ensure that required configuration properties (e.g. Type) are | 284 // We need to ensure that required configuration properties (e.g. Type) are |
262 // included for ONC validation and translation to Shill properties. | 285 // included for ONC validation and translation to Shill properties. |
263 scoped_ptr<base::DictionaryValue> user_settings_copy( | 286 scoped_ptr<base::DictionaryValue> user_settings_copy( |
264 user_settings.DeepCopy()); | 287 user_settings.DeepCopy()); |
265 user_settings_copy->SetStringWithoutPathExpansion( | 288 user_settings_copy->SetStringWithoutPathExpansion( |
266 ::onc::network_config::kType, | 289 ::onc::network_config::kType, |
267 network_util::TranslateShillTypeToONC(state->type())); | 290 network_util::TranslateShillTypeToONC(state->type())); |
268 user_settings_copy->MergeDictionary(&user_settings); | 291 user_settings_copy->MergeDictionary(&user_settings); |
269 | 292 |
293 // Extract any Device properties to apply separately, before validation. | |
pneubeck (no reviews)
2015/03/24 16:19:52
any reason to do this before validation?
So far, a
| |
294 scoped_ptr<base::DictionaryValue> shill_device_dictionary( | |
295 ExtractShillDeviceSettings(user_settings_copy.get())); | |
296 | |
270 // Validate the ONC dictionary. We are liberal and ignore unknown field | 297 // Validate the ONC dictionary. We are liberal and ignore unknown field |
271 // names. User settings are only partial ONC, thus we ignore missing fields. | 298 // names. User settings are only partial ONC, thus we ignore missing fields. |
272 onc::Validator validator(false, // Ignore unknown fields. | 299 onc::Validator validator(false, // Ignore unknown fields. |
273 false, // Ignore invalid recommended field names. | 300 false, // Ignore invalid recommended field names. |
274 false, // Ignore missing fields. | 301 false, // Ignore missing fields. |
275 false); // This ONC does not come from policy. | 302 false); // This ONC does not come from policy. |
276 | 303 |
277 onc::Validator::Result validation_result; | 304 onc::Validator::Result validation_result; |
278 scoped_ptr<base::DictionaryValue> validated_user_settings = | 305 scoped_ptr<base::DictionaryValue> validated_user_settings = |
279 validator.ValidateAndRepairObject( | 306 validator.ValidateAndRepairObject( |
280 &onc::kNetworkConfigurationSignature, | 307 &onc::kNetworkConfigurationSignature, |
281 *user_settings_copy, | 308 *user_settings_copy, |
282 &validation_result); | 309 &validation_result); |
283 if (validation_result == onc::Validator::INVALID) { | 310 if (validation_result == onc::Validator::INVALID) { |
284 InvokeErrorCallback(service_path, error_callback, kInvalidUserSettings); | 311 InvokeErrorCallback(service_path, error_callback, kInvalidUserSettings); |
285 return; | 312 return; |
286 } | 313 } |
287 if (validation_result == onc::Validator::VALID_WITH_WARNINGS) | 314 if (validation_result == onc::Validator::VALID_WITH_WARNINGS) |
288 LOG(WARNING) << "Validation of ONC user settings produced warnings."; | 315 LOG(WARNING) << "Validation of ONC user settings produced warnings."; |
289 | 316 |
290 // Fill in HexSSID field from contents of SSID field if not set already. | 317 // Fill in HexSSID field from contents of SSID field if not set already. |
291 if (user_settings_copy) { | 318 onc::FillInHexSSIDFieldsInOncObject(onc::kNetworkConfigurationSignature, |
292 onc::FillInHexSSIDFieldsInOncObject(onc::kNetworkConfigurationSignature, | 319 validated_user_settings.get()); |
293 validated_user_settings.get()); | |
294 } | |
295 | 320 |
296 const base::DictionaryValue* network_policy = | 321 const base::DictionaryValue* network_policy = |
297 GetByGUID(policies->per_network_config, guid); | 322 GetPolicyByGUID(policies->per_network_config, guid); |
298 VLOG(2) << "This configuration is " << (network_policy ? "" : "not ") | 323 VLOG(2) << "This configuration is " << (network_policy ? "" : "not ") |
299 << "managed."; | 324 << "managed."; |
300 | 325 |
301 scoped_ptr<base::DictionaryValue> shill_dictionary( | 326 scoped_ptr<base::DictionaryValue> shill_dictionary( |
302 policy_util::CreateShillConfiguration(*profile, | 327 policy_util::CreateShillConfiguration(*profile, |
303 guid, | 328 guid, |
304 &policies->global_network_config, | 329 &policies->global_network_config, |
305 network_policy, | 330 network_policy, |
306 validated_user_settings.get())); | 331 validated_user_settings.get())); |
307 | 332 |
333 if (!shill_device_dictionary->empty() && network_device_handler_) { | |
334 SetShillDeviceProperties( | |
335 state->device_path(), shill_device_dictionary.Pass(), | |
336 base::Bind( | |
337 &ManagedNetworkConfigurationHandlerImpl::SetShillServiceProperties, | |
338 weak_ptr_factory_.GetWeakPtr(), service_path, | |
339 base::Passed(&shill_dictionary), callback, error_callback), | |
340 error_callback); | |
341 } else { | |
342 SetShillServiceProperties(service_path, shill_dictionary.Pass(), callback, | |
343 error_callback); | |
344 } | |
345 } | |
346 | |
347 void ManagedNetworkConfigurationHandlerImpl::SetShillDeviceProperties( | |
pneubeck (no reviews)
2015/03/24 16:19:52
this should really, really move to the NetworkDevi
| |
348 const std::string& device_path, | |
349 scoped_ptr<base::DictionaryValue> shill_device_dictionary, | |
350 const base::Closure& callback, | |
351 const network_handler::ErrorCallback& error_callback) { | |
352 // Note: The 'Remove' calls here are crucial to ensure we do not start an | |
353 // infinte callback chain. | |
354 scoped_ptr<base::Value> shill_value; | |
355 if (shill_device_dictionary->RemoveWithoutPathExpansion( | |
356 shill::kCarrierProperty, &shill_value)) { | |
357 std::string carrier; | |
358 shill_value->GetAsString(&carrier); | |
359 NET_LOG(USER) << "SetCarrier: " << device_path << ": " << carrier; | |
360 network_device_handler_->SetCarrier( | |
361 device_path, carrier, | |
362 base::Bind( | |
363 &ManagedNetworkConfigurationHandlerImpl::SetShillDeviceProperties, | |
364 weak_ptr_factory_.GetWeakPtr(), device_path, | |
365 base::Passed(&shill_device_dictionary), callback, error_callback), | |
366 error_callback); | |
367 return; | |
368 } | |
369 if (shill_device_dictionary->empty()) { | |
370 callback.Run(); | |
371 return; | |
372 } | |
373 // We have to set Device properites one at a time, but setting them is rare. | |
374 base::DictionaryValue::Iterator iter(*shill_device_dictionary); | |
375 std::string key = iter.key(); | |
376 if (shill_device_dictionary->RemoveWithoutPathExpansion(key, &shill_value)) { | |
377 NET_LOG(USER) << "SetDeviceProperty: " << device_path << ": " << key << "=" | |
378 << *shill_value; | |
379 network_device_handler_->SetDeviceProperty( | |
380 device_path, key, *shill_value, | |
381 base::Bind( | |
382 &ManagedNetworkConfigurationHandlerImpl::SetShillDeviceProperties, | |
383 weak_ptr_factory_.GetWeakPtr(), device_path, | |
384 base::Passed(&shill_device_dictionary), callback, error_callback), | |
385 error_callback); | |
386 } | |
387 } | |
388 | |
389 void ManagedNetworkConfigurationHandlerImpl::SetShillServiceProperties( | |
390 const std::string& service_path, | |
391 scoped_ptr<base::DictionaryValue> shill_service_dictionary, | |
392 const base::Closure& callback, | |
393 const network_handler::ErrorCallback& error_callback) { | |
308 network_configuration_handler_->SetShillProperties( | 394 network_configuration_handler_->SetShillProperties( |
309 service_path, *shill_dictionary, | 395 service_path, *shill_service_dictionary, |
310 NetworkConfigurationObserver::SOURCE_USER_ACTION, callback, | 396 NetworkConfigurationObserver::SOURCE_USER_ACTION, callback, |
311 error_callback); | 397 error_callback); |
312 } | 398 } |
313 | 399 |
314 void ManagedNetworkConfigurationHandlerImpl::CreateConfiguration( | 400 void ManagedNetworkConfigurationHandlerImpl::CreateConfiguration( |
315 const std::string& userhash, | 401 const std::string& userhash, |
316 const base::DictionaryValue& properties, | 402 const base::DictionaryValue& properties, |
317 const network_handler::StringResultCallback& callback, | 403 const network_handler::StringResultCallback& callback, |
318 const network_handler::ErrorCallback& error_callback) const { | 404 const network_handler::ErrorCallback& error_callback) const { |
319 const Policies* policies = GetPoliciesForUser(userhash); | 405 const Policies* policies = GetPoliciesForUser(userhash); |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
565 ManagedNetworkConfigurationHandlerImpl::FindPolicyByGUID( | 651 ManagedNetworkConfigurationHandlerImpl::FindPolicyByGUID( |
566 const std::string userhash, | 652 const std::string userhash, |
567 const std::string& guid, | 653 const std::string& guid, |
568 ::onc::ONCSource* onc_source) const { | 654 ::onc::ONCSource* onc_source) const { |
569 *onc_source = ::onc::ONC_SOURCE_NONE; | 655 *onc_source = ::onc::ONC_SOURCE_NONE; |
570 | 656 |
571 if (!userhash.empty()) { | 657 if (!userhash.empty()) { |
572 const Policies* user_policies = GetPoliciesForUser(userhash); | 658 const Policies* user_policies = GetPoliciesForUser(userhash); |
573 if (user_policies) { | 659 if (user_policies) { |
574 const base::DictionaryValue* policy = | 660 const base::DictionaryValue* policy = |
575 GetByGUID(user_policies->per_network_config, guid); | 661 GetPolicyByGUID(user_policies->per_network_config, guid); |
576 if (policy) { | 662 if (policy) { |
577 *onc_source = ::onc::ONC_SOURCE_USER_POLICY; | 663 *onc_source = ::onc::ONC_SOURCE_USER_POLICY; |
578 return policy; | 664 return policy; |
579 } | 665 } |
580 } | 666 } |
581 } | 667 } |
582 | 668 |
583 const Policies* device_policies = GetPoliciesForUser(std::string()); | 669 const Policies* device_policies = GetPoliciesForUser(std::string()); |
584 if (device_policies) { | 670 if (device_policies) { |
585 const base::DictionaryValue* policy = | 671 const base::DictionaryValue* policy = |
586 GetByGUID(device_policies->per_network_config, guid); | 672 GetPolicyByGUID(device_policies->per_network_config, guid); |
587 if (policy) { | 673 if (policy) { |
588 *onc_source = ::onc::ONC_SOURCE_DEVICE_POLICY; | 674 *onc_source = ::onc::ONC_SOURCE_DEVICE_POLICY; |
589 return policy; | 675 return policy; |
590 } | 676 } |
591 } | 677 } |
592 | 678 |
593 return NULL; | 679 return NULL; |
594 } | 680 } |
595 | 681 |
596 const GuidToPolicyMap* | 682 const GuidToPolicyMap* |
(...skipping 24 matching lines...) Expand all Loading... | |
621 network_profile_handler_->GetProfileForPath(profile_path); | 707 network_profile_handler_->GetProfileForPath(profile_path); |
622 if (!profile) { | 708 if (!profile) { |
623 NET_LOG_ERROR("Profile path unknown:" + profile_path, guid); | 709 NET_LOG_ERROR("Profile path unknown:" + profile_path, guid); |
624 return NULL; | 710 return NULL; |
625 } | 711 } |
626 | 712 |
627 const Policies* policies = GetPoliciesForProfile(*profile); | 713 const Policies* policies = GetPoliciesForProfile(*profile); |
628 if (!policies) | 714 if (!policies) |
629 return NULL; | 715 return NULL; |
630 | 716 |
631 return GetByGUID(policies->per_network_config, guid); | 717 return GetPolicyByGUID(policies->per_network_config, guid); |
632 } | 718 } |
633 | 719 |
634 const ManagedNetworkConfigurationHandlerImpl::Policies* | 720 const ManagedNetworkConfigurationHandlerImpl::Policies* |
635 ManagedNetworkConfigurationHandlerImpl::GetPoliciesForUser( | 721 ManagedNetworkConfigurationHandlerImpl::GetPoliciesForUser( |
636 const std::string& userhash) const { | 722 const std::string& userhash) const { |
637 UserToPoliciesMap::const_iterator it = policies_by_user_.find(userhash); | 723 UserToPoliciesMap::const_iterator it = policies_by_user_.find(userhash); |
638 if (it == policies_by_user_.end()) | 724 if (it == policies_by_user_.end()) |
639 return NULL; | 725 return NULL; |
640 return it->second.get(); | 726 return it->second.get(); |
641 } | 727 } |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
801 scoped_ptr<base::DictionaryValue> network_properties, | 887 scoped_ptr<base::DictionaryValue> network_properties, |
802 GetDevicePropertiesCallback send_callback, | 888 GetDevicePropertiesCallback send_callback, |
803 const std::string& error_name, | 889 const std::string& error_name, |
804 scoped_ptr<base::DictionaryValue> error_data) { | 890 scoped_ptr<base::DictionaryValue> error_data) { |
805 NET_LOG_ERROR("Error getting device properties", service_path); | 891 NET_LOG_ERROR("Error getting device properties", service_path); |
806 send_callback.Run(service_path, network_properties.Pass()); | 892 send_callback.Run(service_path, network_properties.Pass()); |
807 } | 893 } |
808 | 894 |
809 | 895 |
810 } // namespace chromeos | 896 } // namespace chromeos |
OLD | NEW |