File indexing completed on 2024-12-22 05:36:22
0001 <?php 0002 0003 /** 0004 * Validator for the components of a URI for a specific scheme 0005 */ 0006 abstract class HTMLPurifier_URIScheme 0007 { 0008 0009 /** 0010 * Scheme's default port (integer). If an explicit port number is 0011 * specified that coincides with the default port, it will be 0012 * elided. 0013 * @type int 0014 */ 0015 public $default_port = null; 0016 0017 /** 0018 * Whether or not URIs of this scheme are locatable by a browser 0019 * http and ftp are accessible, while mailto and news are not. 0020 * @type bool 0021 */ 0022 public $browsable = false; 0023 0024 /** 0025 * Whether or not data transmitted over this scheme is encrypted. 0026 * https is secure, http is not. 0027 * @type bool 0028 */ 0029 public $secure = false; 0030 0031 /** 0032 * Whether or not the URI always uses <hier_part>, resolves edge cases 0033 * with making relative URIs absolute 0034 * @type bool 0035 */ 0036 public $hierarchical = false; 0037 0038 /** 0039 * Whether or not the URI may omit a hostname when the scheme is 0040 * explicitly specified, ala file:///path/to/file. As of writing, 0041 * 'file' is the only scheme that browsers support his properly. 0042 * @type bool 0043 */ 0044 public $may_omit_host = false; 0045 0046 /** 0047 * Validates the components of a URI for a specific scheme. 0048 * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object 0049 * @param HTMLPurifier_Config $config 0050 * @param HTMLPurifier_Context $context 0051 * @return bool success or failure 0052 */ 0053 abstract public function doValidate(&$uri, $config, $context); 0054 0055 /** 0056 * Public interface for validating components of a URI. Performs a 0057 * bunch of default actions. Don't overload this method. 0058 * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object 0059 * @param HTMLPurifier_Config $config 0060 * @param HTMLPurifier_Context $context 0061 * @return bool success or failure 0062 */ 0063 public function validate(&$uri, $config, $context) 0064 { 0065 if ($this->default_port == $uri->port) { 0066 $uri->port = null; 0067 } 0068 // kludge: browsers do funny things when the scheme but not the 0069 // authority is set 0070 if (!$this->may_omit_host && 0071 // if the scheme is present, a missing host is always in error 0072 (!is_null($uri->scheme) && ($uri->host === '' || is_null($uri->host))) || 0073 // if the scheme is not present, a *blank* host is in error, 0074 // since this translates into '///path' which most browsers 0075 // interpret as being 'http://path'. 0076 (is_null($uri->scheme) && $uri->host === '') 0077 ) { 0078 do { 0079 if (is_null($uri->scheme)) { 0080 if (substr($uri->path, 0, 2) != '//') { 0081 $uri->host = null; 0082 break; 0083 } 0084 // URI is '////path', so we cannot nullify the 0085 // host to preserve semantics. Try expanding the 0086 // hostname instead (fall through) 0087 } 0088 // first see if we can manually insert a hostname 0089 $host = $config->get('URI.Host'); 0090 if (!is_null($host)) { 0091 $uri->host = $host; 0092 } else { 0093 // we can't do anything sensible, reject the URL. 0094 return false; 0095 } 0096 } while (false); 0097 } 0098 return $this->doValidate($uri, $config, $context); 0099 } 0100 } 0101 0102 // vim: et sw=4 sts=4