MDL-48766 iplookup: Update to geoip2 db to support ipv6
[moodle.git] / iplookup / lib.php
index da07be6..4afeb3f 100644 (file)
@@ -36,39 +36,30 @@ function iplookup_find_location($ip) {
 
     $info = array('city'=>null, 'country'=>null, 'longitude'=>null, 'latitude'=>null, 'error'=>null, 'note'=>'',  'title'=>array());
 
-    if (!empty($CFG->geoipfile) and file_exists($CFG->geoipfile)) {
-        require_once('Net/GeoIP.php');
+    if (!empty($CFG->geoip2file) and file_exists($CFG->geoip2file)) {
+        $reader = new GeoIp2\Database\Reader($CFG->geoip2file);
+        $record = $reader->city($ip);
 
-        $geoip = Net_GeoIP::getInstance($CFG->geoipfile, Net_GeoIP::STANDARD);
-        $location = $geoip->lookupLocation($ip);
-        $geoip->close();
-
-        if (empty($location)) {
+        if (empty($record)) {
             $info['error'] = get_string('iplookupfailed', 'error', $ip);
             return $info;
         }
-        if (!empty($location->city)) {
-            $info['city'] = core_text::convert($location->city, 'iso-8859-1', 'utf-8');
-            $info['title'][] = $info['city'];
-        }
 
-        if (!empty($location->countryCode)) {
-            $countries = get_string_manager()->get_list_of_countries(true);
-            if (isset($countries[$location->countryCode])) {
-                // prefer our localized country names
-                $info['country'] = $countries[$location->countryCode];
-            } else {
-                $info['country'] = $location->countryName;
-            }
-            $info['title'][] = $info['country'];
-
-        } else if (!empty($location->countryName)) {
-            $info['country'] = $location->countryName;
-            $info['title'][] = $info['country'];
+        $info['city'] = core_text::convert($record->city->name, 'iso-8859-1', 'utf-8');
+        $info['title'][] = $info['city'];
+
+        $countrycode = $record->country->isoCode;
+        $countries = get_string_manager()->get_list_of_countries(true);
+        if (isset($countries[$countrycode])) {
+            // Prefer our localized country names.
+            $info['country'] = $countries[$countrycode];
+        } else {
+            $info['country'] = $record->country->names['en'];
         }
+        $info['title'][] = $info['country'];
 
-        $info['longitude'] = $location->longitude;
-        $info['latitude']  = $location->latitude;
+        $info['longitude'] = $record->location->longitude;
+        $info['latitude']  = $record->location->latitude;
         $info['note'] = get_string('iplookupmaxmindnote', 'admin');
 
         return $info;
@@ -76,6 +67,12 @@ function iplookup_find_location($ip) {
     } else {
         require_once($CFG->libdir.'/filelib.php');
 
+        if (strpos($ip, ':') !== false) {
+            // IPv6 is not supported by geoplugin.net.
+            $info['error'] = get_string('invalidipformat', 'error');
+            return $info;
+        }
+
         $ipdata = download_file_content('http://www.geoplugin.net/json.gp?ip='.$ip);
         if ($ipdata) {
             $ipdata = preg_replace('/^geoPlugin\((.*)\)\s*$/s', '$1', $ipdata);