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) {