From 4c798bd17e9ba237a3cc995f5664df117c5ef51f Mon Sep 17 00:00:00 2001 From: "Edward Z. Yang" Date: Tue, 4 Mar 2008 04:13:07 +0000 Subject: [PATCH] [3.1.0] Implement Duplicate validator, also modify some design things git-svn-id: http://htmlpurifier.org/svnroot/htmlpurifier/trunk@1596 48356398-32a2-884e-a903-53898d9a118a --- .../HTMLPurifier/ConfigSchema/Interchange.php | 5 ++++ .../ConfigSchema/InterchangeValidator.php | 20 ++++++--------- .../HTMLPurifier/ConfigSchema/Validator.php | 7 ++++++ .../ConfigSchema/Validator/Alnum.php | 2 +- .../ConfigSchema/Validator/Duplicate.php | 21 ++++++++++++++++ .../ConfigSchema/Validator/Exists.php | 2 +- .../ConfigSchema/Validator/DuplicateTest.php | 25 +++++++++++++++++++ .../ConfigSchema/ValidatorHarness.php | 3 +-- 8 files changed, 68 insertions(+), 17 deletions(-) create mode 100644 library/HTMLPurifier/ConfigSchema/Validator/Duplicate.php create mode 100644 tests/HTMLPurifier/ConfigSchema/Validator/DuplicateTest.php diff --git a/library/HTMLPurifier/ConfigSchema/Interchange.php b/library/HTMLPurifier/ConfigSchema/Interchange.php index ce4ab741..d9d98e2f 100644 --- a/library/HTMLPurifier/ConfigSchema/Interchange.php +++ b/library/HTMLPurifier/ConfigSchema/Interchange.php @@ -55,9 +55,14 @@ class HTMLPurifier_ConfigSchema_Interchange */ public function getValidatorAdapter() { $validator = new HTMLPurifier_ConfigSchema_InterchangeValidator($this); + + // Validators should be defined in the order they are to be called. + // Common validators $validator->addValidator(new HTMLPurifier_ConfigSchema_Validator_Exists('ID')); + $validator->addValidator(new HTMLPurifier_ConfigSchema_Validator_Duplicate()); $validator->addValidator(new HTMLPurifier_ConfigSchema_Validator_Exists('DESCRIPTION')); + // Namespace validators // Directive validators diff --git a/library/HTMLPurifier/ConfigSchema/InterchangeValidator.php b/library/HTMLPurifier/ConfigSchema/InterchangeValidator.php index 9dd3fe42..1eed72c7 100644 --- a/library/HTMLPurifier/ConfigSchema/InterchangeValidator.php +++ b/library/HTMLPurifier/ConfigSchema/InterchangeValidator.php @@ -8,8 +8,7 @@ class HTMLPurifier_ConfigSchema_InterchangeValidator protected $interchange; protected $validators = array(); protected $namespaceValidators = array(); - protected $directiveVaildators = array(); - protected $index = 0; + protected $directiveValidators = array(); /** * @param $interchange Instance of HTMLPurifier_ConfigSchema_Interchange @@ -23,31 +22,29 @@ class HTMLPurifier_ConfigSchema_InterchangeValidator * Registers a HTMLPurifier_ConfigSchema_Validator to run when adding. */ public function addValidator($validator) { - $this->validators[$this->index++] = $validator; + $this->addNamespaceValidator($validator); + $this->addDirectiveValidator($validator); } /** * Register validators to be used only on directives */ public function addDirectiveValidator($validator) { - $this->directiveValidators[$this->index++] = $validator; + $this->directiveValidators[] = $validator; } /** * Register validators to be used only on namespaces */ public function addNamespaceValidator($validator) { - $this->namespaceValidators[$this->index++] = $validator; + $this->namespaceValidators[] = $validator; } /** * Validates and adds a namespace hash */ public function addNamespace($hash) { - for ($i = 0; $i < $this->index; $i++) { - if (isset($this->validators[$i])) $validator = $this->validators[$i]; - elseif (isset($this->namespaceValidators[$i])) $validator = $this->namespaceValidators[$i]; - else continue; + foreach ($this->namespaceValidators as $validator) { $validator->validate($hash, $this->interchange); } $this->interchange->addNamespace($hash); @@ -57,10 +54,7 @@ class HTMLPurifier_ConfigSchema_InterchangeValidator * Validates and adds a directive hash */ public function addDirective($hash) { - for ($i = 0; $i < $this->index; $i++) { - if (isset($this->validators[$i])) $validator = $this->validators[$i]; - elseif (isset($this->directiveValidators[$i])) $validator = $this->directiveValidators[$i]; - else continue; + foreach ($this->directiveValidators as $validator) { $validator->validate($hash, $this->interchange); } $this->interchange->addDirective($hash); diff --git a/library/HTMLPurifier/ConfigSchema/Validator.php b/library/HTMLPurifier/ConfigSchema/Validator.php index 700cccfb..cfd8d29c 100644 --- a/library/HTMLPurifier/ConfigSchema/Validator.php +++ b/library/HTMLPurifier/ConfigSchema/Validator.php @@ -16,4 +16,11 @@ class HTMLPurifier_ConfigSchema_Validator */ public function validate(&$arr, $interchange) {} + /** + * Throws a HTMLPurifier_ConfigSchema_Exception + */ + protected function error($msg) { + throw new HTMLPurifier_ConfigSchema_Exception($msg); + } + } diff --git a/library/HTMLPurifier/ConfigSchema/Validator/Alnum.php b/library/HTMLPurifier/ConfigSchema/Validator/Alnum.php index 3233b9d3..10a7a306 100644 --- a/library/HTMLPurifier/ConfigSchema/Validator/Alnum.php +++ b/library/HTMLPurifier/ConfigSchema/Validator/Alnum.php @@ -15,7 +15,7 @@ class HTMLPurifier_ConfigSchema_Validator_Alnum extends HTMLPurifier_ConfigSchem public function validate(&$arr, $interchange) { if (!ctype_alnum($arr[$this->index])) { - throw new HTMLPurifier_ConfigSchema_Exception($arr[$this->index] . ' in '. $this->index .' must be alphanumeric'); + $this->error($arr[$this->index] . ' in '. $this->index .' must be alphanumeric'); } } diff --git a/library/HTMLPurifier/ConfigSchema/Validator/Duplicate.php b/library/HTMLPurifier/ConfigSchema/Validator/Duplicate.php new file mode 100644 index 00000000..bcada41d --- /dev/null +++ b/library/HTMLPurifier/ConfigSchema/Validator/Duplicate.php @@ -0,0 +1,21 @@ +namespaces[$arr['ID']])) { + $this->error('Cannot redefine namespace'); + } + if (isset($interchange->directives[$arr['ID']])) { + $this->error('Cannot redefine directive'); + } + } + +} diff --git a/library/HTMLPurifier/ConfigSchema/Validator/Exists.php b/library/HTMLPurifier/ConfigSchema/Validator/Exists.php index b6ef67cb..ac36878d 100644 --- a/library/HTMLPurifier/ConfigSchema/Validator/Exists.php +++ b/library/HTMLPurifier/ConfigSchema/Validator/Exists.php @@ -14,7 +14,7 @@ class HTMLPurifier_ConfigSchema_Validator_Exists extends HTMLPurifier_ConfigSche public function validate(&$arr, $interchange) { if (empty($arr[$this->index])) { - throw new HTMLPurifier_ConfigSchema_Exception($this->index . ' must exist'); + $this->error($this->index . ' must exist'); } } diff --git a/tests/HTMLPurifier/ConfigSchema/Validator/DuplicateTest.php b/tests/HTMLPurifier/ConfigSchema/Validator/DuplicateTest.php new file mode 100644 index 00000000..ac3fd4e3 --- /dev/null +++ b/tests/HTMLPurifier/ConfigSchema/Validator/DuplicateTest.php @@ -0,0 +1,25 @@ +validator = new HTMLPurifier_ConfigSchema_Validator_Duplicate(); + } + + public function testValidateNamespace() { + $this->interchange->addNamespace(array('ID' => 'Namespace')); + $this->expectSchemaException('Cannot redefine namespace'); + $arr = array('ID' => 'Namespace'); + $this->validator->validate($arr, $this->interchange); + } + + public function testValidateDirective() { + $this->interchange->addDirective(array('ID' => 'Namespace.Directive')); + $this->expectSchemaException('Cannot redefine directive'); + $arr = array('ID' => 'Namespace.Directive'); + $this->validator->validate($arr, $this->interchange); + } + +} diff --git a/tests/HTMLPurifier/ConfigSchema/ValidatorHarness.php b/tests/HTMLPurifier/ConfigSchema/ValidatorHarness.php index 9230e20a..33865cec 100644 --- a/tests/HTMLPurifier/ConfigSchema/ValidatorHarness.php +++ b/tests/HTMLPurifier/ConfigSchema/ValidatorHarness.php @@ -6,8 +6,7 @@ class HTMLPurifier_ConfigSchema_ValidatorHarness extends UnitTestCase protected $interchange, $validator; public function setup() { - generate_mock_once('HTMLPurifier_ConfigSchema_Interchange'); - $this->interchange = new HTMLPurifier_ConfigSchema_InterchangeMock(); + $this->interchange = new HTMLPurifier_ConfigSchema_Interchange(); } protected function expectSchemaException($msg) {