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

0001 <?php
0002 
0003 /**
0004  * Registry for retrieving specific URI scheme validator objects.
0005  */
0006 class HTMLPurifier_URISchemeRegistry
0007 {
0008 
0009     /**
0010      * Retrieve sole instance of the registry.
0011      * @param HTMLPurifier_URISchemeRegistry $prototype Optional prototype to overload sole instance with,
0012      *                   or bool true to reset to default registry.
0013      * @return HTMLPurifier_URISchemeRegistry
0014      * @note Pass a registry object $prototype with a compatible interface and
0015      *       the function will copy it and return it all further times.
0016      */
0017     public static function instance($prototype = null)
0018     {
0019         static $instance = null;
0020         if ($prototype !== null) {
0021             $instance = $prototype;
0022         } elseif ($instance === null || $prototype == true) {
0023             $instance = new HTMLPurifier_URISchemeRegistry();
0024         }
0025         return $instance;
0026     }
0027 
0028     /**
0029      * Cache of retrieved schemes.
0030      * @type HTMLPurifier_URIScheme[]
0031      */
0032     protected $schemes = array();
0033 
0034     /**
0035      * Retrieves a scheme validator object
0036      * @param string $scheme String scheme name like http or mailto
0037      * @param HTMLPurifier_Config $config
0038      * @param HTMLPurifier_Context $context
0039      * @return HTMLPurifier_URIScheme
0040      */
0041     public function getScheme($scheme, $config, $context)
0042     {
0043         if (!$config) {
0044             $config = HTMLPurifier_Config::createDefault();
0045         }
0046 
0047         // important, otherwise attacker could include arbitrary file
0048         $allowed_schemes = $config->get('URI.AllowedSchemes');
0049         if (!$config->get('URI.OverrideAllowedSchemes') &&
0050             !isset($allowed_schemes[$scheme])
0051         ) {
0052             return;
0053         }
0054 
0055         if (isset($this->schemes[$scheme])) {
0056             return $this->schemes[$scheme];
0057         }
0058         if (!isset($allowed_schemes[$scheme])) {
0059             return;
0060         }
0061 
0062         $class = 'HTMLPurifier_URIScheme_' . $scheme;
0063         if (!class_exists($class)) {
0064             return;
0065         }
0066         $this->schemes[$scheme] = new $class();
0067         return $this->schemes[$scheme];
0068     }
0069 
0070     /**
0071      * Registers a custom scheme to the cache, bypassing reflection.
0072      * @param string $scheme Scheme name
0073      * @param HTMLPurifier_URIScheme $scheme_obj
0074      */
0075     public function register($scheme, $scheme_obj)
0076     {
0077         $this->schemes[$scheme] = $scheme_obj;
0078     }
0079 }
0080 
0081 // vim: et sw=4 sts=4