diff options
Diffstat (limited to 'chromeos/network/onc/onc_validator.h')
-rw-r--r-- | chromeos/network/onc/onc_validator.h | 126 |
1 files changed, 97 insertions, 29 deletions
diff --git a/chromeos/network/onc/onc_validator.h b/chromeos/network/onc/onc_validator.h index 4a74272..cef7ef5 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); }; |