minfraud 1.0.4 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -0
  3. data/.travis.yml +20 -3
  4. data/CHANGELOG.md +31 -3
  5. data/CODE_OF_CONDUCT.md +4 -4
  6. data/Gemfile +9 -2
  7. data/LICENSE.txt +2 -1
  8. data/README.dev.md +4 -0
  9. data/README.md +106 -35
  10. data/lib/maxmind/geoip2/model/city.rb +99 -0
  11. data/lib/maxmind/geoip2/model/country.rb +94 -0
  12. data/lib/maxmind/geoip2/model/insights.rb +38 -0
  13. data/lib/maxmind/geoip2/record/abstract.rb +46 -0
  14. data/lib/maxmind/geoip2/record/city.rb +62 -0
  15. data/lib/maxmind/geoip2/record/continent.rb +61 -0
  16. data/lib/maxmind/geoip2/record/country.rb +78 -0
  17. data/lib/maxmind/geoip2/record/location.rb +97 -0
  18. data/lib/maxmind/geoip2/record/maxmind.rb +41 -0
  19. data/lib/maxmind/geoip2/record/place.rb +52 -0
  20. data/lib/maxmind/geoip2/record/postal.rb +54 -0
  21. data/lib/maxmind/geoip2/record/represented_country.rb +47 -0
  22. data/lib/maxmind/geoip2/record/subdivision.rb +72 -0
  23. data/lib/maxmind/geoip2/record/traits.rb +224 -0
  24. data/lib/minfraud.rb +5 -3
  25. data/lib/minfraud/assessments.rb +14 -5
  26. data/lib/minfraud/components/account.rb +1 -1
  27. data/lib/minfraud/components/addressable.rb +1 -1
  28. data/lib/minfraud/components/custom_inputs.rb +14 -0
  29. data/lib/minfraud/components/device.rb +11 -0
  30. data/lib/minfraud/components/event.rb +12 -1
  31. data/lib/minfraud/components/payment.rb +124 -12
  32. data/lib/minfraud/components/report/transaction.rb +69 -0
  33. data/lib/minfraud/error_handler.rb +36 -16
  34. data/lib/minfraud/http_service.rb +0 -1
  35. data/lib/minfraud/http_service/response.rb +36 -4
  36. data/lib/minfraud/model/abstract.rb +20 -0
  37. data/lib/minfraud/model/address.rb +52 -0
  38. data/lib/minfraud/model/billing_address.rb +11 -0
  39. data/lib/minfraud/model/credit_card.rb +75 -0
  40. data/lib/minfraud/model/device.rb +54 -0
  41. data/lib/minfraud/model/disposition.rb +35 -0
  42. data/lib/minfraud/model/email.rb +54 -0
  43. data/lib/minfraud/model/email_domain.rb +24 -0
  44. data/lib/minfraud/model/error.rb +28 -0
  45. data/lib/minfraud/model/factors.rb +24 -0
  46. data/lib/minfraud/model/geoip2_location.rb +25 -0
  47. data/lib/minfraud/model/insights.rb +68 -0
  48. data/lib/minfraud/model/ip_address.rb +82 -0
  49. data/lib/minfraud/model/issuer.rb +49 -0
  50. data/lib/minfraud/model/score.rb +76 -0
  51. data/lib/minfraud/model/score_ip_address.rb +23 -0
  52. data/lib/minfraud/model/shipping_address.rb +30 -0
  53. data/lib/minfraud/model/subscores.rb +156 -0
  54. data/lib/minfraud/model/warning.rb +63 -0
  55. data/lib/minfraud/report.rb +38 -0
  56. data/lib/minfraud/resolver.rb +2 -1
  57. data/lib/minfraud/version.rb +1 -1
  58. data/minfraud.gemspec +16 -16
  59. metadata +61 -39
