File indexing completed on 2024-12-22 05:36:22

0001 <?php
0002 
0003 class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition
0004 {
0005 
0006     public $type = 'URI';
0007     protected $filters = array();
0008     protected $postFilters = array();
0009     protected $registeredFilters = array();
0010 
0011     /**
0012      * HTMLPurifier_URI object of the base specified at %URI.Base
0013      */
0014     public $base;
0015 
0016     /**
0017      * String host to consider "home" base, derived off of $base
0018      */
0019     public $host;
0020 
0021     /**
0022      * Name of default scheme based on %URI.DefaultScheme and %URI.Base
0023      */
0024     public $defaultScheme;
0025 
0026     public function __construct()
0027     {
0028         $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternal());
0029         $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources());
0030         $this->registerFilter(new HTMLPurifier_URIFilter_DisableResources());
0031         $this->registerFilter(new HTMLPurifier_URIFilter_HostBlacklist());
0032         $this->registerFilter(new HTMLPurifier_URIFilter_SafeIframe());
0033         $this->registerFilter(new HTMLPurifier_URIFilter_MakeAbsolute());
0034         $this->registerFilter(new HTMLPurifier_URIFilter_Munge());
0035     }
0036 
0037     public function registerFilter($filter)
0038     {
0039         $this->registeredFilters[$filter->name] = $filter;
0040     }
0041 
0042     public function addFilter($filter, $config)
0043     {
0044         $r = $filter->prepare($config);
0045         if ($r === false) return; // null is ok, for backwards compat
0046         if ($filter->post) {
0047             $this->postFilters[$filter->name] = $filter;
0048         } else {
0049             $this->filters[$filter->name] = $filter;
0050         }
0051     }
0052 
0053     protected function doSetup($config)
0054     {
0055         $this->setupMemberVariables($config);
0056         $this->setupFilters($config);
0057     }
0058 
0059     protected function setupFilters($config)
0060     {
0061         foreach ($this->registeredFilters as $name => $filter) {
0062             if ($filter->always_load) {
0063                 $this->addFilter($filter, $config);
0064             } else {
0065                 $conf = $config->get('URI.' . $name);
0066                 if ($conf !== false && $conf !== null) {
0067                     $this->addFilter($filter, $config);
0068                 }
0069             }
0070         }
0071         unset($this->registeredFilters);
0072     }
0073 
0074     protected function setupMemberVariables($config)
0075     {
0076         $this->host = $config->get('URI.Host');
0077         $base_uri = $config->get('URI.Base');
0078         if (!is_null($base_uri)) {
0079             $parser = new HTMLPurifier_URIParser();
0080             $this->base = $parser->parse($base_uri);
0081             $this->defaultScheme = $this->base->scheme;
0082             if (is_null($this->host)) $this->host = $this->base->host;
0083         }
0084         if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI.DefaultScheme');
0085     }
0086 
0087     public function getDefaultScheme($config, $context)
0088     {
0089         return HTMLPurifier_URISchemeRegistry::instance()->getScheme($this->defaultScheme, $config, $context);
0090     }
0091 
0092     public function filter(&$uri, $config, $context)
0093     {
0094         foreach ($this->filters as $name => $f) {
0095             $result = $f->filter($uri, $config, $context);
0096             if (!$result) return false;
0097         }
0098         return true;
0099     }
0100 
0101     public function postFilter(&$uri, $config, $context)
0102     {
0103         foreach ($this->postFilters as $name => $f) {
0104             $result = $f->filter($uri, $config, $context);
0105             if (!$result) return false;
0106         }
0107         return true;
0108     }
0109 
0110 }
0111 
0112 // vim: et sw=4 sts=4