1 |
efrain |
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
|