minfraud 1.3.0 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e5fce80d6ea146e9d31c969019ccefb4a79789645ecbb1db17e1221e90d46e7e
4
- data.tar.gz: c1c4082e3a4b4305a530ed84f7a126c2f08872930ecc0df50e3fa20a9ece19cd
3
+ metadata.gz: 6df345c5d62d26c7e778a55423ac6a542ec8b94c040c6a43d26ef0cdad484503
4
+ data.tar.gz: 9d7d427983c71db3e4aa8ac1f7ef1008388a4847b455db50179e579292ac8c61
5
5
  SHA512:
6
- metadata.gz: c3996a9546ab76d48a2cd1721612a6d1833c37715f9f4da957dbe584be5a5c8523c552989c766af1f1c72f83b8b20eede3721543f0db86e381a2e8c333d4526b
7
- data.tar.gz: 960d79206d07a0ec8b00cb48948dc6699c23693fcf64910a5469d728f6c2028a530f50d3f0079aa59acbd603544c29a88df659686bc8a4f3998bf4804af42a16
6
+ metadata.gz: 2cb3b9e1e1d825c828cf1e73684b70784ee1ba5de18902a1d76cd08b5f625cb276bd3a276c64e74f8c3cf8a8269be9c7707a6cd5afa12700d59281985178d070
7
+ data.tar.gz: 55fd1da7ed9543c44a6efcd4b3638b03a1537c31de12773a0446789f129234ceed750e16e8b0c8c629bcf2956815ef0b0f00cfdfe482fe3e4ad736b0cef5b3ef
@@ -0,0 +1,7 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ open-pull-requests-limit: 10
@@ -0,0 +1,12 @@
1
+ name: Run rubocop
2
+ on: [push, pull_request]
3
+ jobs:
4
+ rubocop:
5
+ runs-on: ubuntu-latest
6
+ steps:
7
+ - uses: actions/checkout@v2
8
+ - uses: ruby/setup-ruby@v1
9
+ with:
10
+ ruby-version: '3.0'
11
+ - run: bundle install
12
+ - run: bundle exec rake -t rubocop
@@ -1,14 +1,7 @@
1
- name: ruby-versions
2
- on:
3
- push:
4
- paths-ignore:
5
- - "**.md"
6
- pull_request:
7
- paths-ignore:
8
- - "**.md"
1
+ name: Run tests
2
+ on: [push, pull_request]
9
3
  jobs:
10
- run:
11
- name: ruby
4
+ test:
12
5
  runs-on: ${{ matrix.os }}
13
6
  strategy:
14
7
  fail-fast: false
@@ -16,31 +9,21 @@ jobs:
16
9
  os: [ubuntu-latest, windows-latest, macos-latest]
17
10
  version:
18
11
  [
19
- "2.2",
20
- "2.3",
21
- "2.4",
22
- "2.5",
23
- "2.6",
24
- "2.7",
25
- "head",
26
- "jruby",
27
- "jruby-head",
12
+ 2.5,
13
+ 2.6,
14
+ 2.7,
15
+ '3.0',
16
+ jruby,
28
17
  ]
29
18
  exclude:
30
19
  - os: windows-latest
31
- version: "jruby"
32
- - os: windows-latest
33
- version: "jruby-head"
20
+ version: jruby
34
21
  steps:
35
- - name: checkout
36
- uses: actions/checkout@v2
37
-
22
+ - uses: actions/checkout@v2
23
+ with:
24
+ submodules: true
38
25
  - uses: ruby/setup-ruby@v1
39
26
  with:
40
27
  ruby-version: ${{ matrix.version }}
41
- - name: ruby version
42
- run: ruby -v
43
- - run: bundler install
44
- name: install
45
- - run: bundler exec rake -t
46
- name: test
28
+ - run: bundle install
29
+ - run: bundle exec rake -t spec
data/.rubocop.yml CHANGED
@@ -1,5 +1,6 @@
1
- Gemspec/RequiredRubyVersion:
2
- Enabled: false # We support 1.9, but newer rubocops don't.
1
+ AllCops:
2
+ TargetRubyVersion: 2.5
3
+ NewCops: enable
3
4
 
