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