Index: chromeos/network/managed_network_configuration_handler_impl.cc |
diff --git a/chromeos/network/managed_network_configuration_handler_impl.cc b/chromeos/network/managed_network_configuration_handler_impl.cc |
index 3e6a324b292a0b045662b67406f7dc8f4abfa0a9..eb16c55d7f5add1faea8b3ae6290bfadbe70cef0 100644 |
--- a/chromeos/network/managed_network_configuration_handler_impl.cc |
+++ b/chromeos/network/managed_network_configuration_handler_impl.cc |
@@ -28,6 +28,7 @@ |
#include "chromeos/network/network_state.h" |
#include "chromeos/network/network_state_handler.h" |
#include "chromeos/network/network_ui_data.h" |
+#include "chromeos/network/network_util.h" |
#include "chromeos/network/onc/onc_merger.h" |
#include "chromeos/network/onc/onc_signature.h" |
#include "chromeos/network/onc/onc_translator.h" |
@@ -265,6 +266,15 @@ void ManagedNetworkConfigurationHandlerImpl::SetProperties( |
return; |
} |
+ // We need to ensure that required configuration properties (e.g. Type) are |
+ // included for ONC validation and translation to Shill properties. |
+ scoped_ptr<base::DictionaryValue> user_settings_copy( |
+ user_settings.DeepCopy()); |
+ user_settings_copy->SetStringWithoutPathExpansion( |
+ ::onc::network_config::kType, |
+ network_util::TranslateShillTypeToONC(state->type())); |
+ user_settings_copy->MergeDictionary(&user_settings); |
+ |
// Validate the ONC dictionary. We are liberal and ignore unknown field |
// names. User settings are only partial ONC, thus we ignore missing fields. |
onc::Validator validator(false, // Ignore unknown fields. |
@@ -276,7 +286,7 @@ void ManagedNetworkConfigurationHandlerImpl::SetProperties( |
scoped_ptr<base::DictionaryValue> validated_user_settings = |
validator.ValidateAndRepairObject( |
&onc::kNetworkConfigurationSignature, |
- user_settings, |
+ *user_settings_copy, |
&validation_result); |
if (validation_result == onc::Validator::INVALID) { |
@@ -722,14 +732,17 @@ void ManagedNetworkConfigurationHandlerImpl::GetPropertiesCallback( |
scoped_ptr<base::DictionaryValue> shill_properties_copy( |
shill_properties.DeepCopy()); |
- // Add associated Device properties before the ONC translation. |
- GetDeviceStateProperties(service_path, shill_properties_copy.get()); |
+ std::string type; |
+ shill_properties_copy->GetStringWithoutPathExpansion(shill::kTypeProperty, |
+ &type); |
+ // Add associated DeviceState properties for non-VPN networks. |
+ if (type != shill::kTypeVPN) |
+ GetDeviceStateProperties(service_path, shill_properties_copy.get()); |
- // Only request Device properties for Cellular networks with a valid device. |
- std::string type, device_path; |
+ // Only request additional Device properties for Cellular networks with a |
+ // valid device. |
+ std::string device_path; |
if (!network_device_handler_ || |
- !shill_properties_copy->GetStringWithoutPathExpansion( |
- shill::kTypeProperty, &type) || |
type != shill::kTypeCellular || |
!shill_properties_copy->GetStringWithoutPathExpansion( |
shill::kDeviceProperty, &device_path) || |