| 
									
										
										
										
											2016-01-28 18:57:36 +01:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Configuration definition, defines directives and their defaults. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class HTMLPurifier_ConfigSchema | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Defaults of the directives and namespaces. | 
					
						
							|  |  |  |      * @type array | 
					
						
							|  |  |  |      * @note This shares the exact same structure as HTMLPurifier_Config::$conf | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public $defaults = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * The default property list. Do not edit this property list. | 
					
						
							|  |  |  |      * @type array | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public $defaultPlist; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Definition of the directives. | 
					
						
							|  |  |  |      * The structure of this is: | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      *  array( | 
					
						
							|  |  |  |      *      'Namespace' => array( | 
					
						
							| 
									
										
										
										
											2017-07-10 13:46:07 +02:00
										 |  |  |      *          'Directive' => new stdClass(), | 
					
						
							| 
									
										
										
										
											2016-01-28 18:57:36 +01:00
										 |  |  |      *      ) | 
					
						
							|  |  |  |      *  ) | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:46:07 +02:00
										 |  |  |      * The stdClass may have the following properties: | 
					
						
							| 
									
										
										
										
											2016-01-28 18:57:36 +01:00
										 |  |  |      * | 
					
						
							|  |  |  |      *  - If isAlias isn't set: | 
					
						
							|  |  |  |      *      - type: Integer type of directive, see HTMLPurifier_VarParser for definitions | 
					
						
							|  |  |  |      *      - allow_null: If set, this directive allows null values | 
					
						
							|  |  |  |      *      - aliases: If set, an associative array of value aliases to real values | 
					
						
							|  |  |  |      *      - allowed: If set, a lookup array of allowed (string) values | 
					
						
							|  |  |  |      *  - If isAlias is set: | 
					
						
							|  |  |  |      *      - namespace: Namespace this directive aliases to | 
					
						
							|  |  |  |      *      - name: Directive name this directive aliases to | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2017-07-10 13:46:07 +02:00
										 |  |  |      * In certain degenerate cases, stdClass will actually be an integer. In | 
					
						
							|  |  |  |      * that case, the value is equivalent to an stdClass with the type | 
					
						
							| 
									
										
										
										
											2016-01-28 18:57:36 +01:00
										 |  |  |      * property set to the integer. If the integer is negative, type is | 
					
						
							|  |  |  |      * equal to the absolute value of integer, and allow_null is true. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * This class is friendly with HTMLPurifier_Config. If you need introspection | 
					
						
							|  |  |  |      * about the schema, you're better of using the ConfigSchema_Interchange, | 
					
						
							|  |  |  |      * which uses more memory but has much richer information. | 
					
						
							|  |  |  |      * @type array | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public $info = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Application-wide singleton | 
					
						
							|  |  |  |      * @type HTMLPurifier_ConfigSchema | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected static $singleton; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function __construct() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->defaultPlist = new HTMLPurifier_PropertyList(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Unserializes the default ConfigSchema. | 
					
						
							|  |  |  |      * @return HTMLPurifier_ConfigSchema | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public static function makeFromSerial() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $contents = file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema.ser'); | 
					
						
							|  |  |  |         $r = unserialize($contents); | 
					
						
							|  |  |  |         if (!$r) { | 
					
						
							|  |  |  |             $hash = sha1($contents); | 
					
						
							|  |  |  |             trigger_error("Unserialization of configuration schema failed, sha1 of file was $hash", E_USER_ERROR); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $r; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Retrieves an instance of the application-wide configuration definition. | 
					
						
							|  |  |  |      * @param HTMLPurifier_ConfigSchema $prototype | 
					
						
							|  |  |  |      * @return HTMLPurifier_ConfigSchema | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public static function instance($prototype = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($prototype !== null) { | 
					
						
							|  |  |  |             HTMLPurifier_ConfigSchema::$singleton = $prototype; | 
					
						
							|  |  |  |         } elseif (HTMLPurifier_ConfigSchema::$singleton === null || $prototype === true) { | 
					
						
							|  |  |  |             HTMLPurifier_ConfigSchema::$singleton = HTMLPurifier_ConfigSchema::makeFromSerial(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return HTMLPurifier_ConfigSchema::$singleton; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Defines a directive for configuration | 
					
						
							|  |  |  |      * @warning Will fail of directive's namespace is defined. | 
					
						
							|  |  |  |      * @warning This method's signature is slightly different from the legacy | 
					
						
							|  |  |  |      *          define() static method! Beware! | 
					
						
							|  |  |  |      * @param string $key Name of directive | 
					
						
							|  |  |  |      * @param mixed $default Default value of directive | 
					
						
							|  |  |  |      * @param string $type Allowed type of the directive. See | 
					
						
							| 
									
										
										
										
											2019-07-15 01:41:55 +01:00
										 |  |  |      *      HTMLPurifier_VarParser::$types for allowed values | 
					
						
							| 
									
										
										
										
											2016-01-28 18:57:36 +01:00
										 |  |  |      * @param bool $allow_null Whether or not to allow null values | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function add($key, $default, $type, $allow_null) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:46:07 +02:00
										 |  |  |         $obj = new stdClass(); | 
					
						
							| 
									
										
										
										
											2016-01-28 18:57:36 +01:00
										 |  |  |         $obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type]; | 
					
						
							|  |  |  |         if ($allow_null) { | 
					
						
							|  |  |  |             $obj->allow_null = true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         $this->info[$key] = $obj; | 
					
						
							|  |  |  |         $this->defaults[$key] = $default; | 
					
						
							|  |  |  |         $this->defaultPlist->set($key, $default); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Defines a directive value alias. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Directive value aliases are convenient for developers because it lets | 
					
						
							|  |  |  |      * them set a directive to several values and get the same result. | 
					
						
							|  |  |  |      * @param string $key Name of Directive | 
					
						
							|  |  |  |      * @param array $aliases Hash of aliased values to the real alias | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function addValueAliases($key, $aliases) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!isset($this->info[$key]->aliases)) { | 
					
						
							|  |  |  |             $this->info[$key]->aliases = array(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         foreach ($aliases as $alias => $real) { | 
					
						
							|  |  |  |             $this->info[$key]->aliases[$alias] = $real; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Defines a set of allowed values for a directive. | 
					
						
							|  |  |  |      * @warning This is slightly different from the corresponding static | 
					
						
							|  |  |  |      *          method definition. | 
					
						
							|  |  |  |      * @param string $key Name of directive | 
					
						
							|  |  |  |      * @param array $allowed Lookup array of allowed values | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function addAllowedValues($key, $allowed) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->info[$key]->allowed = $allowed; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Defines a directive alias for backwards compatibility | 
					
						
							|  |  |  |      * @param string $key Directive that will be aliased | 
					
						
							|  |  |  |      * @param string $new_key Directive that the alias will be to | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function addAlias($key, $new_key) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-07-10 13:46:07 +02:00
										 |  |  |         $obj = new stdClass; | 
					
						
							| 
									
										
										
										
											2016-01-28 18:57:36 +01:00
										 |  |  |         $obj->key = $new_key; | 
					
						
							|  |  |  |         $obj->isAlias = true; | 
					
						
							|  |  |  |         $this->info[$key] = $obj; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2017-07-10 13:46:07 +02:00
										 |  |  |      * Replaces any stdClass that only has the type property with type integer. | 
					
						
							| 
									
										
										
										
											2016-01-28 18:57:36 +01:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function postProcess() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         foreach ($this->info as $key => $v) { | 
					
						
							|  |  |  |             if (count((array) $v) == 1) { | 
					
						
							|  |  |  |                 $this->info[$key] = $v->type; | 
					
						
							|  |  |  |             } elseif (count((array) $v) == 2 && isset($v->allow_null)) { | 
					
						
							|  |  |  |                 $this->info[$key] = -$v->type; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // vim: et sw=4 sts=4
 |