| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | <?php/** * Registry for retrieving specific URI scheme validator objects. */class HTMLPurifier_URISchemeRegistry{    /**     * Retrieve sole instance of the registry.     * @param HTMLPurifier_URISchemeRegistry $prototype Optional prototype to overload sole instance with,     *                   or bool true to reset to default registry.     * @return HTMLPurifier_URISchemeRegistry     * @note Pass a registry object $prototype with a compatible interface and     *       the function will copy it and return it all further times.     */    public static function instance($prototype = null)    {        static $instance = null;        if ($prototype !== null) {            $instance = $prototype;        } elseif ($instance === null || $prototype == true) {            $instance = new HTMLPurifier_URISchemeRegistry();        }        return $instance;    }    /**     * Cache of retrieved schemes.     * @type HTMLPurifier_URIScheme[]     */    protected $schemes = array();    /**     * Retrieves a scheme validator object     * @param string $scheme String scheme name like http or mailto     * @param HTMLPurifier_Config $config     * @param HTMLPurifier_Context $context     * @return HTMLPurifier_URIScheme     */    public function getScheme($scheme, $config, $context)    {        if (!$config) {            $config = HTMLPurifier_Config::createDefault();        }        // important, otherwise attacker could include arbitrary file        $allowed_schemes = $config->get('URI.AllowedSchemes');        if (!$config->get('URI.OverrideAllowedSchemes') &&            !isset($allowed_schemes[$scheme])        ) {            return;        }        if (isset($this->schemes[$scheme])) {            return $this->schemes[$scheme];        }        if (!isset($allowed_schemes[$scheme])) {            return;        }        $class = 'HTMLPurifier_URIScheme_' . $scheme;        if (!class_exists($class)) {            return;        }        $this->schemes[$scheme] = new $class();        return $this->schemes[$scheme];    }    /**     * Registers a custom scheme to the cache, bypassing reflection.     * @param string $scheme Scheme name     * @param HTMLPurifier_URIScheme $scheme_obj     */    public function register($scheme, $scheme_obj)    {        $this->schemes[$scheme] = $scheme_obj;    }}// vim: et sw=4 sts=4
 |