4
5
  # Metrics.
5
6
 
@@ -103,6 +104,3 @@ Lint/MissingSuper:
103
104
 
104
105
  Naming/VariableNumber:
105
106
  Enabled: false # Doesn't always make sense.
106
-
107
- AllCops:
108
- NewCops: enable
data/CHANGELOG.md CHANGED
@@ -1,5 +1,47 @@
1
1
  # Minfraud Changelog
2
2
 
3
+ ## v1.6.0 (2021-08-19)
4
+
5
+ * Adds new processor to `Minfraud::Components::Payment`: `:cardknox`,
6
+ `:creditguard`, `:credorax`, `:datacap`, `:dlocal`, `:onpay`, and
7
+ `:safecharge`.
8
+ * Adds `rule_label` to minFraud output `/disposition`.
9
+ * Adds support for the `/credit_card/was_3d_secure_successful` input. This is
10
+ available by setting the `was_3d_secure_successful` attribute on
11
+ `Minfraud::Components::CreditCard`.
12
+ * Ruby 2.5+ is now required. If you're using Ruby 2.1, 2.2, 2.3, or 2.4,
13
+ please use version 1.5.0 of this gem.
14
+
15
+ ## v1.5.0 (2021-02-02)
16
+
17
+ * Add the `hash_address` attribute to `Minfraud::Components::Email`. If
18
+ this is `true`, the MD5 hash of the `address` will be sent instead of the
19
+ plain text `address`. Use this if you prefer to send the hash of the
20
+ `address` rather than the plain text. Note that this normalizes the
21
+ `address`, so we recommend using it as opposed to hashing the `address`
22
+ manually.
23
+ * The email `domain` input is now automatically set if the email `address`
24
+ input is set but the `domain` is not.
25
+ * Adds new payment processors `:apple_pay` and `:aps_payments` to
26
+ `Minfraud::Components::Payment`.
27
+ * Added support for the IP address risk reasons in the minFraud Insights
28
+ and Factors responses. This is available at `.ip_address.risk_reasons`.
29
+ It is an array of `IPRiskReason` objects.
30
+
31
+ ## v1.4.1 (2020-12-01)
32
+
33
+ * Do not throw an exception if the response does not include IP address
34
+ information. Previously we would incorrectly try to retrieve fields from
35
+ `nil`, leading to a `NoMethodError`.
36
+
37
+ ## v1.4.0 (2020-10-13)
38
+
39
+ * IMPORTANT: Ruby 2.0 is no longer supported. If you're using Ruby 2.0,
40
+ please use version 1.3.0.
41
+ * Add handling for the `REQUEST_INVALID` error code.
42
+ * The IP address is no longer a required input.
43
+ * Adds new payment processor `:tsys` to `Minfraud::Components::Payment`.
44
+
3
45
  ## v1.3.0 (2020-09-25)
4
46
 
5
47
  * Adds support for persistent HTTP connections. Connections persist
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
@@ -1,4 +1,4 @@
1
1
  # How to release
2
2
 
3
3
  See
