fix ipinfo parsing

This commit is contained in:
Stefan Stidl 2023-11-05 02:08:11 +01:00
parent 58e2b413f2
commit 9b8faee10d

View file

@ -76,7 +76,7 @@ function getIpInfoTokenString()
return ''; return '';
} }
return '?token='.$IPINFO_APIKEY; return '?token=' . $IPINFO_APIKEY;
} }
/** /**
@ -86,7 +86,7 @@ function getIpInfoTokenString()
*/ */
function getIspInfo($ip) function getIspInfo($ip)
{ {
$json = file_get_contents('https://ipinfo.io/'.$ip.'/json'.getIpInfoTokenString()); $json = file_get_contents('https://ipinfo.io/' . $ip . '/json' . getIpInfoTokenString());
if (!is_string($json)) { if (!is_string($json)) {
return null; return null;
} }
@ -106,17 +106,91 @@ function getIspInfo($ip)
*/ */
function getIsp($rawIspInfo) function getIsp($rawIspInfo)
{ {
if ( if (is_array($rawIspInfo)) {
!is_array($rawIspInfo) /* variant with no token
|| !array_key_exists('org', $rawIspInfo) has json like:
|| !is_string($rawIspInfo['org']) {
|| empty($rawIspInfo['org']) "ip": "xxx.xxx.xxx.xxx",
) { "hostname": "example.com",
return 'Unknown ISP'; "city": "Vienna",
"region": "Vienna",
"country": "AT",
"loc": "48.2085,16.3721",
"org": "ASxxxx T-Mobile Austria GmbH",
"postal": "nnnn",
"timezone": "Europe/Vienna",
"readme": "https://ipinfo.io/missingauth"
}
*/
if (
array_key_exists('org', $rawIspInfo)
&& is_string($rawIspInfo['org'])
&& !empty($rawIspInfo['org'])
) {
// Remove AS##### from ISP name, if present
return preg_replace('/AS\\d+\\s/', '', $rawIspInfo['org']);
}
/*
variant with valid token has json:
{
"ip": "xxx.xxx.xxx.xxx",
"hostname": "example.com",
"city": "Vienna",
"region": "Vienna",
"country": "AT",
"loc": "48.2085,16.3721",
"postal": "1010",
"timezone": "Europe/Vienna",
"asn": {
"asn": "ASxxxx",
"name": "T-Mobile Austria GmbH",
"domain": "t-mobile.at",
"route": "xxx.xxx.xxx.xxx/xx",
"type": "isp"
},
"company": {
"name": "XX",
"domain": "example.com",
"type": "isp"
},
"privacy": {
"vpn": true,
"proxy": false,
"tor": false,
"relay": false,
"hosting": false,
"service": ""
},
"abuse": {
"address": "...",
"country": "AT",
"email": "abuse@example.com",
"name": "XXX",
"network": "xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx",
"phone": ""
},
"domains": {
"total": 0,
"domains": [
]
}
}
*/
if (
array_key_exists('asn', $rawIspInfo)
&& is_string($rawIspInfo['asn'])
&& !empty($rawIspInfo['asn'])
&& array_key_exists('name', $rawIspInfo['asn'])
&& is_string($rawIspInfo['asn']['name'])
) {
// Remove AS##### from ISP name, if present
return $rawIspInfo['asn']['name'];
}
} }
// Remove AS##### from ISP name, if present return 'Unknown ISP';
return preg_replace('/AS\\d+\\s/', '', $rawIspInfo['org']);
} }
/** /**
@ -135,7 +209,7 @@ function getServerLocation()
return $serverLoc; return $serverLoc;
} }
$json = file_get_contents('https://ipinfo.io/json'.getIpInfoTokenString()); $json = file_get_contents('https://ipinfo.io/json' . getIpInfoTokenString());
if (!is_string($json)) { if (!is_string($json)) {
return null; return null;
} }
@ -151,7 +225,7 @@ function getServerLocation()
} }
$serverLoc = $details['loc']; $serverLoc = $details['loc'];
$cacheData = "<?php\n\n\$serverLoc = '".addslashes($serverLoc)."';\n"; $cacheData = "<?php\n\n\$serverLoc = '" . addslashes($serverLoc) . "';\n";
file_put_contents(SERVER_LOCATION_CACHE_FILE, $cacheData); file_put_contents(SERVER_LOCATION_CACHE_FILE, $cacheData);
return $serverLoc; return $serverLoc;
@ -240,7 +314,7 @@ function calculateDistance($clientLocation, $serverLocation, $unit)
$dist = '<15'; $dist = '<15';
} }
return $dist.' mi'; return $dist . ' mi';
} }
if ('km' === $unit) { if ('km' === $unit) {
@ -249,7 +323,7 @@ function calculateDistance($clientLocation, $serverLocation, $unit)
$dist = '<20'; $dist = '<20';
} }
return $dist.' km'; return $dist . ' km';
} }
return null; return null;
@ -288,17 +362,17 @@ function sendResponse(
) { ) {
$processedString = $ip; $processedString = $ip;
if (is_string($ipInfo)) { if (is_string($ipInfo)) {
$processedString .= ' - '.$ipInfo; $processedString .= ' - ' . $ipInfo;
} }
if ( if (
is_array($rawIspInfo) is_array($rawIspInfo)
&& array_key_exists('country', $rawIspInfo) && array_key_exists('country', $rawIspInfo)
) { ) {
$processedString .= ', '.$rawIspInfo['country']; $processedString .= ', ' . $rawIspInfo['country'];
} }
if (is_string($distance)) { if (is_string($distance)) {
$processedString .= ' ('.$distance.')'; $processedString .= ' (' . $distance . ')';
} }
sendHeaders(); sendHeaders();