maxmind-geoip2 1.0.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -0
- data/README.md +13 -10
- data/lib/maxmind/geoip2/client.rb +18 -9
- data/lib/maxmind/geoip2/errors.rb +17 -8
- data/lib/maxmind/geoip2/model/city.rb +4 -5
- data/lib/maxmind/geoip2/model/connection_type.rb +3 -2
- data/lib/maxmind/geoip2/model/enterprise.rb +2 -3
- data/lib/maxmind/geoip2/model/insights.rb +3 -5
- data/lib/maxmind/geoip2/model/isp.rb +16 -0
- data/lib/maxmind/geoip2/reader.rb +1 -2
- data/lib/maxmind/geoip2/record/traits.rb +58 -26
- data/lib/maxmind/geoip2/version.rb +8 -0
- data/maxmind-geoip2.gemspec +8 -2
- data/test/data/MaxMind-DB-spec.md +15 -11
- data/test/data/cmd/write-test-data/main.go +68 -0
- data/test/data/go.mod +13 -0
- data/test/data/go.sum +16 -0
- data/test/data/perltidyrc +6 -0
- data/test/data/pkg/writer/decoder.go +178 -0
- data/test/data/pkg/writer/geoip2.go +182 -0
- data/test/data/pkg/writer/ip.go +39 -0
- data/test/data/pkg/writer/maxmind.go +245 -0
- data/test/data/pkg/writer/nestedstructures.go +73 -0
- data/test/data/pkg/writer/writer.go +58 -0
- data/test/data/source-data/GeoIP2-City-Test.json +402 -48
- data/test/data/source-data/GeoIP2-Connection-Type-Test.json +35 -10
- data/test/data/source-data/GeoIP2-Country-Test.json +145 -58
- data/test/data/source-data/GeoIP2-Domain-Test.json +5 -0
- data/test/data/source-data/GeoIP2-Enterprise-Test.json +408 -4
- data/test/data/source-data/GeoIP2-ISP-Test.json +10 -0
- data/test/data/source-data/GeoIP2-Precision-Enterprise-Sandbox-Test.json +296 -0
- data/test/data/source-data/GeoIP2-Precision-Enterprise-Test.json +473 -6
- data/test/data/source-data/GeoIP2-Static-IP-Score-Test.json +15 -0
- data/test/data/source-data/GeoIP2-User-Count-Test.json +18 -0
- data/test/data/source-data/GeoLite2-ASN-Test.json +4091 -8
- data/test/data/source-data/GeoLite2-City-Test.json +12972 -0
- data/test/data/source-data/GeoLite2-Country-Test.json +11372 -0
- data/test/data/test-data/GeoIP2-Anonymous-IP-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-City-Test-Broken-Double-Format.mmdb +0 -0
- data/test/data/test-data/GeoIP2-City-Test-Invalid-Node-Count.mmdb +0 -0
- data/test/data/test-data/GeoIP2-City-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Connection-Type-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Country-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-DensityIncome-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Domain-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Enterprise-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-ISP-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Precision-Enterprise-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-Static-IP-Score-Test.mmdb +0 -0
- data/test/data/test-data/GeoIP2-User-Count-Test.mmdb +0 -0
- data/test/data/test-data/GeoLite2-ASN-Test.mmdb +0 -0
- data/test/data/test-data/GeoLite2-City-Test.mmdb +0 -0
- data/test/data/test-data/GeoLite2-Country-Test.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-no-ipv4-search-tree.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-string-value-entries.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-broken-pointers-24.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-broken-search-tree-24.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-decoder.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv4-24.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv4-28.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv4-32.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv6-24.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv6-28.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-ipv6-32.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-mixed-24.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-mixed-28.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-mixed-32.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-nested.mmdb +0 -0
- data/test/data/test-data/MaxMind-DB-test-pointer-decoder.mmdb +0 -0
- data/test/data/test-data/README.md +30 -14
- data/test/test_client.rb +18 -2
- data/test/test_reader.rb +37 -3
- metadata +21 -8
- data/test/data/MaxMind-DB-test-metadata-pointers.mmdb +0 -0
- data/test/data/source-data/README +0 -15
- data/test/data/test-data/write-test-data.pl +0 -691
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c1d04d352a8344e1e8d9c232ab7713bc0b74ddaa1e4a82aec61dbbf37bfd925
|
4
|
+
data.tar.gz: 20bcee370b35a4e098b48b36146eb7da9674f6c271ba94744a435addbd9c5e05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0331f1fe319379d035bd4f8675f775bbe31f0d3747d2f9a65754523cb6718160237d5a232d54cad7cd00cdcfe5243ff0f8a39276d749948116fc974221eb3d8a
|
7
|
+
data.tar.gz: 1d3e2f6c9a5847671b4b86004c7407bacf25cb271674d7dd49c5217b15d20a307ba416ec19a5f04d2050925ee689a97f01ca899f2edcb611bb44c5ee1a13ba35
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,32 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.2.0 (2023-12-04)
|
4
|
+
|
5
|
+
* `MaxMind::GeoIP2::Client` now validates the IP address before making a
|
6
|
+
request to the web service.
|
7
|
+
* `MaxMind::GeoIP2::Client` now includes the version of Ruby, the version
|
8
|
+
of the HTTP client library, and its own version in the User-Agent header.
|
9
|
+
* The `anycast?` method was added to `MaxMind::GeoIP2::Record::Traits`.
|
10
|
+
This returns `true` if the IP address belongs to an [anycast
|
11
|
+
network](https://en.wikipedia.org/wiki/Anycast). This is available for
|
12
|
+
the GeoIP2 Country, City Plus, and Insights web services and the GeoIP2
|
13
|
+
Country, City, and Enterprise databases.
|
14
|
+
|
15
|
+
## 1.1.0 (2021-11-18)
|
16
|
+
|
17
|
+
* Exceptions from this gem now inherit from `MaxMind::GeoIP2::Error`. IP
|
18
|
+
address related exceptions now inherit from
|
19
|
+
`MaxMind::GeoIP2::AddressError`, which itself inherits from
|
20
|
+
`MaxMind::GeoIP2::Error`. Pull Request by gr8bit. GitHub #35.
|
21
|
+
* Support for mobile country code (MCC) and mobile network codes (MNC) was
|
22
|
+
added for the GeoIP2 ISP and Enterprise databases as well as the GeoIP2
|
23
|
+
City and Insights web services. `mobile_country_code` and
|
24
|
+
`mobile_network_code` attributes were added to
|
25
|
+
`MaxMind::GeoIP2::Model::ISP` for the GeoIP2 ISP database and
|
26
|
+
`MaxMind::GeoIP2::Record::Traits` for the Enterprise database and the
|
27
|
+
GeoIP2 City and Insights web services. We expect this data to be
|
28
|
+
available by late January, 2022.
|
29
|
+
|
3
30
|
## 1.0.0 (2021-05-14)
|
4
31
|
|
5
32
|
* Ruby 2.4 is no longer supported. If you're using Ruby 2.4, please use
|
data/README.md
CHANGED
@@ -2,11 +2,9 @@
|
|
2
2
|
|
3
3
|
## Description
|
4
4
|
|
5
|
-
This is the Ruby API for the GeoIP2
|
6
|
-
[webservices](https://dev.maxmind.com/geoip/
|
7
|
-
[databases](https://dev.maxmind.com/geoip/
|
8
|
-
works with the free [GeoLite2
|
9
|
-
databases](https://dev.maxmind.com/geoip/geoip2/geolite2/).
|
5
|
+
This is the Ruby API for the GeoIP2 and GeoLite2
|
6
|
+
[webservices](https://dev.maxmind.com/geoip/docs/web-services?lang=en)
|
7
|
+
and [databases](https://dev.maxmind.com/geoip/docs/databases?lang=en).
|
10
8
|
|
11
9
|
## Installation
|
12
10
|
|
@@ -230,14 +228,19 @@ client = MaxMind::GeoIP2::Client.new(
|
|
230
228
|
account_id: 42,
|
231
229
|
license_key: 'license_key',
|
232
230
|
|
233
|
-
# To use the GeoLite2 web service instead of GeoIP2
|
231
|
+
# To use the GeoLite2 web service instead of the GeoIP2 web service, set
|
234
232
|
# the host parameter to "geolite.info":
|
235
233
|
# host: 'geolite.info',
|
234
|
+
|
235
|
+
# To use the Sandbox GeoIP2 web service instead of the production GeoIP2
|
236
|
+
# web service, set the host parameter to "sandbox.maxmind.com":
|
237
|
+
# host: 'sandbox.maxmind.com',
|
236
238
|
)
|
237
239
|
|
238
240
|
# Replace "city" with the method corresponding to the web service that
|
239
241
|
# you are using, e.g., "country", "insights". Please note that Insights
|
240
|
-
# is only supported by GeoIP2
|
242
|
+
# is only supported by the GeoIP2 web service and not the GeoLite2 web
|
243
|
+
# service.
|
241
244
|
record = client.city('128.101.101.101')
|
242
245
|
|
243
246
|
puts record.country.iso_code # US
|
@@ -281,8 +284,8 @@ which can be populated vary between end points. In addition, while an end
|
|
281
284
|
point may offer a particular piece of data, MaxMind does not always have
|
282
285
|
every piece of data for any given IP address.
|
283
286
|
|
284
|
-
See the [GeoIP2
|
285
|
-
|
287
|
+
See the [GeoIP2 web service
|
288
|
+
documentation](https://dev.maxmind.com/geoip/docs/web-services?lang=en) for details on
|
286
289
|
what data each end point may return.
|
287
290
|
|
288
291
|
The only piece of data which is always returned is the `ip_address`
|
@@ -342,7 +345,7 @@ This library uses [Semantic Versioning](https://semver.org/).
|
|
342
345
|
|
343
346
|
## Copyright and License
|
344
347
|
|
345
|
-
This software is Copyright (c) 2020-
|
348
|
+
This software is Copyright (c) 2020-2023 by MaxMind, Inc.
|
346
349
|
|
347
350
|
This is free software, licensed under the [Apache License, Version
|
348
351
|
2.0](LICENSE-APACHE) or the [MIT License](LICENSE-MIT), at your option.
|
@@ -4,15 +4,17 @@ require 'connection_pool'
|
|
4
4
|
require 'http'
|
5
5
|
require 'json'
|
6
6
|
require 'maxmind/geoip2/errors'
|
7
|
+
require 'maxmind/geoip2/version'
|
7
8
|
require 'maxmind/geoip2/model/city'
|
8
9
|
require 'maxmind/geoip2/model/country'
|
9
10
|
require 'maxmind/geoip2/model/insights'
|
11
|
+
require 'resolv'
|
10
12
|
|
11
13
|
module MaxMind
|
12
14
|
module GeoIP2
|
13
15
|
# This class provides a client API for all the
|
14
|
-
# {https://dev.maxmind.com/geoip/
|
15
|
-
# services}. The services are Country, City, and Insights. Each service
|
16
|
+
# {https://dev.maxmind.com/geoip/docs/web-services?lang=en GeoIP2 web
|
17
|
+
# services}. The services are Country, City Plus, and Insights. Each service
|
16
18
|
# returns a different set of data about an IP address, with Country returning
|
17
19
|
# the least data and Insights the most.
|
18
20
|
#
|
@@ -58,7 +60,7 @@ module MaxMind
|
|
58
60
|
# rubocop:disable Metrics/CyclomaticComplexity
|
59
61
|
# rubocop:disable Metrics/PerceivedComplexity
|
60
62
|
|
61
|
-
# Create a Client that may be used to query a GeoIP2
|
63
|
+
# Create a Client that may be used to query a GeoIP2 web service.
|
62
64
|
#
|
63
65
|
# Once created, the Client is safe to use for lookups from multiple
|
64
66
|
# threads.
|
@@ -71,8 +73,10 @@ module MaxMind
|
|
71
73
|
# property from most preferred to least preferred.
|
72
74
|
#
|
73
75
|
# @param host [String] the host to use when querying the web service. Set
|
74
|
-
# this to "geolite.info" to use the GeoLite2 web service instead of
|
75
|
-
# GeoIP2
|
76
|
+
# this to "geolite.info" to use the GeoLite2 web service instead of the
|
77
|
+
# GeoIP2 web service. Set this to "sandbox.maxmind.com" to use the
|
78
|
+
# Sandbox environment. The sandbox allows you to experiment with the
|
79
|
+
# API without affecting your production data.
|
76
80
|
#
|
77
81
|
# @param timeout [Integer] the number of seconds to wait for a request
|
78
82
|
# before timing out. If 0, no timeout is set.
|
@@ -117,7 +121,7 @@ module MaxMind
|
|
117
121
|
# rubocop:enable Metrics/CyclomaticComplexity
|
118
122
|
# rubocop:enable Metrics/ParameterLists
|
119
123
|
|
120
|
-
# This method calls the City web service.
|
124
|
+
# This method calls the City Plus web service.
|
121
125
|
#
|
122
126
|
# @param ip_address [String] IPv4 or IPv6 address as a string. If no
|
123
127
|
# address is provided, the address that the web service is called from is
|
@@ -193,8 +197,8 @@ module MaxMind
|
|
193
197
|
|
194
198
|
# This method calls the Insights web service.
|
195
199
|
#
|
196
|
-
# Insights is only supported by the GeoIP2
|
197
|
-
#
|
200
|
+
# Insights is only supported by the GeoIP2 web service. The GeoLite2 web
|
201
|
+
# service does not support it.
|
198
202
|
#
|
199
203
|
# @param ip_address [String] IPv4 or IPv6 address as a string. If no
|
200
204
|
# address is provided, the address that the web service is called from is
|
@@ -234,6 +238,10 @@ module MaxMind
|
|
234
238
|
private
|
235
239
|
|
236
240
|
def response_for(endpoint, model_class, ip_address)
|
241
|
+
if ip_address != 'me' && ip_address !~ Resolv::AddressRegex
|
242
|
+
raise AddressInvalidError, "The value \"#{ip_address}\" is not a valid IP address"
|
243
|
+
end
|
244
|
+
|
237
245
|
record = get(endpoint, ip_address)
|
238
246
|
|
239
247
|
model_class.new(record, @locales)
|
@@ -243,8 +251,9 @@ module MaxMind
|
|
243
251
|
headers = HTTP.basic_auth(user: @account_id, pass: @license_key)
|
244
252
|
.headers(
|
245
253
|
accept: 'application/json',
|
246
|
-
user_agent:
|
254
|
+
user_agent: "MaxMind-GeoIP2-ruby/#{VERSION} ruby/#{RUBY_VERSION} http/#{HTTP::VERSION}"
|
247
255
|
)
|
256
|
+
|
248
257
|
timeout = @timeout > 0 ? headers.timeout(@timeout) : headers
|
249
258
|
|
250
259
|
proxy = timeout
|
@@ -2,40 +2,49 @@
|
|
2
2
|
|
3
3
|
module MaxMind
|
4
4
|
module GeoIP2
|
5
|
+
# Module's base error class
|
6
|
+
class Error < StandardError
|
7
|
+
end
|
8
|
+
|
9
|
+
# Base error class for all errors that originate from the IP address
|
10
|
+
# itself and will not change when retried.
|
11
|
+
class AddressError < Error
|
12
|
+
end
|
13
|
+
|
5
14
|
# An AddressNotFoundError means the IP address was not found in the
|
6
15
|
# database or the web service said the IP address was not found.
|
7
|
-
class AddressNotFoundError <
|
16
|
+
class AddressNotFoundError < AddressError
|
8
17
|
end
|
9
18
|
|
10
19
|
# An HTTPError means there was an unexpected HTTP status or response.
|
11
|
-
class HTTPError <
|
20
|
+
class HTTPError < Error
|
12
21
|
end
|
13
22
|
|
14
23
|
# An AddressInvalidError means the IP address was invalid.
|
15
|
-
class AddressInvalidError <
|
24
|
+
class AddressInvalidError < AddressError
|
16
25
|
end
|
17
26
|
|
18
27
|
# An AddressReservedError means the IP address is reserved.
|
19
|
-
class AddressReservedError <
|
28
|
+
class AddressReservedError < AddressError
|
20
29
|
end
|
21
30
|
|
22
31
|
# An AuthenticationError means there was a problem authenticating to the
|
23
32
|
# web service.
|
24
|
-
class AuthenticationError <
|
33
|
+
class AuthenticationError < Error
|
25
34
|
end
|
26
35
|
|
27
36
|
# An InsufficientFundsError means the account is out of credits.
|
28
|
-
class InsufficientFundsError <
|
37
|
+
class InsufficientFundsError < Error
|
29
38
|
end
|
30
39
|
|
31
40
|
# A PermissionRequiredError means the account does not have permission to
|
32
41
|
# use the requested service.
|
33
|
-
class PermissionRequiredError <
|
42
|
+
class PermissionRequiredError < Error
|
34
43
|
end
|
35
44
|
|
36
45
|
# An InvalidRequestError means the web service returned an error and there
|
37
46
|
# is no more specific error class.
|
38
|
-
class InvalidRequestError <
|
47
|
+
class InvalidRequestError < Error
|
39
48
|
end
|
40
49
|
end
|
41
50
|
end
|
@@ -9,12 +9,11 @@ require 'maxmind/geoip2/record/subdivision'
|
|
9
9
|
module MaxMind
|
10
10
|
module GeoIP2
|
11
11
|
module Model
|
12
|
-
# Model class for the data returned by the GeoIP2 City web service
|
13
|
-
# database. It is also used for GeoLite2 City lookups.
|
12
|
+
# Model class for the data returned by the GeoIP2 City Plus web service
|
13
|
+
# and the City database. It is also used for GeoLite2 City lookups.
|
14
14
|
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
# https://dev.maxmind.com/geoip/geoip2/web-services for more details.
|
15
|
+
# See https://dev.maxmind.com/geoip/docs/web-services?lang=en for more
|
16
|
+
# details.
|
18
17
|
#
|
19
18
|
# See {MaxMind::GeoIP2::Model::Country} for inherited methods.
|
20
19
|
class City < Country
|
@@ -7,8 +7,9 @@ module MaxMind
|
|
7
7
|
module Model
|
8
8
|
# Model class for the GeoIP2 Connection Type database.
|
9
9
|
class ConnectionType < Abstract
|
10
|
-
# The connection type may take the following values: "Dialup",
|
11
|
-
# "Corporate", "Cellular". Additional
|
10
|
+
# The connection type may take the following values: "Dialup",
|
11
|
+
# "Cable/DSL", "Corporate", "Cellular", and "Satellite". Additional
|
12
|
+
# values may be added in the future.
|
12
13
|
#
|
13
14
|
# @return [String, nil]
|
14
15
|
def connection_type
|
@@ -7,9 +7,8 @@ module MaxMind
|
|
7
7
|
module Model
|
8
8
|
# Model class for the data returned by GeoIP2 Enterprise database lookups.
|
9
9
|
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# https://dev.maxmind.com/geoip/geoip2/web-services for more details.
|
10
|
+
# See https://dev.maxmind.com/geoip/docs/web-services?lang=en for more
|
11
|
+
# details.
|
13
12
|
#
|
14
13
|
# See {MaxMind::GeoIP2::Model::City} for inherited methods.
|
15
14
|
class Enterprise < City
|
@@ -5,12 +5,10 @@ require 'maxmind/geoip2/model/city'
|
|
5
5
|
module MaxMind
|
6
6
|
module GeoIP2
|
7
7
|
module Model
|
8
|
-
# Model class for the data returned by the GeoIP2
|
9
|
-
# service.
|
8
|
+
# Model class for the data returned by the GeoIP2 Insights web service.
|
10
9
|
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
# https://dev.maxmind.com/geoip/geoip2/web-services for more details.
|
10
|
+
# See https://dev.maxmind.com/geoip/docs/web-services?lang=en for more
|
11
|
+
# details.
|
14
12
|
class Insights < City
|
15
13
|
end
|
16
14
|
end
|
@@ -36,6 +36,22 @@ module MaxMind
|
|
36
36
|
get('isp')
|
37
37
|
end
|
38
38
|
|
39
|
+
# The {https://en.wikipedia.org/wiki/Mobile_country_code mobile country
|
40
|
+
# code (MCC)} associated with the IP address and ISP.
|
41
|
+
#
|
42
|
+
# @return [String, nil]
|
43
|
+
def mobile_country_code
|
44
|
+
get('mobile_country_code')
|
45
|
+
end
|
46
|
+
|
47
|
+
# The {https://en.wikipedia.org/wiki/Mobile_country_code mobile network
|
48
|
+
# code (MNC)} associated with the IP address and ISP.
|
49
|
+
#
|
50
|
+
# @return [String, nil]
|
51
|
+
def mobile_network_code
|
52
|
+
get('mobile_network_code')
|
53
|
+
end
|
54
|
+
|
39
55
|
# The network in CIDR notation associated with the record. In particular,
|
40
56
|
# this is the largest network where all of the fields besides ip_address
|
41
57
|
# have the same value.
|
@@ -37,8 +37,7 @@ module MaxMind
|
|
37
37
|
# Reader and reuse it.
|
38
38
|
#
|
39
39
|
# Once created, the Reader is safe to use for lookups from multiple
|
40
|
-
# threads. It is safe to use after forking
|
41
|
-
# MaxMind::DB::MODE_MEMORY or if your version of Ruby supports IO#pread.
|
40
|
+
# threads. It is safe to use after forking.
|
42
41
|
#
|
43
42
|
# @overload initialize(database:, locales: ['en'], mode: MaxMind::DB::MODE_AUTO)
|
44
43
|
# @param database [String] a path to a GeoIP2/GeoLite2 database file.
|
@@ -16,16 +16,14 @@ module MaxMind
|
|
16
16
|
if record && !record.key?('network') && record.key?('ip_address') &&
|
17
17
|
record.key?('prefix_length')
|
18
18
|
ip = IPAddr.new(record['ip_address']).mask(record['prefix_length'])
|
19
|
-
|
20
|
-
# method only becomes available in Ruby 2.5+.
|
21
|
-
record['network'] = format('%s/%d', ip.to_s, record['prefix_length'])
|
19
|
+
record['network'] = format('%s/%d', ip.to_s, ip.prefix)
|
22
20
|
end
|
23
21
|
end
|
24
22
|
|
25
23
|
# The autonomous system number associated with the IP address. See
|
26
24
|
# Wikipedia[https://en.wikipedia.org/wiki/Autonomous_system_(Internet)].
|
27
|
-
# This attribute is only available from the City and Insights web
|
28
|
-
# and the
|
25
|
+
# This attribute is only available from the City Plus and Insights web
|
26
|
+
# services and the Enterprise database.
|
29
27
|
#
|
30
28
|
# @return [Integer, nil]
|
31
29
|
def autonomous_system_number
|
@@ -35,8 +33,8 @@ module MaxMind
|
|
35
33
|
# The organization associated with the registered autonomous system number
|
36
34
|
# for the IP address. See
|
37
35
|
# Wikipedia[https://en.wikipedia.org/wiki/Autonomous_system_(Internet)].
|
38
|
-
# This attribute is only available from the City and Insights web
|
39
|
-
# and the
|
36
|
+
# This attribute is only available from the City Plus and Insights web
|
37
|
+
# services and the Enterprise database.
|
40
38
|
#
|
41
39
|
# @return [String, nil]
|
42
40
|
def autonomous_system_organization
|
@@ -44,8 +42,9 @@ module MaxMind
|
|
44
42
|
end
|
45
43
|
|
46
44
|
# The connection type may take the following values: "Dialup",
|
47
|
-
# "Cable/DSL", "Corporate", "Cellular". Additional
|
48
|
-
# the future. This attribute is only available
|
45
|
+
# "Cable/DSL", "Corporate", "Cellular", and "Satellite". Additional
|
46
|
+
# values may be added in the future. This attribute is only available
|
47
|
+
# from the City Plus and Insights web services and the Enterprise
|
49
48
|
# database.
|
50
49
|
#
|
51
50
|
# @return [String, nil]
|
@@ -55,8 +54,8 @@ module MaxMind
|
|
55
54
|
|
56
55
|
# The second level domain associated with the IP address. This will be
|
57
56
|
# something like "example.com" or "example.co.uk", not "foo.example.com".
|
58
|
-
# This attribute is only available from the City and Insights web
|
59
|
-
# and the
|
57
|
+
# This attribute is only available from the City Plus and Insights web
|
58
|
+
# services and the Enterprise database.
|
60
59
|
#
|
61
60
|
# @return [String, nil]
|
62
61
|
def domain
|
@@ -75,7 +74,7 @@ module MaxMind
|
|
75
74
|
end
|
76
75
|
|
77
76
|
# This is true if the IP address belongs to any sort of anonymous network.
|
78
|
-
# This property is only available from
|
77
|
+
# This property is only available from Insights.
|
79
78
|
#
|
80
79
|
# @return [Boolean]
|
81
80
|
def anonymous?
|
@@ -85,17 +84,28 @@ module MaxMind
|
|
85
84
|
# This is true if the IP address is registered to an anonymous VPN
|
86
85
|
# provider. If a VPN provider does not register subnets under names
|
87
86
|
# associated with them, we will likely only flag their IP ranges using the
|
88
|
-
# hosting_provider? property. This property is only available from
|
89
|
-
# Precision Insights.
|
87
|
+
# hosting_provider? property. This property is only available from Insights.
|
90
88
|
#
|
91
89
|
# @return [Boolean]
|
92
90
|
def anonymous_vpn?
|
93
91
|
get('is_anonymous_vpn')
|
94
92
|
end
|
95
93
|
|
94
|
+
# This is true if the IP address belongs to an
|
95
|
+
# {https://en.wikipedia.org/wiki/Anycast anycast network}.
|
96
|
+
#
|
97
|
+
# This property is only available from the Country, City Plus, and
|
98
|
+
# Insights web services and the GeoIP2 Country, City, and Enterprise
|
99
|
+
# databases.
|
100
|
+
#
|
101
|
+
# @return [Boolean]
|
102
|
+
def anycast?
|
103
|
+
get('is_anycast')
|
104
|
+
end
|
105
|
+
|
96
106
|
# This is true if the IP address belongs to a hosting or VPN provider (see
|
97
107
|
# description of the anonymous_vpn? property). This property is only
|
98
|
-
# available from
|
108
|
+
# available from Insights.
|
99
109
|
#
|
100
110
|
# @return [Boolean]
|
101
111
|
def hosting_provider?
|
@@ -104,15 +114,37 @@ module MaxMind
|
|
104
114
|
|
105
115
|
# This attribute is true if MaxMind believes this IP address to be a
|
106
116
|
# legitimate proxy, such as an internal VPN used by a corporation. This
|
107
|
-
# attribute is only available in the
|
117
|
+
# attribute is only available in the Enterprise database.
|
108
118
|
#
|
109
119
|
# @return [Boolean]
|
110
120
|
def legitimate_proxy?
|
111
121
|
get('is_legitimate_proxy')
|
112
122
|
end
|
113
123
|
|
124
|
+
# The {https://en.wikipedia.org/wiki/Mobile_country_code mobile country
|
125
|
+
# code (MCC)} associated with the IP address and ISP.
|
126
|
+
#
|
127
|
+
# This attribute is only available from the City Plus and Insights web
|
128
|
+
# services and the Enterprise database.
|
129
|
+
#
|
130
|
+
# @return [String, nil]
|
131
|
+
def mobile_country_code
|
132
|
+
get('mobile_country_code')
|
133
|
+
end
|
134
|
+
|
135
|
+
# The {https://en.wikipedia.org/wiki/Mobile_country_code mobile network
|
136
|
+
# code (MNC)} associated with the IP address and ISP.
|
137
|
+
#
|
138
|
+
# This attribute is only available from the City Plus and Insights web
|
139
|
+
# services and the Enterprise database.
|
140
|
+
#
|
141
|
+
# @return [String, nil]
|
142
|
+
def mobile_network_code
|
143
|
+
get('mobile_network_code')
|
144
|
+
end
|
145
|
+
|
114
146
|
# This is true if the IP address belongs to a public proxy. This property
|
115
|
-
# is only available from
|
147
|
+
# is only available from Insights.
|
116
148
|
#
|
117
149
|
# @return [Boolean]
|
118
150
|
def public_proxy?
|
@@ -121,7 +153,7 @@ module MaxMind
|
|
121
153
|
|
122
154
|
# This is true if the IP address is on a suspected anonymizing network
|
123
155
|
# and belongs to a residential ISP. This property is only available
|
124
|
-
# from
|
156
|
+
# from Insights.
|
125
157
|
#
|
126
158
|
# @return [Boolean]
|
127
159
|
def residential_proxy?
|
@@ -129,7 +161,7 @@ module MaxMind
|
|
129
161
|
end
|
130
162
|
|
131
163
|
# This is true if the IP address is a Tor exit node. This property is only
|
132
|
-
# available from
|
164
|
+
# available from Insights.
|
133
165
|
#
|
134
166
|
# @return [Boolean]
|
135
167
|
def tor_exit_node?
|
@@ -137,7 +169,7 @@ module MaxMind
|
|
137
169
|
end
|
138
170
|
|
139
171
|
# The name of the ISP associated with the IP address. This attribute is
|
140
|
-
# only available from the City and Insights web services and the
|
172
|
+
# only available from the City Plus and Insights web services and the
|
141
173
|
# Enterprise database.
|
142
174
|
#
|
143
175
|
# @return [String, nil]
|
@@ -155,8 +187,8 @@ module MaxMind
|
|
155
187
|
end
|
156
188
|
|
157
189
|
# The name of the organization associated with the IP address. This
|
158
|
-
# attribute is only available from the City and Insights web services
|
159
|
-
# the
|
190
|
+
# attribute is only available from the City Plus and Insights web services
|
191
|
+
# and the Enterprise database.
|
160
192
|
#
|
161
193
|
# @return [String, nil]
|
162
194
|
def organization
|
@@ -164,7 +196,7 @@ module MaxMind
|
|
164
196
|
end
|
165
197
|
|
166
198
|
# An indicator of how static or dynamic an IP address is. This property is
|
167
|
-
# only available from
|
199
|
+
# only available from Insights.
|
168
200
|
#
|
169
201
|
# @return [Float, nil]
|
170
202
|
def static_ip_score
|
@@ -173,8 +205,7 @@ module MaxMind
|
|
173
205
|
|
174
206
|
# The estimated number of users sharing the IP/network during the past 24
|
175
207
|
# hours. For IPv4, the count is for the individual IP. For IPv6, the count
|
176
|
-
# is for the /64 network. This property is only available from
|
177
|
-
# Precision Insights.
|
208
|
+
# is for the /64 network. This property is only available from Insights.
|
178
209
|
#
|
179
210
|
# @return [Integer, nil]
|
180
211
|
def user_count
|
@@ -188,6 +219,7 @@ module MaxMind
|
|
188
219
|
# * cafe
|
189
220
|
# * cellular
|
190
221
|
# * college
|
222
|
+
# * consumer_privacy_network
|
191
223
|
# * content_delivery_network
|
192
224
|
# * dialup
|
193
225
|
# * government
|
@@ -201,7 +233,7 @@ module MaxMind
|
|
201
233
|
# * traveler
|
202
234
|
#
|
203
235
|
# This attribute is only available from the Insights web service and the
|
204
|
-
#
|
236
|
+
# Enterprise database.
|
205
237
|
#
|
206
238
|
# @return [String, nil]
|
207
239
|
def user_type
|
data/maxmind-geoip2.gemspec
CHANGED
@@ -1,11 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require 'maxmind/geoip2/version'
|
7
|
+
|
3
8
|
Gem::Specification.new do |s|
|
4
9
|
s.authors = ['William Storey']
|
5
10
|
s.files = Dir['**/*']
|
6
11
|
s.name = 'maxmind-geoip2'
|
7
12
|
s.summary = 'A gem for interacting with the GeoIP2 webservices and databases.'
|
8
|
-
s.version =
|
13
|
+
s.version = MaxMind::GeoIP2::VERSION
|
9
14
|
|
10
15
|
s.description = 'A gem for interacting with the GeoIP2 webservices and databases. MaxMind provides geolocation data as downloadable databases as well as through a webservice.'
|
11
16
|
s.email = 'support@maxmind.com'
|
@@ -16,13 +21,14 @@ Gem::Specification.new do |s|
|
|
16
21
|
'changelog_uri' => 'https://github.com/maxmind/GeoIP2-ruby/blob/main/CHANGELOG.md',
|
17
22
|
'documentation_uri' => 'https://www.rubydoc.info/gems/maxmind-geoip2',
|
18
23
|
'homepage_uri' => 'https://github.com/maxmind/GeoIP2-ruby',
|
24
|
+
'rubygems_mfa_required' => 'true',
|
19
25
|
'source_code_uri' => 'https://github.com/maxmind/GeoIP2-ruby',
|
20
26
|
}
|
21
27
|
s.required_ruby_version = '>= 2.5.0'
|
22
28
|
|
23
29
|
s.add_runtime_dependency 'connection_pool', ['~> 2.2']
|
24
30
|
s.add_runtime_dependency 'http', '>= 4.3', '< 6.0'
|
25
|
-
s.add_runtime_dependency 'maxmind-db', ['~> 1.
|
31
|
+
s.add_runtime_dependency 'maxmind-db', ['~> 1.2']
|
26
32
|
|
27
33
|
s.add_development_dependency 'minitest'
|
28
34
|
s.add_development_dependency 'rake'
|
@@ -26,9 +26,10 @@ not be broken by minor version changes to the format.
|
|
26
26
|
The binary database is split into three parts:
|
27
27
|
|
28
28
|
1. The binary search tree. Each level of the tree corresponds to a single bit
|
29
|
-
in the
|
30
|
-
2. The data section
|
31
|
-
|
29
|
+
in the prefix of the network the IP address belongs to.
|
30
|
+
2. The data section with the values for the networks in the binary search
|
31
|
+
tree. These values may be comprised of a single data type, e.g., the string
|
32
|
+
"US" or "New York", or they may be a more complex map or array type made up
|
32
33
|
of multiple fields.
|
33
34
|
3. Database metadata. Information about the database itself.
|
34
35
|
|
@@ -48,15 +49,15 @@ of this sequence.
|
|
48
49
|
The maximum allowable size for the metadata section, including the marker that
|
49
50
|
starts the metadata, is 128KiB.
|
50
51
|
|
51
|
-
The metadata is stored as a
|
52
|
-
|
53
|
-
|
52
|
+
The metadata is stored as a separate data section comprised of a map data
|
53
|
+
structure starting at the beginning of that section. This structure is
|
54
|
+
described later in the spec.
|
54
55
|
|
55
56
|
Except where otherwise specified, each key listed is required for the database
|
56
57
|
to be considered valid.
|
57
58
|
|
58
|
-
|
59
|
-
|
59
|
+
Changing a key's data type or removing a key would constitute a major version
|
60
|
+
change for this spec. Adding a key constitutes a minor version change.
|
60
61
|
|
61
62
|
The list of known keys for the current version of the format is as follows:
|
62
63
|
|
@@ -304,7 +305,8 @@ will point to the beginning of a field. It is illegal for a pointer to point
|
|
304
305
|
to another pointer.
|
305
306
|
|
306
307
|
Pointer values start from the beginning of the data section, *not* the
|
307
|
-
beginning of the file.
|
308
|
+
beginning of the file. Pointers in the metadata start from the beginning of
|
309
|
+
the metadata section.
|
308
310
|
|
309
311
|
### UTF-8 string - 2
|
310
312
|
|
@@ -337,8 +339,10 @@ by the length specifier in the control byte. See below for details.
|
|
337
339
|
|
338
340
|
A length of zero always indicates the number 0.
|
339
341
|
|
340
|
-
When storing a signed integer,
|
341
|
-
|
342
|
+
When storing a signed integer, fields shorter than the maximum byte length
|
343
|
+
are always positive. When the field is the maximum length, e.g., 4 bytes for
|
344
|
+
32-bit integers, the left-most bit is the sign. A 1 is negative and a 0 is
|
345
|
+
positive.
|
342
346
|
|
343
347
|
The type numbers for our integer types are:
|
344
348
|
|