diff options
Diffstat (limited to 'libs/MaxMindGeoIP/geoipcity.inc')
-rwxr-xr-x | libs/MaxMindGeoIP/geoipcity.inc | 382 |
1 files changed, 193 insertions, 189 deletions
diff --git a/libs/MaxMindGeoIP/geoipcity.inc b/libs/MaxMindGeoIP/geoipcity.inc index a93c3d35dd..44ed49b878 100755 --- a/libs/MaxMindGeoIP/geoipcity.inc +++ b/libs/MaxMindGeoIP/geoipcity.inc @@ -2,7 +2,7 @@ /* geoipcity.inc * - * Copyright (C) 2004 Maxmind LLC + * Copyright (C) 2013 MaxMind, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -11,227 +11,231 @@ * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -/* - * Changelog: - * - * 2005-01-13 Andrew Hill, Awarez Ltd. (http://www.awarez.net) - * Formatted file according to PEAR library standards. - * Changed inclusion of geoip.inc file to require_once, so that - * this library can be used in the same script as geoip.inc. - */ -define("FULL_RECORD_LENGTH",50); +define("FULL_RECORD_LENGTH", 50); require_once 'geoip.inc'; require_once 'geoipregionvars.php'; -class geoiprecord { - var $country_code; - var $country_code3; - var $country_name; - var $region; - var $city; - var $postal_code; - var $latitude; - var $longitude; - var $area_code; - var $dma_code; # metro and dma code are the same. use metro_code - var $metro_code; - var $continent_code; +class geoiprecord +{ + public $country_code; + public $country_code3; + public $country_name; + public $region; + public $city; + public $postal_code; + public $latitude; + public $longitude; + public $area_code; + public $dma_code; # metro and dma code are the same. use metro_code + public $metro_code; + public $continent_code; } -class geoipdnsrecord { - var $country_code; - var $country_code3; - var $country_name; - var $region; - var $regionname; - var $city; - var $postal_code; - var $latitude; - var $longitude; - var $areacode; - var $dmacode; - var $isp; - var $org; - var $metrocode; +class geoipdnsrecord +{ + public $country_code; + public $country_code3; + public $country_name; + public $region; + public $regionname; + public $city; + public $postal_code; + public $latitude; + public $longitude; + public $areacode; + public $dmacode; + public $isp; + public $org; + public $metrocode; } -function getrecordwithdnsservice($str){ - $record = new geoipdnsrecord; - $keyvalue = explode(";",$str); - foreach ($keyvalue as $keyvalue2){ - list($key,$value) = explode("=",$keyvalue2); - if ($key == "co"){ - $record->country_code = $value; - } - if ($key == "ci"){ - $record->city = $value; - } - if ($key == "re"){ - $record->region = $value; - } - if ($key == "ac"){ - $record->areacode = $value; - } - if ($key == "dm" || $key == "me" ){ - $record->dmacode = $value; - $record->metrocode = $value; - } - if ($key == "is"){ - $record->isp = $value; - } - if ($key == "or"){ - $record->org = $value; - } - if ($key == "zi"){ - $record->postal_code = $value; +function getrecordwithdnsservice($str) +{ + $record = new geoipdnsrecord; + $keyvalue = explode(";", $str); + foreach ($keyvalue as $keyvalue2) { + list($key, $value) = explode("=", $keyvalue2); + if ($key == "co") { + $record->country_code = $value; + } + if ($key == "ci") { + $record->city = $value; + } + if ($key == "re") { + $record->region = $value; + } + if ($key == "ac") { + $record->areacode = $value; + } + if ($key == "dm" || $key == "me") { + $record->dmacode = $value; + $record->metrocode = $value; + } + if ($key == "is") { + $record->isp = $value; + } + if ($key == "or") { + $record->org = $value; + } + if ($key == "zi") { + $record->postal_code = $value; + } + if ($key == "la") { + $record->latitude = $value; + } + if ($key == "lo") { + $record->longitude = $value; + } } - if ($key == "la"){ - $record->latitude = $value; + $number = $GLOBALS['GEOIP_COUNTRY_CODE_TO_NUMBER'][$record->country_code]; + $record->country_code3 = $GLOBALS['GEOIP_COUNTRY_CODES3'][$number]; + $record->country_name = $GLOBALS['GEOIP_COUNTRY_NAMES'][$number]; + if ($record->region != "") { + if (($record->country_code == "US") || ($record->country_code == "CA")) { + $record->regionname = $GLOBALS['ISO'][$record->country_code][$record->region]; + } else { + $record->regionname = $GLOBALS['FIPS'][$record->country_code][$record->region]; + } } - if ($key == "lo"){ - $record->longitude = $value; - } - } - $number = $GLOBALS['GEOIP_COUNTRY_CODE_TO_NUMBER'][$record->country_code]; - $record->country_code3 = $GLOBALS['GEOIP_COUNTRY_CODES3'][$number]; - $record->country_name = $GLOBALS['GEOIP_COUNTRY_NAMES'][$number]; - if ($record->region != "") { - if (($record->country_code == "US") || ($record->country_code == "CA")){ - $record->regionname = $GLOBALS['ISO'][$record->country_code][$record->region]; - } else { - $record->regionname = $GLOBALS['FIPS'][$record->country_code][$record->region]; - } - } - return $record; + return $record; } -function _get_record_v6($gi,$ipnum){ - $seek_country = _geoip_seek_country_v6($gi,$ipnum); - if ($seek_country == $gi->databaseSegments) { - return NULL; - } - return _common_get_record($gi, $seek_country); +function _get_record_v6($gi, $ipnum) +{ + $seek_country = _geoip_seek_country_v6($gi, $ipnum); + if ($seek_country == $gi->databaseSegments) { + return null; + } + return _common_get_record($gi, $seek_country); } -function _common_get_record($gi, $seek_country){ - // workaround php's broken substr, strpos, etc handling with - // mbstring.func_overload and mbstring.internal_encoding - $enc = mb_internal_encoding(); - mb_internal_encoding('ISO-8859-1'); - - $record_pointer = $seek_country + (2 * $gi->record_length - 1) * $gi->databaseSegments; - - if ($gi->flags & GEOIP_MEMORY_CACHE) { - $record_buf = substr($gi->memory_buffer,$record_pointer,FULL_RECORD_LENGTH); - } elseif ($gi->flags & GEOIP_SHARED_MEMORY){ - $record_buf = @shmop_read($gi->shmid,$record_pointer,FULL_RECORD_LENGTH); - } else { - fseek($gi->filehandle, $record_pointer, SEEK_SET); - $record_buf = fread($gi->filehandle,FULL_RECORD_LENGTH); - } - $record = new geoiprecord; - $record_buf_pos = 0; - $char = ord(substr($record_buf,$record_buf_pos,1)); +function _common_get_record($gi, $seek_country) +{ + // workaround php's broken substr, strpos, etc handling with + // mbstring.func_overload and mbstring.internal_encoding + $mbExists = extension_loaded('mbstring'); + if ($mbExists) { + $enc = mb_internal_encoding(); + mb_internal_encoding('ISO-8859-1'); + } + + $record_pointer = $seek_country + (2 * $gi->record_length - 1) * $gi->databaseSegments; + + if ($gi->flags & GEOIP_MEMORY_CACHE) { + $record_buf = substr($gi->memory_buffer, $record_pointer, FULL_RECORD_LENGTH); + } elseif ($gi->flags & GEOIP_SHARED_MEMORY) { + $record_buf = @shmop_read($gi->shmid, $record_pointer, FULL_RECORD_LENGTH); + } else { + fseek($gi->filehandle, $record_pointer, SEEK_SET); + $record_buf = fread($gi->filehandle, FULL_RECORD_LENGTH); + } + $record = new geoiprecord; + $record_buf_pos = 0; + $char = ord(substr($record_buf, $record_buf_pos, 1)); $record->country_code = $gi->GEOIP_COUNTRY_CODES[$char]; $record->country_code3 = $gi->GEOIP_COUNTRY_CODES3[$char]; $record->country_name = $gi->GEOIP_COUNTRY_NAMES[$char]; - $record->continent_code = $gi->GEOIP_CONTINENT_CODES[$char]; - $record_buf_pos++; - $str_length = 0; + $record->continent_code = $gi->GEOIP_CONTINENT_CODES[$char]; + $record_buf_pos++; + $str_length = 0; + // Get region - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - while ($char != 0){ - $str_length++; - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - } - if ($str_length > 0){ - $record->region = substr($record_buf,$record_buf_pos,$str_length); - } - $record_buf_pos += $str_length + 1; - $str_length = 0; + $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1)); + while ($char != 0) { + $str_length++; + $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1)); + } + if ($str_length > 0) { + $record->region = substr($record_buf, $record_buf_pos, $str_length); + } + $record_buf_pos += $str_length + 1; + $str_length = 0; // Get city - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - while ($char != 0){ - $str_length++; - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - } - if ($str_length > 0){ - $record->city = substr($record_buf,$record_buf_pos,$str_length); - } - $record_buf_pos += $str_length + 1; - $str_length = 0; + $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1)); + while ($char != 0) { + $str_length++; + $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1)); + } + if ($str_length > 0) { + $record->city = substr($record_buf, $record_buf_pos, $str_length); + } + $record_buf_pos += $str_length + 1; + $str_length = 0; // Get postal code - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - while ($char != 0){ - $str_length++; - $char = ord(substr($record_buf,$record_buf_pos+$str_length,1)); - } - if ($str_length > 0){ - $record->postal_code = substr($record_buf,$record_buf_pos,$str_length); - } - $record_buf_pos += $str_length + 1; - $str_length = 0; + $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1)); + while ($char != 0) { + $str_length++; + $char = ord(substr($record_buf, $record_buf_pos + $str_length, 1)); + } + if ($str_length > 0) { + $record->postal_code = substr($record_buf, $record_buf_pos, $str_length); + } + $record_buf_pos += $str_length + 1; + $str_length = 0; // Get latitude and longitude - $latitude = 0; - $longitude = 0; - for ($j = 0;$j < 3; ++$j){ - $char = ord(substr($record_buf,$record_buf_pos++,1)); - $latitude += ($char << ($j * 8)); - } - $record->latitude = ($latitude/10000) - 180; - for ($j = 0;$j < 3; ++$j){ - $char = ord(substr($record_buf,$record_buf_pos++,1)); - $longitude += ($char << ($j * 8)); - } - $record->longitude = ($longitude/10000) - 180; - if (GEOIP_CITY_EDITION_REV1 == $gi->databaseType){ - $metroarea_combo = 0; - if ($record->country_code == "US"){ - for ($j = 0;$j < 3;++$j){ - $char = ord(substr($record_buf,$record_buf_pos++,1)); - $metroarea_combo += ($char << ($j * 8)); - } - $record->metro_code = $record->dma_code = floor($metroarea_combo/1000); - $record->area_code = $metroarea_combo%1000; - } - } - mb_internal_encoding($enc); - return $record; + $latitude = 0; + $longitude = 0; + for ($j = 0; $j < 3; ++$j) { + $char = ord(substr($record_buf, $record_buf_pos++, 1)); + $latitude += ($char << ($j * 8)); + } + $record->latitude = ($latitude / 10000) - 180; + for ($j = 0; $j < 3; ++$j) { + $char = ord(substr($record_buf, $record_buf_pos++, 1)); + $longitude += ($char << ($j * 8)); + } + $record->longitude = ($longitude / 10000) - 180; + if (GEOIP_CITY_EDITION_REV1 == $gi->databaseType) { + $metroarea_combo = 0; + if ($record->country_code == "US") { + for ($j = 0; $j < 3; ++$j) { + $char = ord(substr($record_buf, $record_buf_pos++, 1)); + $metroarea_combo += ($char << ($j * 8)); + } + $record->metro_code = $record->dma_code = floor($metroarea_combo / 1000); + $record->area_code = $metroarea_combo % 1000; + } + } + if ($mbExists) { + mb_internal_encoding($enc); + } + return $record; } -function GeoIP_record_by_addr_v6 ($gi,$addr){ - if ($addr == NULL){ - return 0; - } - $ipnum = inet_pton($addr); - return _get_record_v6($gi, $ipnum); +function GeoIP_record_by_addr_v6($gi, $addr) +{ + if ($addr == null) { + return 0; + } + $ipnum = inet_pton($addr); + return _get_record_v6($gi, $ipnum); } -function _get_record($gi,$ipnum){ - $seek_country = _geoip_seek_country($gi,$ipnum); - if ($seek_country == $gi->databaseSegments) { - return NULL; - } - return _common_get_record($gi, $seek_country); +function _get_record($gi, $ipnum) +{ + $seek_country = _geoip_seek_country($gi, $ipnum); + if ($seek_country == $gi->databaseSegments) { + return null; + } + return _common_get_record($gi, $seek_country); } -function GeoIP_record_by_addr ($gi,$addr){ - if ($addr == NULL){ - return 0; - } - $ipnum = ip2long($addr); - return _get_record($gi, $ipnum); +function GeoIP_record_by_addr($gi, $addr) +{ + if ($addr == null) { + return 0; + } + $ipnum = ip2long($addr); + return _get_record($gi, $ipnum); } - -?> |