1: <?php
2:
3: /**
4: * Validates an IPv6 address.
5: * @author Feyd @ forums.devnetwork.net (public domain)
6: * @note This function requires brackets to have been removed from address
7: * in URI.
8: */
9: class HTMLPurifier_AttrDef_URI_IPv6 extends HTMLPurifier_AttrDef_URI_IPv4
10: {
11:
12: /**
13: * @param string $aIP
14: * @param HTMLPurifier_Config $config
15: * @param HTMLPurifier_Context $context
16: * @return bool|string
17: */
18: public function validate($aIP, $config, $context)
19: {
20: if (!$this->ip4) {
21: $this->_loadRegex();
22: }
23:
24: $original = $aIP;
25:
26: $hex = '[0-9a-fA-F]';
27: $blk = '(?:' . $hex . '{1,4})';
28: $pre = '(?:/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))'; // /0 - /128
29:
30: // prefix check
31: if (strpos($aIP, '/') !== false) {
32: if (preg_match('#' . $pre . '$#s', $aIP, $find)) {
33: $aIP = substr($aIP, 0, 0 - strlen($find[0]));
34: unset($find);
35: } else {
36: return false;
37: }
38: }
39:
40: // IPv4-compatiblity check
41: if (preg_match('#(?<=:' . ')' . $this->ip4 . '$#s', $aIP, $find)) {
42: $aIP = substr($aIP, 0, 0 - strlen($find[0]));
43: $ip = explode('.', $find[0]);
44: $ip = array_map('dechex', $ip);
45: $aIP .= $ip[0] . $ip[1] . ':' . $ip[2] . $ip[3];
46: unset($find, $ip);
47: }
48:
49: // compression check
50: $aIP = explode('::', $aIP);
51: $c = count($aIP);
52: if ($c > 2) {
53: return false;
54: } elseif ($c == 2) {
55: list($first, $second) = $aIP;
56: $first = explode(':', $first);
57: $second = explode(':', $second);
58:
59: if (count($first) + count($second) > 8) {
60: return false;
61: }
62:
63: while (count($first) < 8) {
64: array_push($first, '0');
65: }
66:
67: array_splice($first, 8 - count($second), 8, $second);
68: $aIP = $first;
69: unset($first, $second);
70: } else {
71: $aIP = explode(':', $aIP[0]);
72: }
73: $c = count($aIP);
74:
75: if ($c != 8) {
76: return false;
77: }
78:
79: // All the pieces should be 16-bit hex strings. Are they?
80: foreach ($aIP as $piece) {
81: if (!preg_match('#^[0-9a-fA-F]{4}$#s', sprintf('%04s', $piece))) {
82: return false;
83: }
84: }
85: return $original;
86: }
87: }
88:
89: // vim: et sw=4 sts=4
90: