summaryrefslogtreecommitdiffstats
path: root/EssentialsGeoIP/src/com/maxmind/geoip/LookupService.java
diff options
context:
space:
mode:
authormd_5 <md_5@bigpond.com>2013-01-13 09:51:23 +1100
committermd_5 <md_5@bigpond.com>2013-01-13 09:51:23 +1100
commit4818bec0d855a6d1309b2fecfab2206b8220e3dc (patch)
treead74c7d6b65b21267c8568f7b477052914c40235 /EssentialsGeoIP/src/com/maxmind/geoip/LookupService.java
parent2a26e4603446effaeeb167f1dff87bf61f5ad33e (diff)
downloadEssentials-4818bec0d855a6d1309b2fecfab2206b8220e3dc.tar
Essentials-4818bec0d855a6d1309b2fecfab2206b8220e3dc.tar.gz
Essentials-4818bec0d855a6d1309b2fecfab2206b8220e3dc.tar.lz
Essentials-4818bec0d855a6d1309b2fecfab2206b8220e3dc.tar.xz
Essentials-4818bec0d855a6d1309b2fecfab2206b8220e3dc.zip
Update the build system slightly to use embedded libraries.
Diffstat (limited to 'EssentialsGeoIP/src/com/maxmind/geoip/LookupService.java')
-rw-r--r--EssentialsGeoIP/src/com/maxmind/geoip/LookupService.java1046
1 files changed, 0 insertions, 1046 deletions
diff --git a/EssentialsGeoIP/src/com/maxmind/geoip/LookupService.java b/EssentialsGeoIP/src/com/maxmind/geoip/LookupService.java
deleted file mode 100644
index 19da6c8f5..000000000
--- a/EssentialsGeoIP/src/com/maxmind/geoip/LookupService.java
+++ /dev/null
@@ -1,1046 +0,0 @@
-/**
- * LookupService.java
- *
- * Copyright (C) 2003 MaxMind LLC. All Rights Reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * 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
- * 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
- */
-
-package com.maxmind.geoip;
-
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.net.Inet6Address;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.StringTokenizer;
-import javax.naming.NamingException;
-import javax.naming.directory.Attributes;
-import javax.naming.directory.DirContext;
-import javax.naming.directory.InitialDirContext;
-
-/**
- * Provides a lookup service for information based on an IP address. The location of
- * a database file is supplied when creating a lookup service instance. The edition of
- * the database determines what information is available about an IP address. See the
- * DatabaseInfo class for further details.<p>
- *
- * The following code snippet demonstrates looking up the country that an IP
- * address is from:
- * <pre>
- * // First, create a LookupService instance with the location of the database.
- * LookupService lookupService = new LookupService("c:\\geoip.dat");
- * // Assume we have a String ipAddress (in dot-decimal form).
- * Country country = lookupService.getCountry(ipAddress);
- * System.out.println("The country is: " + country.getName());
- * System.out.println("The country code is: " + country.getCode());
- * </pre>
- *
- * In general, a single LookupService instance should be created and then reused
- * repeatedly.<p>
- *
- * <i>Tip:</i> Those deploying the GeoIP API as part of a web application may find it
- * difficult to pass in a File to create the lookup service, as the location of the
- * database may vary per deployment or may even be part of the web-application. In this
- * case, the database should be added to the classpath of the web-app. For example, by
- * putting it into the WEB-INF/classes directory of the web application. The following code
- * snippet demonstrates how to create a LookupService using a database that can be found
- * on the classpath:
- *
- * <pre>
- * String fileName = getClass().getResource("/GeoIP.dat").toExternalForm().substring(6);
- * LookupService lookupService = new LookupService(fileName);</pre>
- *
- * @author Matt Tucker (matt@jivesoftware.com)
- */
-public class LookupService {
-
- /**
- * Database file.
- */
- private RandomAccessFile file = null;
- private File databaseFile = null;
-
- /**
- * Information about the database.
- */
- private DatabaseInfo databaseInfo = null;
-
- /**
- * The database type. Default is the country edition.
- */
- byte databaseType = DatabaseInfo.COUNTRY_EDITION;
-
- int databaseSegments[];
- int recordLength;
-
- String licenseKey;
- int dnsService = 0;
- int dboptions;
- byte dbbuffer[];
- byte index_cache[];
- long mtime;
- int last_netmask;
- private final static int US_OFFSET = 1;
- private final static int CANADA_OFFSET = 677;
- private final static int WORLD_OFFSET = 1353;
- private final static int FIPS_RANGE = 360;
- private final static int COUNTRY_BEGIN = 16776960;
- private final static int STATE_BEGIN_REV0 = 16700000;
- private final static int STATE_BEGIN_REV1 = 16000000;
- private final static int STRUCTURE_INFO_MAX_SIZE = 20;
- private final static int DATABASE_INFO_MAX_SIZE = 100;
- public final static int GEOIP_STANDARD = 0;
- public final static int GEOIP_MEMORY_CACHE = 1;
- public final static int GEOIP_CHECK_CACHE = 2;
- public final static int GEOIP_INDEX_CACHE = 4;
- public final static int GEOIP_UNKNOWN_SPEED = 0;
- public final static int GEOIP_DIALUP_SPEED = 1;
- public final static int GEOIP_CABLEDSL_SPEED = 2;
- public final static int GEOIP_CORPORATE_SPEED = 3;
-
-
- private final static int SEGMENT_RECORD_LENGTH = 3;
- private final static int STANDARD_RECORD_LENGTH = 3;
- private final static int ORG_RECORD_LENGTH = 4;
- private final static int MAX_RECORD_LENGTH = 4;
-
- private final static int MAX_ORG_RECORD_LENGTH = 300;
- private final static int FULL_RECORD_LENGTH = 60;
-
- private final Country UNKNOWN_COUNTRY = new Country("--", "N/A");
-
- private static final HashMap hashmapcountryCodetoindex = new HashMap(512);
- private static final HashMap hashmapcountryNametoindex = new HashMap(512);
- private static final String[] countryCode = {
- "--","AP","EU","AD","AE","AF","AG","AI","AL","AM","AN","AO","AQ","AR",
- "AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ",
- "BM","BN","BO","BR","BS","BT","BV","BW","BY","BZ","CA","CC","CD","CF",
- "CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CX","CY","CZ",
- "DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","FI",
- "FJ","FK","FM","FO","FR","FX","GA","GB","GD","GE","GF","GH","GI","GL",
- "GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HM","HN","HR",
- "HT","HU","ID","IE","IL","IN","IO","IQ","IR","IS","IT","JM","JO","JP",
- "KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC",
- "LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","MG","MH","MK",
- "ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY",
- "MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM",
- "PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY",
- "QA","RE","RO","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ",
- "SK","SL","SM","SN","SO","SR","ST","SV","SY","SZ","TC","TD","TF","TG",
- "TH","TJ","TK","TM","TN","TO","TL","TR","TT","TV","TW","TZ","UA","UG",
- "UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE",
- "YT","RS","ZA","ZM","ME","ZW","A1","A2","O1","AX","GG","IM","JE","BL",
- "MF"};
-
- private static final String[] countryName = {
- "N/A","Asia/Pacific Region","Europe","Andorra","United Arab Emirates",
- "Afghanistan","Antigua and Barbuda","Anguilla","Albania","Armenia",
- "Netherlands Antilles","Angola","Antarctica","Argentina","American Samoa",
- "Austria","Australia","Aruba","Azerbaijan","Bosnia and Herzegovina",
- "Barbados","Bangladesh","Belgium","Burkina Faso","Bulgaria","Bahrain",
- "Burundi","Benin","Bermuda","Brunei Darussalam","Bolivia","Brazil","Bahamas",
- "Bhutan","Bouvet Island","Botswana","Belarus","Belize","Canada",
- "Cocos (Keeling) Islands","Congo, The Democratic Republic of the",
- "Central African Republic","Congo","Switzerland","Cote D'Ivoire",
- "Cook Islands","Chile","Cameroon","China","Colombia","Costa Rica","Cuba",
- "Cape Verde","Christmas Island","Cyprus","Czech Republic","Germany",
- "Djibouti","Denmark","Dominica","Dominican Republic","Algeria","Ecuador",
- "Estonia","Egypt","Western Sahara","Eritrea","Spain","Ethiopia","Finland",
- "Fiji","Falkland Islands (Malvinas)","Micronesia, Federated States of",
- "Faroe Islands","France","France, Metropolitan","Gabon","United Kingdom",
- "Grenada","Georgia","French Guiana","Ghana","Gibraltar","Greenland","Gambia",
- "Guinea","Guadeloupe","Equatorial Guinea","Greece",
- "South Georgia and the South Sandwich Islands","Guatemala","Guam",
- "Guinea-Bissau","Guyana","Hong Kong","Heard Island and McDonald Islands",
- "Honduras","Croatia","Haiti","Hungary","Indonesia","Ireland","Israel","India",
- "British Indian Ocean Territory","Iraq","Iran, Islamic Republic of",
- "Iceland","Italy","Jamaica","Jordan","Japan","Kenya","Kyrgyzstan","Cambodia",
- "Kiribati","Comoros","Saint Kitts and Nevis",
- "Korea, Democratic People's Republic of","Korea, Republic of","Kuwait",
- "Cayman Islands","Kazakhstan","Lao People's Democratic Republic","Lebanon",
- "Saint Lucia","Liechtenstein","Sri Lanka","Liberia","Lesotho","Lithuania",
- "Luxembourg","Latvia","Libyan Arab Jamahiriya","Morocco","Monaco",
- "Moldova, Republic of","Madagascar","Marshall Islands",
- "Macedonia","Mali","Myanmar","Mongolia",
- "Macau","Northern Mariana Islands","Martinique","Mauritania","Montserrat",
- "Malta","Mauritius","Maldives","Malawi","Mexico","Malaysia","Mozambique",
- "Namibia","New Caledonia","Niger","Norfolk Island","Nigeria","Nicaragua",
- "Netherlands","Norway","Nepal","Nauru","Niue","New Zealand","Oman","Panama",
- "Peru","French Polynesia","Papua New Guinea","Philippines","Pakistan",
- "Poland","Saint Pierre and Miquelon","Pitcairn Islands","Puerto Rico","" +
- "Palestinian Territory","Portugal","Palau","Paraguay","Qatar",
- "Reunion","Romania","Russian Federation","Rwanda","Saudi Arabia",
- "Solomon Islands","Seychelles","Sudan","Sweden","Singapore","Saint Helena",
- "Slovenia","Svalbard and Jan Mayen","Slovakia","Sierra Leone","San Marino",
- "Senegal","Somalia","Suriname","Sao Tome and Principe","El Salvador",
- "Syrian Arab Republic","Swaziland","Turks and Caicos Islands","Chad",
- "French Southern Territories","Togo","Thailand","Tajikistan","Tokelau",
- "Turkmenistan","Tunisia","Tonga","Timor-Leste","Turkey","Trinidad and Tobago",
- "Tuvalu","Taiwan","Tanzania, United Republic of","Ukraine","Uganda",
- "United States Minor Outlying Islands","United States","Uruguay","Uzbekistan",
- "Holy See (Vatican City State)","Saint Vincent and the Grenadines",
- "Venezuela","Virgin Islands, British","Virgin Islands, U.S.","Vietnam",
- "Vanuatu","Wallis and Futuna","Samoa","Yemen","Mayotte","Serbia",
- "South Africa","Zambia","Montenegro","Zimbabwe","Anonymous Proxy",
- "Satellite Provider","Other","Aland Islands","Guernsey","Isle of Man","Jersey",
- "Saint Barthelemy","Saint Martin"};
-
-
- /* init the hashmap once at startup time */
- static {
- int i;
- if(countryCode.length!=countryName.length)
- throw new AssertionError("countryCode.length!=countryName.length");
-
- // distributed service only
- for (i = 0; i < countryCode.length ;i++){
- hashmapcountryCodetoindex.put(countryCode[i],Integer.valueOf(i));
- hashmapcountryNametoindex.put(countryName[i],Integer.valueOf(i));
- }
- };
-
-
- /**
- * Create a new distributed lookup service using the license key
- *
- * @param databaseFile String representation of the database file.
- * @param licenseKey license key provided by Maxmind to access distributed service
- */
- public LookupService(String databaseFile,String licenseKey) throws IOException {
- this(new File(databaseFile));
- this.licenseKey = licenseKey;
- dnsService = 1;
- }
- /**
- * Create a new distributed lookup service using the license key
- *
- * @param databaseFile the database file.
- * @param licenseKey license key provided by Maxmind to access distributed service
- */
- public LookupService(File databaseFile,String licenseKey) throws IOException {
- this(databaseFile);
- this.licenseKey = licenseKey;
- dnsService = 1;
- }
- /**
- * Create a new distributed lookup service using the license key
- *
- * @param options Resevered for future use
- * @param licenseKey license key provided by Maxmind to access distributed service
- */
- public LookupService(int options,String licenseKey) throws IOException {
- this.licenseKey = licenseKey;
- dnsService = 1;
- init();
- }
- /**
- * Create a new lookup service using the specified database file.
- *
- * @param databaseFile String representation of the database file.
- * @throws java.io.IOException if an error occured creating the lookup service
- * from the database file.
- */
- public LookupService(String databaseFile) throws IOException {
- this(new File(databaseFile));
- }
-
- /**
- * Create a new lookup service using the specified database file.
- *
- * @param databaseFile the database file.
- * @throws java.io.IOException if an error occured creating the lookup service
- * from the database file.
- */
- public LookupService(File databaseFile) throws IOException {
- this.databaseFile = databaseFile;
- this.file = new RandomAccessFile(databaseFile, "r");
- init();
- }
-
- /**
- * Create a new lookup service using the specified database file.
- *
- * @param databaseFile String representation of the database file.
- * @param options database flags to use when opening the database
- * GEOIP_STANDARD read database from disk
- * GEOIP_MEMORY_CACHE cache the database in RAM and read it from RAM
- * @throws java.io.IOException if an error occured creating the lookup service
- * from the database file.
- */
- public LookupService(String databaseFile, int options) throws IOException{
- this(new File(databaseFile),options);
- }
-
- /**
- * Create a new lookup service using the specified database file.
- *
- * @param databaseFile the database file.
- * @param options database flags to use when opening the database
- * GEOIP_STANDARD read database from disk
- * GEOIP_MEMORY_CACHE cache the database in RAM and read it from RAM
- * @throws java.io.IOException if an error occured creating the lookup service
- * from the database file.
- */
- public LookupService(File databaseFile, int options) throws IOException{
- this.databaseFile = databaseFile;
- this.file = new RandomAccessFile(databaseFile, "r");
- dboptions = options;
- init();
- }
- /**
- * Reads meta-data from the database file.
- *
- * @throws java.io.IOException if an error occurs reading from the database file.
- */
- private void init() throws IOException {
- int i, j;
- byte [] delim = new byte[3];
- byte [] buf = new byte[SEGMENT_RECORD_LENGTH];
-
- if (file == null) {
- return;
- }
- if ((dboptions & GEOIP_CHECK_CACHE) != 0) {
- mtime = databaseFile.lastModified();
- }
- file.seek(file.length() - 3);
- for (i = 0; i < STRUCTURE_INFO_MAX_SIZE; i++) {
- file.readFully(delim);
- if (delim[0] == -1 && delim[1] == -1 && delim[2] == -1) {
- databaseType = file.readByte();
- if (databaseType >= 106) {
- // Backward compatibility with databases from April 2003 and earlier
- databaseType -= 105;
- }
- // Determine the database type.
- if (databaseType == DatabaseInfo.REGION_EDITION_REV0) {
- databaseSegments = new int[1];
- databaseSegments[0] = STATE_BEGIN_REV0;
- recordLength = STANDARD_RECORD_LENGTH;
- }else if (databaseType == DatabaseInfo.REGION_EDITION_REV1){
- databaseSegments = new int[1];
- databaseSegments[0] = STATE_BEGIN_REV1;
- recordLength = STANDARD_RECORD_LENGTH;
- }
- else if (databaseType == DatabaseInfo.CITY_EDITION_REV0 ||
- databaseType == DatabaseInfo.CITY_EDITION_REV1 ||
- databaseType == DatabaseInfo.ORG_EDITION ||
- databaseType == DatabaseInfo.ISP_EDITION ||
- databaseType == DatabaseInfo.ASNUM_EDITION) {
- databaseSegments = new int[1];
- databaseSegments[0] = 0;
- if (databaseType == DatabaseInfo.CITY_EDITION_REV0 ||
- databaseType == DatabaseInfo.CITY_EDITION_REV1 ||
- databaseType == DatabaseInfo.ASNUM_EDITION) {
- recordLength = STANDARD_RECORD_LENGTH;
- }
- else {
- recordLength = ORG_RECORD_LENGTH;
- }
- file.readFully(buf);
- for (j = 0; j < SEGMENT_RECORD_LENGTH; j++) {
- databaseSegments[0] += (unsignedByteToInt(buf[j]) << (j * 8));
- }
- }
- break;
- }
- else {
- file.seek(file.getFilePointer() - 4);
- }
- }
- if ((databaseType == DatabaseInfo.COUNTRY_EDITION) ||
- (databaseType == DatabaseInfo.COUNTRY_EDITION_V6) ||
- (databaseType == DatabaseInfo.PROXY_EDITION) ||
- (databaseType == DatabaseInfo.NETSPEED_EDITION)) {
- databaseSegments = new int[1];
- databaseSegments[0] = COUNTRY_BEGIN;
- recordLength = STANDARD_RECORD_LENGTH;
- }
- if ((dboptions & GEOIP_MEMORY_CACHE) == 1) {
- int l = (int) file.length();
- dbbuffer = new byte[l];
- file.seek(0);
- file.readFully(dbbuffer,0,l);
- databaseInfo = this.getDatabaseInfo();
- file.close();
- }
- if ((dboptions & GEOIP_INDEX_CACHE) != 0) {
- int l = databaseSegments[0] * recordLength * 2;
- index_cache = new byte[l];
- if (index_cache != null){
- file.seek(0);
- file.readFully(index_cache,0,l);
- }
- } else {
- index_cache = null;
- }
- }
-
- /**
- * Closes the lookup service.
- */
- public void close() {
- try {
- if (file != null){
- file.close();
- }
- file = null;
- }
- catch (Exception e) { }
- }
-
- /**
- * Returns the country the IP address is in.
- *
- * @param ipAddress String version of an IPv6 address, i.e. "::127.0.0.1"
- * @return the country the IP address is from.
- */
- public Country getCountryV6(String ipAddress) {
- InetAddress addr;
- try {
- addr = Inet6Address.getByName(ipAddress);
- }
- catch (UnknownHostException e) {
- return UNKNOWN_COUNTRY;
- }
- return getCountryV6(addr);
- }
-
- /**
- * Returns the country the IP address is in.
- *
- * @param ipAddress String version of an IP address, i.e. "127.0.0.1"
- * @return the country the IP address is from.
- */
- public Country getCountry(String ipAddress) {
- InetAddress addr;
- try {
- addr = InetAddress.getByName(ipAddress);
- }
- catch (UnknownHostException e) {
- return UNKNOWN_COUNTRY;
- }
- return getCountry(bytesToLong(addr.getAddress()));
- }
-
- /**
- * Returns the country the IP address is in.
- *
- * @param ipAddress the IP address.
- * @return the country the IP address is from.
- */
- public synchronized Country getCountry(InetAddress ipAddress) {
- return getCountry(bytesToLong(ipAddress.getAddress()));
- }
-
- /**
- * Returns the country the IP address is in.
- *
- * @param addr the IP address as Inet6Address.
- * @return the country the IP address is from.
- */
- public Country getCountryV6(InetAddress addr) {
- if (file == null && (dboptions & GEOIP_MEMORY_CACHE) == 0) {
- throw new IllegalStateException("Database has been closed.");
- }
- int ret = seekCountryV6(addr) - COUNTRY_BEGIN;
- if (ret == 0) {
- return UNKNOWN_COUNTRY;
- }
- else {
- return new Country(countryCode[ret], countryName[ret]);
- }
- }
-
- /**
- * Returns the country the IP address is in.
- *
- * @param ipAddress the IP address in long format.
- * @return the country the IP address is from.
- */
- public Country getCountry(long ipAddress) {
- if (file == null && (dboptions & GEOIP_MEMORY_CACHE) == 0) {
- throw new IllegalStateException("Database has been closed.");
- }
- int ret = seekCountry(ipAddress) - COUNTRY_BEGIN;
- if (ret == 0) {
- return UNKNOWN_COUNTRY;
- }
- else {
- return new Country(countryCode[ret], countryName[ret]);
- }
- }
-
- public int getID(String ipAddress) {
- InetAddress addr;
- try {
- addr = InetAddress.getByName(ipAddress);
- }
- catch (UnknownHostException e) {
- return 0;
- }
- return getID(bytesToLong(addr.getAddress()));
- }
-
- public int getID(InetAddress ipAddress) {
- return getID(bytesToLong(ipAddress.getAddress()));
- }
-
- public synchronized int getID(long ipAddress) {
- if (file == null && (dboptions & GEOIP_MEMORY_CACHE) == 0) {
- throw new IllegalStateException("Database has been closed.");
- }
- int ret = seekCountry(ipAddress) - databaseSegments[0];
- return ret;
- }
-
- public int last_netmask() {
- return this.last_netmask;
- }
-
- public void netmask(int nm){
- this.last_netmask = nm;
- }
-
- /**
- * Returns information about the database.
- *
- * @return database info.
- */
- public synchronized DatabaseInfo getDatabaseInfo() {
- if (databaseInfo != null) {
- return databaseInfo;
- }
- try {
- _check_mtime();
- boolean hasStructureInfo = false;
- byte [] delim = new byte[3];
- // Advance to part of file where database info is stored.
- file.seek(file.length() - 3);
- for (int i=0; i<STRUCTURE_INFO_MAX_SIZE; i++) {
- int read = file.read( delim );
- if( read==3 && (delim[0]&0xFF)==255 && (delim[1]&0xFF) == 255 && (delim[2]&0xFF)==255 ){
- hasStructureInfo = true;
- break;
- }
- file.seek(file.getFilePointer() - 4);
-
- }
- if (hasStructureInfo) {
- file.seek(file.getFilePointer() - 6);
- }
- else {
- // No structure info, must be pre Sep 2002 database, go back to end.
- file.seek(file.length() - 3);
- }
- // Find the database info string.
- for (int i=0; i<DATABASE_INFO_MAX_SIZE; i++) {
- file.readFully(delim);
- if (delim[0]==0 && delim[1]==0 && delim[2]==0) {
- byte[] dbInfo = new byte[i];
- file.readFully(dbInfo);
- // Create the database info object using the string.
- this.databaseInfo = new DatabaseInfo(new String(dbInfo));
- return databaseInfo;
- }
- file.seek(file.getFilePointer() -4);
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- return new DatabaseInfo("");
- }
-
- synchronized void _check_mtime(){
- try {
- if ((dboptions & GEOIP_CHECK_CACHE) != 0){
- long t = databaseFile.lastModified();
- if (t != mtime){
- /* GeoIP Database file updated */
- /* refresh filehandle */
- file.close();
- file = new RandomAccessFile(databaseFile,"r");
- databaseInfo = null;
- init();
- }
- }
- } catch (IOException e) {
- System.out.println("file not found");
- }
- }
-
- // for GeoIP City only
- public Location getLocation(InetAddress addr) {
- return getLocation(bytesToLong(addr.getAddress()));
- }
-
- // for GeoIP City only
- public Location getLocation(String str) {
- if (dnsService == 0) {
- InetAddress addr;
- try {
- addr = InetAddress.getByName(str);
- }
- catch (UnknownHostException e) {
- return null;
- }
-
- return getLocation(addr);
- } else {
- String str2 = getDnsAttributes(str);
- return getLocationwithdnsservice(str2);
- // TODO if DNS is not available, go to local file as backup
- }
- }
-
- String getDnsAttributes(String ip) {
- try {
- Hashtable env = new Hashtable();
- env.put("java.naming.factory.initial", "com.sun.jndi.dns.DnsContextFactory");
- // TODO don't specify ws1, instead use ns servers for s.maxmind.com
- env.put("java.naming.provider.url","dns://ws1.maxmind.com/");
-
- DirContext ictx = new InitialDirContext(env);
- Attributes attrs = ictx.getAttributes(licenseKey + "." + ip + ".s.maxmind.com", new String[] {"txt"});
- //System.out.println(attrs.get("txt").get());
- String str = attrs.get("txt").get().toString();
- return str;
- }
- catch(NamingException e) {
- // TODO fix this to handle exceptions
- System.out.println("DNS error");
- return null;
- }
-
- }
-
- public Location getLocationwithdnsservice(String str) {
- Location record = new Location();
- String key;
- String value;
- StringTokenizer st = new StringTokenizer(str,";=\"");
- while (st.hasMoreTokens()) {
- key = st.nextToken();
- if (st.hasMoreTokens()) {
- value = st.nextToken();
- } else {
- value = "";}
- if (key.equals("co")) {
- Integer i = (Integer)hashmapcountryCodetoindex.get(value);
- record.countryCode = value;
- record.countryName = countryName[i.intValue()];
- }
- if (key.equals("ci")) {
- record.city = value;
- }
- if (key.equals("re")) {
- record.region = value;
- }
- if (key.equals("zi")) {
- record.postalCode = value;
- }
- // TODO, ISP and Organization
- //if (key.equals("or")) {
- //record.org = value;
- //}
- //if (key.equals("is")) {
- //record.isp = value;
- //}
- if (key.equals("la")) {
- try{
- record.latitude = Float.parseFloat(value);
- } catch(NumberFormatException e) {
- record.latitude = 0;
- }
- }
- if (key.equals("lo")) {
- try{
- record.longitude = Float.parseFloat(value);
- } catch(NumberFormatException e) {
- record.latitude = 0;
- }
- }
- // dm depreciated use me ( metro_code ) instead
- if (key.equals("dm") || key.equals("me")) {
- try{
- record.metro_code = record.dma_code = Integer.parseInt(value);
- } catch(NumberFormatException e) {
- record.metro_code = record.dma_code = 0;
- }
- }
- if (key.equals("ac")) {
- try{
- record.area_code = Integer.parseInt(value);
- } catch(NumberFormatException e) {
- record.area_code = 0;
- }
- }
- }
- return record;
- }
-
- public synchronized Region getRegion(String str) {
- InetAddress addr;
- try {
- addr = InetAddress.getByName(str);
- }
- catch (UnknownHostException e) {
- return null;
- }
-
- return getRegion(bytesToLong(addr.getAddress()));
- }
-
- public synchronized Region getRegion(long ipnum) {
- Region record = new Region();
- int seek_region = 0;
- if (databaseType == DatabaseInfo.REGION_EDITION_REV0) {
- seek_region = seekCountry(ipnum) - STATE_BEGIN_REV0;
- char ch[] = new char[2];
- if (seek_region >= 1000) {
- record.countryCode = "US";
- record.countryName = "United States";
- ch[0] = (char)(((seek_region - 1000)/26) + 65);
- ch[1] = (char)(((seek_region - 1000)%26) + 65);
- record.region = new String(ch);
- } else {
- record.countryCode = countryCode[seek_region];
- record.countryName = countryName[seek_region];
- record.region = "";
- }
- } else if (databaseType == DatabaseInfo.REGION_EDITION_REV1) {
- seek_region = seekCountry(ipnum) - STATE_BEGIN_REV1;
- char ch[] = new char[2];
- if (seek_region < US_OFFSET) {
- record.countryCode = "";
- record.countryName = "";
- record.region = "";
- } else if (seek_region < CANADA_OFFSET) {
- record.countryCode = "US";
- record.countryName = "United States";
- ch[0] = (char)(((seek_region - US_OFFSET)/26) + 65);
- ch[1] = (char)(((seek_region - US_OFFSET)%26) + 65);
- record.region = new String(ch);
- } else if (seek_region < WORLD_OFFSET) {
- record.countryCode = "CA";
- record.countryName = "Canada";
- ch[0] = (char)(((seek_region - CANADA_OFFSET)/26) + 65);
- ch[1] = (char)(((seek_region - CANADA_OFFSET)%26) + 65);
- record.region = new String(ch);
- } else {
- record.countryCode = countryCode[(seek_region - WORLD_OFFSET) / FIPS_RANGE];
- record.countryName = countryName[(seek_region - WORLD_OFFSET) / FIPS_RANGE];
- record.region = "";
- }
- }
- return record;
- }
-
- public synchronized Location getLocation(long ipnum) {
- int record_pointer;
- byte record_buf[] = new byte[FULL_RECORD_LENGTH];
- int record_buf_offset = 0;
- Location record = new Location();
- int str_length = 0;
- int j, seek_country;
- double latitude = 0, longitude = 0;
-
- try {
- seek_country = seekCountry(ipnum);
- if (seek_country == databaseSegments[0]) {
- return null;
- }
- record_pointer = seek_country + (2 * recordLength - 1) * databaseSegments[0];
-
- if ((dboptions & GEOIP_MEMORY_CACHE) == 1) {
- //read from memory
- System.arraycopy(dbbuffer, record_pointer, record_buf, 0, Math.min(dbbuffer.length - record_pointer, FULL_RECORD_LENGTH));
-} else {
- //read from disk
- file.seek(record_pointer);
- file.readFully(record_buf);
- }
-
- // get country
- record.countryCode = countryCode[unsignedByteToInt(record_buf[0])];
- record.countryName = countryName[unsignedByteToInt(record_buf[0])];
- record_buf_offset++;
-
- // get region
- while (record_buf[record_buf_offset + str_length] != '\0')
- str_length++;
- if (str_length > 0) {
- record.region = new String(record_buf, record_buf_offset, str_length);
- }
- record_buf_offset += str_length + 1;
- str_length = 0;
-
- // get city
- while (record_buf[record_buf_offset + str_length] != '\0')
- str_length++;
- if (str_length > 0) {
- record.city = new String(record_buf, record_buf_offset, str_length, "ISO-8859-1");
- }
- record_buf_offset += str_length + 1;
- str_length = 0;
-
- // get postal code
- while (record_buf[record_buf_offset + str_length] != '\0')
- str_length++;
- if (str_length > 0) {
- record.postalCode = new String(record_buf, record_buf_offset, str_length);
- }
- record_buf_offset += str_length + 1;
-
- // get latitude
- for (j = 0; j < 3; j++)
- latitude += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
- record.latitude = (float) latitude/10000 - 180;
- record_buf_offset += 3;
-
- // get longitude
- for (j = 0; j < 3; j++)
- longitude += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
- record.longitude = (float) longitude/10000 - 180;
-
- record.dma_code = record.metro_code = 0;
- record.area_code = 0;
- if (databaseType == DatabaseInfo.CITY_EDITION_REV1) {
- // get DMA code
- int metroarea_combo = 0;
- if (record.countryCode == "US") {
- record_buf_offset += 3;
- for (j = 0; j < 3; j++)
- metroarea_combo += (unsignedByteToInt(record_buf[record_buf_offset + j]) << (j * 8));
- record.metro_code = record.dma_code = metroarea_combo/1000;
- record.area_code = metroarea_combo % 1000;
- }
- }
- }
- catch (IOException e) {
- System.err.println("IO Exception while seting up segments");
- }
- return record;
- }
-
- public String getOrg(InetAddress addr) {
- return getOrg(bytesToLong(addr.getAddress()));
- }
-
- public String getOrg(String str) {
- InetAddress addr;
- try {
- addr = InetAddress.getByName(str);
- }
- catch (UnknownHostException e) {
- return null;
- }
- return getOrg(addr);
- }
-
- // GeoIP Organization and ISP Edition methods
- public synchronized String getOrg(long ipnum) {
- int seek_org;
- int record_pointer;
- int str_length = 0;
- byte [] buf = new byte[MAX_ORG_RECORD_LENGTH];
- String org_buf;
-
- try {
- seek_org = seekCountry(ipnum);
- if (seek_org == databaseSegments[0]) {
- return null;
- }
-
- record_pointer = seek_org + (2 * recordLength - 1) * databaseSegments[0];
- if ((dboptions & GEOIP_MEMORY_CACHE) == 1) {
- //read from memory
- System.arraycopy(dbbuffer, record_pointer, buf, 0, Math.min(dbbuffer.length - record_pointer, MAX_ORG_RECORD_LENGTH));
- } else {
- //read from disk
- file.seek(record_pointer);
- file.readFully(buf);
- }
- while (buf[str_length] != '\0') {
- str_length++;
- }
- org_buf = new String(buf, 0, str_length, "ISO-8859-1");
- return org_buf;
- }
- catch (IOException e) {
- System.out.println("IO Exception");
- return null;
- }
- }
-
- /**
- * Finds the country index value given an IPv6 address.
- *
- * @param addr the ip address to find in long format.
- * @return the country index.
- */
- private synchronized int seekCountryV6(InetAddress addr) {
- byte [] v6vec = addr.getAddress();
- byte [] buf = new byte[2 * MAX_RECORD_LENGTH];
- int [] x = new int[2];
- int offset = 0;
- _check_mtime();
- for (int depth = 127; depth >= 0; depth--) {
- if ((dboptions & GEOIP_MEMORY_CACHE) == 1) {
- //read from memory
- for (int i = 0;i < 2 * MAX_RECORD_LENGTH;i++) {
- buf[i] = dbbuffer[(2 * recordLength * offset)+i];
- }
- } else if ((dboptions & GEOIP_INDEX_CACHE) != 0) {
- //read from index cache
- for (int i = 0;i < 2 * MAX_RECORD_LENGTH;i++) {
- buf[i] = index_cache[(2 * recordLength * offset)+i];
- }
- } else {
- //read from disk
- try {
- file.seek(2 * recordLength * offset);
- file.readFully(buf);
- }
- catch (IOException e) {
- System.out.println("IO Exception");
- }
- }
- for (int i = 0; i<2; i++) {
- x[i] = 0;
- for (int j = 0; j<recordLength; j++) {
- int y = buf[i*recordLength+j];
- if (y < 0) {
- y+= 256;
- }
- x[i] += (y << (j * 8));
- }
- }
-
- int bnum = 127 - depth;
- int idx = bnum >> 3;
- int b_mask = 1 << ( bnum & 7 ^ 7 );
- if ((v6vec[idx] & b_mask) > 0) {
- if (x[1] >= databaseSegments[0]) {
- last_netmask = 128 - depth;
- return x[1];
- }
- offset = x[1];
- }
- else {
- if (x[0] >= databaseSegments[0]) {
- last_netmask = 128 - depth;
- return x[0];
- }
- offset = x[0];
- }
- }
-
- // shouldn't reach here
- System.err.println("Error seeking country while seeking " + addr.getHostAddress() );
- return 0;
- }
- /**
- * Finds the country index value given an IP address.
- *
- * @param ipAddress the ip address to find in long format.
- * @return the country index.
- */
- private synchronized int seekCountry(long ipAddress) {
- byte [] buf = new byte[2 * MAX_RECORD_LENGTH];
- int [] x = new int[2];
- int offset = 0;
- _check_mtime();
- for (int depth = 31; depth >= 0; depth--) {
- if ((dboptions & GEOIP_MEMORY_CACHE) == 1) {
- //read from memory
- for (int i = 0;i < 2 * MAX_RECORD_LENGTH;i++) {
- buf[i] = dbbuffer[(2 * recordLength * offset)+i];
- }
- } else if ((dboptions & GEOIP_INDEX_CACHE) != 0) {
- //read from index cache
- for (int i = 0;i < 2 * MAX_RECORD_LENGTH;i++) {
- buf[i] = index_cache[(2 * recordLength * offset)+i];
- }
- } else {
- //read from disk
- try {
- file.seek(2 * recordLength * offset);
- file.readFully(buf);
- }
- catch (IOException e) {
- System.out.println("IO Exception");
- }
- }
- for (int i = 0; i<2; i++) {
- x[i] = 0;
- for (int j = 0; j<recordLength; j++) {
- int y = buf[i*recordLength+j];
- if (y < 0) {
- y+= 256;
- }
- x[i] += (y << (j * 8));
- }
- }
-
- if ((ipAddress & (1 << depth)) > 0) {
- if (x[1] >= databaseSegments[0]) {
- last_netmask = 32 - depth;
- return x[1];
- }
- offset = x[1];
- }
- else {
- if (x[0] >= databaseSegments[0]) {
- last_netmask = 32 - depth;
- return x[0];
- }
- offset = x[0];
- }
- }
-
- // shouldn't reach here
- System.err.println("Error seeking country while seeking " + ipAddress);
- return 0;
- }
-
- /**
- * Returns the long version of an IP address given an InetAddress object.
- *
- * @param address the InetAddress.
- * @return the long form of the IP address.
- */
- private static long bytesToLong(byte [] address) {
- long ipnum = 0;
- for (int i = 0; i < 4; ++i) {
- long y = address[i];
- if (y < 0) {
- y+= 256;
- }
- ipnum += y << ((3-i)*8);
- }
- return ipnum;
- }
-
- private static int unsignedByteToInt(byte b) {
- return (int) b & 0xFF;
- }
-}