GeoipNetwork::__construct()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 1
1
<?php
2
3
namespace iriven\bin;
4
5
class GeoipNetwork
6
{
7
    /**
8
     * @var string $ipAddress
9
    **/
10
    private $ipAddress=null;
11
    /**
12
     * Class constructor.
13
     *
14
     * @param string $ipAddress
15
     */
16
    public function __construct(string $ipAddress=null)
17
    {
18
        $ipAddress || $ipAddress = $this->getIPAddress();
19
        $this->validateAddress($ipAddress);
20
        $this->ipAddress = $ipAddress;
21
    }
22
    /**
23
     * Auto Get the current visitor IP Address
24
     * @return string
25
     */
26
    public function getIPAddress()
27
    {
28
        $ipAddress = '';
29
        $ipKeys =['HTTP_X_COMING_FROM', 'HTTP_FORWARDED', 'HTTP_FORWARDED_FOR', 'HTTP_X_CLUSTER_CLIENT_IP',
30
                'HTTP_X_FORWARDED', 'HTTP_VIA', 'HTTP_CLIENT_IP','HTTP_X_FORWARDED_FOR','REMOTE_ADDR'];
31
        foreach ($ipKeys as $key):
32
            if (array_key_exists($key, $_SERVER) && !empty($_SERVER[$key])):
33
                $ipAddress = $_SERVER[$key];
34
                if (($commaPos = strpos($ipAddress, ',')) > 0):
35
                    $ipAddress = substr($ipAddress, 0, ($commaPos - 1));
36
                endif;
37
                break;
38
            endif;
39
        endforeach;
40
        return $ipAddress?:'0.0.0.0';
41
    }
42
    /**
43
     * If IPV6, Returns the IP in it's fullest format.
44
     * @example
45
     *          ::1              => 0000:0000:0000:0000:0000:0000:0000:0001
46
     *          220F::127.0.0.1  => 220F:0000:0000:0000:0000:0000:7F00:0001
47
     *          2F:A1::1         => 002F:00A1:0000:0000:0000:0000:0000:0001
48
     * @param $ipAddress
49
     * @return mixed|string
50
     */
51
    public function expandAddress($ipAddress)
52
    {
53
        $ipAddress || $ipAddress = $this->ipAddress;
54
        try
55
        {
56
            $this->validateAddress($ipAddress);
57
            if (strpos($ipAddress, ':') !== false) // IPv6 address
58
            {
59
                $hex = unpack('H*hex', inet_pton($ipAddress));
60
                $ipAddress = substr(preg_replace('/([A-f0-9]{4})/', "$1:", $hex['hex']), 0, -1);
61
                $ipAddress = strtoupper($ipAddress);
62
            }
63
        } catch (\UnexpectedValueException $th) {
64
            trigger_error($th->getMessage(), E_USER_ERROR);
65
        }
66
        return $ipAddress;
67
    }
68
    /**
69
     * Convert both IPV4 and IPv6 address to int|bigint
70
     *
71
     * @param string $ipAddress
72
     * @return int
73
     */
74
    public function ip2Integer(string $ipAddress)
75
    {
76
        $ipAddress = $this->expandAddress($ipAddress);
77
        if (strpos($ipAddress, ':') !== false):
78
            $bin = inet_pton($ipAddress) ;
79
            $ints = unpack('J2', $bin) ;
80
            return $ints[1] ;
81
        endif;
82
        return ip2long($ipAddress);
83
    }
84
    /**
85
     * Check IP address validity
86
     *
87
     * @param string $ipAddress
88
     * @return string
89
     */
90
    public function validateAddress(string $ipAddress)
91
    {
92
        try
93
        {
94
            if (!filter_var($ipAddress, FILTER_VALIDATE_IP, [FILTER_FLAG_IPV4|FILTER_FLAG_IPV6])) {
95
                throw new \UnexpectedValueException('Invalid IP given: '.$ipAddress);
96
            }
97
        } catch (\UnexpectedValueException $th) {
98
            trigger_error($th->getMessage(), E_USER_ERROR);
99
        }
100
        return $ipAddress;
101
    }
102
    /**
103
     * Get IP version of given address
104
     *
105
     * @param string $ipAddress
106
     * @return integer
107
     */
108
    public function ipVersion(string $ipAddress)
109
    {
110
        $ipAddress || $ipAddress = $this->getIPAddress();
111
        try
112
        {
113
            $ipAddress = $this->expandAddress($ipAddress);
114
            if (strpos($ipAddress, ':') !== false) {return 6;}
115
            return 4;
116
        } catch (\UnexpectedValueException $th) {
117
            trigger_error($th->getMessage(), E_USER_ERROR);
118
        }
119
    }
120
121
    /**
122
     * Check IP address validity
123
     *
124
     * @param string $ipAddress
125
     * @return bool
126
     */
127
    public function isIpAddress(string $ipAddress)
128
    {
129
        $ipAddress || $ipAddress = $this->getIPAddress();
130
        if (filter_var($ipAddress, FILTER_VALIDATE_IP, [FILTER_FLAG_IPV4|FILTER_FLAG_IPV6]) !== false):
131
            return true;
132
        endif;
133
        return false;
134
    }
135
136
}
137