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

0001 <?php
0002 
0003 /**
0004  * Validates a URI as defined by RFC 3986.
0005  * @note Scheme-specific mechanics deferred to HTMLPurifier_URIScheme
0006  */
0007 class HTMLPurifier_AttrDef_URI extends HTMLPurifier_AttrDef
0008 {
0009 
0010     /**
0011      * @type HTMLPurifier_URIParser
0012      */
0013     protected $parser;
0014 
0015     /**
0016      * @type bool
0017      */
0018     protected $embedsResource;
0019 
0020     /**
0021      * @param bool $embeds_resource Does the URI here result in an extra HTTP request?
0022      */
0023     public function __construct($embeds_resource = false)
0024     {
0025         $this->parser = new HTMLPurifier_URIParser();
0026         $this->embedsResource = (bool)$embeds_resource;
0027     }
0028 
0029     /**
0030      * @param string $string
0031      * @return HTMLPurifier_AttrDef_URI
0032      */
0033     public function make($string)
0034     {
0035         $embeds = ($string === 'embedded');
0036         return new HTMLPurifier_AttrDef_URI($embeds);
0037     }
0038 
0039     /**
0040      * @param string $uri
0041      * @param HTMLPurifier_Config $config
0042      * @param HTMLPurifier_Context $context
0043      * @return bool|string
0044      */
0045     public function validate($uri, $config, $context)
0046     {
0047         if ($config->get('URI.Disable')) {
0048             return false;
0049         }
0050 
0051         $uri = $this->parseCDATA($uri);
0052 
0053         // parse the URI
0054         $uri = $this->parser->parse($uri);
0055         if ($uri === false) {
0056             return false;
0057         }
0058 
0059         // add embedded flag to context for validators
0060         $context->register('EmbeddedURI', $this->embedsResource);
0061 
0062         $ok = false;
0063         do {
0064 
0065             // generic validation
0066             $result = $uri->validate($config, $context);
0067             if (!$result) {
0068                 break;
0069             }
0070 
0071             // chained filtering
0072             $uri_def = $config->getDefinition('URI');
0073             $result = $uri_def->filter($uri, $config, $context);
0074             if (!$result) {
0075                 break;
0076             }
0077 
0078             // scheme-specific validation
0079             $scheme_obj = $uri->getSchemeObj($config, $context);
0080             if (!$scheme_obj) {
0081                 break;
0082             }
0083             if ($this->embedsResource && !$scheme_obj->browsable) {
0084                 break;
0085             }
0086             $result = $scheme_obj->validate($uri, $config, $context);
0087             if (!$result) {
0088                 break;
0089             }
0090 
0091             // Post chained filtering
0092             $result = $uri_def->postFilter($uri, $config, $context);
0093             if (!$result) {
0094                 break;
0095             }
0096 
0097             // survived gauntlet
0098             $ok = true;
0099 
0100         } while (false);
0101 
0102         $context->destroy('EmbeddedURI');
0103         if (!$ok) {
0104             return false;
0105         }
0106         // back to string
0107         return $uri->toString();
0108     }
0109 }
0110 
0111 // vim: et sw=4 sts=4