PluginProbe
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder / 1.2
Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder v1.2
V-3.3.0 3.2.2 3.2.1 3.2.0 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 V3.0.3 V3.0.2 -3.0.1 V_3.0.0 1.1.1 1.1.8 1.2 1.3 1.4 1.4.18 1.5.2 1.9 2.0 2.10.0 2.10.1 2.10.2 All 137 releases
bit-form / includes / Core / Util / IpTool.php

IpTool.php in Bit Form – Contact Form, Payment Forms, Multi Step Forms, Calculator & Custom Form Builder 1.2, at includes/Core/Util/IpTool.php

306 lines 11.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Provides IP related functionality
5 */
6
7 namespace BitCode\BitForm\Core\Util;
8
9 final class IpTool
10 {
11 /**
12 * Check ip address
13 *
14 * @return ip_addr IP address of current visitor
15 */
16 private static function _checkIP()
17 {
18 if (getenv('HTTP_CLIENT_IP')) {
19 $ip = getenv('HTTP_CLIENT_IP');
20 } elseif (getenv('HTTP_X_FORWARDED_FOR')) {
21 $ip = getenv('HTTP_X_FORWARDED_FOR');
22 } elseif (getenv('HTTP_X_FORWARDED')) {
23 $ip = getenv('HTTP_X_FORWARDED');
24 } elseif (getenv('HTTP_FORWARDED_FOR')) {
25 $ip = getenv('HTTP_FORWARDED_FOR');
26 } elseif (getenv('HTTP_FORWARDED')) {
27 $ip = getenv('HTTP_FORWARDED');
28 } else {
29 $ip = $_SERVER['REMOTE_ADDR'];
30 }
31 return $ip;
32 }
33 /**
34 * Check device info
35 *
36 * @return void
37 */
38 private static function _checkDevice()
39 {
40 if (isset($_SERVER)) {
41 $user_agent = $_SERVER['HTTP_USER_AGENT'];
42 } else {
43 global $HTTP_SERVER_VARS;
44 if (isset($HTTP_SERVER_VARS)) {
45 $user_agent = $HTTP_SERVER_VARS['HTTP_USER_AGENT'];
46 } else {
47 global $HTTP_USER_AGENT;
48 $user_agent = $HTTP_USER_AGENT;
49 }
50 }
51 return IpTool::_getBrowserName($user_agent) . '|' . IpTool::_getOS($user_agent);
52 }
53 /**
54 * Get browser name
55 *
56 * @link https://stackoverflow.com/questions/18070154/get-operating-system-info
57 *
58 * @param string $user_agent $_SERVER['HTTP_USER_AGENT']
59 *
60 * @return void
61 */
62 private static function _getBrowserName($user_agent)
63 {
64 // Make case insensitive.
65 $t = strtolower($user_agent);
66
67 // If the string *starts* with the string, strpos returns 0 (i.e., FALSE). Do a ghetto hack and start with a space.
68 // "[strpos()] may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE."
69 // http://php.net/manual/en/function.strpos.php
70 $t = " " . $t;
71
72 // Humans / Regular Users
73 if (strpos($t, 'opera') || strpos($t, 'opr/')) {
74 return 'Opera';
75 } elseif (strpos($t, 'edge')) {
76 return 'Edge';
77 } elseif (strpos($t, 'Edg')) {
78 return 'Edge';
79 } elseif (strpos($t, 'chrome')) {
80 return 'Chrome';
81 } elseif (strpos($t, 'safari')) {
82 return 'Safari';
83 } elseif (strpos($t, 'firefox')) {
84 return 'Firefox';
85 } elseif (strpos($t, 'msie') || strpos($t, 'trident/7')) {
86 return 'Internet Explorer';
87 } elseif (strpos($t, 'google')) {
88 return 'Googlebot';
89 } elseif (strpos($t, 'bing')) {
90 return 'Bingbot';
91 } elseif (strpos($t, 'slurp')) {
92 return 'Yahoo! Slurp';
93 } elseif (strpos($t, 'duckduckgo')) {
94 return 'DuckDuckBot';
95 } elseif (strpos($t, 'baidu')) {
96 return 'Baidu';
97 } elseif (strpos($t, 'yandex')) {
98 return 'Yandex';
99 } elseif (strpos($t, 'sogou')) {
100 return 'Sogou';
101 } elseif (strpos($t, 'exabot')) {
102 return 'Exabot';
103 } elseif (strpos($t, 'msn')) {
104 return 'MSN';
105 }
106
107 // Common Tools and Bots
108 elseif (strpos($t, 'mj12bot')) {
109 return 'Majestic';
110 } elseif (strpos($t, 'ahrefs')) {
111 return 'Ahrefs';
112 } elseif (strpos($t, 'semrush')) {
113 return 'SEMRush';
114 } elseif (strpos($t, 'rogerbot') || strpos($t, 'dotbot')) {
115 return 'Moz';
116 } elseif (strpos($t, 'frog') || strpos($t, 'screaming')) {
117 return 'Screaming Frog';
118 } elseif (strpos($t, 'facebook')) {
119 return 'Facebook';
120 } elseif (strpos($t, 'pinterest')) {
121 return 'Pinterest';
122 } elseif (
123 strpos($t, 'crawler') || strpos($t, 'api')
124 || strpos($t, 'spider') || strpos($t, 'http')
125 || strpos($t, 'bot') || strpos($t, 'archive')
126 || strpos($t, 'info') || strpos($t, 'data')
127 ) {
128 return 'Bot';
129 }
130
131 return 'Other (Unknown)';
132 }
133 /**
134 * Provide Operating System Information of User
135 *
136 * @link https://stackoverflow.com/questions/18070154/get-operating-system-info
137 *
138 * @return void
139 */
140 private static function _getOS($user_agent)
141 {
142 $ros[] = array('Windows XP', 'Windows XP');
143 $ros[] = array('Windows NT 5.1|Windows NT5.1', 'Windows XP');
144 $ros[] = array('Windows 2000', 'Windows 2000');
145 $ros[] = array('Windows NT 5.0', 'Windows 2000');
146 $ros[] = array('Windows NT 4.0|WinNT4.0', 'Windows NT');
147 $ros[] = array('Windows NT 5.2', 'Windows Server 2003');
148 $ros[] = array('Windows NT 6.0', 'Windows Vista');
149 $ros[] = array('Windows NT 7.0', 'Windows 7');
150 $ros[] = array('Windows CE', 'Windows CE');
151 $ros[] = array(
152 '(media center pc).([0-9]{1,2}\.[0-9]{1,2})',
153 'Windows Media Center'
154 );
155 $ros[] = array('(win)([0-9]{1,2}\.[0-9x]{1,2})', 'Windows');
156 $ros[] = array('(win)([0-9]{2})', 'Windows');
157 $ros[] = array('(windows)([0-9x]{2})', 'Windows');
158 // Doesn't seem like these are necessary...not totally sure though..
159 //$ros[] = array('(winnt)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'Windows NT');
160 //$ros[] = array('(windows nt)(([0-9]{1,2}\.[0-9]{1,2}){0,1})', 'Windows NT'); // fix by bg
161 $ros[] = array('Windows ME', 'Windows ME');
162 $ros[] = array('Win 9x 4.90', 'Windows ME');
163 $ros[] = array('Windows 98|Win98', 'Windows 98');
164 $ros[] = array('Windows 95', 'Windows 95');
165 $ros[] = array('(windows)([0-9]{1,2}\.[0-9]{1,2})', 'Windows');
166 $ros[] = array('win32', 'Windows');
167 $ros[] = array('(java)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})', 'Java');
168 $ros[] = array('(Solaris)([0-9]{1,2}\.[0-9x]{1,2}){0,1}', 'Solaris');
169 $ros[] = array('dos x86', 'DOS');
170 $ros[] = array('unix', 'Unix');
171 //Android
172 $ros[] = array('SM', 'Samsung');
173 $ros[] = array('HTC', 'HTC');
174 $ros[] = array('LG', 'LG');
175 $ros[] = array('Microsoft', 'Microsoft');
176 $ros[] = array('Pixel', 'Pixel');
177 $ros[] = array('MI', 'Xiaomi');
178 $ros[] = array('Xiaomi', 'Xiaomi');
179 $ros[] = array('Android', 'Android');
180 $ros[] = array('android', 'Android');
181
182 //iPhone
183 $ros[] = array('iPhone', 'iPhone');
184
185 $ros[] = array('Mac OS X', 'Mac OS X');
186 $ros[] = array('Mac OS X Puma', 'Mac OS X 10.1[^0-9]');
187 $ros[] = array('Mac_PowerPC', 'Macintosh PowerPC');
188 $ros[] = array('(mac|Macintosh)', 'Mac OS');
189 $ros[] = array('(sunos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'SunOS');
190 $ros[] = array('(beos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'BeOS');
191 $ros[] = array('(risc os)([0-9]{1,2}\.[0-9]{1,2})', 'RISC OS');
192 $ros[] = array('os\/2', 'OS/2');
193 $ros[] = array('freebsd', 'FreeBSD');
194 $ros[] = array('openbsd', 'OpenBSD');
195 $ros[] = array('netbsd', 'NetBSD');
196 $ros[] = array('irix', 'IRIX');
197 $ros[] = array('plan9', 'Plan9');
198 $ros[] = array('osf', 'OSF');
199 $ros[] = array('aix', 'AIX');
200 $ros[] = array('GNU Hurd', 'GNU Hurd');
201 $ros[] = array('(fedora)', 'Linux - Fedora');
202 $ros[] = array('(kubuntu)', 'Linux - Kubuntu');
203 $ros[] = array('(ubuntu)', 'Linux - Ubuntu');
204 $ros[] = array('(debian)', 'Linux - Debian');
205 $ros[] = array('(CentOS)', 'Linux - CentOS');
206 $ros[] = array(
207 '(Mandriva).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)',
208 'Linux - Mandriva'
209 );
210 $ros[] = array(
211 '(SUSE).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)',
212 'Linux - SUSE'
213 );
214 $ros[] = array('(Dropline)', 'Linux - Slackware (Dropline GNOME)');
215 $ros[] = array('(ASPLinux)', 'Linux - ASPLinux');
216 $ros[] = array('(Red Hat)', 'Linux - Red Hat');
217 // Loads of Linux machines will be detected as unix.
218 // Actually, all of the linux machines I've checked have the 'X11' in the User Agent.
219 //$ros[] = array('X11', 'Unix');
220 $ros[] = array('(linux)', 'Linux');
221 $ros[] = array('(amigaos)([0-9]{1,2}\.[0-9]{1,2})', 'AmigaOS');
222 $ros[] = array('amiga-aweb', 'AmigaOS');
223 $ros[] = array('amiga', 'Amiga');
224 $ros[] = array('AvantGo', 'PalmOS');
225 //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1}-([0-9]{1,2}) i([0-9]{1})86){1}', 'Linux');
226 //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1} i([0-9]{1}86)){1}', 'Linux');
227 //$ros[] = array('(Linux)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3}(rel\.[0-9]{1,2}){0,1})', 'Linux');
228 $ros[] = array('[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3})', 'Linux');
229 $ros[] = array('(webtv)/([0-9]{1,2}\.[0-9]{1,2})', 'WebTV');
230 $ros[] = array('Dreamcast', 'Dreamcast OS');
231 $ros[] = array('GetRight', 'Windows');
232 $ros[] = array('go!zilla', 'Windows');
233 $ros[] = array('gozilla', 'Windows');
234 $ros[] = array('gulliver', 'Windows');
235 $ros[] = array('ia archiver', 'Windows');
236 $ros[] = array('NetPositive', 'Windows');
237 $ros[] = array('mass downloader', 'Windows');
238 $ros[] = array('microsoft', 'Windows');
239 $ros[] = array('offline explorer', 'Windows');
240 $ros[] = array('teleport', 'Windows');
241 $ros[] = array('web downloader', 'Windows');
242 $ros[] = array('webcapture', 'Windows');
243 $ros[] = array('webcollage', 'Windows');
244 $ros[] = array('webcopier', 'Windows');
245 $ros[] = array('webstripper', 'Windows');
246 $ros[] = array('webzip', 'Windows');
247 $ros[] = array('wget', 'Windows');
248 $ros[] = array('Java', 'Unknown');
249 $ros[] = array('flashget', 'Windows');
250 // delete next line if the script show not the right OS
251 //$ros[] = array('(PHP)/([0-9]{1,2}.[0-9]{1,2})', 'PHP');
252 $ros[] = array('MS FrontPage', 'Windows');
253 $ros[] = array('(msproxy)/([0-9]{1,2}.[0-9]{1,2})', 'Windows');
254 $ros[] = array('(msie)([0-9]{1,2}.[0-9]{1,2})', 'Windows');
255 $ros[] = array('libwww-perl', 'Unix');
256 $ros[] = array('UP.Browser', 'Windows CE');
257 $ros[] = array('NetAnts', 'Windows');
258 $ros[] = array('Android', 'Android');
259 $file = count($ros);
260 $os = '';
261 for ($n = 0; $n < $file; $n++) {
262 if (@preg_match('/' . $ros[$n][0] . '/i', $user_agent)) {
263 $os = @$ros[$n][1];
264 break;
265 }
266 }
267 return trim($os);
268 }
269
270 /**
271 * Set user details ip,cdevice, user_id, user's visited page, current mysql formatted time
272 *
273 * @return Array of user details
274 */
275 private static function _setUserDetail()
276 {
277 $user_details['ip'] = ip2long(IpTool::_checkIP());
278 $user_details['device'] = IpTool::_checkDevice();
279 $user_details['id'] = get_current_user_id();
280 $user_details['page'] = is_object(get_post()) ? get_permalink(get_post()->ID) : null;
281 $user_details['time'] = current_time("mysql");
282
283 return $user_details;
284 }
285
286 /**
287 * Provide user details
288 *
289 * @return _setUserDetail user details array
290 */
291 public static function getUserDetail()
292 {
293 return IpTool::_setUserDetail();
294 }
295
296 /**
297 * Provide user IP address
298 *
299 * @return ip
300 */
301 public static function getIP()
302 {
303 return IpTool::_checkIP();
304 }
305 }
306