| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | <?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
 |