18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Copyright (c) 2012 The Chromium Authors. All rights reserved. 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Use of this source code is governed by a BSD-style license that can be 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// found in the LICENSE file. 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#ifndef CHROMEOS_NETWORK_ONC_ONC_VALIDATOR_H_ 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#define CHROMEOS_NETWORK_ONC_ONC_VALIDATOR_H_ 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <set> 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <string> 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include <vector> 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "base/memory/scoped_ptr.h" 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "chromeos/chromeos_export.h" 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "chromeos/network/onc/onc_mapper.h" 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "components/onc/onc_constants.h" 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace base { 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass DictionaryValue; 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass Value; 208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace chromeos { 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtnamespace onc { 248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct OncValueSignature; 26c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// The ONC Validator searches for the following invalid cases: 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// - a value is found that has the wrong type or is not expected according to 29fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt// the ONC spec (always an error) 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// - a field name is found that is not part of the signature 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// (controlled by flag |error_on_unknown_field|) 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// - a kRecommended array contains a field name that is not part of the 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// enclosing object's signature or if that field is dictionary typed 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// (controlled by flag |error_on_wrong_recommended|) 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// - |managed_onc| is false and a field with name kRecommended is found 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// (always ignored) 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// - a required field is missing (controlled by flag |error_on_missing_field|) 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// If one of these invalid cases occurs and, in case of a controlling flag, that 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// flag is true, then it is an error. The function ValidateAndRepairObject sets 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// |result| to INVALID and returns NULL. 468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// Otherwise, a DeepCopy of the validated object is created, which contains 488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// all but the invalid fields and values. 498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// If one of the invalid cases occurs and the controlling flag is false, then 518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// it is a warning. The function ValidateAndRepairObject sets |result| to 528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// VALID_WITH_WARNINGS and returns the repaired copy. 538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// 548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// If no error occurred, |result| is set to VALID and an exact DeepCopy is 558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt// returned. 568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtclass CHROMEOS_EXPORT Validator : public Mapper { 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt public: 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt enum Result { 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt VALID, 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt VALID_WITH_WARNINGS, 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt INVALID 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt }; 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 64c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt // See the class comment. 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Validator(bool error_on_unknown_field, 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool error_on_wrong_recommended, 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool error_on_missing_field, 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool managed_onc); 69c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 70c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt virtual ~Validator(); 71c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 72c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt // Sets the ONC source to |source|. If not set, defaults to ONC_SOURCE_NONE. 73c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt // If the source is set to ONC_SOURCE_DEVICE_POLICY, validation additionally 74c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt // checks: 75c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt // - only the network types Wifi and Ethernet are allowed 76c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt // - client certificate patterns are disallowed 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void SetOncSource(::onc::ONCSource source) { 78fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt onc_source_ = source; 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Validate the given |onc_object| according to |object_signature|. The 828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // |object_signature| has to be a pointer to one of the signatures in 838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // |onc_signature.h|. If an error is found, the function returns NULL and sets 848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // |result| to INVALID. If possible (no error encountered) a DeepCopy is 858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // created that contains all but the invalid fields and values and returns 868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // this "repaired" object. That means, if not handled as an error, then the 878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // following are dropped from the copy: 888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // - unknown fields 898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // - invalid field names in kRecommended arrays 908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // - kRecommended fields in an unmanaged ONC 918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // If any of these cases occurred, sets |result| to VALID_WITH_WARNINGS and 928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // otherwise to VALID. 938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // For details, see the class comment. 948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt scoped_ptr<base::DictionaryValue> ValidateAndRepairObject( 958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const OncValueSignature* object_signature, 968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const base::DictionaryValue& onc_object, 978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Result* result); 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt private: 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Overridden from Mapper: 1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Compare |onc_value|s type with |onc_type| and validate/repair according to 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // |signature|. On error returns NULL. 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual scoped_ptr<base::Value> MapValue(const OncValueSignature& signature, 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const base::Value& onc_value, 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool* error) OVERRIDE; 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Dispatch to the right validation function according to 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // |signature|. Iterates over all fields and recursively validates/repairs 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // these. All valid fields are added to the result dictionary. Returns the 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // repaired dictionary. Only on error returns NULL. 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual scoped_ptr<base::DictionaryValue> MapObject( 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const OncValueSignature& signature, 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const base::DictionaryValue& onc_object, 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool* error) OVERRIDE; 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Pushes/pops the |field_name| to |path_|, otherwise like |Mapper::MapField|. 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual scoped_ptr<base::Value> MapField( 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const std::string& field_name, 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const OncValueSignature& object_signature, 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const base::Value& onc_value, 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool* found_unknown_field, 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool* error) OVERRIDE; 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Ignores nested errors in NetworkConfigurations and Certificates, otherwise 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // like |Mapper::MapArray|. 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual scoped_ptr<base::ListValue> MapArray( 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const OncValueSignature& array_signature, 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const base::ListValue& onc_array, 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool* nested_error) OVERRIDE; 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Pushes/pops the index to |path_|, otherwise like |Mapper::MapEntry|. 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt virtual scoped_ptr<base::Value> MapEntry(int index, 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const OncValueSignature& signature, 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const base::Value& onc_value, 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool* error) OVERRIDE; 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // This is the default validation of objects/dictionaries. Validates 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // |onc_object| according to |object_signature|. |result| must point to a 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // dictionary into which the repaired fields are written. 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateObjectDefault(const OncValueSignature& object_signature, 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const base::DictionaryValue& onc_object, 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt base::DictionaryValue* result); 143c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Validates/repairs the kRecommended array in |result| according to 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // |object_signature| of the enclosing object. 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateRecommendedField(const OncValueSignature& object_signature, 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt base::DictionaryValue* result); 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Validates the ClientCert* fields in a VPN or EAP object. Only if 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // |allow_cert_type_none| is true, the value "None" is allowed as 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // ClientCertType. 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateClientCertFields(bool allow_cert_type_none, 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt base::DictionaryValue* result); 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateToplevelConfiguration(base::DictionaryValue* result); 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateNetworkConfiguration(base::DictionaryValue* result); 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateEthernet(base::DictionaryValue* result); 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateIPConfig(base::DictionaryValue* result); 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateWiFi(base::DictionaryValue* result); 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateVPN(base::DictionaryValue* result); 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateIPsec(base::DictionaryValue* result); 162fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt bool ValidateOpenVPN(base::DictionaryValue* result); 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateVerifyX509(base::DictionaryValue* result); 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateCertificatePattern(base::DictionaryValue* result); 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateProxySettings(base::DictionaryValue* result); 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateProxyLocation(base::DictionaryValue* result); 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateEAP(base::DictionaryValue* result); 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool ValidateCertificate(base::DictionaryValue* result); 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool FieldExistsAndHasNoValidValue( 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const base::DictionaryValue& object, 1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const std::string& field_name, 1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const std::vector<const char*>& valid_values); 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool FieldExistsAndIsNotInRange(const base::DictionaryValue& object, 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const std::string &field_name, 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int lower_bound, 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int upper_bound); 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool FieldExistsAndIsEmpty(const base::DictionaryValue& object, 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const std::string& field_name); 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool RequireField(const base::DictionaryValue& dict, const std::string& key); 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Returns true if the GUID is unique or if the GUID is not a string 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // and false otherwise. The function also adds the GUID to a set in 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // order to identify duplicates. 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool CheckGuidIsUniqueAndAddToSet(const base::DictionaryValue& dict, 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const std::string& kGUID, 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt std::set<std::string> *guids); 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Prohibit certificate patterns for device policy ONC so that an unmanaged 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // user won't have a certificate presented for them involuntarily. 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool IsCertPatternInDevicePolicy(const std::string& cert_type); 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Prohibit global network configuration in user ONC imports. 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool IsGlobalNetworkConfigInUserImport( 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const base::DictionaryValue& onc_object); 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt std::string MessageHeader(); 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const bool error_on_unknown_field_; 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const bool error_on_wrong_recommended_; 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const bool error_on_missing_field_; 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const bool managed_onc_; 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ::onc::ONCSource onc_source_; 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // The path of field names and indices to the current value. Indices 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // are stored as strings in decimal notation. 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt std::vector<std::string> path_; 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Accumulates all network GUIDs during validation. Used to identify 214fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt // duplicate GUIDs. 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt std::set<std::string> network_guids_; 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Accumulates all certificate GUIDs during validation. Used to identify 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // duplicate GUIDs. 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt std::set<std::string> certificate_guids_; 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // Tracks if an error or warning occurred within validation initiated by 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt // function ValidateAndRepairObject. 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt bool error_or_warning_found_; 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DISALLOW_COPY_AND_ASSIGN(Validator); 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt}; 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 228fb79edc9df1f20461e90e478363d207348213d35Dmitry Shmidt} // namespace onc 229c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt} // namespace chromeos 230c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt 231c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt#endif // CHROMEOS_NETWORK_ONC_ONC_VALIDATOR_H_ 232c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt