/**
  * Check if the supplied IP address is within the user supplied range.
  *
  * @param string $ip
  * @return bool
  */
 public function isIPInRange($ip)
 {
     $ip_string = $this->getIPString();
     // IPv4 range
     if (strpos($ip_string, '.') !== false && strpos($ip, '.') !== false) {
         // IPv4-mapped-IPv6
         if (preg_match('/:ffff:([^:]+)$/i', $ip_string, $matches)) {
             $ip_string = $matches[1];
         }
         if (preg_match('/:ffff:([^:]+)$/i', $ip, $matches)) {
             $ip = $matches[1];
         }
         // Range check
         if (preg_match('/\\[\\d+\\-\\d+\\]/', $ip_string)) {
             $IPparts = explode('.', $ip);
             $whiteParts = explode('.', $ip_string);
             $mismatch = false;
             for ($i = 0; $i <= 3; $i++) {
                 if (preg_match('/^\\[(\\d+)\\-(\\d+)\\]$/', $whiteParts[$i], $m)) {
                     if ($IPparts[$i] < $m[1] || $IPparts[$i] > $m[2]) {
                         $mismatch = true;
                     }
                 } else {
                     if ($whiteParts[$i] != $IPparts[$i]) {
                         $mismatch = true;
                     }
                 }
             }
             if ($mismatch === false) {
                 return true;
                 // Is whitelisted because we did not get a mismatch
             }
         } else {
             if ($ip_string == $ip) {
                 return true;
             }
         }
         // IPv6 range
     } else {
         if (strpos($ip_string, ':') !== false && strpos($ip, ':') !== false) {
             $ip = strtolower(wfWAFUtils::expandIPv6Address($ip));
             $ip_string = strtolower(self::expandIPv6Range($ip_string));
             if (preg_match('/\\[[a-f0-9]+\\-[a-f0-9]+\\]/i', $ip_string)) {
                 $IPparts = explode(':', $ip);
                 $whiteParts = explode(':', $ip_string);
                 $mismatch = false;
                 for ($i = 0; $i <= 7; $i++) {
                     if (preg_match('/^\\[([a-f0-9]+)\\-([a-f0-9]+)\\]$/i', $whiteParts[$i], $m)) {
                         $ip_group = hexdec($IPparts[$i]);
                         $range_group_from = hexdec($m[1]);
                         $range_group_to = hexdec($m[2]);
                         if ($ip_group < $range_group_from || $ip_group > $range_group_to) {
                             $mismatch = true;
                             break;
                         }
                     } else {
                         if ($whiteParts[$i] != $IPparts[$i]) {
                             $mismatch = true;
                             break;
                         }
                     }
                 }
                 if ($mismatch === false) {
                     return true;
                     // Is whitelisted because we did not get a mismatch
                 }
             } else {
                 if ($ip_string == $ip) {
                     return true;
                 }
             }
         }
     }
     return false;
 }