Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.
   1  <?php
   2  
   3  class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition
   4  {
   5  
   6      public $type = 'URI';
   7      protected $filters = array();
   8      protected $postFilters = array();
   9      protected $registeredFilters = array();
  10  
  11      /**

  12       * HTMLPurifier_URI object of the base specified at %URI.Base

  13       */
  14      public $base;
  15  
  16      /**

  17       * String host to consider "home" base, derived off of $base

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

  22       * Name of default scheme based on %URI.DefaultScheme and %URI.Base

  23       */
  24      public $defaultScheme;
  25  
  26      public function __construct()
  27      {
  28          $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternal());
  29          $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources());
  30          $this->registerFilter(new HTMLPurifier_URIFilter_DisableResources());
  31          $this->registerFilter(new HTMLPurifier_URIFilter_HostBlacklist());
  32          $this->registerFilter(new HTMLPurifier_URIFilter_SafeIframe());
  33          $this->registerFilter(new HTMLPurifier_URIFilter_MakeAbsolute());
  34          $this->registerFilter(new HTMLPurifier_URIFilter_Munge());
  35      }
  36  
  37      public function registerFilter($filter)
  38      {
  39          $this->registeredFilters[$filter->name] = $filter;
  40      }
  41  
  42      public function addFilter($filter, $config)
  43      {
  44          $r = $filter->prepare($config);
  45          if ($r === false) return; // null is ok, for backwards compat

  46          if ($filter->post) {
  47              $this->postFilters[$filter->name] = $filter;
  48          } else {
  49              $this->filters[$filter->name] = $filter;
  50          }
  51      }
  52  
  53      protected function doSetup($config)
  54      {
  55          $this->setupMemberVariables($config);
  56          $this->setupFilters($config);
  57      }
  58  
  59      protected function setupFilters($config)
  60      {
  61          foreach ($this->registeredFilters as $name => $filter) {
  62              if ($filter->always_load) {
  63                  $this->addFilter($filter, $config);
  64              } else {
  65                  $conf = $config->get('URI.' . $name);
  66                  if ($conf !== false && $conf !== null) {
  67                      $this->addFilter($filter, $config);
  68                  }
  69              }
  70          }
  71          unset($this->registeredFilters);
  72      }
  73  
  74      protected function setupMemberVariables($config)
  75      {
  76          $this->host = $config->get('URI.Host');
  77          $base_uri = $config->get('URI.Base');
  78          if (!is_null($base_uri)) {
  79              $parser = new HTMLPurifier_URIParser();
  80              $this->base = $parser->parse($base_uri);
  81              $this->defaultScheme = $this->base->scheme;
  82              if (is_null($this->host)) $this->host = $this->base->host;
  83          }
  84          if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI.DefaultScheme');
  85      }
  86  
  87      public function getDefaultScheme($config, $context)
  88      {
  89          return HTMLPurifier_URISchemeRegistry::instance()->getScheme($this->defaultScheme, $config, $context);
  90      }
  91  
  92      public function filter(&$uri, $config, $context)
  93      {
  94          foreach ($this->filters as $name => $f) {
  95              $result = $f->filter($uri, $config, $context);
  96              if (!$result) return false;
  97          }
  98          return true;
  99      }
 100  
 101      public function postFilter(&$uri, $config, $context)
 102      {
 103          foreach ($this->postFilters as $name => $f) {
 104              $result = $f->filter($uri, $config, $context);
 105              if (!$result) return false;
 106          }
 107          return true;
 108      }
 109  
 110  }
 111  
 112  // vim: et sw=4 sts=4