Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
/iplookup/ -> lib.php (source)

Differences Between: [Versions 401 and 403]

   1  <?php
   2  
   3  // This file is part of Moodle - http://moodle.org/
   4  //
   5  // Moodle is free software: you can redistribute it and/or modify
   6  // it under the terms of the GNU General Public License as published by
   7  // the Free Software Foundation, either version 3 of the License, or
   8  // (at your option) any later version.
   9  //
  10  // Moodle is distributed in the hope that it will be useful,
  11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13  // GNU General Public License for more details.
  14  //
  15  // You should have received a copy of the GNU General Public License
  16  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  17  
  18  /**
  19   * IP Lookup utility functions
  20   *
  21   * @package    core
  22   * @subpackage iplookup
  23   * @copyright  2010 Petr Skoda {@link http://skodak.org}
  24   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  25   */
  26  
  27  defined('MOODLE_INTERNAL') || die();
  28  
  29  /**
  30   * Returns location information
  31   * @param string $ip
  32   * @return array
  33   */
  34  function iplookup_find_location($ip) {
  35      global $CFG;
  36  
  37      $info = array('city'=>null, 'country'=>null, 'longitude'=>null, 'latitude'=>null, 'error'=>null, 'note'=>'',  'title'=>array());
  38  
  39      if (!empty($CFG->geoip2file) and file_exists($CFG->geoip2file)) {
  40          $reader = new GeoIp2\Database\Reader($CFG->geoip2file);
  41          $record = $reader->city($ip);
  42  
  43          if (empty($record)) {
  44              $info['error'] = get_string('iplookupfailed', 'error', $ip);
  45              return $info;
  46          }
  47  
  48          $info['city'] = core_text::convert($record->city->name, 'iso-8859-1', 'utf-8');
  49          $info['title'][] = $info['city'];
  50  
  51          $countrycode = $record->country->isoCode;
  52          $countries = get_string_manager()->get_list_of_countries(true);
  53          if (isset($countries[$countrycode])) {
  54              // Prefer our localized country names.
  55              $info['country'] = $countries[$countrycode];
  56          } else {
  57              $info['country'] = $record->country->names['en'];
  58          }
  59          $info['title'][] = $info['country'];
  60  
  61          $info['longitude'] = $record->location->longitude;
  62          $info['latitude']  = $record->location->latitude;
  63          $info['note'] = get_string('iplookupmaxmindnote', 'admin');
  64  
  65          return $info;
  66  
  67      } else {
  68          require_once($CFG->libdir.'/filelib.php');
  69  
  70          if (strpos($ip, ':') !== false) {
  71              // IPv6 is not supported by geoplugin.net.
  72              $info['error'] = get_string('invalidipformat', 'error');
  73              return $info;
  74          }
  75  
  76          $ipdata = download_file_content('http://www.geoplugin.net/json.gp?ip='.$ip);
  77          if ($ipdata) {
  78              $ipdata = preg_replace('/^geoPlugin\((.*)\)\s*$/s', '$1', $ipdata);
  79              $ipdata = json_decode($ipdata, true);
  80          }
  81          if (!is_array($ipdata)) {
  82              $info['error'] = get_string('cannotgeoplugin', 'error');
  83              return $info;
  84          }
  85          $info['latitude']  = (float)$ipdata['geoplugin_latitude'];
  86          $info['longitude'] = (float)$ipdata['geoplugin_longitude'];
  87          $info['city']      = s($ipdata['geoplugin_city']);
  88  
  89          $countrycode = $ipdata['geoplugin_countryCode'];
  90          $countries = get_string_manager()->get_list_of_countries(true);
  91          if (isset($countries[$countrycode])) {
  92              // prefer our localized country names
  93              $info['country'] = $countries[$countrycode];
  94          } else {
  95              $info['country'] = s($ipdata['geoplugin_countryName']);
  96          }
  97  
  98          $info['note'] = get_string('iplookupgeoplugin', 'admin');
  99  
 100          $info['title'][] = $info['city'];
 101          $info['title'][] = $info['country'];
 102  
 103          return $info;
 104      }
 105  
 106  }