function validate_ip_address($rxs)
{
global $__vp_validate_error;
if (empty($rxs)) {
$__vp_validate_error = array('error' => 'empty_vp_ip_range');
return false;
}
$remote_ips = array();
if ($this->get_option('allow_forwarded_for') && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$remote_ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
}
if (!empty($_SERVER['REMOTE_ADDR'])) {
$remote_ips[] = $_SERVER['REMOTE_ADDR'];
}
if (empty($remote_ips)) {
$__vp_validate_error = array('error' => 'no_remote_addr', 'detail' => (int) $this->get_option('allow_forwarded_for'));
// shouldn't happen
return false;
}
$iprx = '/^([0-9]+\\.[0-9]+\\.[0-9]+\\.)([0-9]+)$/';
foreach ($remote_ips as $_remote_ip) {
$remote_ip = preg_replace('#^::(ffff:)?#', '', $_remote_ip);
if (!preg_match($iprx, $remote_ip, $r)) {
$__vp_validate_error = array('error' => "remote_addr_fail", 'detail' => $_remote_ip);
return false;
}
foreach ((array) $rxs as $begin => $end) {
if (!preg_match($iprx, $begin, $b)) {
continue;
}
if (!preg_match($iprx, $end, $e)) {
continue;
}
if ($r[1] != $b[1] || $r[1] != $e[1]) {
continue;
}
$me = $r[2];
$b = min((int) $b[2], (int) $e[2]);
$e = max((int) $b[2], (int) $e[2]);
if ($me >= $b && $me <= $e) {
return true;
}
}
}
$__vp_validate_error = array('error' => 'remote_addr_fail', 'detail' => $remote_ips);
return false;
}