| 1: | <?php
|
| 2: |
|
| 3: | |
| 4: | |
| 5: | |
| 6: | |
| 7: | |
| 8: |
|
| 9: | class HTMLPurifier_AttrDef_URI_IPv6 extends HTMLPurifier_AttrDef_URI_IPv4
|
| 10: | {
|
| 11: |
|
| 12: | |
| 13: | |
| 14: | |
| 15: | |
| 16: | |
| 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]))';
|
| 29: |
|
| 30: |
|
| 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: |
|
| 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: |
|
| 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: |
|
| 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: |
|
| 90: | |