<?php
/**
* Provides IP related functionality.
*/
namespace BitApps\WPKit\Http;
trait IpTool
{
/**
* Provide user details.
*
* @return setUserDetail user details array
*/
public static function getUserDetail()
{
return self::setUserDetail();
}
/**
* Provide user IP address.
*
* @return ip
*/
public static function ip()
{
return self::checkIP();
}
public function device()
{
return self::checkDevice();
}
public function user()
{
if (is_user_logged_in()) {
return wp_get_current_user();
}
return false;
}
/**
* Check ip address.
*
* @return string IP address of current visitor
*/
private static function checkIP()
{
if (getenv('HTTP_CLIENT_IP')) {
$ip = sanitize_text_field(getenv('HTTP_CLIENT_IP'));
} elseif (getenv('HTTP_X_FORWARDED_FOR')) {
$ip = sanitize_text_field(getenv('HTTP_X_FORWARDED_FOR'));
} elseif (getenv('HTTP_X_FORWARDED')) {
$ip = sanitize_text_field(getenv('HTTP_X_FORWARDED'));
} elseif (getenv('HTTP_FORWARDED_FOR')) {
$ip = sanitize_text_field(getenv('HTTP_FORWARDED_FOR'));
} elseif (getenv('HTTP_FORWARDED')) {
$ip = sanitize_text_field(getenv('HTTP_FORWARDED'));
} else {
$ip = sanitize_text_field($_SERVER['REMOTE_ADDR']);
}
return filter_var($ip, FILTER_VALIDATE_IP);
}
/**
* Check device info.
*/
private static function checkDevice()
{
return isset(
$_SERVER['HTTP_USER_AGENT']
) ? self::getBrowserName(wp_kses($_SERVER['HTTP_USER_AGENT'], [])) . '|' . self::getOS(wp_kses($_SERVER['HTTP_USER_AGENT'], [])) : '';
}
/**
* Get browser name.
*
* @param string $userAgent $_SERVER['HTTP_USER_AGENT']
*
* @see https://stackoverflow.com/questions/18070154/get-operating-system-info
*/
private static function getBrowserName($userAgent)
{
// Make case insensitive.
$t = strtolower($userAgent);
// If the string *starts* with the string, strpos returns 0 (i.e., FALSE). Do a ghetto hack and start with a space.
// "[strpos()] may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE."
// http://php.net/manual/en/function.strpos.php
$t = ' ' . $t;
// Humans / Regular Users
if (strpos($t, 'opera') || strpos($t, 'opr/')) {
return 'Opera';
}
if (strpos($t, 'edge')) {
return 'Edge';
}
if (strpos($t, 'Edg')) {
return 'Edge';
}
if (strpos($t, 'chrome')) {
return 'Chrome';
}
if (strpos($t, 'safari')) {
return 'Safari';
}
if (strpos($t, 'firefox')) {
return 'Firefox';
}
if (strpos($t, 'msie') || strpos($t, 'trident/7')) {
return 'Internet Explorer';
}
if (strpos($t, 'google')) {
return 'Googlebot';
}
if (strpos($t, 'bing')) {
return 'Bingbot';
}
if (strpos($t, 'slurp')) {
return 'Yahoo! Slurp';
}
if (strpos($t, 'duckduckgo')) {
return 'DuckDuckBot';
}
if (strpos($t, 'baidu')) {
return 'Baidu';
}
if (strpos($t, 'yandex')) {
return 'Yandex';
}
if (strpos($t, 'sogou')) {
return 'Sogou';
}
if (strpos($t, 'exabot')) {
return 'Exabot';
}
if (strpos($t, 'msn')) {
return 'MSN';
}
// Common Tools and Bots
if (strpos($t, 'mj12bot')) {
return 'Majestic';
}
if (strpos($t, 'ahrefs')) {
return 'Ahrefs';
}
if (strpos($t, 'semrush')) {
return 'SEMRush';
}
if (strpos($t, 'rogerbot') || strpos($t, 'dotbot')) {
return 'Moz';
}
if (strpos($t, 'frog') || strpos($t, 'screaming')) {
return 'Screaming Frog';
}
if (strpos($t, 'facebook')) {
return 'Facebook';
}
if (strpos($t, 'pinterest')) {
return 'Pinterest';
}
if (
strpos($t, 'crawler')
|| strpos($t, 'api')
|| strpos($t, 'spider')
|| strpos($t, 'http')
|| strpos($t, 'bot')
|| strpos($t, 'archive')
|| strpos($t, 'info')
|| strpos($t, 'data')
) {
return 'Bot';
}
return 'Other (Unknown)';
}
/**
* Provide Operating System Information of User.
*
* @param mixed $userAgent
*
* @see https://stackoverflow.com/questions/18070154/get-operating-system-info
*/
private static function getOS($userAgent)
{
$ros[] = ['Windows XP', 'Windows XP'];
$ros[] = ['Windows NT 5.1|Windows NT5.1', 'Windows XP'];
$ros[] = ['Windows 2000', 'Windows 2000'];
$ros[] = ['Windows NT 5.0', 'Windows 2000'];
$ros[] = ['Windows NT 4.0|WinNT4.0', 'Windows NT'];
$ros[] = ['Windows NT 5.2', 'Windows Server 2003'];
$ros[] = ['Windows NT 6.0', 'Windows Vista'];
$ros[] = ['Windows NT 7.0', 'Windows 7'];
$ros[] = ['Windows CE', 'Windows CE'];
$ros[] = [
'(media center pc).([0-9]{1,2}\.[0-9]{1,2})',
'Windows Media Center',
];
$ros[] = ['(win)([0-9]{1,2}\.[0-9x]{1,2})', 'Windows'];
$ros[] = ['(win)([0-9]{2})', 'Windows'];
$ros[] = ['(windows)([0-9x]{2})', 'Windows'];
// Doesn't seem like these are necessary...not totally sure though..
// $ros[] = array('(winnt)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'Windows NT');
// $ros[] = array('(windows nt)(([0-9]{1,2}\.[0-9]{1,2}){0,1})', 'Windows NT'); // fix by bg
$ros[] = ['Windows ME', 'Windows ME'];
$ros[] = ['Win 9x 4.90', 'Windows ME'];
$ros[] = ['Windows 98|Win98', 'Windows 98'];
$ros[] = ['Windows 95', 'Windows 95'];
$ros[] = ['(windows)([0-9]{1,2}\.[0-9]{1,2})', 'Windows'];
$ros[] = ['win32', 'Windows'];
$ros[] = ['(java)([0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2})', 'Java'];
$ros[] = ['(Solaris)([0-9]{1,2}\.[0-9x]{1,2}){0,1}', 'Solaris'];
$ros[] = ['dos x86', 'DOS'];
$ros[] = ['unix', 'Unix'];
// Android
$ros[] = ['SM', 'Samsung'];
$ros[] = ['HTC', 'HTC'];
$ros[] = ['LG', 'LG'];
$ros[] = ['Microsoft', 'Microsoft'];
$ros[] = ['Pixel', 'Pixel'];
$ros[] = ['MI', 'Xiaomi'];
$ros[] = ['Xiaomi', 'Xiaomi'];
$ros[] = ['Android', 'Android'];
$ros[] = ['android', 'Android'];
// iPhone
$ros[] = ['iPhone', 'iPhone'];
$ros[] = ['Mac OS X', 'Mac OS X'];
$ros[] = ['Mac OS X Puma', 'Mac OS X 10.1[^0-9]'];
$ros[] = ['Mac_PowerPC', 'Macintosh PowerPC'];
$ros[] = ['(mac|Macintosh)', 'Mac OS'];
$ros[] = ['(sunos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'SunOS'];
$ros[] = ['(beos)([0-9]{1,2}\.[0-9]{1,2}){0,1}', 'BeOS'];
$ros[] = ['(risc os)([0-9]{1,2}\.[0-9]{1,2})', 'RISC OS'];
$ros[] = ['os\/2', 'OS/2'];
$ros[] = ['freebsd', 'FreeBSD'];
$ros[] = ['openbsd', 'OpenBSD'];
$ros[] = ['netbsd', 'NetBSD'];
$ros[] = ['irix', 'IRIX'];
$ros[] = ['plan9', 'Plan9'];
$ros[] = ['osf', 'OSF'];
$ros[] = ['aix', 'AIX'];
$ros[] = ['GNU Hurd', 'GNU Hurd'];
$ros[] = ['(fedora)', 'Linux - Fedora'];
$ros[] = ['(kubuntu)', 'Linux - Kubuntu'];
$ros[] = ['(ubuntu)', 'Linux - Ubuntu'];
$ros[] = ['(debian)', 'Linux - Debian'];
$ros[] = ['(CentOS)', 'Linux - CentOS'];
$ros[] = [
'(Mandriva).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)',
'Linux - Mandriva',
];
$ros[] = [
'(SUSE).([0-9]{1,3}(\.[0-9]{1,3})?(\.[0-9]{1,3})?)',
'Linux - SUSE',
];
$ros[] = ['(Dropline)', 'Linux - Slackware (Dropline GNOME)'];
$ros[] = ['(ASPLinux)', 'Linux - ASPLinux'];
$ros[] = ['(Red Hat)', 'Linux - Red Hat'];
$ros[] = ['(linux)', 'Linux'];
$ros[] = ['(amigaos)([0-9]{1,2}\.[0-9]{1,2})', 'AmigaOS'];
$ros[] = ['amiga-aweb', 'AmigaOS'];
$ros[] = ['amiga', 'Amiga'];
$ros[] = ['AvantGo', 'PalmOS'];
$ros[] = ['[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,3})', 'Linux'];
$ros[] = ['(webtv)/([0-9]{1,2}\.[0-9]{1,2})', 'WebTV'];
$ros[] = ['Dreamcast', 'Dreamcast OS'];
$ros[] = ['GetRight', 'Windows'];
$ros[] = ['go!zilla', 'Windows'];
$ros[] = ['gozilla', 'Windows'];
$ros[] = ['gulliver', 'Windows'];
$ros[] = ['ia archiver', 'Windows'];
$ros[] = ['NetPositive', 'Windows'];
$ros[] = ['mass downloader', 'Windows'];
$ros[] = ['microsoft', 'Windows'];
$ros[] = ['offline explorer', 'Windows'];
$ros[] = ['teleport', 'Windows'];
$ros[] = ['web downloader', 'Windows'];
$ros[] = ['webcapture', 'Windows'];
$ros[] = ['webcollage', 'Windows'];
$ros[] = ['webcopier', 'Windows'];
$ros[] = ['webstripper', 'Windows'];
$ros[] = ['webzip', 'Windows'];
$ros[] = ['wget', 'Windows'];
$ros[] = ['Java', 'Unknown'];
$ros[] = ['flashget', 'Windows'];
$ros[] = ['MS FrontPage', 'Windows'];
$ros[] = ['(msproxy)/([0-9]{1,2}.[0-9]{1,2})', 'Windows'];
$ros[] = ['(msie)([0-9]{1,2}.[0-9]{1,2})', 'Windows'];
$ros[] = ['libwww-perl', 'Unix'];
$ros[] = ['UP.Browser', 'Windows CE'];
$ros[] = ['NetAnts', 'Windows'];
$ros[] = ['Android', 'Android'];
$file = \count($ros);
$os = '';
for ($n = 0; $n < $file; ++$n) {
if (@preg_match('/' . $ros[$n][0] . '/i', $userAgent)) {
$os = @$ros[$n][1];
break;
}
}
return trim($os);
}
/**
* Set user details ip,cdevice, user_id, user's visited page, current mysql formatted time.
*
* @return array of user details
*/
private static function setUserDetail()
{
$userDetails['ip'] = ip2long(self::checkIP());
$userDetails['device'] = self::checkDevice();
$userDetails['id'] = get_current_user_id();
$userDetails['page'] = \is_object(get_post()) ? get_permalink(get_post()->ID) : null;
$userDetails['time'] = current_time('mysql');
return $userDetails;
}
}