minfraud 1.4.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +7 -0
- data/.github/workflows/rubocop.yml +1 -1
- data/.github/workflows/test.yml +1 -4
- data/.rubocop.yml +4 -25
- data/CHANGELOG.md +82 -1
- data/Gemfile +0 -9
- data/LICENSE.txt +1 -1
- data/README.dev.md +1 -1
- data/README.md +13 -12
- data/lib/minfraud/assessments.rb +21 -16
- data/lib/minfraud/components/account.rb +1 -1
- data/lib/minfraud/components/billing.rb +1 -1
- data/lib/minfraud/components/credit_card.rb +21 -9
- data/lib/minfraud/components/custom_inputs.rb +1 -1
- data/lib/minfraud/components/device.rb +1 -1
- data/lib/minfraud/components/email.rb +93 -4
- data/lib/minfraud/components/event.rb +11 -11
- data/lib/minfraud/components/order.rb +1 -1
- data/lib/minfraud/components/payment.rb +152 -133
- data/lib/minfraud/components/report/transaction.rb +2 -2
- data/lib/minfraud/components/shipping.rb +2 -2
- data/lib/minfraud/components/shopping_cart.rb +2 -2
- data/lib/minfraud/components/shopping_cart_item.rb +3 -3
- data/lib/minfraud/http_service/response.rb +28 -21
- data/lib/minfraud/model/device.rb +1 -1
- data/lib/minfraud/model/disposition.rb +13 -6
- data/lib/minfraud/model/ip_address.rb +20 -44
- data/lib/minfraud/model/ip_risk_reason.rb +48 -0
- data/lib/minfraud/model/score.rb +1 -1
- data/lib/minfraud/model/subscores.rb +0 -22
- data/lib/minfraud/report.rb +19 -11
- data/lib/minfraud/validates.rb +2 -2
- data/lib/minfraud/version.rb +1 -1
- data/lib/minfraud.rb +18 -24
- data/minfraud.gemspec +10 -6
- metadata +40 -51
- data/lib/maxmind/geoip2/model/city.rb +0 -99
- data/lib/maxmind/geoip2/model/country.rb +0 -94
- data/lib/maxmind/geoip2/model/insights.rb +0 -38
- data/lib/maxmind/geoip2/record/abstract.rb +0 -46
- data/lib/maxmind/geoip2/record/city.rb +0 -62
- data/lib/maxmind/geoip2/record/continent.rb +0 -61
- data/lib/maxmind/geoip2/record/country.rb +0 -78
- data/lib/maxmind/geoip2/record/location.rb +0 -97
- data/lib/maxmind/geoip2/record/maxmind.rb +0 -41
- data/lib/maxmind/geoip2/record/place.rb +0 -52
- data/lib/maxmind/geoip2/record/postal.rb +0 -54
- data/lib/maxmind/geoip2/record/represented_country.rb +0 -47
- data/lib/maxmind/geoip2/record/subdivision.rb +0 -72
- data/lib/maxmind/geoip2/record/traits.rb +0 -233
- data/lib/minfraud/http_service/request.rb +0 -38
- data/lib/minfraud/http_service.rb +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e3c2e76357a683ceda7350bde7dc4c89cc6055d473b771ee74041d4371f05f7
|
4
|
+
data.tar.gz: 60aacbf2435a51f65c9d9702e209ddab469d21dd672ba8d5baf34dae807deb2f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ebdccdbdb2d97665faabbf8486cdeb029e1a1d372a09a1ffeff226f5f900d99887e6e370e01515543983c46f86d4083fa347e557d82c5dde265b079e055adddc
|
7
|
+
data.tar.gz: 61f65f9cc64dd1e0c205c5c2f8df5acfb621dc1ae80b828d5df27e0616964ac0c0a1315b609a4a3228b1f9ecce78dd31411b66513c25eb4311532b3b9f71d775
|
data/.github/workflows/test.yml
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.5
|
3
|
+
NewCops: enable
|
3
4
|
|
4
5
|
# Metrics.
|
5
6
|
|
@@ -39,7 +40,7 @@ Layout/IndentationStyle:
|
|
39
40
|
# Style.
|
40
41
|
|
41
42
|
Style/HashSyntax:
|
42
|
-
EnforcedStyle: ruby19_no_mixed_keys # Default is ruby19.
|
43
|
+
EnforcedStyle: ruby19_no_mixed_keys # Default is ruby19. This one is better.
|
43
44
|
|
44
45
|
Style/CollectionMethods:
|
45
46
|
Enabled: true # Default is false.
|
@@ -53,9 +54,6 @@ Style/NegatedIf: # I disagree with this.
|
|
53
54
|
Style/IfUnlessModifier: # This doesn't always make sense.
|
54
55
|
Enabled: false
|
55
56
|
|
56
|
-
Style/SymbolArray:
|
57
|
-
EnforcedStyle: brackets # Default is percent, but 1.9 doesn't support that.
|
58
|
-
|
59
57
|
# Trailing commas are often good.
|
60
58
|
Style/TrailingCommaInArguments:
|
61
59
|
Enabled: false
|
@@ -64,9 +62,6 @@ Style/TrailingCommaInArrayLiteral:
|
|
64
62
|
Style/TrailingCommaInHashLiteral:
|
65
63
|
Enabled: false
|
66
64
|
|
67
|
-
Style/SafeNavigation:
|
68
|
-
Enabled: false # Default is true, but this 1.9 doesn't support it.
|
69
|
-
|
70
65
|
# Default is both which is probably fine, but it changes code and I don't want
|
71
66
|
# to investigate any possible behavior change right now.
|
72
67
|
Style/EmptyElse:
|
@@ -75,25 +70,12 @@ Style/EmptyElse:
|
|
75
70
|
Style/ConditionalAssignment:
|
76
71
|
Enabled: false # This produces kind of strange results.
|
77
72
|
|
78
|
-
Style/Dir:
|
79
|
-
Enabled: false # This is good, but not supported on 1.9.
|
80
|
-
|
81
|
-
Style/ExpandPathArguments:
|
82
|
-
Enabled: false # This causes us to use __dir__ which 1.9 doesn't support.
|
83
|
-
|
84
73
|
Style/GuardClause:
|
85
74
|
Enabled: false # Doesn't always make sense.
|
86
75
|
|
87
|
-
Style/Documentation:
|
88
|
-
Enabled: false # We should enable this, but allow for pre-existing code.
|
89
|
-
|
90
76
|
Style/FormatStringToken:
|
91
77
|
Enabled: false # Seems unnecessary.
|
92
78
|
|
93
|
-
# Asks to use x.negative? instead of x < 0. But this isn't available until 2.3.
|
94
|
-
Style/NumericPredicate:
|
95
|
-
Enabled: false
|
96
|
-
|
97
79
|
# Seems unnecessary. Asks us to call super in a bunch of places when there's no
|
98
80
|
# need.
|
99
81
|
Lint/MissingSuper:
|
@@ -103,6 +85,3 @@ Lint/MissingSuper:
|
|
103
85
|
|
104
86
|
Naming/VariableNumber:
|
105
87
|
Enabled: false # Doesn't always make sense.
|
106
|
-
|
107
|
-
AllCops:
|
108
|
-
NewCops: enable
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,84 @@
|
|
1
|
-
#
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## v2.0.0 (2021-12-06)
|
4
|
+
|
5
|
+
* Breaking change from 1.x: Removed deprecated methods
|
6
|
+
`is_in_european_union`, `is_anonymous`, `is_anonymous_vpn`,
|
7
|
+
`is_hosting_provider`, `is_public_proxy`, and `is_tor_exit_node`. The
|
8
|
+
non-deprecated equivalents are `in_european_union?`, `anonymous?`,
|
9
|
+
`anonymous_vpn?`, `hosting_provider?`, `public_proxy?`, and
|
10
|
+
`tor_exit_node?`.
|
11
|
+
* Breaking change from 1.x: Removed deprecated methods for deprecated
|
12
|
+
subscores: `email_tenure` and `ip_tenure`. For `email_tenure`, please use
|
13
|
+
the `email_address` subscore instead. For `ip_tenure`, please use
|
14
|
+
`risk_score` instead.
|
15
|
+
* Breaking change from 1.x: Removed deprecated method for deprecated
|
16
|
+
attribute `ip_address.country.is_high_risk`.
|
17
|
+
* Breaking change from 1.x: Switches HTTP client from faraday to http.rb.
|
18
|
+
There should be no behavior change for most users, but this is
|
19
|
+
technically a breaking change from the perspective of semver. Most users
|
20
|
+
should not be affected as the changes are limited to attributes and
|
21
|
+
classes that would not normally be accessed outside the gem.
|
22
|
+
* Breaking change from 1.x: `user_id` is no longer supported as a way to
|
23
|
+
configure your MaxMind account ID. Use `account_id` instead.
|
24
|
+
* Breaking change from 1.x: Removed the `Minfraud.configuration` method.
|
25
|
+
* Breaking change from 1.x: Localized names are no longer exposed via
|
26
|
+
methods on `names` objects, only as hash keys. For example, use
|
27
|
+
`response.ip_address.country.names['en']` instead of
|
28
|
+
`response.ip_address.country.names.en`. The latter was deprecated.
|
29
|
+
* Adds mobile country code (MCC) and mobile network code (MNC) to minFraud
|
30
|
+
Insights and Factors responses. These are available at
|
31
|
+
`response.ip_address.traits.mobile_country_code` and
|
32
|
+
`response.ip_address.traits.mobile_network_code`. We expect this data to
|
33
|
+
be available by late January, 2022.
|
34
|
+
* Adds the following new processors to `Minfraud::Components::Payment`:
|
35
|
+
* `:boacompra`
|
36
|
+
* `:boku`
|
37
|
+
* `:coregateway`
|
38
|
+
* `:fiserv`
|
39
|
+
* `:neopay`
|
40
|
+
* `:neosurf`
|
41
|
+
* `:openbucks`
|
42
|
+
* `:paysera`
|
43
|
+
* `:payvision`
|
44
|
+
* `:trustly`
|
45
|
+
* Depend on the `maxmind-geoip2` gem. This allows us to delete classes from
|
46
|
+
that gem that we previously had included in this gem. There is no
|
47
|
+
functional difference.
|
48
|
+
|
49
|
+
## v1.6.0 (2021-08-19)
|
50
|
+
|
51
|
+
* Adds new processor to `Minfraud::Components::Payment`: `:cardknox`,
|
52
|
+
`:creditguard`, `:credorax`, `:datacap`, `:dlocal`, `:onpay`, and
|
53
|
+
`:safecharge`.
|
54
|
+
* Adds `rule_label` to minFraud output `/disposition`.
|
55
|
+
* Adds support for the `/credit_card/was_3d_secure_successful` input. This is
|
56
|
+
available by setting the `was_3d_secure_successful` attribute on
|
57
|
+
`Minfraud::Components::CreditCard`.
|
58
|
+
* Ruby 2.5+ is now required. If you're using Ruby 2.1, 2.2, 2.3, or 2.4,
|
59
|
+
please use version 1.5.0 of this gem.
|
60
|
+
|
61
|
+
## v1.5.0 (2021-02-02)
|
62
|
+
|
63
|
+
* Add the `hash_address` attribute to `Minfraud::Components::Email`. If
|
64
|
+
this is `true`, the MD5 hash of the `address` will be sent instead of the
|
65
|
+
plain text `address`. Use this if you prefer to send the hash of the
|
66
|
+
`address` rather than the plain text. Note that this normalizes the
|
67
|
+
`address`, so we recommend using it as opposed to hashing the `address`
|
68
|
+
manually.
|
69
|
+
* The email `domain` input is now automatically set if the email `address`
|
70
|
+
input is set but the `domain` is not.
|
71
|
+
* Adds new payment processors `:apple_pay` and `:aps_payments` to
|
72
|
+
`Minfraud::Components::Payment`.
|
73
|
+
* Added support for the IP address risk reasons in the minFraud Insights
|
74
|
+
and Factors responses. This is available at `.ip_address.risk_reasons`.
|
75
|
+
It is an array of `IPRiskReason` objects.
|
76
|
+
|
77
|
+
## v1.4.1 (2020-12-01)
|
78
|
+
|
79
|
+
* Do not throw an exception if the response does not include IP address
|
80
|
+
information. Previously we would incorrectly try to retrieve fields from
|
81
|
+
`nil`, leading to a `NoMethodError`.
|
2
82
|
|
3
83
|
## v1.4.0 (2020-10-13)
|
4
84
|
|
@@ -69,6 +149,7 @@
|
|
69
149
|
* Adds `amount` attribute to the `Minfraud::Components::Order` instances
|
70
150
|
|
71
151
|
## v1.0.3 (2016-11-24)
|
152
|
+
|
72
153
|
* Adds `token` attribute to the `Minfraud::Components::CreditCard` instances
|
73
154
|
according to the MinFraud Release Notes introduced on November 17, 2016
|
74
155
|
|
data/Gemfile
CHANGED
@@ -2,13 +2,4 @@
|
|
2
2
|
|
3
3
|
source 'https://rubygems.org'
|
4
4
|
|
5
|
-
# coveralls fails on Ruby 1.9. My understanding is we don't need to run this on
|
6
|
-
# more than one version anyway, so restrict to the current latest.
|
7
|
-
version_pieces = RUBY_VERSION.split('.')
|
8
|
-
major_version = version_pieces[0]
|
9
|
-
minor_version = version_pieces[1]
|
10
|
-
if major_version == '2' && minor_version == '7'
|
11
|
-
gem 'coveralls', require: false
|
12
|
-
end
|
13
|
-
|
14
5
|
gemspec
|
data/LICENSE.txt
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
The MIT License (MIT)
|
2
2
|
|
3
3
|
Copyright (c) 2016-2020 kushnir.yb
|
4
|
-
Copyright (c) 2020 MaxMind, Inc.
|
4
|
+
Copyright (c) 2020-2021 MaxMind, Inc.
|
5
5
|
|
6
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
7
|
of this software and associated documentation files (the "Software"), to deal
|
data/README.dev.md
CHANGED
data/README.md
CHANGED
@@ -3,9 +3,9 @@
|
|
3
3
|
## Description
|
4
4
|
|
5
5
|
This package provides an API for the [MaxMind minFraud web
|
6
|
-
services](https://dev.maxmind.com/minfraud
|
6
|
+
services](https://dev.maxmind.com/minfraud?lang=en). This includes minFraud Score,
|
7
7
|
Insights, and Factors. It also includes our [minFraud Report Transaction
|
8
|
-
API](https://dev.maxmind.com/minfraud/report-transaction
|
8
|
+
API](https://dev.maxmind.com/minfraud/report-a-transaction?lang=en).
|
9
9
|
|
10
10
|
The legacy minFraud Standard and Premium services are not supported by this
|
11
11
|
API.
|
@@ -122,14 +122,15 @@ assessment = Minfraud::Assessments.new(
|
|
122
122
|
decline_code: 'invalid number',
|
123
123
|
},
|
124
124
|
credit_card: {
|
125
|
-
issuer_id_number:
|
126
|
-
last_4_digits:
|
127
|
-
bank_name:
|
128
|
-
bank_phone_country_code:
|
129
|
-
bank_phone_number:
|
130
|
-
token:
|
131
|
-
avs_result:
|
132
|
-
cvv_result:
|
125
|
+
issuer_id_number: '411111',
|
126
|
+
last_4_digits: '7643',
|
127
|
+
bank_name: 'Bank of No Hope',
|
128
|
+
bank_phone_country_code: '1',
|
129
|
+
bank_phone_number: '123-456-1234',
|
130
|
+
token: 'abcd',
|
131
|
+
avs_result: 'Y',
|
132
|
+
cvv_result: 'N',
|
133
|
+
was_3d_secure_successful: true,
|
133
134
|
},
|
134
135
|
order: {
|
135
136
|
amount: 323.21,
|
@@ -264,7 +265,7 @@ to the client API, please see
|
|
264
265
|
|
265
266
|
## Requirements
|
266
267
|
|
267
|
-
This gem works with Ruby 2.
|
268
|
+
This gem works with Ruby 2.5 and above.
|
268
269
|
|
269
270
|
## Contributing
|
270
271
|
|
@@ -282,7 +283,7 @@ This API uses [Semantic Versioning](https://semver.org/).
|
|
282
283
|
|
283
284
|
Copyright (c) 2016-2020 kushnir.yb.
|
284
285
|
|
285
|
-
Copyright (c) 2020 MaxMind, Inc.
|
286
|
+
Copyright (c) 2020-2021 MaxMind, Inc.
|
286
287
|
|
287
288
|
The gem is available as open source under the terms of the [MIT
|
288
289
|
License](https://opensource.org/licenses/MIT).
|
data/lib/minfraud/assessments.rb
CHANGED
@@ -4,9 +4,8 @@ module Minfraud
|
|
4
4
|
# Assessments is used to perform minFraud Score, Insights, and Factors
|
5
5
|
# requests.
|
6
6
|
#
|
7
|
-
# @see https://dev.maxmind.com/minfraud
|
7
|
+
# @see https://dev.maxmind.com/minfraud?lang=en
|
8
8
|
class Assessments
|
9
|
-
include ::Minfraud::HTTPService
|
10
9
|
include ::Minfraud::Resolver
|
11
10
|
|
12
11
|
# The Account component.
|
@@ -82,6 +81,8 @@ module Minfraud
|
|
82
81
|
#
|
83
82
|
# @return [Minfraud::HTTPService::Response]
|
84
83
|
#
|
84
|
+
# @raise [JSON::ParserError] if there was invalid JSON in the response.
|
85
|
+
#
|
85
86
|
# @raise [Minfraud::AuthorizationError] If there was an authentication
|
86
87
|
# problem.
|
87
88
|
#
|
@@ -98,6 +99,8 @@ module Minfraud
|
|
98
99
|
#
|
99
100
|
# @return [Minfraud::HTTPService::Response]
|
100
101
|
#
|
102
|
+
# @raise [JSON::ParserError] if there was invalid JSON in the response.
|
103
|
+
#
|
101
104
|
# @raise [Minfraud::AuthorizationError] If there was an authentication
|
102
105
|
# problem.
|
103
106
|
#
|
@@ -114,6 +117,8 @@ module Minfraud
|
|
114
117
|
#
|
115
118
|
# @return [Minfraud::HTTPService::Response]
|
116
119
|
#
|
120
|
+
# @raise [JSON::ParserError] if there was invalid JSON in the response.
|
121
|
+
#
|
117
122
|
# @raise [Minfraud::AuthorizationError] If there was an authentication
|
118
123
|
# problem.
|
119
124
|
#
|
@@ -129,18 +134,22 @@ module Minfraud
|
|
129
134
|
private
|
130
135
|
|
131
136
|
def perform_request(endpoint)
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
+
response = nil
|
138
|
+
body = nil
|
139
|
+
Minfraud.connection_pool.with do |client|
|
140
|
+
response = client.post(
|
141
|
+
"/minfraud/v2.0/#{endpoint}",
|
142
|
+
json: request_body,
|
143
|
+
)
|
144
|
+
|
145
|
+
body = response.to_s
|
146
|
+
end
|
137
147
|
|
138
148
|
response = ::Minfraud::HTTPService::Response.new(
|
139
|
-
endpoint
|
140
|
-
|
141
|
-
|
142
|
-
body
|
143
|
-
headers: raw.headers
|
149
|
+
endpoint,
|
150
|
+
@locales,
|
151
|
+
response,
|
152
|
+
body,
|
144
153
|
)
|
145
154
|
|
146
155
|
::Minfraud::ErrorHandler.examine(response)
|
@@ -153,9 +162,5 @@ module Minfraud
|
|
153
162
|
mem.merge!(e.to_s => value.to_json)
|
154
163
|
end
|
155
164
|
end
|
156
|
-
|
157
|
-
def request
|
158
|
-
@request ||= Request.new(::Minfraud::HTTPService.configuration)
|
159
|
-
end
|
160
165
|
end
|
161
166
|
end
|
@@ -4,7 +4,7 @@ module Minfraud
|
|
4
4
|
module Components
|
5
5
|
# Account corresponds to the account object of a minFraud request.
|
6
6
|
#
|
7
|
-
# @see https://dev.maxmind.com/minfraud
|
7
|
+
# @see https://dev.maxmind.com/minfraud/api-documentation/requests?lang=en#schema--request--account
|
8
8
|
class Account < Base
|
9
9
|
include Minfraud::Validates
|
10
10
|
|
@@ -4,7 +4,7 @@ module Minfraud
|
|
4
4
|
module Components
|
5
5
|
# Billing corresponds to the billing object of a minFraud request.
|
6
6
|
#
|
7
|
-
# @see https://dev.maxmind.com/minfraud
|
7
|
+
# @see https://dev.maxmind.com/minfraud/api-documentation/requests?lang=en#schema--request--billing
|
8
8
|
class Billing < Addressable; end
|
9
9
|
end
|
10
10
|
end
|
@@ -4,7 +4,7 @@ module Minfraud
|
|
4
4
|
module Components
|
5
5
|
# CreditCard corresponds to the credit_card object of a minFraud request.
|
6
6
|
#
|
7
|
-
# @see https://dev.maxmind.com/minfraud
|
7
|
+
# @see https://dev.maxmind.com/minfraud/api-documentation/requests?lang=en#schema--request--credit-card
|
8
8
|
class CreditCard < Base
|
9
9
|
include Minfraud::Validates
|
10
10
|
|
@@ -62,17 +62,28 @@ module Minfraud
|
|
62
62
|
# @return [String, nil]
|
63
63
|
attr_accessor :cvv_result
|
64
64
|
|
65
|
+
# Whether the outcome of 3-D Secure verification (e.g. Safekey,
|
66
|
+
# SecureCode, Verified by Visa) was successful. +true+ if customer
|
67
|
+
# verification was successful, or +false+ if the customer failed
|
68
|
+
# verification. If 3-D Secure verification was not used, was unavailable,
|
69
|
+
# or resulted in an outcome other than success or failure, do not
|
70
|
+
# include this field.
|
71
|
+
#
|
72
|
+
# @return [Boolean, nil]
|
73
|
+
attr_accessor :was_3d_secure_successful
|
74
|
+
|
65
75
|
# @param params [Hash] Hash of parameters. Each key/value should
|
66
76
|
# correspond to one of the available attributes.
|
67
77
|
def initialize(params = {})
|
68
|
-
@bank_phone_country_code
|
69
|
-
@issuer_id_number
|
70
|
-
@last_4_digits
|
71
|
-
@bank_name
|
72
|
-
@bank_phone_number
|
73
|
-
@avs_result
|
74
|
-
@cvv_result
|
75
|
-
@token
|
78
|
+
@bank_phone_country_code = params[:bank_phone_country_code]
|
79
|
+
@issuer_id_number = params[:issuer_id_number]
|
80
|
+
@last_4_digits = params[:last_4_digits]
|
81
|
+
@bank_name = params[:bank_name]
|
82
|
+
@bank_phone_number = params[:bank_phone_number]
|
83
|
+
@avs_result = params[:avs_result]
|
84
|
+
@cvv_result = params[:cvv_result]
|
85
|
+
@token = params[:token]
|
86
|
+
@was_3d_secure_successful = params[:was_3d_secure_successful]
|
76
87
|
|
77
88
|
validate
|
78
89
|
end
|
@@ -90,6 +101,7 @@ module Minfraud
|
|
90
101
|
validate_string('avs_result', 1, @avs_result)
|
91
102
|
validate_string('cvv_result', 1, @cvv_result)
|
92
103
|
validate_credit_card_token('token', @token)
|
104
|
+
validate_boolean('was_3d_secure_successful', @was_3d_secure_successful)
|
93
105
|
end
|
94
106
|
end
|
95
107
|
end
|
@@ -5,7 +5,7 @@ module Minfraud
|
|
5
5
|
# CustomInputs corresponds to the custom_inputs object of a minFraud
|
6
6
|
# request.
|
7
7
|
#
|
8
|
-
# @see https://dev.maxmind.com/minfraud
|
8
|
+
# @see https://dev.maxmind.com/minfraud/api-documentation/requests?lang=en#schema--request--custom-inputs
|
9
9
|
class CustomInputs < Base
|
10
10
|
include Minfraud::Validates
|
11
11
|
|
@@ -4,7 +4,7 @@ module Minfraud
|
|
4
4
|
module Components
|
5
5
|
# Device corresponds to the device object of a minFraud request.
|
6
6
|
#
|
7
|
-
# @see https://dev.maxmind.com/minfraud
|
7
|
+
# @see https://dev.maxmind.com/minfraud/api-documentation/requests?lang=en#schema--request--device
|
8
8
|
class Device < Base
|
9
9
|
include Minfraud::Validates
|
10
10
|
|
@@ -1,17 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'digest/md5'
|
4
|
+
require 'simpleidn'
|
5
|
+
|
3
6
|
module Minfraud
|
4
7
|
module Components
|
5
8
|
# Email corresponds to the email object of a minFraud request.
|
6
9
|
#
|
7
|
-
# @see https://dev.maxmind.com/minfraud
|
10
|
+
# @see https://dev.maxmind.com/minfraud/api-documentation/requests?lang=en#schema--request--email
|
8
11
|
class Email < Base
|
9
12
|
include Minfraud::Validates
|
10
13
|
|
11
14
|
# This field must be either be a valid email address or an MD5 of the
|
12
15
|
# lowercased email used in the transaction. Important: if using the MD5
|
13
16
|
# hash, please be sure to convert the email address to lowercase before
|
14
|
-
# calculating its MD5 hash.
|
17
|
+
# calculating its MD5 hash. Instead of converting an address to an MD5
|
18
|
+
# hash yourself, please use the hash_address attribute in this class.
|
15
19
|
#
|
16
20
|
# @return [String, nil]
|
17
21
|
attr_accessor :address
|
@@ -21,15 +25,46 @@ module Minfraud
|
|
21
25
|
# @return [String, nil]
|
22
26
|
attr_accessor :domain
|
23
27
|
|
28
|
+
# By default, the address will be sent in plain text. If this is set
|
29
|
+
# true, the address will instead be sent as an MD5 hash.
|
30
|
+
#
|
31
|
+
# @return [Boolean, nil]
|
32
|
+
attr_accessor :hash_address
|
33
|
+
|
24
34
|
# @param params [Hash] Hash of parameters. Each key/value should
|
25
35
|
# correspond to one of the available attributes.
|
26
36
|
def initialize(params = {})
|
27
|
-
@address
|
28
|
-
@domain
|
37
|
+
@address = params[:address]
|
38
|
+
@domain = params[:domain]
|
39
|
+
@hash_address = params[:hash_address]
|
29
40
|
|
30
41
|
validate
|
31
42
|
end
|
32
43
|
|
44
|
+
# A JSON representation of Minfraud::Components::Email.
|
45
|
+
#
|
46
|
+
# @return [Hash]
|
47
|
+
def to_json(*_args)
|
48
|
+
json = super
|
49
|
+
|
50
|
+
if json['address'] && !json['domain']
|
51
|
+
_, domain = address.split('@', 2)
|
52
|
+
if domain
|
53
|
+
domain = clean_domain(domain)
|
54
|
+
json['domain'] = domain if domain
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
if json.delete('hash_address') && json['address']
|
59
|
+
hash = hash_email_address(json['address'])
|
60
|
+
|
61
|
+
# We could consider clearing the key if !hash.
|
62
|
+
json['address'] = hash if hash
|
63
|
+
end
|
64
|
+
|
65
|
+
json
|
66
|
+
end
|
67
|
+
|
33
68
|
private
|
34
69
|
|
35
70
|
def validate
|
@@ -38,6 +73,60 @@ module Minfraud
|
|
38
73
|
validate_email('email', @address)
|
39
74
|
validate_string('domain', 255, @domain)
|
40
75
|
end
|
76
|
+
|
77
|
+
def hash_email_address(address)
|
78
|
+
address = clean_email_address(address)
|
79
|
+
return nil if !address
|
80
|
+
|
81
|
+
Digest::MD5.hexdigest(address)
|
82
|
+
end
|
83
|
+
|
84
|
+
def clean_email_address(address)
|
85
|
+
address = address.strip
|
86
|
+
address.downcase!
|
87
|
+
|
88
|
+
local_part, domain = address.split('@', 2)
|
89
|
+
return nil if !local_part || !domain
|
90
|
+
|
91
|
+
domain = clean_domain(domain)
|
92
|
+
|
93
|
+
if domain == 'yahoo.com'
|
94
|
+
local_part.sub!(/\A([^-]+)-.*\z/, '\1')
|
95
|
+
else
|
96
|
+
local_part.sub!(/\A([^+]+)\+.*\z/, '\1')
|
97
|
+
end
|
98
|
+
|
99
|
+
"#{local_part}@#{domain}"
|
100
|
+
end
|
101
|
+
|
102
|
+
TYPO_DOMAINS = {
|
103
|
+
# gmail.com
|
104
|
+
'35gmai.com' => 'gmail.com',
|
105
|
+
'636gmail.com' => 'gmail.com',
|
106
|
+
'gamil.com' => 'gmail.com',
|
107
|
+
'gmail.comu' => 'gmail.com',
|
108
|
+
'gmial.com' => 'gmail.com',
|
109
|
+
'gmil.com' => 'gmail.com',
|
110
|
+
'yahoogmail.com' => 'gmail.com',
|
111
|
+
# outlook.com
|
112
|
+
'putlook.com' => 'outlook.com',
|
113
|
+
}.freeze
|
114
|
+
private_constant :TYPO_DOMAINS
|
115
|
+
|
116
|
+
def clean_domain(domain)
|
117
|
+
domain = domain.strip
|
118
|
+
|
119
|
+
# We could use delete_suffix!, but that is in Ruby 2.5+ only.
|
120
|
+
domain.sub!(/\.\z/, '')
|
121
|
+
|
122
|
+
domain = SimpleIDN.to_ascii(domain)
|
123
|
+
|
124
|
+
if TYPO_DOMAINS.key?(domain)
|
125
|
+
domain = TYPO_DOMAINS[domain]
|
126
|
+
end
|
127
|
+
|
128
|
+
domain
|
129
|
+
end
|
41
130
|
end
|
42
131
|
end
|
43
132
|
end
|
@@ -4,7 +4,7 @@ module Minfraud
|
|
4
4
|
module Components
|
5
5
|
# Event corresponds to the event object of a minFraud request.
|
6
6
|
#
|
7
|
-
# @see https://dev.maxmind.com/minfraud
|
7
|
+
# @see https://dev.maxmind.com/minfraud/api-documentation/requests?lang=en#schema--request--event
|
8
8
|
class Event < Base
|
9
9
|
include ::Minfraud::Enum
|
10
10
|
include Minfraud::Validates
|
@@ -43,16 +43,16 @@ module Minfraud
|
|
43
43
|
#
|
44
44
|
# @return [Symbol, nil]
|
45
45
|
enum_accessor :type,
|
46
|
-
[
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
46
|
+
%i[
|
47
|
+
account_creation
|
48
|
+
account_login
|
49
|
+
email_change
|
50
|
+
password_reset
|
51
|
+
payout_change
|
52
|
+
purchase
|
53
|
+
recurring_purchase
|
54
|
+
referral
|
55
|
+
survey
|
56
56
|
]
|
57
57
|
|
58
58
|
# @param params [Hash] Hash of parameters. Each key/value should
|
@@ -4,7 +4,7 @@ module Minfraud
|
|
4
4
|
module Components
|
5
5
|
# Order corresponds to the order object of a minFraud request.
|
6
6
|
#
|
7
|
-
# @see https://dev.maxmind.com/minfraud
|
7
|
+
# @see https://dev.maxmind.com/minfraud/api-documentation/requests?lang=en#schema--request--order
|
8
8
|
class Order < Base
|
9
9
|
include Minfraud::Validates
|
10
10
|
|