4
- [here](https://github.com/maxmind/MaxMind-DB-Reader-ruby/blob/master/README.dev.md).
4
+ [here](https://github.com/maxmind/MaxMind-DB-Reader-ruby/blob/main/README.dev.md).
data/README.md CHANGED
@@ -122,14 +122,15 @@ assessment = Minfraud::Assessments.new(
122
122
  decline_code: 'invalid number',
123
123
  },
124
124
  credit_card: {
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',
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.0 and above.
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/Rakefile CHANGED
@@ -9,13 +9,4 @@ RSpec::Core::RakeTask.new(:spec)
9
9
  RuboCop::RakeTask.new
10
10
 
11
11
  task default: :spec
12
-
13
- # The current version of rubocop supports Ruby 2.4+. While we could run its
14
- # older versions, the config isn't backwards compatible. Let's run it only for
15
- # 2.4+. This isn't perfect, but as long as 1.9+ tests pass we should be okay.
16
- version_pieces = RUBY_VERSION.split('.')
17
- major_version = version_pieces[0]
18
- minor_version = version_pieces[1]
19
- if major_version == '2' && minor_version.to_i >= 4
20
- task default: :rubocop
21
- end
12
+ task default: :rubocop
@@ -33,7 +33,7 @@ module MaxMind
33
33
  # @!visibility private
34
34
  def initialize(record)
35
35
  super(record)
36
- if !record.key?('network') && record.key?('ip_address') &&
36
+ if record && !record.key?('network') && record.key?('ip_address') &&
37
37
  record.key?('prefix_length')
38
38
  ip = IPAddr.new(record['ip_address']).mask(record['prefix_length'])
39
39
  # We could use ip.prefix instead of record['prefix_length'], but that
@@ -89,7 +89,7 @@ module MaxMind
89
89
  # NAT, this may differ from the IP address locally assigned to it. This
90
90
  # attribute is returned by all end points.
91
91
  #
92
- # @return [String]
92
+ # @return [String, nil]
93
93
  def ip_address
94
94
  get('ip_address')
95
95
  end
@@ -169,7 +169,7 @@ module MaxMind
169
169
  # this is the largest network where all of the fields besides ip_address
170
170
  # have the same value.
171
171
  #
172
- # @return [String]
172
+ # @return [String, nil]
173
173
  def network
174
174
  get('network')
175
175
  end
@@ -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 = params[:bank_phone_country_code]
69
- @issuer_id_number = params[:issuer_id_number]
70
- @last_4_digits = params[:last_4_digits]
71
- @bank_name = params[:bank_name]
72
- @bank_phone_number = params[:bank_phone_number]
73
- @avs_result = params[:avs_result]
74
- @cvv_result = params[:cvv_result]
75
- @token = params[: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
@@ -11,7 +11,7 @@ module Minfraud
11
11
  # The IP address associated with the device used by the customer in the
12
12
  # transaction. The IP address must be in IPv4 or IPv6 presentation
13
13
  # format, i.e., dotted-quad notation or the IPv6 hexadecimal-colon
14
- # notation. (Required)
14
+ # notation.
15
15
  #
16
16
  # @return [String, nil]
17
17
  attr_accessor :ip_address
@@ -1,5 +1,8 @@
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.
@@ -11,7 +14,8 @@ module Minfraud
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 = params[:address]
28
- @domain = params[: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
@@ -22,6 +22,8 @@ module Minfraud
22
22
  :altapay,
23
23
  :amazon_payments,
24
24
  :american_express_payment_gateway,
25
+ :apple_pay,
26
+ :aps_payments,
25
27
  :authorizenet,
26
28
  :balanced,
27
29
  :beanstream,
@@ -29,6 +31,7 @@ module Minfraud
29
31
  :bluesnap,
30
32
  :bpoint,
31
33
  :braintree,
34
+ :cardknox,
32
35
  :cardpay,
33
36
  :cashfree,
34
37
  :ccavenue,
@@ -42,15 +45,19 @@ module Minfraud
42
45
  :compropago,
43
46
  :concept_payments,
44
47
  :conekta,
48
+ :creditguard,
49
+ :credorax,
45
50
  :ct_payments,
46
51
  :cuentadigital,
47
52
  :curopayments,
48
53
  :cybersource,
49
54
  :dalenys,
50
55
  :dalpay,
56
+ :datacap,
51
57
  :datacash,
52
58
  :dibs,
53
59
  :digital_river,
60
+ :dlocal,
54
61
  :dotpay,
55
62
  :ebs,
56
63
  :ecomm365,
@@ -87,6 +94,7 @@ module Minfraud
87
94
  :nmi,
88
95
  :oceanpayment,
89
96
  :oney,
97
+ :onpay,
90
98
  :openpaymx,
91
99
  :optimal_payments,
92
100
  :orangepay,
@@ -122,6 +130,7 @@ module Minfraud
122
130
  :rede,
123
131
  :redpagos,
124
132
  :rewardspay,
133
+ :safecharge,
125
134
  :sagepay,
126
135
  :securetrading,
127
136
  :simplify_commerce,
@@ -136,6 +145,7 @@ module Minfraud
136
145
  :telerecargas,
137
146
  :towah,
138
147
  :transact_pro,
148
+ :tsys,
139
149
  :usa_epay,
140
150
  :vantiv,
141
151
  :verepay,
@@ -13,7 +13,7 @@ module Minfraud
13
13
  attr_accessor :items
14
14
 
15
15
  # @param params [Array] Array of shopping cart items. You may provide
16
- # each item as either as Hash where each key is a symbol corresponding
16
+ # each item as either a Hash where each key is a symbol corresponding
17
17
  # to an item's field, or as a Minfraud:::Components::ShoppingCartItem
18
18
  # object.
19
19
  def initialize(params = [])
@@ -27,15 +27,6 @@ module Minfraud
27
27
 
28
28
  # @!visibility private
29
29
  STATUS_CODES = {
30
- IP_ADDRESS_INVALID: [
31
- ClientError, 'You have not supplied a valid IPv4 or IPv6 address'
32
- ],
33
- IP_ADDRESS_REQUIRED: [
34
- ClientError, 'You have not supplied an IP address which is a required field'
35
- ],
36
- IP_ADDRESS_RESERVED: [
37
- ClientError, 'You have supplied an IP address which is reserved'
38
- ],
39
30
  JSON_INVALID: [
40
31
  ClientError, 'JSON body cannot be decoded'
41
32
  ],
@@ -48,6 +39,9 @@ module Minfraud
48
39
  PARAMETER_UNKNOWN: [
49
40
  ClientError, 'You have supplied an unknown parameter'
50
41
  ],
42
+ REQUEST_INVALID: [
43
+ ClientError, 'The request did not contain any valid input values.'
44
+ ],
51
45
  TAG_REQUIRED: [
52
46
  ClientError, 'You have not supplied a tag, which is a required field'
53
47
  ],
@@ -10,8 +10,8 @@ module Minfraud
10
10
  # rules.
11
11
  class Disposition < Abstract
12
12
  # The action to take on the transaction as defined by your custom rules.
13
- # The current set of values are "accept", "manual_review", and "reject".
14
- # If you do not have custom rules set up, this will be nil.
13
+ # The current set of values are "accept", "manual_review", "reject", and
14
+ # "test". If you do not have custom rules set up, this will be nil.
15
15
  #
16
16
  # @return [String, nil]
17
17
  attr_reader :action
@@ -23,12 +23,19 @@ module Minfraud
23
23
  # @return [String, nil]
24
24
  attr_reader :reason
25
25
 
26
+ # The label of the custom rule that was triggered. If you do not have
27
+ # custom rules set up, the triggered custom rule does not have a label,
28
+ # or no custom rule was triggered, this will be nil.
29
+ # @return [String, nil]
30
+ attr_reader :rule_label
31
+
26
32
  # @!visibility private
27
33
  def initialize(record)
28
34
  super(record)
29
35
 
30
- @action = get('action')
31
- @reason = get('reason')
36
+ @action = get('action')
37
+ @reason = get('reason')
38
+ @rule_label = get('rule_label')
32
39
  end
33
40
  end
34
41
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'maxmind/geoip2/model/insights'
4
4
  require 'minfraud/model/geoip2_location'
5
+ require 'minfraud/model/ip_risk_reason'
5
6
 
6
7
  module Minfraud
7
8
  module Model
@@ -13,9 +14,20 @@ module Minfraud
13
14
  # @return [Float]
14
15
  attr_reader :risk
15
16
 
17
+ # This field contains IPRiskReason objects identifying the reasons why
18
+ # the IP address received the associated risk. This will be an empty
19
+ # array if there are no reasons.
20
+ #
21
+ # @return [Array<Minfraud::Model::IPRiskReason>]
22
+ attr_reader :risk_reasons
23
+
16
24
  # @!visibility private
17
25
  def initialize(record, locales)
18
- super(record, locales)
26
+ if record
27
+ super(record, locales)
28
+ else
29
+ super({}, locales)
30
+ end
19
31
 
20
32
  if record
21
33
  @location = Minfraud::Model::GeoIP2Location.new(record.fetch('location', nil))
@@ -28,6 +40,13 @@ module Minfraud
28
40
  @risk = nil
29
41
  end
30
42
 
43
+ @risk_reasons = []
44
+ if record && record.key?('risk_reasons')
45
+ record['risk_reasons'].each do |r|
46
+ @risk_reasons << Minfraud::Model::IPRiskReason.new(r)
47
+ end
48
+ end
49
+
31
50
  # Decorate objects with deprecated attributes and names for backwards
32
51
  # compatibility. Do this here rather than with the overhead of
33
52
  # subclasses/modules for them in the hope that one day we can delete
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minfraud/model/abstract'
4
+
5
+ module Minfraud
6
+ module Model
7
+ # Reason for the IP risk.
8
+ #
9
+ # This class provides both a machine-readable code and a human-readable
10
+ # explanation of the reason for the IP risk score.
11
+ #
12
+ # Although more codes may be added in the future, the current codes are:
13
+ #
14
+ # * ANONYMOUS_IP - The IP address belongs to an anonymous network. See the
15
+ # object at ip_address.traits for more details.
16
+ # * BILLING_POSTAL_VELOCITY - Many different billing postal codes have been
17
+ # seen on this IP address.
18
+ # * EMAIL_VELOCITY - Many different email addresses have been seen on this
19
+ # IP address.
20
+ # * HIGH_RISK_DEVICE - A high risk device was seen on this IP address.
21
+ # * HIGH_RISK_EMAIL - A high risk email address was seen on this IP address
22
+ # in your past transactions.
23
+ # * ISSUER_ID_NUMBER_VELOCITY - Many different issuer ID numbers have been
24
+ # seen on this IP address.
25
+ # * MINFRAUD_NETWORK_ACTIVITY - Suspicious activity has been seen on this
26
+ # IP address across minFraud customers.
27
+ class IPRiskReason < Abstract
28
+ # This value is a machine-readable code identifying the reason.
29
+ #
30
+ # @return [String, nil]
31
+ attr_reader :code
32
+
33
+ # This field provides a human-readable explanation of the reason. The
34
+ # text may change at any time and should not be matched against.
35
+ #
36
+ # @return [String, nil]
37
+ attr_reader :reason
38
+
39
+ # @!visibility private
40
+ def initialize(record)
41
+ super(record)
42
+
43
+ @code = get('code')
44
+ @reason = get('reason')
45
+ end
46
+ end
47
+ end
48
+ end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Minfraud
4
4
  # The Gem version.
5
- VERSION = '1.3.0'
5
+ VERSION = '1.6.0'
6
6
  end
data/minfraud.gemspec CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |spec|
15
15
  spec.homepage = 'https://github.com/maxmind/minfraud-api-ruby'
16
16
  spec.license = 'MIT'
17
17
 
18
- spec.required_ruby_version = '>= 2.0'
18
+ spec.required_ruby_version = '>= 2.5.0'
19
19
 
20
20
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
21
  spec.bindir = 'exe'
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.add_runtime_dependency 'faraday', '>= 0.9.1', '< 2.0'
26
26
  spec.add_runtime_dependency 'faraday_middleware', '>= 0.9.1', '< 2.0'
27
27
  spec.add_runtime_dependency 'net-http-persistent', '>= 2.0.0', '< 5.0'
28
+ spec.add_runtime_dependency 'simpleidn', '>= 0.1.1'
28
29
 
29
30
  spec.add_development_dependency 'bundler', '>= 1.16'
30
31
  spec.add_development_dependency 'rake'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minfraud
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - kushnir.yb
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-25 00:00:00.000000000 Z
11
+ date: 2021-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -70,6 +70,20 @@ dependencies:
70
70
  - - "<"
71
71
  - !ruby/object:Gem::Version
72
72
  version: '5.0'
73
+ - !ruby/object:Gem::Dependency
74
+ name: simpleidn
75
+ requirement: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: 0.1.1
80
+ type: :runtime
81
+ prerelease: false
82
+ version_requirements: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: 0.1.1
73
87
  - !ruby/object:Gem::Dependency
74
88
  name: bundler
75
89
  requirement: !ruby/object:Gem::Requirement
@@ -140,18 +154,19 @@ dependencies:
140
154
  - - ">="
141
155
  - !ruby/object:Gem::Version
142
156
  version: '0'
143
- description:
157
+ description:
144
158
  email:
145
159
  - support@maxmind.com
146
160
  executables: []
147
161
  extensions: []
148
162
  extra_rdoc_files: []
149
163
  files:
164
+ - ".github/dependabot.yml"
165
+ - ".github/workflows/rubocop.yml"
150
166
  - ".github/workflows/test.yml"
151
167
  - ".gitignore"
152
168
  - ".rspec"
153
169
  - ".rubocop.yml"
154
- - ".travis.yml"
155
170
  - CHANGELOG.md
156
171
  - CODE_OF_CONDUCT.md
157
172
  - Gemfile
@@ -211,6 +226,7 @@ files:
211
226
  - lib/minfraud/model/geoip2_location.rb
212
227
  - lib/minfraud/model/insights.rb
213
228
  - lib/minfraud/model/ip_address.rb
229
+ - lib/minfraud/model/ip_risk_reason.rb
214
230
  - lib/minfraud/model/issuer.rb
215
231
  - lib/minfraud/model/score.rb
216
232
  - lib/minfraud/model/score_ip_address.rb
@@ -226,7 +242,7 @@ homepage: https://github.com/maxmind/minfraud-api-ruby
226
242
  licenses:
227
243
  - MIT
228
244
  metadata: {}
229
- post_install_message:
245
+ post_install_message:
230
246
  rdoc_options: []
231
247
  require_paths:
232
248
  - lib
@@ -234,16 +250,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
234
250
  requirements:
235
251
  - - ">="
236
252
  - !ruby/object:Gem::Version
237
- version: '2.0'
253
+ version: 2.5.0
238
254
  required_rubygems_version: !ruby/object:Gem::Requirement
239
255
  requirements:
240
256
  - - ">="
241
257
  - !ruby/object:Gem::Version
242
258
  version: '0'
243
259
  requirements: []
244
- rubyforge_project:
245
- rubygems_version: 2.7.6.2
246
- signing_key:
260
+ rubygems_version: 3.1.2
261
+ signing_key:
247
262
  specification_version: 4
248
263
  summary: Ruby API for the minFraud Score, Insights, Factors, and Report Transactions
249
264
  services
data/.travis.yml DELETED
@@ -1,21 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - 2.0
5
- - 2.1
6
- - 2.2
7
- - 2.3
8
- - 2.4
9
- - 2.5
10
- - 2.6
11
- - 2.7
12
-
13
- notifications:
14
- email:
15
- on_failure: always
16
- on_success: change
17
- recipients:
18
- - dev-ci@maxmind.com
19
- slack:
20
- rooms:
21
- secure: "wuwMo+BWnaBtkt1uGAi4Zd0EARX3B2TXDmBGCtn8r4PLfehh61S6nLQDASNXSk200PmniFM8PyOUNVGVJqWpYQAEMn32WWdy4vTK2c8CsjwfsMhgnOI2YDCzw+jiP+8EfIGBsPO4xA7yrzweP8gkzBtplb3LbaCiW83WfFo9+402yr0/0F9gfWi8qvuIw29XAS1XWhTY4itqGfkSPdOHQz/45ElpLkGlgreuRrih3tAgn9YLb/Uh/6McHfHkL74YwQU3p0NiZcoleWYM0CLpPzyrN8EsbmIT+L75nIVwXnh62Gx2jJWayj7ZzvyKtVKHtLb/LKRs4Dg0UEg65xX1EcBAkC5fn4KG1jQHvi/tdOx1Sfh3hO6OK+68q1R6cQQYy+uG84q8RUjpO6dzFcWpE1yMdbQ5XMKfTh56ZdhXJ803LD2gGeIgcMwJp6HK9tnf0vaPPI9kbr8fqJBUUkciUoqpYzFd5m0ZCUbJsMD0oPY19FSRtfCNQvCbmhYrLy1sQ5FeMzbF0bi2oaUv+JD/A5RKokNMrrwv3nnTtG4vN1hJklQk2VW3sZWl6UjYgzhrbmKABtvPuB+xcYywIu4+JSworpfDwM/PZAKOfd6n+r8OdNV256l8WaNeF6osvXkUR7yxYpytywdQPA0d/z8mxTVoATE3wat7pnmTrqI5fqw=\n"