| 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 c91cfdaadf292386f1a49c46e3db26bf8ef0024d..9336b3356bfcb9a12a3429b4ad2fd27edb87746f 100644
 | 
| --- a/chromeos/network/managed_network_configuration_handler_impl.cc
 | 
| +++ b/chromeos/network/managed_network_configuration_handler_impl.cc
 | 
| @@ -354,14 +354,58 @@ void ManagedNetworkConfigurationHandlerImpl::CreateConfiguration(
 | 
|      const base::DictionaryValue& properties,
 | 
|      const network_handler::ServiceResultCallback& callback,
 | 
|      const network_handler::ErrorCallback& error_callback) const {
 | 
| -  const Policies* policies = GetPoliciesForUser(userhash);
 | 
| +  // 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.
 | 
| +                           false,   // Ignore invalid recommended field names.
 | 
| +                           false,   // Ignore missing fields.
 | 
| +                           false);  // This ONC does not come from policy.
 | 
| +
 | 
| +  onc::Validator::Result validation_result;
 | 
| +  std::unique_ptr<base::DictionaryValue> validated_properties =
 | 
| +      validator.ValidateAndRepairObject(&onc::kNetworkConfigurationSignature,
 | 
| +                                        properties, &validation_result);
 | 
| +
 | 
| +  if (validation_result == onc::Validator::INVALID) {
 | 
| +    InvokeErrorCallback("", error_callback, kInvalidUserSettings);
 | 
| +    return;
 | 
| +  }
 | 
| +
 | 
| +  if (validation_result == onc::Validator::VALID_WITH_WARNINGS)
 | 
| +    LOG(WARNING) << "Validation of ONC user settings produced warnings.";
 | 
| +
 | 
| +  // Fill in HexSSID field from contents of SSID field if not set already - this
 | 
| +  // is required to properly match the configuration against existing policies.
 | 
| +  if (validated_properties) {
 | 
| +    onc::FillInHexSSIDFieldsInOncObject(onc::kNetworkConfigurationSignature,
 | 
| +                                        validated_properties.get());
 | 
| +  }
 | 
| +
 | 
| +  // Make sure the network is not configured through a user policy.
 | 
| +  const Policies* policies = nullptr;
 | 
| +  if (!userhash.empty()) {
 | 
| +    policies = GetPoliciesForUser(userhash);
 | 
| +    if (!policies) {
 | 
| +      InvokeErrorCallback("", error_callback, kPoliciesNotInitialized);
 | 
| +      return;
 | 
| +    }
 | 
| +
 | 
| +    if (policy_util::FindMatchingPolicy(policies->per_network_config,
 | 
| +                                        *validated_properties)) {
 | 
| +      InvokeErrorCallback("", error_callback, kNetworkAlreadyConfigured);
 | 
| +      return;
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  // Make user the network is not configured through a device policy.
 | 
| +  policies = GetPoliciesForUser("");
 | 
|    if (!policies) {
 | 
|      InvokeErrorCallback("", error_callback, kPoliciesNotInitialized);
 | 
|      return;
 | 
|    }
 | 
|  
 | 
|    if (policy_util::FindMatchingPolicy(policies->per_network_config,
 | 
| -                                      properties)) {
 | 
| +                                      *validated_properties)) {
 | 
|      InvokeErrorCallback("", error_callback, kNetworkAlreadyConfigured);
 | 
|      return;
 | 
|    }
 | 
| @@ -384,7 +428,7 @@ void ManagedNetworkConfigurationHandlerImpl::CreateConfiguration(
 | 
|        policy_util::CreateShillConfiguration(*profile, guid,
 | 
|                                              NULL,  // no global policy
 | 
|                                              NULL,  // no network policy
 | 
| -                                            &properties));
 | 
| +                                            validated_properties.get()));
 | 
|  
 | 
|    network_configuration_handler_->CreateShillConfiguration(
 | 
|        *shill_dictionary, NetworkConfigurationObserver::SOURCE_USER_ACTION,
 | 
| 
 |