Yaffs site version 1.1
[yaffs-website] / vendor / ezyang / htmlpurifier / library / HTMLPurifier / URIScheme.php
1 <?php
2
3 /**
4  * Validator for the components of a URI for a specific scheme
5  */
6 abstract class HTMLPurifier_URIScheme
7 {
8
9     /**
10      * Scheme's default port (integer). If an explicit port number is
11      * specified that coincides with the default port, it will be
12      * elided.
13      * @type int
14      */
15     public $default_port = null;
16
17     /**
18      * Whether or not URIs of this scheme are locatable by a browser
19      * http and ftp are accessible, while mailto and news are not.
20      * @type bool
21      */
22     public $browsable = false;
23
24     /**
25      * Whether or not data transmitted over this scheme is encrypted.
26      * https is secure, http is not.
27      * @type bool
28      */
29     public $secure = false;
30
31     /**
32      * Whether or not the URI always uses <hier_part>, resolves edge cases
33      * with making relative URIs absolute
34      * @type bool
35      */
36     public $hierarchical = false;
37
38     /**
39      * Whether or not the URI may omit a hostname when the scheme is
40      * explicitly specified, ala file:///path/to/file. As of writing,
41      * 'file' is the only scheme that browsers support his properly.
42      * @type bool
43      */
44     public $may_omit_host = false;
45
46     /**
47      * Validates the components of a URI for a specific scheme.
48      * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object
49      * @param HTMLPurifier_Config $config
50      * @param HTMLPurifier_Context $context
51      * @return bool success or failure
52      */
53     abstract public function doValidate(&$uri, $config, $context);
54
55     /**
56      * Public interface for validating components of a URI.  Performs a
57      * bunch of default actions. Don't overload this method.
58      * @param HTMLPurifier_URI $uri Reference to a HTMLPurifier_URI object
59      * @param HTMLPurifier_Config $config
60      * @param HTMLPurifier_Context $context
61      * @return bool success or failure
62      */
63     public function validate(&$uri, $config, $context)
64     {
65         if ($this->default_port == $uri->port) {
66             $uri->port = null;
67         }
68         // kludge: browsers do funny things when the scheme but not the
69         // authority is set
70         if (!$this->may_omit_host &&
71             // if the scheme is present, a missing host is always in error
72             (!is_null($uri->scheme) && ($uri->host === '' || is_null($uri->host))) ||
73             // if the scheme is not present, a *blank* host is in error,
74             // since this translates into '///path' which most browsers
75             // interpret as being 'http://path'.
76             (is_null($uri->scheme) && $uri->host === '')
77         ) {
78             do {
79                 if (is_null($uri->scheme)) {
80                     if (substr($uri->path, 0, 2) != '//') {
81                         $uri->host = null;
82                         break;
83                     }
84                     // URI is '////path', so we cannot nullify the
85                     // host to preserve semantics.  Try expanding the
86                     // hostname instead (fall through)
87                 }
88                 // first see if we can manually insert a hostname
89                 $host = $config->get('URI.Host');
90                 if (!is_null($host)) {
91                     $uri->host = $host;
92                 } else {
93                     // we can't do anything sensible, reject the URL.
94                     return false;
95                 }
96             } while (false);
97         }
98         return $this->doValidate($uri, $config, $context);
99     }
100 }
101
102 // vim: et sw=4 sts=4