forked from infinity-next/infinity-next
-
Notifications
You must be signed in to change notification settings - Fork 0
/
IP.php
183 lines (159 loc) · 3.5 KB
/
IP.php
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
<?php namespace App\Support;
use App\Contracts\PermissionUser;
use App\Support\IP\CIDR as CIDR;
use Log;
use Request;
class IP extends CIDR {
public function __construct($cidr = null, $end = null)
{
if ($cidr === null || $cidr === "")
{
return parent::__construct(Request::ip());
}
// Passing a static, return it.
if ($cidr instanceof static)
{
// If no end, return $cidr.
if ($end === null)
{
return parent::__construct($cidr->getStart(), $cidr->getEnd());
}
// If end is a static, we are creating a range with two exising IPs.
if ($end instanceof static)
{
$end = $end->getEnd();
}
// If $end is binary, return it to base64.
if (is_binary($end))
{
$end = inet_ntop($end);
}
return parent::__construct($cidr->getStart(), $end);
}
else if (is_binary($cidr))
{
try
{
$start = inet_ntop($cidr);
}
catch (\Exception $e)
{
Log::warning("App\Support\IP::__construct trying to make IP from \$cidr binary value \"{$cidr}\" 0x" . bin2hex($cidr) . ", but it's not a real IP!");
if (!env('APP_DEBUG', false))
{
$start = "127.0.0.1";
}
else
{
throw $e;
}
}
}
else
{
try
{
$start = inet_ntop($cidr);
}
catch (\Exception $e)
{
$start = $cidr;
}
}
// Passing a static, return it.
if ($end instanceof static)
{
return parent::__construct($start, $end->getEnd());
}
else if (is_binary($end))
{
try
{
$end = inet_ntop($end);
}
catch (\Exception $e)
{
Log::warning("App\Support\IP::__construct trying to make IP from \$end binary value \"{$cidr}\" 0x" . bin2hex($end) . ", but it's not a real IP!");
if (!env('APP_DEBUG', false))
{
$end = "127.0.0.1";
}
else
{
throw $e;
}
}
}
return parent::__construct($start, $end);
}
public function __toString()
{
return $this->toSQL();
}
public function getStartForSQL()
{
return $this->toSQL(true);
}
public function geEndForSQL()
{
return $this->toSQL(false);
}
public function toBinary()
{
return inet_pton($this->getStart());
}
public function toSQL($start = true)
{
$ip = $start ? $this->getStart() : $this->getEnd();
return binary_sql(inet_pton($ip));
}
public function toLong()
{
return sprintf('%u', ip2long(parent::__toString()));
}
public function toText()
{
return parent::__toString();
}
public function toTextForUser(PermissionUser $user)
{
return $user->getTextForIP($this->toText());
}
public function intersects($cidr)
{
return self::cidr_intersect(parent::__toString(), $cidr);
}
/**
* Quickly determines if the supplied CIDR is the same as this CIDR.
*
* @return boolean
*/
public function is($ip)
{
if ($ip instanceof static)
{
return $ip->getStart() === $this->start && $ip->getEnd() === $this->end;
}
else if (is_string($ip))
{
return $this->start === $ip && $this->end === $ip;
}
return false;
}
/**
* Converts an IPv4 or IPv6 CIDR block into its range.
*
* @static
* @param string $cidr CIDR block or IP address string.
* @param integer|null $bits If /bits is not specified on string they can be passed via this parameter instead.cidr_intersect
* @return array A 2 element array with the low, high range
*/
public static function cidr_to_range($cidr, $bits = null)
{
if ($cidr instanceof static)
{
return parent::cidr_to_range($cidr->getCidr(), $bits);
}
return parent::cidr_to_range($cidr, $bits);
}
}