From 1844a19f486bdd22896521eb02dd77883c2e6162 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 25 Nov 2009 00:52:44 +0000 Subject: [PATCH] Add support for GeoIP lookups using Quova. --- config/application.yml | 3 ++ config/environment.rb | 1 + lib/osm.rb | 18 ++++++++---- lib/quova.rb | 66 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 lib/quova.rb diff --git a/config/application.yml b/config/application.yml index d4a8537e8..363cc6398 100644 --- a/config/application.yml +++ b/config/application.yml @@ -19,6 +19,9 @@ standard_settings: &standard_settings max_messages_per_hour: 60 # Domain for handling message replies #messages_domain: "messages.openstreetmap.org" + # Quova authentication details + #quova_username: "" + #quova_password: "" development: <<: *standard_settings diff --git a/config/environment.rb b/config/environment.rb index 12a8b5424..83bfbbf2a 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -52,6 +52,7 @@ Rails::Initializer.run do |config| # note: this should be changed to 0.3.6 as soon as it's released, as this has fixes for # uploading multipart documents. config.gem 'oauth', :version => '>=0.2.1' + config.gem 'httpclient' # Only load the plugins named here, in the order given. By default, all plugins # in vendor/plugins are loaded in alphabetical order. diff --git a/lib/osm.rb b/lib/osm.rb index 554ebfaef..cb23b0c97 100644 --- a/lib/osm.rb +++ b/lib/osm.rb @@ -448,12 +448,20 @@ module OSM def self.IPLocation(ip_address) Timeout::timeout(4) do - Net::HTTP.start('api.hostip.info') do |http| - country = http.get("/country.php?ip=#{ip_address}").body - country = "GB" if country == "UK" - country = Country.find_by_code(country) - return { :minlon => country.min_lon, :minlat => country.min_lat, :maxlon => country.max_lon, :maxlat => country.max_lat } + ipinfo = Quova::IpInfo.new(ip_address) + + if ipinfo.status == Quova::Success then + country = ipinfo.country_code + else + Net::HTTP.start('api.hostip.info') do |http| + country = http.get("/country.php?ip=#{ip_address}").body + country = "GB" if country == "UK" + end end + + country = Country.find_by_code(country.upcase) + + return { :minlon => country.min_lon, :minlat => country.min_lat, :maxlon => country.max_lon, :maxlat => country.max_lat } end return nil diff --git a/lib/quova.rb b/lib/quova.rb new file mode 100644 index 000000000..a7318d66e --- /dev/null +++ b/lib/quova.rb @@ -0,0 +1,66 @@ +## +# Load required libraries +require 'soap/wsdlDriver' + +## +# Monkey patch WSDL parser to stop it moaning +module WSDL + class Parser + def warn(msg) + end + end +end + +## +# Provide interface to Quova geolocation service +module Quova + ## + # Access details for WSDL description + WSDL_URL="https://webservices.quova.com/OnDemand/GeoPoint/v1/default.asmx?WSDL" + WSDL_USER = APP_CONFIG['quova_username'] + WSDL_PASS = APP_CONFIG['quova_password'] + + ## + # Status codes + Success = 0 + IPV6NoSupport = 1 + InvalidCredentials = 2 + NotMapped = 3 + InvalidIPFormat = 4 + IPAddressNull = 5 + AccessDenied = 6 + QueryLimit = 7 + OutOfService = 10 + + ## + # Create SOAP endpoint + @@soap = SOAP::WSDLDriverFactory.new(WSDL_URL).create_rpc_driver + @@soap.options["protocol.http.basic_auth"] << [WSDL_URL, WSDL_USER, WSDL_PASS] + + ## + # Accessor for SOAP endpoint + def self.soap + @@soap + end + + ## + # Class representing geolocation details for an IP address + class IpInfo + def initialize(ip_address) + @ipinfo = Quova::soap.GetIpInfo(:ipAddress => ip_address) + end + + def status + @ipinfo["GetIpInfoResult"]["Response"]["Status"].to_i + end + + def country_code + @ipinfo["GetIpInfoResult"]["Location"]["Country"]["Name"] + end + + def country_confidence + @ipinfo["GetIpInfoResult"]["Location"]["Country"]["Confidence"] + end + end +end + -- 2.39.5