Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.
   1  <?php
   2  
   3  /**

   4   * Configuration definition, defines directives and their defaults.

   5   */
   6  class HTMLPurifier_ConfigSchema
   7  {
   8      /**

   9       * Defaults of the directives and namespaces.

  10       * @type array

  11       * @note This shares the exact same structure as HTMLPurifier_Config::$conf

  12       */
  13      public $defaults = array();
  14  
  15      /**

  16       * The default property list. Do not edit this property list.

  17       * @type array

  18       */
  19      public $defaultPlist;
  20  
  21      /**

  22       * Definition of the directives.

  23       * The structure of this is:

  24       *

  25       *  array(

  26       *      'Namespace' => array(

  27       *          'Directive' => new stdClass(),

  28       *      )

  29       *  )

  30       *

  31       * The stdClass may have the following properties:

  32       *

  33       *  - If isAlias isn't set:

  34       *      - type: Integer type of directive, see HTMLPurifier_VarParser for definitions

  35       *      - allow_null: If set, this directive allows null values

  36       *      - aliases: If set, an associative array of value aliases to real values

  37       *      - allowed: If set, a lookup array of allowed (string) values

  38       *  - If isAlias is set:

  39       *      - namespace: Namespace this directive aliases to

  40       *      - name: Directive name this directive aliases to

  41       *

  42       * In certain degenerate cases, stdClass will actually be an integer. In

  43       * that case, the value is equivalent to an stdClass with the type

  44       * property set to the integer. If the integer is negative, type is

  45       * equal to the absolute value of integer, and allow_null is true.

  46       *

  47       * This class is friendly with HTMLPurifier_Config. If you need introspection

  48       * about the schema, you're better of using the ConfigSchema_Interchange,

  49       * which uses more memory but has much richer information.

  50       * @type array

  51       */
  52      public $info = array();
  53  
  54      /**

  55       * Application-wide singleton

  56       * @type HTMLPurifier_ConfigSchema

  57       */
  58      protected static $singleton;
  59  
  60      public function __construct()
  61      {
  62          $this->defaultPlist = new HTMLPurifier_PropertyList();
  63      }
  64  
  65      /**

  66       * Unserializes the default ConfigSchema.

  67       * @return HTMLPurifier_ConfigSchema

  68       */
  69      public static function makeFromSerial()
  70      {
  71          $contents = file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema.ser');
  72          $r = unserialize($contents);
  73          if (!$r) {
  74              $hash = sha1($contents);
  75              trigger_error("Unserialization of configuration schema failed, sha1 of file was $hash", E_USER_ERROR);
  76          }
  77          return $r;
  78      }
  79  
  80      /**

  81       * Retrieves an instance of the application-wide configuration definition.

  82       * @param HTMLPurifier_ConfigSchema $prototype

  83       * @return HTMLPurifier_ConfigSchema

  84       */
  85      public static function instance($prototype = null)
  86      {
  87          if ($prototype !== null) {
  88              HTMLPurifier_ConfigSchema::$singleton = $prototype;
  89          } elseif (HTMLPurifier_ConfigSchema::$singleton === null || $prototype === true) {
  90              HTMLPurifier_ConfigSchema::$singleton = HTMLPurifier_ConfigSchema::makeFromSerial();
  91          }
  92          return HTMLPurifier_ConfigSchema::$singleton;
  93      }
  94  
  95      /**

  96       * Defines a directive for configuration

  97       * @warning Will fail of directive's namespace is defined.

  98       * @warning This method's signature is slightly different from the legacy

  99       *          define() static method! Beware!

 100       * @param string $key Name of directive

 101       * @param mixed $default Default value of directive

 102       * @param string $type Allowed type of the directive. See

 103       *      HTMLPurifier_VarParser::$types for allowed values

 104       * @param bool $allow_null Whether or not to allow null values

 105       */
 106      public function add($key, $default, $type, $allow_null)
 107      {
 108          $obj = new stdClass();
 109          $obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type];
 110          if ($allow_null) {
 111              $obj->allow_null = true;
 112          }
 113          $this->info[$key] = $obj;
 114          $this->defaults[$key] = $default;
 115          $this->defaultPlist->set($key, $default);
 116      }
 117  
 118      /**

 119       * Defines a directive value alias.

 120       *

 121       * Directive value aliases are convenient for developers because it lets

 122       * them set a directive to several values and get the same result.

 123       * @param string $key Name of Directive

 124       * @param array $aliases Hash of aliased values to the real alias

 125       */
 126      public function addValueAliases($key, $aliases)
 127      {
 128          if (!isset($this->info[$key]->aliases)) {
 129              $this->info[$key]->aliases = array();
 130          }
 131          foreach ($aliases as $alias => $real) {
 132              $this->info[$key]->aliases[$alias] = $real;
 133          }
 134      }
 135  
 136      /**

 137       * Defines a set of allowed values for a directive.

 138       * @warning This is slightly different from the corresponding static

 139       *          method definition.

 140       * @param string $key Name of directive

 141       * @param array $allowed Lookup array of allowed values

 142       */
 143      public function addAllowedValues($key, $allowed)
 144      {
 145          $this->info[$key]->allowed = $allowed;
 146      }
 147  
 148      /**

 149       * Defines a directive alias for backwards compatibility

 150       * @param string $key Directive that will be aliased

 151       * @param string $new_key Directive that the alias will be to

 152       */
 153      public function addAlias($key, $new_key)
 154      {
 155          $obj = new stdClass;
 156          $obj->key = $new_key;
 157          $obj->isAlias = true;
 158          $this->info[$key] = $obj;
 159      }
 160  
 161      /**

 162       * Replaces any stdClass that only has the type property with type integer.

 163       */
 164      public function postProcess()
 165      {
 166          foreach ($this->info as $key => $v) {
 167              if (count((array) $v) == 1) {
 168                  $this->info[$key] = $v->type;
 169              } elseif (count((array) $v) == 2 && isset($v->allow_null)) {
 170                  $this->info[$key] = -$v->type;
 171              }
 172          }
 173      }
 174  }
 175  
 176  // vim: et sw=4 sts=4