--- /dev/null
+<?php\r
+\r
+class HTMLPurifier_URIDefinition extends HTMLPurifier_Definition\r
+{\r
+\r
+ public $type = 'URI';\r
+ protected $filters = array();\r
+ protected $postFilters = array();\r
+ protected $registeredFilters = array();\r
+\r
+ /**\r
+ * HTMLPurifier_URI object of the base specified at %URI.Base\r
+ */\r
+ public $base;\r
+\r
+ /**\r
+ * String host to consider "home" base, derived off of $base\r
+ */\r
+ public $host;\r
+\r
+ /**\r
+ * Name of default scheme based on %URI.DefaultScheme and %URI.Base\r
+ */\r
+ public $defaultScheme;\r
+\r
+ public function __construct()\r
+ {\r
+ $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternal());\r
+ $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources());\r
+ $this->registerFilter(new HTMLPurifier_URIFilter_DisableResources());\r
+ $this->registerFilter(new HTMLPurifier_URIFilter_HostBlacklist());\r
+ $this->registerFilter(new HTMLPurifier_URIFilter_SafeIframe());\r
+ $this->registerFilter(new HTMLPurifier_URIFilter_MakeAbsolute());\r
+ $this->registerFilter(new HTMLPurifier_URIFilter_Munge());\r
+ }\r
+\r
+ public function registerFilter($filter)\r
+ {\r
+ $this->registeredFilters[$filter->name] = $filter;\r
+ }\r
+\r
+ public function addFilter($filter, $config)\r
+ {\r
+ $r = $filter->prepare($config);\r
+ if ($r === false) return; // null is ok, for backwards compat\r
+ if ($filter->post) {\r
+ $this->postFilters[$filter->name] = $filter;\r
+ } else {\r
+ $this->filters[$filter->name] = $filter;\r
+ }\r
+ }\r
+\r
+ protected function doSetup($config)\r
+ {\r
+ $this->setupMemberVariables($config);\r
+ $this->setupFilters($config);\r
+ }\r
+\r
+ protected function setupFilters($config)\r
+ {\r
+ foreach ($this->registeredFilters as $name => $filter) {\r
+ if ($filter->always_load) {\r
+ $this->addFilter($filter, $config);\r
+ } else {\r
+ $conf = $config->get('URI.' . $name);\r
+ if ($conf !== false && $conf !== null) {\r
+ $this->addFilter($filter, $config);\r
+ }\r
+ }\r
+ }\r
+ unset($this->registeredFilters);\r
+ }\r
+\r
+ protected function setupMemberVariables($config)\r
+ {\r
+ $this->host = $config->get('URI.Host');\r
+ $base_uri = $config->get('URI.Base');\r
+ if (!is_null($base_uri)) {\r
+ $parser = new HTMLPurifier_URIParser();\r
+ $this->base = $parser->parse($base_uri);\r
+ $this->defaultScheme = $this->base->scheme;\r
+ if (is_null($this->host)) $this->host = $this->base->host;\r
+ }\r
+ if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI.DefaultScheme');\r
+ }\r
+\r
+ public function getDefaultScheme($config, $context)\r
+ {\r
+ return HTMLPurifier_URISchemeRegistry::instance()->getScheme($this->defaultScheme, $config, $context);\r
+ }\r
+\r
+ public function filter(&$uri, $config, $context)\r
+ {\r
+ foreach ($this->filters as $name => $f) {\r
+ $result = $f->filter($uri, $config, $context);\r
+ if (!$result) return false;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ public function postFilter(&$uri, $config, $context)\r
+ {\r
+ foreach ($this->postFilters as $name => $f) {\r
+ $result = $f->filter($uri, $config, $context);\r
+ if (!$result) return false;\r
+ }\r
+ return true;\r
+ }\r
+\r
+}\r
+\r
+// vim: et sw=4 sts=4\r