Chromium Code Reviews| Index: chromeos/network/onc/onc_validator.cc |
| diff --git a/chromeos/network/onc/onc_validator.cc b/chromeos/network/onc/onc_validator.cc |
| index 684eca32eeebf42b8b9d44e0d7f3d926f6839f82..cb320970521437e9babba2e5add883260db60723 100644 |
| --- a/chromeos/network/onc/onc_validator.cc |
| +++ b/chromeos/network/onc/onc_validator.cc |
| @@ -7,7 +7,9 @@ |
| #include <algorithm> |
| #include <string> |
| +#include "base/json/json_writer.h" |
| #include "base/logging.h" |
| +#include "base/string_number_conversions.h" |
| #include "base/string_util.h" |
| #include "base/values.h" |
| #include "chromeos/network/onc/onc_constants.h" |
| @@ -16,6 +18,33 @@ |
| namespace chromeos { |
| namespace onc { |
| +namespace { |
| + |
| +std::string ValueToString(const base::Value& value) { |
| + std::string json; |
| + base::JSONWriter::Write(&value, &json); |
| + return json; |
| +} |
| + |
| +// Copied from policy/configuration_policy_handler.cc. |
| +// TODO(pneubeck): move to a common place like base/. |
| +std::string ValueTypeToString(Value::Type type) { |
| + static const char* strings[] = { |
| + "null", |
| + "boolean", |
| + "integer", |
| + "double", |
| + "string", |
| + "binary", |
| + "dictionary", |
| + "list" |
| + }; |
| + DCHECK(static_cast<size_t>(type) < arraysize(strings)); |
|
pastarmovj
2012/12/13 10:15:44
Make this a CHECK you'll segfault if you go beyond
pneubeck (no reviews)
2012/12/13 14:10:03
Fixed also in the original source file.
|
| + return strings[type]; |
| +} |
| + |
| +} // namespace |
| + |
| Validator::Validator( |
| bool error_on_unknown_field, |
| bool error_on_wrong_recommended, |
| @@ -32,10 +61,22 @@ Validator::~Validator() { |
| scoped_ptr<base::DictionaryValue> Validator::ValidateAndRepairObject( |
| const OncValueSignature* object_signature, |
| - const base::DictionaryValue& onc_object) { |
| + const base::DictionaryValue& onc_object, |
| + Result* result) { |
| CHECK(object_signature != NULL); |
| + *result = VALID; |
| + error_or_warning_found_ = false; |
| + bool error = false; |
| scoped_ptr<base::Value> result_value = |
| - MapValue(*object_signature, onc_object); |
| + MapValue(*object_signature, onc_object, &error); |
| + if (error) { |
| + *result = INVALID; |
| + result_value.reset(); |
| + } else if (error_or_warning_found_) { |
| + *result = VALID_WITH_WARNINGS; |
| + } |
| + DCHECK_EQ(result_value.get() == NULL, *result == INVALID); |
|
pastarmovj
2012/12/13 10:15:44
Please put a comment here that the value should be
pneubeck (no reviews)
2012/12/13 14:10:03
Done.
|
| + |
| base::DictionaryValue* result_dict = NULL; |
| if (result_value.get() != NULL) { |
| result_value.release()->GetAsDictionary(&result_dict); |
| @@ -47,14 +88,19 @@ scoped_ptr<base::DictionaryValue> Validator::ValidateAndRepairObject( |
| scoped_ptr<base::Value> Validator::MapValue( |
| const OncValueSignature& signature, |
| - const base::Value& onc_value) { |
| + const base::Value& onc_value, |
| + bool* error) { |
| if (onc_value.GetType() != signature.onc_type) { |
| - DVLOG(1) << "Wrong type. Expected " << signature.onc_type |
| - << ", but found " << onc_value.GetType(); |
| + LOG(ERROR) << ErrorHeader() << "Found value '" << ValueToString(onc_value) |
|
Joao da Silva
2012/12/13 09:51:35
ValueToString is not needed, base/values.h has ope
pneubeck (no reviews)
2012/12/13 14:10:03
Done.
|
| + << "' of type '" << ValueTypeToString(onc_value.GetType()) |
| + << "', but type '" << ValueTypeToString(signature.onc_type) |
| + << "' is required."; |
| + error_or_warning_found_ = *error = true; |
| return scoped_ptr<base::Value>(); |
| } |
| - scoped_ptr<base::Value> repaired = Mapper::MapValue(signature, onc_value); |
| + scoped_ptr<base::Value> repaired = |
| + Mapper::MapValue(signature, onc_value, error); |
| if (repaired.get() != NULL) |
| CHECK_EQ(repaired->GetType(), signature.onc_type); |
| return repaired.Pass(); |
| @@ -62,11 +108,14 @@ scoped_ptr<base::Value> Validator::MapValue( |
| scoped_ptr<base::DictionaryValue> Validator::MapObject( |
| const OncValueSignature& signature, |
| - const base::DictionaryValue& onc_object) { |
| + const base::DictionaryValue& onc_object, |
| + bool* error) { |
| scoped_ptr<base::DictionaryValue> repaired(new base::DictionaryValue); |
| bool valid; |
| - if (&signature == &kNetworkConfigurationSignature) |
| + if (&signature == &kToplevelConfigurationSignature) |
|
pastarmovj
2012/12/13 10:15:44
It's a pity we can't do cases on strings :(
pneubeck (no reviews)
2012/12/13 14:10:03
These are actually not strings but pointers, still
|
| + valid = ValidateToplevelConfiguration(onc_object, repaired.get()); |
| + else if (&signature == &kNetworkConfigurationSignature) |
| valid = ValidateNetworkConfiguration(onc_object, repaired.get()); |
| else if (&signature == &kEthernetSignature) |
| valid = ValidateEthernet(onc_object, repaired.get()); |
| @@ -93,10 +142,52 @@ scoped_ptr<base::DictionaryValue> Validator::MapObject( |
| else |
| valid = ValidateObjectDefault(signature, onc_object, repaired.get()); |
| - if (valid) |
| + if (valid) { |
| return repaired.Pass(); |
| - else |
| + } else { |
| + error_or_warning_found_ = *error = true; |
| return scoped_ptr<base::DictionaryValue>(); |
| + } |
| +} |
| + |
| +scoped_ptr<base::Value> Validator::MapField( |
| + const std::string& field_name, |
| + const OncValueSignature& object_signature, |
| + const base::Value& onc_value, |
| + bool* found_unknown_field, |
| + bool* error) { |
| + path_.push_back(field_name); |
| + bool current_field_unknown = false; |
| + scoped_ptr<base::Value> result = Mapper::MapField( |
| + field_name, object_signature, onc_value, ¤t_field_unknown, error); |
| + |
| + DCHECK_EQ(field_name, path_.back()); |
| + path_.pop_back(); |
| + |
| + if (current_field_unknown) { |
| + error_or_warning_found_ = *found_unknown_field = true; |
| + std::string message = MessageHeader(error_on_unknown_field_) |
| + + "Field name '" + field_name + "' is unknown."; |
| + if (error_on_unknown_field_) |
| + LOG(ERROR) << message; |
| + else |
| + LOG(WARNING) << message; |
| + } |
| + |
| + return result.Pass(); |
| +} |
| + |
| +scoped_ptr<base::Value> Validator::MapEntry(int index, |
| + const OncValueSignature& signature, |
| + const base::Value& onc_value, |
| + bool* error) { |
| + std::string str = base::IntToString(index); |
| + path_.push_back(str); |
| + scoped_ptr<base::Value> result = Mapper::MapEntry(index, signature, |
|
pastarmovj
2012/12/13 10:15:44
I'd rather split this after the =
pneubeck (no reviews)
2012/12/13 14:10:03
Done.
|
| + onc_value, error); |
| + DCHECK_EQ(str, path_.back()); |
| + path_.pop_back(); |
| + return result.Pass(); |
| } |
| bool Validator::ValidateObjectDefault( |
| @@ -107,17 +198,15 @@ bool Validator::ValidateObjectDefault( |
| bool nested_error_occured = false; |
| MapFields(signature, onc_object, &found_unknown_field, &nested_error_occured, |
| result); |
| - if (nested_error_occured) |
| - return false; |
| - if (found_unknown_field) { |
| - if (error_on_unknown_field_) { |
| - DVLOG(1) << "Unknown field name. Aborting."; |
| - return false; |
| - } |
| - DVLOG(1) << "Unknown field name. Ignoring."; |
| + if (found_unknown_field && error_on_unknown_field_) { |
| + DVLOG(1) << "Unknown field names are errors: Aborting."; |
| + return false; |
| } |
| + if (nested_error_occured) |
| + return false; |
| + |
| return ValidateRecommendedField(signature, result); |
| } |
| @@ -140,8 +229,8 @@ bool Validator::ValidateRecommendedField( |
| recommended.reset(recommended_list); |
| if (!managed_onc_) { |
| - DVLOG(1) << "Found a " << onc::kRecommended |
| - << " field in unmanaged ONC. Removing it."; |
| + LOG(WARNING) << WarningHeader() << "Found the field '" << onc::kRecommended |
| + << "' in an unmanaged ONC. Removing it."; |
| return true; |
| } |
| @@ -169,13 +258,19 @@ bool Validator::ValidateRecommendedField( |
| } |
| if (found_error) { |
| - DVLOG(1) << "Found " << error_cause << " field name '" << field_name |
| - << "' in kRecommended array. " |
| - << (error_on_wrong_recommended_ ? "Aborting." : "Ignoring."); |
| - if (error_on_wrong_recommended_) |
| + error_or_warning_found_ = true; |
| + path_.push_back(onc::kRecommended); |
| + std::string message = MessageHeader(error_on_wrong_recommended_) + |
| + "The " + error_cause + " field '" + field_name + |
| + "' cannot be recommended."; |
| + path_.pop_back(); |
| + if (error_on_wrong_recommended_) { |
| + LOG(ERROR) << message; |
| return false; |
| - else |
| + } else { |
| + LOG(WARNING) << message; |
| continue; |
| + } |
| } |
| repaired_recommended->Append((*it)->DeepCopy()); |
| @@ -195,33 +290,93 @@ std::string JoinStringRange(const char** range_begin, |
| return JoinString(string_vector, separator); |
| } |
| -bool RequireAnyOf(const std::string &actual, const char** valid_values) { |
| +} // namespace |
| + |
| +bool Validator::FieldExistsAndHasNoValueOf(const base::DictionaryValue& object, |
| + const std::string &field_name, |
| + const char** valid_values) { |
|
pastarmovj
2012/12/13 10:15:44
I think the way you pass this array is somewhat er
pneubeck (no reviews)
2012/12/13 14:10:03
We already had a discussion about that previously
|
| + std::string actual_value; |
| + if (!object.GetStringWithoutPathExpansion(field_name, &actual_value)) |
| + return false; |
| + |
| const char** it = valid_values; |
| for (; *it != NULL; ++it) { |
| - if (actual == *it) |
| - return true; |
| + if (actual_value == *it) |
| + return false; |
| } |
| - DVLOG(1) << "Found " << actual << ", but expected one of " |
| - << JoinStringRange(valid_values, it, ", "); |
| - return false; |
| + error_or_warning_found_ = true; |
| + std::string valid_values_str = |
| + "[" + JoinStringRange(valid_values, it, ", ") + "]"; |
| + path_.push_back(field_name); |
| + LOG(ERROR) << ErrorHeader() << "Found value '" << actual_value << |
| + "', but expected one of the values " << valid_values_str; |
| + path_.pop_back(); |
| + return true; |
| } |
| -bool IsInRange(int actual, int lower_bound, int upper_bound) { |
| - if (lower_bound <= actual && actual <= upper_bound) |
| - return true; |
| - DVLOG(1) << "Found " << actual << ", which is out of range [" << lower_bound |
| - << ", " << upper_bound << "]"; |
| - return false; |
| +bool Validator::FieldExistsAndIsNotInRange(const base::DictionaryValue& object, |
| + const std::string &field_name, |
| + int lower_bound, |
| + int upper_bound) { |
| + int actual_value; |
| + if (!object.GetIntegerWithoutPathExpansion(field_name, &actual_value) || |
| + (lower_bound <= actual_value && actual_value <= upper_bound)) { |
| + return false; |
| + } |
| + error_or_warning_found_ = true; |
| + path_.push_back(field_name); |
| + LOG(ERROR) << ErrorHeader() << "Found value '" << actual_value |
| + << "', but expected a value in the range [" << lower_bound |
| + << ", " << upper_bound << "] (boundaries inclusive)"; |
| + path_.pop_back(); |
| + return true; |
| } |
| -bool RequireField(const base::DictionaryValue& dict, std::string key) { |
| - if (dict.HasKey(key)) |
| +bool Validator::RequireField(const base::DictionaryValue& dict, |
| + const std::string& field_name) { |
| + if (dict.HasKey(field_name)) |
| return true; |
| - DVLOG(1) << "Required field " << key << " missing."; |
| + error_or_warning_found_ = true; |
| + LOG(ERROR) << ErrorHeader() << "The required field '" << field_name |
| + << "' is missing."; |
| return false; |
| } |
| -} // namespace |
| +bool Validator::ValidateToplevelConfiguration( |
| + const base::DictionaryValue& onc_object, |
| + base::DictionaryValue* result) { |
| + if (!ValidateObjectDefault(kToplevelConfigurationSignature, |
| + onc_object, result)) { |
| + return false; |
| + } |
| + |
| + static const char* kValidTypes[] = |
| + { kUnencryptedConfiguration, kEncryptedConfiguration, NULL }; |
| + if (FieldExistsAndHasNoValueOf(*result, kType, kValidTypes)) |
| + return false; |
| + |
| + bool allRequiredExist = true; |
| + |
| + // Not part of the ONC spec yet: |
| + // We don't require the type field and default to UnencryptedConfiguration. |
| + std::string type = kUnencryptedConfiguration; |
| + result->GetStringWithoutPathExpansion(kType, &type); |
| + if (type == kUnencryptedConfiguration && |
| + !result->HasKey(kNetworkConfigurations) && |
| + !result->HasKey(kCertificates)) { |
| + error_or_warning_found_ = true; |
| + std::string message = MessageHeader(error_on_missing_field_) + |
| + "Neither the field '" + kNetworkConfigurations + "' nor '" + |
| + kCertificates + "is present, but at least one is required."; |
| + if (error_on_missing_field_) |
| + LOG(ERROR) << message; |
| + else |
| + LOG(WARNING) << message; |
| + allRequiredExist = false; |
| + } |
| + |
| + return !error_on_missing_field_ || allRequiredExist; |
| +} |
| bool Validator::ValidateNetworkConfiguration( |
| const base::DictionaryValue& onc_object, |
| @@ -231,12 +386,9 @@ bool Validator::ValidateNetworkConfiguration( |
| return false; |
| } |
| - std::string type; |
| static const char* kValidTypes[] = { kEthernet, kVPN, kWiFi, NULL }; |
| - if (result->GetStringWithoutPathExpansion(kType, &type) && |
| - !RequireAnyOf(type, kValidTypes)) { |
| + if (FieldExistsAndHasNoValueOf(*result, kType, kValidTypes)) |
| return false; |
| - } |
| bool allRequiredExist = RequireField(*result, kGUID); |
| @@ -245,6 +397,9 @@ bool Validator::ValidateNetworkConfiguration( |
| if (!remove) { |
| allRequiredExist &= RequireField(*result, kName); |
| allRequiredExist &= RequireField(*result, kType); |
| + |
| + std::string type; |
| + result->GetStringWithoutPathExpansion(kType, &type); |
| allRequiredExist &= type.empty() || RequireField(*result, type); |
| } |
| @@ -258,14 +413,15 @@ bool Validator::ValidateEthernet( |
| if (!ValidateObjectDefault(kEthernetSignature, onc_object, result)) |
| return false; |
| - std::string auth; |
| static const char* kValidAuthentications[] = { kNone, k8021X, NULL }; |
| - if (result->GetStringWithoutPathExpansion(kAuthentication, &auth) && |
| - !RequireAnyOf(auth, kValidAuthentications)) { |
| + if (FieldExistsAndHasNoValueOf(*result, kAuthentication, |
| + kValidAuthentications)) { |
| return false; |
| } |
| bool allRequiredExist = true; |
| + std::string auth; |
| + result->GetStringWithoutPathExpansion(kAuthentication, &auth); |
| if (auth == k8021X) |
| allRequiredExist &= RequireField(*result, kEAP); |
| @@ -279,19 +435,17 @@ bool Validator::ValidateIPConfig( |
| if (!ValidateObjectDefault(kIPConfigSignature, onc_object, result)) |
| return false; |
| - std::string type; |
| static const char* kValidTypes[] = { kIPv4, kIPv6, NULL }; |
| - if (result->GetStringWithoutPathExpansion(ipconfig::kType, &type) && |
| - !RequireAnyOf(type, kValidTypes)) { |
| + if (FieldExistsAndHasNoValueOf(*result, ipconfig::kType, kValidTypes)) |
| return false; |
| - } |
| - int routing_prefix; |
| + std::string type; |
| + result->GetStringWithoutPathExpansion(ipconfig::kType, &type); |
| int lower_bound = 1; |
| // In case of missing type, choose higher upper_bound. |
| int upper_bound = (type == kIPv4) ? 32 : 128; |
| - if (result->GetIntegerWithoutPathExpansion(kRoutingPrefix, &routing_prefix) && |
| - !IsInRange(routing_prefix, lower_bound, upper_bound)) { |
| + if (FieldExistsAndIsNotInRange(*result, kRoutingPrefix, |
| + lower_bound, upper_bound)) { |
| return false; |
| } |
| @@ -309,16 +463,16 @@ bool Validator::ValidateWiFi( |
| if (!ValidateObjectDefault(kWiFiSignature, onc_object, result)) |
| return false; |
| - std::string security; |
| static const char* kValidSecurities[] = |
| { kNone, kWEP_PSK, kWEP_8021X, kWPA_PSK, kWPA_EAP, NULL }; |
| - if (result->GetStringWithoutPathExpansion(kSecurity, &security) && |
| - !RequireAnyOf(security, kValidSecurities)) { |
| + if (FieldExistsAndHasNoValueOf(*result, kSecurity, kValidSecurities)) |
| return false; |
| - } |
| bool allRequiredExist = RequireField(*result, kSecurity) & |
| RequireField(*result, kSSID); |
| + |
| + std::string security; |
| + result->GetStringWithoutPathExpansion(kSecurity, &security); |
| if (security == kWEP_8021X || security == kWPA_EAP) |
| allRequiredExist &= RequireField(*result, kEAP); |
| else if (security == kWEP_PSK || security == kWPA_PSK) |
| @@ -334,16 +488,14 @@ bool Validator::ValidateVPN( |
| if (!ValidateObjectDefault(kVPNSignature, onc_object, result)) |
| return false; |
| - std::string type; |
| static const char* kValidTypes[] = |
| { kIPsec, kTypeL2TP_IPsec, kOpenVPN, NULL }; |
| - if (result->GetStringWithoutPathExpansion(vpn::kType, &type) && |
| - !RequireAnyOf(type, kValidTypes)) { |
| + if (FieldExistsAndHasNoValueOf(*result, vpn::kType, kValidTypes)) |
| return false; |
| - } |
| bool allRequiredExist = RequireField(*result, vpn::kType); |
| - |
| + std::string type; |
| + result->GetStringWithoutPathExpansion(vpn::kType, &type); |
| if (type == kOpenVPN) { |
| allRequiredExist &= RequireField(*result, kOpenVPN); |
| } else if (type == kIPsec) { |
| @@ -364,26 +516,24 @@ bool Validator::ValidateIPsec( |
| if (!ValidateObjectDefault(kIPsecSignature, onc_object, result)) |
| return false; |
| - std::string auth; |
| static const char* kValidAuthentications[] = { kPSK, kCert, NULL }; |
| - if (result->GetStringWithoutPathExpansion(kAuthenticationType, &auth) && |
| - !RequireAnyOf(auth, kValidAuthentications)) { |
| - return false; |
| - } |
| - |
| - std::string cert_type; |
| static const char* kValidCertTypes[] = { kRef, kPattern, NULL }; |
| - if (result->GetStringWithoutPathExpansion(kClientCertType, &cert_type) && |
| - !RequireAnyOf(cert_type, kValidCertTypes)) { |
| + if (FieldExistsAndHasNoValueOf(*result, kAuthenticationType, |
| + kValidAuthentications) | |
|
Joao da Silva
2012/12/13 09:51:35
||
pneubeck (no reviews)
2012/12/13 14:10:03
Done.
|
| + FieldExistsAndHasNoValueOf(*result, kClientCertType, kValidCertTypes)) { |
| return false; |
| } |
| bool allRequiredExist = RequireField(*result, kAuthenticationType) & |
| RequireField(*result, kIKEVersion); |
| + std::string auth; |
| + result->GetStringWithoutPathExpansion(kAuthenticationType, &auth); |
| if (auth == kCert) { |
| allRequiredExist &= RequireField(*result, kClientCertType) & |
| RequireField(*result, kServerCARef); |
| } |
| + std::string cert_type; |
| + result->GetStringWithoutPathExpansion(kClientCertType, &cert_type); |
| if (cert_type == kPattern) |
| allRequiredExist &= RequireField(*result, kClientCertPattern); |
| else if (cert_type == kRef) |
| @@ -401,31 +551,23 @@ bool Validator::ValidateOpenVPN( |
| if (!ValidateObjectDefault(kOpenVPNSignature, onc_object, result)) |
| return false; |
| - std::string auth_retry; |
| static const char* kValidAuthRetryValues[] = |
| { openvpn::kNone, kInteract, kNoInteract, NULL }; |
| - if (result->GetStringWithoutPathExpansion(kAuthRetry, &auth_retry) && |
| - !RequireAnyOf(auth_retry, kValidAuthRetryValues)) { |
| - return false; |
| - } |
| - |
| - std::string cert_type; |
| static const char* kValidCertTypes[] = |
| { certificate::kNone, kRef, kPattern, NULL }; |
| - if (result->GetStringWithoutPathExpansion(kClientCertType, &cert_type) && |
| - !RequireAnyOf(cert_type, kValidCertTypes)) { |
| - return false; |
| - } |
| - |
| - std::string cert_tls; |
| static const char* kValidCertTlsValues[] = |
| { openvpn::kNone, openvpn::kServer, NULL }; |
| - if (result->GetStringWithoutPathExpansion(kRemoteCertTLS, &cert_tls) && |
| - !RequireAnyOf(cert_tls, kValidCertTlsValues)) { |
| + |
| + if (FieldExistsAndHasNoValueOf(*result, kAuthRetry, kValidAuthRetryValues) | |
| + FieldExistsAndHasNoValueOf(*result, kClientCertType, kValidCertTypes) | |
|
Joao da Silva
2012/12/13 09:51:35
||
pastarmovj
2012/12/13 10:15:44
Twice!
pneubeck (no reviews)
2012/12/13 14:10:03
Done.
pneubeck (no reviews)
2012/12/13 14:10:03
Done.
|
| + FieldExistsAndHasNoValueOf(*result, kRemoteCertTLS, |
| + kValidCertTlsValues)) { |
| return false; |
| } |
| bool allRequiredExist = RequireField(*result, kClientCertType); |
| + std::string cert_type; |
| + result->GetStringWithoutPathExpansion(kClientCertType, &cert_type); |
| if (cert_type == kPattern) |
| allRequiredExist &= RequireField(*result, kClientCertPattern); |
| else if (cert_type == kRef) |
| @@ -444,9 +586,15 @@ bool Validator::ValidateCertificatePattern( |
| bool allRequiredExist = true; |
| if (!result->HasKey(kSubject) && !result->HasKey(kIssuer) && |
| !result->HasKey(kIssuerCARef)) { |
| + error_or_warning_found_ = true; |
| allRequiredExist = false; |
| - DVLOG(1) << "None of the fields " << kSubject << ", " << kIssuer << ", and " |
| - << kIssuerCARef << " exists, but at least one is required."; |
| + std::string message = MessageHeader(error_on_missing_field_) + |
| + "None of the fields '" + kSubject + "', '" + kIssuer + "', and '" + |
| + kIssuerCARef + "' is present, but at least one is required."; |
| + if (error_on_missing_field_) |
| + LOG(ERROR) << message; |
| + else |
| + LOG(WARNING) << message; |
| } |
| return !error_on_missing_field_ || allRequiredExist; |
| @@ -458,15 +606,13 @@ bool Validator::ValidateProxySettings(const base::DictionaryValue& onc_object, |
| if (!ValidateObjectDefault(kProxySettingsSignature, onc_object, result)) |
| return false; |
| - std::string type; |
| static const char* kValidTypes[] = { kDirect, kManual, kPAC, kWPAD, NULL }; |
| - if (result->GetStringWithoutPathExpansion(proxy::kType, &type) && |
| - !RequireAnyOf(type, kValidTypes)) { |
| + if (FieldExistsAndHasNoValueOf(*result, proxy::kType, kValidTypes)) |
| return false; |
| - } |
| bool allRequiredExist = RequireField(*result, proxy::kType); |
| - |
| + std::string type; |
| + result->GetStringWithoutPathExpansion(proxy::kType, &type); |
| if (type == kManual) |
| allRequiredExist &= RequireField(*result, kManual); |
| else if (type == kPAC) |
| @@ -494,32 +640,22 @@ bool Validator::ValidateEAP(const base::DictionaryValue& onc_object, |
| if (!ValidateObjectDefault(kEAPSignature, onc_object, result)) |
| return false; |
| - std::string inner; |
| static const char* kValidInnerValues[] = |
| { kAutomatic, kMD5, kMSCHAPv2, kPAP, NULL }; |
| - if (result->GetStringWithoutPathExpansion(kInner, &inner) && |
| - !RequireAnyOf(inner, kValidInnerValues)) { |
| - return false; |
| - } |
| - |
| - std::string outer; |
| static const char* kValidOuterValues[] = |
| { kPEAP, kEAP_TLS, kEAP_TTLS, kLEAP, kEAP_SIM, kEAP_FAST, kEAP_AKA, |
| NULL }; |
| - if (result->GetStringWithoutPathExpansion(kOuter, &outer) && |
| - !RequireAnyOf(outer, kValidOuterValues)) { |
| - return false; |
| - } |
| - |
| - std::string cert_type; |
| static const char* kValidCertTypes[] = { kRef, kPattern, NULL }; |
| - if (result->GetStringWithoutPathExpansion(kClientCertType, &cert_type) && |
| - !RequireAnyOf(cert_type, kValidCertTypes )) { |
| + |
| + if (FieldExistsAndHasNoValueOf(*result, kInner, kValidInnerValues) | |
| + FieldExistsAndHasNoValueOf(*result, kOuter, kValidOuterValues) | |
|
Joao da Silva
2012/12/13 09:51:35
||
pastarmovj
2012/12/13 10:15:44
x2
pneubeck (no reviews)
2012/12/13 14:10:03
Done.
pneubeck (no reviews)
2012/12/13 14:10:03
Done.
|
| + FieldExistsAndHasNoValueOf(*result, kClientCertType, kValidCertTypes)) { |
| return false; |
| } |
| bool allRequiredExist = RequireField(*result, kOuter); |
| - |
| + std::string cert_type; |
| + result->GetStringWithoutPathExpansion(kClientCertType, &cert_type); |
| if (cert_type == kPattern) |
| allRequiredExist &= RequireField(*result, kClientCertPattern); |
| else if (cert_type == kRef) |
| @@ -535,12 +671,9 @@ bool Validator::ValidateCertificate( |
| if (!ValidateObjectDefault(kCertificateSignature, onc_object, result)) |
| return false; |
| - std::string type; |
| static const char* kValidTypes[] = { kClient, kServer, kAuthority, NULL }; |
| - if (result->GetStringWithoutPathExpansion(certificate::kType, &type) && |
| - !RequireAnyOf(type, kValidTypes)) { |
| + if (FieldExistsAndHasNoValueOf(*result, certificate::kType, kValidTypes)) |
| return false; |
| - } |
| bool allRequiredExist = RequireField(*result, kGUID); |
| @@ -549,6 +682,8 @@ bool Validator::ValidateCertificate( |
| if (!remove) { |
| allRequiredExist &= RequireField(*result, certificate::kType); |
| + std::string type; |
| + result->GetStringWithoutPathExpansion(certificate::kType, &type); |
| if (type == kClient) |
| allRequiredExist &= RequireField(*result, kPKCS12); |
| else if (type == kServer || type == kAuthority) |
| @@ -558,5 +693,19 @@ bool Validator::ValidateCertificate( |
| return !error_on_missing_field_ || allRequiredExist; |
| } |
| +std::string Validator::WarningHeader() { |
| + return MessageHeader(false); |
| +} |
| + |
| +std::string Validator::ErrorHeader() { |
| + return MessageHeader(true); |
| +} |
| + |
| +std::string Validator::MessageHeader(bool is_error) { |
| + std::string path = path_.empty() ? "toplevel" : JoinString(path_, "."); |
| + std::string message = "At " + path + ": "; |
| + return message; |
| +} |
| + |
| } // namespace onc |
| } // namespace chromeos |