@@ -0,0 +1,41 @@
1
+ # Copyright (c) 2020 by MaxMind, Inc.
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ # SOFTWARE.
20
+
21
+ # frozen_string_literal: true
22
+
23
+ require 'maxmind/geoip2/record/abstract'
24
+
25
+ module MaxMind
26
+ module GeoIP2
27
+ module Record
28
+ # Contains data about your account.
29
+ #
30
+ # This record is returned by all location services.
31
+ class MaxMind < Abstract
32
+ # The number of remaining queries you have for the service you are calling.
33
+ #
34
+ # @return [Integer, nil]
35
+ def queries_remaining
36
+ get('queries_remaining')
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,52 @@
1
+ # Copyright (c) 2020 by MaxMind, Inc.
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ # SOFTWARE.
20
+
21
+ # frozen_string_literal: true
22
+
23
+ require 'maxmind/geoip2/record/abstract'
24
+
25
+ module MaxMind
26
+ module GeoIP2
27
+ module Record
28
+ # Location data common to different location types.
29
+ class Place < Abstract
30
+ # @!visibility private
31
+ def initialize(record, locales)
32
+ super(record)
33
+ @locales = locales
34
+ end
35
+
36
+ # The first available localized name in order of preference.
37
+ #
38
+ # @return [String, nil]
39
+ def name
40
+ n = names
41
+ return nil if n.nil?
42
+
43
+ @locales.each do |locale|
44
+ return n[locale] if n.key?(locale)
45
+ end
46
+
47
+ nil
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,54 @@
1
+ # Copyright (c) 2020 by MaxMind, Inc.
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ # SOFTWARE.
20
+
21
+ # frozen_string_literal: true
22
+
23
+ require 'maxmind/geoip2/record/abstract'
24
+
25
+ module MaxMind
26
+ module GeoIP2
27
+ module Record
28
+ # Contains data for the postal record associated with an IP address.
29
+ #
30
+ # This record is returned by all location services and databases besides
31
+ # Country.
32
+ class Postal < Abstract
33
+ # The postal code of the location. Postal codes are not available for all
34
+ # countries. In some countries, this will only contain part of the postal
35
+ # code. This attribute is returned by all location databases and services
36
+ # besides Country.
37
+ #
38
+ # @return [String, nil]
39
+ def code
40
+ get('code')
41
+ end
42
+
43
+ # A value from 0-100 indicating MaxMind's confidence that the postal code
44
+ # is correct. This attribute is only available from the Insights service
45
+ # and the GeoIP2 Enterprise database.
46
+ #
47
+ # @return [Integer, nil]
48
+ def confidence
49
+ get('confidence')
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,47 @@
1
+ # Copyright (c) 2020 by MaxMind, Inc.
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ # SOFTWARE.
20
+
21
+ # frozen_string_literal: true
22
+
23
+ require 'maxmind/geoip2/record/country'
24
+
25
+ module MaxMind
26
+ module GeoIP2
27
+ module Record
28
+ # Contains data for the represented country associated with an IP address.
29
+ #
30
+ # This class contains the country-level data associated with an IP address
31
+ # for the IP's represented country. The represented country is the country
32
+ # represented by something like a military base.
33
+ #
34
+ # See {MaxMind::GeoIP2::Record::Country} for inherited methods.
35
+ class RepresentedCountry < Country
36
+ # A string indicating the type of entity that is representing the country.
37
+ # Currently we only return +military+ but this could expand to include
38
+ # other types in the future.
39
+ #
40
+ # @return [String, nil]
41
+ def type
42
+ get('type')
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,72 @@
1
+ # Copyright (c) 2020 by MaxMind, Inc.
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ # SOFTWARE.
20
+
21
+ # frozen_string_literal: true
22
+
23
+ require 'maxmind/geoip2/record/place'
24
+
25
+ module MaxMind
26
+ module GeoIP2
27
+ module Record
28
+ # Contains data for the subdivisions associated with an IP address.
29
+ #
30
+ # This record is returned by all location databases and services besides
31
+ # Country.
32
+ #
33
+ # See {MaxMind::GeoIP2::Record::Place} for inherited methods.
34
+ class Subdivision < Place
35
+ # This is a value from 0-100 indicating MaxMind's confidence that the
36
+ # subdivision is correct. This attribute is only available from the
37
+ # Insights service and the GeoIP2 Enterprise database.
38
+ #
39
+ # @return [Integer, nil]
40
+ def confidence
41
+ get('confidence')
42
+ end
43
+
44
+ # This is a GeoName ID for the subdivision. This attribute is returned by
45
+ # all location databases and services besides Country.
46
+ #
47
+ # @return [Integer, nil]
48
+ def geoname_id
49
+ get('geoname_id')
50
+ end
51
+
52
+ # This is a string up to three characters long contain the subdivision
53
+ # portion of the ISO 3166-2 code. See
54
+ # https://en.wikipedia.org/wiki/ISO_3166-2. This attribute is returned by
55
+ # all location databases and services except Country.
56
+ #
57
+ # @return [String, nil]
58
+ def iso_code
59
+ get('iso_code')
60
+ end
61
+
62
+ # A Hash where the keys are locale codes and the values are names. This attribute is returned by all location services and
63
+ # databases besides country.
64
+ #
65
+ # @return [Hash<String, String>, nil]
66
+ def names
67
+ get('names')
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,224 @@
1
+ # Copyright (c) 2020 by MaxMind, Inc.
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ # of this software and associated documentation files (the "Software"), to deal
5
+ # in the Software without restriction, including without limitation the rights
6
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ # copies of the Software, and to permit persons to whom the Software is
8
+ # furnished to do so, subject to the following conditions:
9
+ #
10
+ # The above copyright notice and this permission notice shall be included in
11
+ # all copies or substantial portions of the Software.
12
+ #
13
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ # SOFTWARE.
20
+
21
+ # frozen_string_literal: true
22
+
23
+ require 'ipaddr'
24
+ require 'maxmind/geoip2/record/abstract'
25
+
26
+ module MaxMind
27
+ module GeoIP2
28
+ module Record
29
+ # Contains data for the traits record associated with an IP address.
30
+ #
31
+ # This record is returned by all location services and databases.
32
+ class Traits < Abstract
33
+ # @!visibility private
34
+ def initialize(record)
35
+ super(record)
36
+ if !record.key?('network') && record.key?('ip_address') &&
37
+ record.key?('prefix_length')
38
+ ip = IPAddr.new(record['ip_address']).mask(record['prefix_length'])
39
+ # We could use ip.prefix instead of record['prefix_length'], but that
40
+ # method only becomes available in Ruby 2.5+.
41
+ record['network'] = format('%s/%d', ip.to_s, record['prefix_length'])
42
+ end
43
+ end
44
+
45
+ # The autonomous system number associated with the IP address. See
46
+ # Wikipedia[https://en.wikipedia.org/wiki/Autonomous_system_(Internet)].
47
+ # This attribute is only available from the City and Insights web service
48
+ # and the GeoIP2 Enterprise database.
49
+ #
50
+ # @return [Integer, nil]
51
+ def autonomous_system_number
52
+ get('autonomous_system_number')
53
+ end
54
+
55
+ # The organization associated with the registered autonomous system number
56
+ # for the IP address. See
57
+ # Wikipedia[https://en.wikipedia.org/wiki/Autonomous_system_(Internet)].
58
+ # This attribute is only available from the City and Insights web service
59
+ # and the GeoIP2 Enterprise database.
60
+ #
61
+ # @return [String, nil]
62
+ def autonomous_system_organization
63
+ get('autonomous_system_organization')
64
+ end
65
+
66
+ # The connection type may take the following values: "Dialup",
67
+ # "Cable/DSL", "Corporate", "Cellular". Additional values may be added in
68
+ # the future. This attribute is only available in the GeoIP2 Enterprise
69
+ # database.
70
+ #
71
+ # @return [String, nil]
72
+ def connection_type
73
+ get('connection_type')
74
+ end
75
+
76
+ # The second level domain associated with the IP address. This will be
77
+ # something like "example.com" or "example.co.uk", not "foo.example.com".
78
+ # This attribute is only available from the City and Insights web service
79
+ # and the GeoIP2 Enterprise database.
80
+ #
81
+ # @return [String, nil]
82
+ def domain
83
+ get('domain')
84
+ end
85
+
86
+ # The IP address that the data in the model is for. If you performed a "me"
87
+ # lookup against the web service, this will be the externally routable IP
88
+ # address for the system the code is running on. If the system is behind a
89
+ # NAT, this may differ from the IP address locally assigned to it. This
90
+ # attribute is returned by all end points.
91
+ #
92
+ # @return [String]
93
+ def ip_address
94
+ get('ip_address')
95
+ end
96
+
97
+ # This is true if the IP address belongs to any sort of anonymous network.
98
+ # This property is only available from GeoIP2 Precision Insights.
99
+ #
100
+ # @return [Boolean]
101
+ def anonymous?
102
+ get('is_anonymous')
103
+ end
104
+
105
+ # This is true if the IP address is registered to an anonymous VPN
106
+ # provider. If a VPN provider does not register subnets under names
107
+ # associated with them, we will likely only flag their IP ranges using the
108
+ # hosting_provider? property. This property is only available from GeoIP2
109
+ # Precision Insights.
110
+ #
111
+ # @return [Boolean]
112
+ def anonymous_vpn?
113
+ get('is_anonymous_vpn')
114
+ end
115
+
116
+ # This is true if the IP address belongs to a hosting or VPN provider (see
117
+ # description of the anonymous_vpn? property). This property is only
118
+ # available from GeoIP2 Precision Insights.
119
+ #
120
+ # @return [Boolean]
121
+ def hosting_provider?
122
+ get('is_hosting_provider')
123
+ end
124
+
125
+ # This attribute is true if MaxMind believes this IP address to be a
126
+ # legitimate proxy, such as an internal VPN used by a corporation. This
127
+ # attribute is only available in the GeoIP2 Enterprise database.
128
+ #
129
+ # @return [Boolean]
130
+ def legitimate_proxy?
131
+ get('is_legitimate_proxy')
132
+ end
133
+
134
+ # This is true if the IP address belongs to a public proxy. This property
135
+ # is only available from GeoIP2 Precision Insights.
136
+ #
137
+ # @return [Boolean]
138
+ def public_proxy?
139
+ get('is_public_proxy')
140
+ end
141
+
142
+ # This is true if the IP address is a Tor exit node. This property is only
143
+ # available from GeoIP2 Precision Insights.
144
+ #
145
+ # @return [Boolean]
146
+ def tor_exit_node?
147
+ get('is_tor_exit_node')
148
+ end
149
+
150
+ # The name of the ISP associated with the IP address. This attribute is
151
+ # only available from the City and Insights web services and the GeoIP2
152
+ # Enterprise database.
153
+ #
154
+ # @return [String, nil]
155
+ def isp
156
+ get('isp')
157
+ end
158
+
159
+ # The network in CIDR notation associated with the record. In particular,
160
+ # this is the largest network where all of the fields besides ip_address
161
+ # have the same value.
162
+ #
163
+ # @return [String]
164
+ def network
165
+ get('network')
166
+ end
167
+
168
+ # The name of the organization associated with the IP address. This
169
+ # attribute is only available from the City and Insights web services and
170
+ # the GeoIP2 Enterprise database.
171
+ #
172
+ # @return [String, nil]
173
+ def organization
174
+ get('organization')
175
+ end
176
+
177
+ # An indicator of how static or dynamic an IP address is. This property is
178
+ # only available from GeoIP2 Precision Insights.
179
+ #
180
+ # @return [Float, nil]
181
+ def static_ip_score
182
+ get('static_ip_score')
183
+ end
184
+
185
+ # The estimated number of users sharing the IP/network during the past 24
186
+ # hours. For IPv4, the count is for the individual IP. For IPv6, the count
187
+ # is for the /64 network. This property is only available from GeoIP2
188
+ # Precision Insights.
189
+ #
190
+ # @return [Integer, nil]
191
+ def user_count
192
+ get('user_count')
193
+ end
194
+
195
+ # The user type associated with the IP address. This can be one of the
196
+ # following values:
197
+ #
198
+ # * business
199
+ # * cafe
200
+ # * cellular
201
+ # * college
202
+ # * content_delivery_network
203
+ # * dialup
204
+ # * government
205
+ # * hosting
206
+ # * library
207
+ # * military
208
+ # * residential
209
+ # * router
210
+ # * school
211
+ # * search_engine_spider
212
+ # * traveler
213
+ #
214
+ # This attribute is only available from the Insights web service and the
215
+ # GeoIP2 Enterprise database.
216
+ #
217
+ # @return [String, nil]
218
+ def user_type
219
+ get('user_type')
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end