112 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Validates a URI as defined by RFC 3986.
							 | 
						||
| 
								 | 
							
								 * @note Scheme-specific mechanics deferred to HTMLPurifier_URIScheme
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class HTMLPurifier_AttrDef_URI extends HTMLPurifier_AttrDef
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @type HTMLPurifier_URIParser
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected $parser;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @type bool
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected $embedsResource;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @param bool $embeds_resource Does the URI here result in an extra HTTP request?
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function __construct($embeds_resource = false)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->parser = new HTMLPurifier_URIParser();
							 | 
						||
| 
								 | 
							
								        $this->embedsResource = (bool)$embeds_resource;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @param string $string
							 | 
						||
| 
								 | 
							
								     * @return HTMLPurifier_AttrDef_URI
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function make($string)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $embeds = ($string === 'embedded');
							 | 
						||
| 
								 | 
							
								        return new HTMLPurifier_AttrDef_URI($embeds);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * @param string $uri
							 | 
						||
| 
								 | 
							
								     * @param HTMLPurifier_Config $config
							 | 
						||
| 
								 | 
							
								     * @param HTMLPurifier_Context $context
							 | 
						||
| 
								 | 
							
								     * @return bool|string
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    public function validate($uri, $config, $context)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if ($config->get('URI.Disable')) {
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $uri = $this->parseCDATA($uri);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // parse the URI
							 | 
						||
| 
								 | 
							
								        $uri = $this->parser->parse($uri);
							 | 
						||
| 
								 | 
							
								        if ($uri === false) {
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // add embedded flag to context for validators
							 | 
						||
| 
								 | 
							
								        $context->register('EmbeddedURI', $this->embedsResource);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $ok = false;
							 | 
						||
| 
								 | 
							
								        do {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // generic validation
							 | 
						||
| 
								 | 
							
								            $result = $uri->validate($config, $context);
							 | 
						||
| 
								 | 
							
								            if (!$result) {
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // chained filtering
							 | 
						||
| 
								 | 
							
								            $uri_def = $config->getDefinition('URI');
							 | 
						||
| 
								 | 
							
								            $result = $uri_def->filter($uri, $config, $context);
							 | 
						||
| 
								 | 
							
								            if (!$result) {
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // scheme-specific validation
							 | 
						||
| 
								 | 
							
								            $scheme_obj = $uri->getSchemeObj($config, $context);
							 | 
						||
| 
								 | 
							
								            if (!$scheme_obj) {
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            if ($this->embedsResource && !$scheme_obj->browsable) {
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            $result = $scheme_obj->validate($uri, $config, $context);
							 | 
						||
| 
								 | 
							
								            if (!$result) {
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Post chained filtering
							 | 
						||
| 
								 | 
							
								            $result = $uri_def->postFilter($uri, $config, $context);
							 | 
						||
| 
								 | 
							
								            if (!$result) {
							 | 
						||
| 
								 | 
							
								                break;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // survived gauntlet
							 | 
						||
| 
								 | 
							
								            $ok = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        } while (false);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $context->destroy('EmbeddedURI');
							 | 
						||
| 
								 | 
							
								        if (!$ok) {
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        // back to string
							 | 
						||
| 
								 | 
							
								        return $uri->toString();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// vim: et sw=4 sts=4
							 |