Blame view

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