diff --git a/library/HTMLPurifier.includes.php b/library/HTMLPurifier.includes.php index 8039d459..5daef582 100644 --- a/library/HTMLPurifier.includes.php +++ b/library/HTMLPurifier.includes.php @@ -135,6 +135,7 @@ require 'HTMLPurifier/ConfigSchema/Validator/Alnum.php'; require 'HTMLPurifier/ConfigSchema/Validator/Exists.php'; require 'HTMLPurifier/ConfigSchema/Validator/NamespaceExists.php'; require 'HTMLPurifier/ConfigSchema/Validator/ParseId.php'; +require 'HTMLPurifier/ConfigSchema/Validator/ParseType.php'; require 'HTMLPurifier/ConfigSchema/Validator/Unique.php'; require 'HTMLPurifier/DefinitionCache/Decorator.php'; require 'HTMLPurifier/DefinitionCache/Null.php'; diff --git a/library/HTMLPurifier/ConfigSchema/Interchange.php b/library/HTMLPurifier/ConfigSchema/Interchange.php index e2fc6c05..57b0c9cd 100644 --- a/library/HTMLPurifier/ConfigSchema/Interchange.php +++ b/library/HTMLPurifier/ConfigSchema/Interchange.php @@ -57,17 +57,28 @@ class HTMLPurifier_ConfigSchema_Interchange $validator = new HTMLPurifier_ConfigSchema_InterchangeValidator($this); // Validators should be defined in the order they are to be called. + + // ID tests $validator->addValidator($this->make('Exists', 'ID')); $validator->addValidator($this->make('Unique')); $validator->addNamespaceValidator($this->make('Alnum', 'ID')); $validator->addValidator($this->make('ParseId')); $validator->addValidator($this->make('Exists', '_NAMESPACE')); $validator->addValidator($this->make('Alnum', '_NAMESPACE')); + + // Directive tests $validator->addDirectiveValidator($this->make('Exists', '_DIRECTIVE')); $validator->addDirectiveValidator($this->make('Alnum', '_DIRECTIVE')); - $validator->addDirectiveValidator($this->make('Exists', 'TYPE')); - $validator->addDirectiveValidator($this->make('Exists', 'DEFAULT')); $validator->addDirectiveValidator($this->make('NamespaceExists')); + + // Directive: Type tests + $validator->addDirectiveValidator($this->make('Exists', 'TYPE')); + $validator->addDirectiveValidator($this->make('ParseType')); + $validator->addDirectiveValidator($this->make('Exists', '_TYPE')); + $validator->addDirectiveValidator($this->make('Exists', '_NULL')); + $validator->addDirectiveValidator($this->make('Exists', 'DEFAULT')); + + // Common tests $validator->addValidator($this->make('Exists', 'DESCRIPTION')); return $validator; diff --git a/library/HTMLPurifier/ConfigSchema/Validator/ParseType.php b/library/HTMLPurifier/ConfigSchema/Validator/ParseType.php new file mode 100644 index 00000000..dc0a4dab --- /dev/null +++ b/library/HTMLPurifier/ConfigSchema/Validator/ParseType.php @@ -0,0 +1,19 @@ +types[$r[0]])) { + $this->error('Invalid type ' . $r[0] . ' for configuration directive ' . $arr['ID']); + } + $arr['_TYPE'] = $r[0]; + $arr['_NULL'] = (isset($r[1]) && $r[1] === 'null'); + + } + +} diff --git a/tests/HTMLPurifier/ConfigSchema/Validator/ParseTypeTest.php b/tests/HTMLPurifier/ConfigSchema/Validator/ParseTypeTest.php new file mode 100644 index 00000000..f84f7b71 --- /dev/null +++ b/tests/HTMLPurifier/ConfigSchema/Validator/ParseTypeTest.php @@ -0,0 +1,34 @@ + 'N.D', 'TYPE' => 'string'); + $this->validator->validate($arr, $this->interchange); + $this->assertIdentical($arr, array( + 'ID' => 'N.D', + 'TYPE' => 'string', + '_TYPE' => 'string', + '_NULL' => false, + )); + } + + public function testValidateWithNull() { + $arr = array('ID' => 'N.D', 'TYPE' => 'int/null'); + $this->validator->validate($arr, $this->interchange); + $this->assertIdentical($arr, array( + 'ID' => 'N.D', + 'TYPE' => 'int/null', + '_TYPE' => 'int', + '_NULL' => true, + )); + } + + public function testValidateInvalidType() { + $arr = array('ID' => 'N.D', 'TYPE' => 'aint/null'); + $this->expectSchemaException('Invalid type aint for configuration directive N.D'); + $this->validator->validate($arr, $this->interchange); + } + +}