summaryrefslogtreecommitdiffstats
path: root/chromeos/network/onc/onc_validator.h
diff options
context:
space:
mode:
authorpneubeck@chromium.org <pneubeck@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-16 20:41:46 +0000
committerpneubeck@chromium.org <pneubeck@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-16 20:41:46 +0000
commit6d0f4901873c0a61775dfcb1526e572faf9bac64 (patch)
treebce215e107fc45d6953a3f91c3f2de24ddeb6ba5 /chromeos/network/onc/onc_validator.h
parent62f18e79afcf0a1013f3754f5a603a86f79a5ccf (diff)
downloadchromium_src-6d0f4901873c0a61775dfcb1526e572faf9bac64.zip
chromium_src-6d0f4901873c0a61775dfcb1526e572faf9bac64.tar.gz
chromium_src-6d0f4901873c0a61775dfcb1526e572faf9bac64.tar.bz2
Extending ONC validator's logging. Completing toplevel validation.
Adding also more validation tests. The logging is in line with https://codereview.chromium.org/11299236/. BUG=162802 TEST=Unit tests. TBR=stevenjb@chromium.org,eroman@chromium.org (whitespace change in net_interals.cc) Review URL: https://chromiumcodereview.appspot.com/11469026 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173393 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chromeos/network/onc/onc_validator.h')
-rw-r--r--chromeos/network/onc/onc_validator.h126
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);
};