<?php

function rocket_decbin32($dec)
{
    return str_pad(decbin($dec), 32, '0', STR_PAD_LEFT);
}
function rocket_ipv4_in_range($ip, $range)
{
    if (strpos($range, '/') !== false) {
        list($range, $netmask) = explode('/', $range, 2);
        if (strpos($netmask, '.') !== false) {
            $netmask = str_replace('*', '0', $netmask);
            $netmask_dec = ip2long($netmask);
            return (ip2long($ip) & $netmask_dec) == (ip2long($range) & $netmask_dec);
        } else {
            $x = explode('.', $range);
            while (count($x) < 4) {
                $x[] = '0';
            }
            list($a, $b, $c, $d) = $x;
            $range = sprintf("%u.%u.%u.%u", empty($a) ? '0' : $a, empty($b) ? '0' : $b, empty($c) ? '0' : $c, empty($d) ? '0' : $d);
            $range_dec = ip2long($range);
            $ip_dec = ip2long($ip);
            $wildcard_dec = pow(2, 32 - $netmask) - 1;
            $netmask_dec = ~$wildcard_dec;
            return ($ip_dec & $netmask_dec) == ($range_dec & $netmask_dec);
        }
    } else {
        if (strpos($range, '*') !== false) {
            $lower = str_replace('*', '0', $range);
            $upper = str_replace('*', '255', $range);
            $range = "{$lower}-{$upper}";
        }
        if (strpos($range, '-') !== false) {
            list($lower, $upper) = explode('-', $range, 2);
            $lower_dec = (float) sprintf("%u", ip2long($lower));
            $upper_dec = (float) sprintf("%u", ip2long($upper));
            $ip_dec = (float) sprintf("%u", ip2long($ip));
            return $ip_dec >= $lower_dec && $ip_dec <= $upper_dec;
        }
        return false;
    }
}
function rocket_ip2long6($ip)
{
    if (substr_count($ip, '::')) {
        $ip = str_replace('::', str_repeat(':0000', 8 - substr_count($ip, ':')) . ':', $ip);
    }
    $ip = explode(':', $ip);
    $r_ip = '';
    foreach ($ip as $v) {
        $r_ip .= str_pad(base_convert(preg_replace("/[^0-9a-fA-F]/", "", $v), 16, 2), 16, 0, STR_PAD_LEFT);
    }
    return base_convert($r_ip, 2, 10);
}
function get_rocket_ipv6_full($ip)
{
    $pieces = explode("/", $ip, 2);
    $left_piece = $pieces[0];
    $right_piece = null;
    if (count($pieces) > 1) {
        $right_piece = $pieces[1];
    }
    $ip_pieces = explode("::", $left_piece, 2);
    $main_ip_piece = $ip_pieces[0];
    $last_ip_piece = null;
    if (count($ip_pieces) > 1) {
        $last_ip_piece = $ip_pieces[1];
    }
    $main_ip_pieces = explode(":", $main_ip_piece);
    foreach ($main_ip_pieces as $key => $val) {
        $main_ip_pieces[$key] = str_pad($main_ip_pieces[$key], 4, "0", STR_PAD_LEFT);
    }
    $last_piece = "";
    $size = count($main_ip_pieces);
    if (trim($last_ip_piece) != "") {
        $last_piece = str_pad($last_ip_piece, 4, "0", STR_PAD_LEFT);
        for ($i = $size; $i < 7; $i++) {
            $main_ip_pieces[$i] = "0000";
        }
        $main_ip_pieces[7] = $last_piece;
    } else {
        for ($i = $size; $i < 8; $i++) {
            $main_ip_pieces[$i] = "0000";
        }
    }
    $final_ip = implode(":", $main_ip_pieces);
    return rocket_ip2long6($final_ip);
}
function rocket_ipv6_in_range($ip, $range_ip)
{
    $pieces = explode("/", $range_ip, 2);
    $left_piece = $pieces[0];
    $right_piece = $pieces[1];
    $ip_pieces = explode("::", $left_piece, 2);
    $main_ip_piece = $ip_pieces[0];
    $last_ip_piece = $ip_pieces[1];
    $main_ip_pieces = explode(":", $main_ip_piece);
    foreach ($main_ip_pieces as $key => $val) {
        $main_ip_pieces[$key] = str_pad($main_ip_pieces[$key], 4, "0", STR_PAD_LEFT);
    }
    $first = $main_ip_pieces;
    $last = $main_ip_pieces;
    $last_piece = "";
    $size = count($main_ip_pieces);
    if (trim($last_ip_piece) != "") {
        $last_piece = str_pad($last_ip_piece, 4, "0", STR_PAD_LEFT);
        for ($i = $size; $i < 7; $i++) {
            $first[$i] = "0000";
            $last[$i] = "ffff";
        }
        $main_ip_pieces[7] = $last_piece;
    } else {
        for ($i = $size; $i < 8; $i++) {
            $first[$i] = "0000";
            $last[$i] = "ffff";
        }
    }
    $first = rocket_ip2long6(implode(":", $first));
    $last = rocket_ip2long6(implode(":", $last));
    $in_range = $ip >= $first && $ip <= $last;
    return $in_range;
}