Browse Source

fix ipinfo parsing

Stefan Stidl 2 years ago
parent
commit
9b8faee10d
1 changed files with 92 additions and 18 deletions
  1. 92 18
      backend/getIP.php

+ 92 - 18
backend/getIP.php

@@ -76,7 +76,7 @@ function getIpInfoTokenString()
         return '';
     }
 
-    return '?token='.$IPINFO_APIKEY;
+    return '?token=' . $IPINFO_APIKEY;
 }
 
 /**
@@ -86,7 +86,7 @@ function getIpInfoTokenString()
  */
 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)) {
         return null;
     }
@@ -106,17 +106,91 @@ function getIspInfo($ip)
  */
 function getIsp($rawIspInfo)
 {
-    if (
-        !is_array($rawIspInfo)
-        || !array_key_exists('org', $rawIspInfo)
-        || !is_string($rawIspInfo['org'])
-        || empty($rawIspInfo['org'])
-    ) {
-        return 'Unknown ISP';
+    if (is_array($rawIspInfo)) {
+        /* variant with no token
+        has json like: 
+        {
+            "ip": "xxx.xxx.xxx.xxx",
+            "hostname": "example.com",
+            "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": "[email protected]",
+                "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 preg_replace('/AS\\d+\\s/', '', $rawIspInfo['org']);
+    return 'Unknown ISP';
 }
 
 /**
@@ -135,7 +209,7 @@ function getServerLocation()
         return $serverLoc;
     }
 
-    $json = file_get_contents('https://ipinfo.io/json'.getIpInfoTokenString());
+    $json = file_get_contents('https://ipinfo.io/json' . getIpInfoTokenString());
     if (!is_string($json)) {
         return null;
     }
@@ -151,7 +225,7 @@ function getServerLocation()
     }
 
     $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);
 
     return $serverLoc;
@@ -240,7 +314,7 @@ function calculateDistance($clientLocation, $serverLocation, $unit)
             $dist = '<15';
         }
 
-        return $dist.' mi';
+        return $dist . ' mi';
     }
 
     if ('km' === $unit) {
@@ -249,7 +323,7 @@ function calculateDistance($clientLocation, $serverLocation, $unit)
             $dist = '<20';
         }
 
-        return $dist.' km';
+        return $dist . ' km';
     }
 
     return null;
@@ -288,17 +362,17 @@ function sendResponse(
 ) {
     $processedString = $ip;
     if (is_string($ipInfo)) {
-        $processedString .= ' - '.$ipInfo;
+        $processedString .= ' - ' . $ipInfo;
     }
 
     if (
         is_array($rawIspInfo)
         && array_key_exists('country', $rawIspInfo)
     ) {
-        $processedString .= ', '.$rawIspInfo['country'];
+        $processedString .= ', ' . $rawIspInfo['country'];
     }
     if (is_string($distance)) {
-        $processedString .= ' ('.$distance.')';
+        $processedString .= ' (' . $distance . ')';
     }
 
     sendHeaders();