Index: chromeos/network/onc/onc_validator.h |
diff --git a/chromeos/network/onc/onc_validator.h b/chromeos/network/onc/onc_validator.h |
index 4a742720752c9efa5c45d2041a48a3a49cbbe562..cef7ef53222c7ab4d2cdf161c0405d54beea6076 100644 |
--- a/chromeos/network/onc/onc_validator.h |
+++ b/chromeos/network/onc/onc_validator.h |
@@ -5,13 +5,16 @@ |
#ifndef CHROMEOS_NETWORK_ONC_ONC_VALIDATOR_H_ |
#define CHROMEOS_NETWORK_ONC_ONC_VALIDATOR_H_ |
+#include <string> |
+#include <vector> |
+ |
#include "base/memory/scoped_ptr.h" |
#include "chromeos/chromeos_export.h" |
#include "chromeos/network/onc/onc_mapper.h" |
namespace base { |
-class Value; |
class DictionaryValue; |
+class Value; |
} |
namespace chromeos { |
@@ -19,27 +22,44 @@ namespace onc { |
struct OncValueSignature; |
+// The ONC Validator searches for the following invalid cases: |
+// - a value is found that has the wrong type or is not expected according to |
+// the ONC spec (always an error) |
+// |
+// - a field name is found that is not part of the signature |
+// (controlled by flag |error_on_unknown_field|) |
+// |
+// - a kRecommended array contains a field name that is not part of the |
+// enclosing object's signature or if that field is dictionary typed |
+// (controlled by flag |error_on_wrong_recommended|) |
+// |
+// - |managed_onc| is false and a field with name kRecommended is found |
+// (always ignored) |
+// |
+// - a required field is missing (controlled by flag |error_on_missing_field|) |
+// |
+// If one of these invalid cases occurs and, in case of a controlling flag, that |
+// flag is true, then it is an error. The function ValidateAndRepairObject sets |
+// |result| to INVALID and returns NULL. |
+// |
+// Otherwise, a DeepCopy of the validated object is created, which contains |
+// all but the invalid fields and values. |
+// |
+// If one of the invalid cases occurs and the controlling flag is false, then |
+// it is a warning. The function ValidateAndRepairObject sets |result| to |
+// VALID_WITH_WARNINGS and returns the repaired copy. |
+// |
+// If no error occurred, |result| is set to VALID and an exact DeepCopy is |
+// returned. |
class CHROMEOS_EXPORT Validator : public Mapper { |
public: |
- // Creates a Validator that searches for the following invalid cases: |
- // - a field name is found that is not part of the signature |
- // (controlled by |error_on_unknown_field|) |
- // |
- // - a kRecommended array contains a field name that is not part of the |
- // enclosing object's signature or if that field is dictionary typed |
- // (controlled by |error_on_wrong_recommended|) |
- // |
- // - |managed_onc| is false and a field with name kRecommended is found |
- // (always ignored) |
- // |
- // - a required field is missing (controlled by |error_on_missing_field|) |
- // |
- // If one of these invalid cases occurs and the controlling flag is true, then |
- // it is an error and the validation stops. The function |
- // ValidateAndRepairObject returns NULL. |
- // |
- // If no error occurred, then a DeepCopy of the validated object is created, |
- // which contains all but the invalid fields and values. |
+ enum Result { |
+ VALID, |
+ VALID_WITH_WARNINGS, |
+ INVALID |
+ }; |
+ |
+ // See the class comment. |
Validator(bool error_on_unknown_field, |
bool error_on_wrong_recommended, |
bool error_on_missing_field, |
@@ -49,25 +69,30 @@ class CHROMEOS_EXPORT Validator : public Mapper { |
// Validate the given |onc_object| according to |object_signature|. The |
// |object_signature| has to be a pointer to one of the signatures in |
- // |onc_signature.h|. If an error is found, the function returns NULL. If |
- // possible (no error encountered) a DeepCopy is created that contains all but |
- // the invalid fields and values and returns this "repaired" object. |
- // That means, if not handled as an error, then the following are ignored: |
+ // |onc_signature.h|. If an error is found, the function returns NULL and sets |
+ // |result| to INVALID. If possible (no error encountered) a DeepCopy is |
+ // created that contains all but the invalid fields and values and returns |
+ // this "repaired" object. That means, if not handled as an error, then the |
+ // following are dropped from the copy: |
// - unknown fields |
// - invalid field names in kRecommended arrays |
// - kRecommended fields in an unmanaged ONC |
- // For details, see the comment at the Constructor. |
+ // If any of these cases occurred, sets |result| to VALID_WITH_WARNINGS and |
+ // otherwise to VALID. |
+ // For details, see the class comment. |
scoped_ptr<base::DictionaryValue> ValidateAndRepairObject( |
const OncValueSignature* object_signature, |
- const base::DictionaryValue& onc_object); |
+ const base::DictionaryValue& onc_object, |
+ Result* result); |
private: |
- // Overriden from Mapper: |
+ // Overridden from Mapper: |
// Compare |onc_value|s type with |onc_type| and validate/repair according to |
// |signature|. On error returns NULL. |
virtual scoped_ptr<base::Value> MapValue( |
const OncValueSignature& signature, |
- const base::Value& onc_value) OVERRIDE; |
+ const base::Value& onc_value, |
+ bool* error) OVERRIDE; |
// Dispatch to the right validation function according to |
// |signature|. Iterates over all fields and recursively validates/repairs |
@@ -75,7 +100,23 @@ class CHROMEOS_EXPORT Validator : public Mapper { |
// repaired dictionary. On error returns NULL. |
virtual scoped_ptr<base::DictionaryValue> MapObject( |
const OncValueSignature& signature, |
- const base::DictionaryValue& onc_object) OVERRIDE; |
+ const base::DictionaryValue& onc_object, |
+ bool* error) OVERRIDE; |
+ |
+ // Pushes/pops the |field_name| to |path_|, otherwise like |Mapper::MapField|. |
+ virtual scoped_ptr<base::Value> MapField( |
+ const std::string& field_name, |
+ const OncValueSignature& object_signature, |
+ const base::Value& onc_value, |
+ bool* found_unknown_field, |
+ bool* error) OVERRIDE; |
+ |
+ // Pushes/pops the index to |path_|, otherwise like |Mapper::MapEntry|. |
+ virtual scoped_ptr<base::Value> MapEntry( |
+ int index, |
+ const OncValueSignature& signature, |
+ const base::Value& onc_value, |
+ bool* error) OVERRIDE; |
// This is the default validation of objects/dictionaries. Validates |
// |onc_object| according to |object_signature|. |result| must point to a |
@@ -91,6 +132,10 @@ class CHROMEOS_EXPORT Validator : public Mapper { |
const OncValueSignature& object_signature, |
base::DictionaryValue* result); |
+ bool ValidateToplevelConfiguration( |
+ const base::DictionaryValue& onc_object, |
+ base::DictionaryValue* result); |
+ |
bool ValidateNetworkConfiguration( |
const base::DictionaryValue& onc_object, |
base::DictionaryValue* result); |
@@ -139,11 +184,34 @@ class CHROMEOS_EXPORT Validator : public Mapper { |
const base::DictionaryValue& onc_object, |
base::DictionaryValue* result); |
+ bool FieldExistsAndHasNoValidValue(const base::DictionaryValue& object, |
+ const std::string &field_name, |
+ const char** valid_values); |
+ |
+ bool FieldExistsAndIsNotInRange(const base::DictionaryValue& object, |
+ const std::string &field_name, |
+ int lower_bound, |
+ int upper_bound); |
+ |
+ bool RequireField(const base::DictionaryValue& dict, const std::string& key); |
+ |
+ std::string WarningHeader(); |
+ std::string ErrorHeader(); |
+ std::string MessageHeader(bool is_error); |
+ |
const bool error_on_unknown_field_; |
const bool error_on_wrong_recommended_; |
const bool error_on_missing_field_; |
const bool managed_onc_; |
+ // The path of field names and indices to the current value. Indices |
+ // are stored as strings in decimal notation. |
+ std::vector<std::string> path_; |
+ |
+ // Tracks if an error or warning occurred within validation initiated by |
+ // function ValidateAndRepairObject. |
+ bool error_or_warning_found_; |
+ |
DISALLOW_COPY_AND_ASSIGN(Validator); |
}; |