minfraud 1.0.2 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +5 -13
  2. data/.github/workflows/test.yml +46 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +108 -0
  5. data/.travis.yml +19 -3
  6. data/CHANGELOG.md +65 -1
  7. data/CODE_OF_CONDUCT.md +4 -4
  8. data/Gemfile +11 -2
  9. data/LICENSE.txt +2 -1
  10. data/README.dev.md +4 -0
  11. data/README.md +245 -59
  12. data/Rakefile +18 -3
  13. data/bin/console +4 -3
  14. data/lib/maxmind/geoip2/model/city.rb +99 -0
  15. data/lib/maxmind/geoip2/model/country.rb +94 -0
  16. data/lib/maxmind/geoip2/model/insights.rb +38 -0
  17. data/lib/maxmind/geoip2/record/abstract.rb +46 -0
  18. data/lib/maxmind/geoip2/record/city.rb +62 -0
  19. data/lib/maxmind/geoip2/record/continent.rb +61 -0
  20. data/lib/maxmind/geoip2/record/country.rb +78 -0
  21. data/lib/maxmind/geoip2/record/location.rb +97 -0
  22. data/lib/maxmind/geoip2/record/maxmind.rb +41 -0
  23. data/lib/maxmind/geoip2/record/place.rb +52 -0
  24. data/lib/maxmind/geoip2/record/postal.rb +54 -0
  25. data/lib/maxmind/geoip2/record/represented_country.rb +47 -0
  26. data/lib/maxmind/geoip2/record/subdivision.rb +72 -0
  27. data/lib/maxmind/geoip2/record/traits.rb +233 -0
  28. data/lib/minfraud.rb +48 -8
  29. data/lib/minfraud/assessments.rb +118 -49
  30. data/lib/minfraud/components/account.rb +31 -9
  31. data/lib/minfraud/components/addressable.rb +73 -26
  32. data/lib/minfraud/components/base.rb +35 -11
  33. data/lib/minfraud/components/billing.rb +5 -0
  34. data/lib/minfraud/components/credit_card.rb +67 -18
  35. data/lib/minfraud/components/custom_inputs.rb +25 -0
  36. data/lib/minfraud/components/device.rb +51 -10
  37. data/lib/minfraud/components/email.rb +29 -7
  38. data/lib/minfraud/components/event.rb +60 -13
  39. data/lib/minfraud/components/order.rb +60 -22
  40. data/lib/minfraud/components/payment.rb +165 -21
  41. data/lib/minfraud/components/report/transaction.rb +80 -0
  42. data/lib/minfraud/components/shipping.rb +14 -5
  43. data/lib/minfraud/components/shopping_cart.rb +19 -12
  44. data/lib/minfraud/components/shopping_cart_item.rb +42 -13
  45. data/lib/minfraud/enum.rb +22 -8
  46. data/lib/minfraud/error_handler.rb +45 -12
  47. data/lib/minfraud/errors.rb +22 -2
  48. data/lib/minfraud/http_service.rb +22 -8
  49. data/lib/minfraud/http_service/request.rb +19 -18
  50. data/lib/minfraud/http_service/response.rb +49 -12
  51. data/lib/minfraud/model/abstract.rb +20 -0
  52. data/lib/minfraud/model/address.rb +52 -0
  53. data/lib/minfraud/model/billing_address.rb +11 -0
  54. data/lib/minfraud/model/credit_card.rb +75 -0
  55. data/lib/minfraud/model/device.rb +54 -0
  56. data/lib/minfraud/model/disposition.rb +35 -0
  57. data/lib/minfraud/model/email.rb +54 -0
  58. data/lib/minfraud/model/email_domain.rb +24 -0
  59. data/lib/minfraud/model/error.rb +28 -0
  60. data/lib/minfraud/model/factors.rb +24 -0
  61. data/lib/minfraud/model/geoip2_location.rb +25 -0
  62. data/lib/minfraud/model/insights.rb +68 -0
  63. data/lib/minfraud/model/ip_address.rb +82 -0
  64. data/lib/minfraud/model/issuer.rb +49 -0
  65. data/lib/minfraud/model/score.rb +76 -0
  66. data/lib/minfraud/model/score_ip_address.rb +23 -0
  67. data/lib/minfraud/model/shipping_address.rb +30 -0
  68. data/lib/minfraud/model/subscores.rb +178 -0
  69. data/lib/minfraud/model/warning.rb +63 -0
  70. data/lib/minfraud/report.rb +58 -0
  71. data/lib/minfraud/resolver.rb +25 -16
  72. data/lib/minfraud/validates.rb +187 -0
  73. data/lib/minfraud/version.rb +4 -1
  74. data/minfraud.gemspec +23 -18
  75. metadata +123 -48
@@ -1,22 +1,44 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
5
+ # Account corresponds to the account object of a minFraud request.
6
+ #
7
+ # @see https://dev.maxmind.com/minfraud/#Account_(/account)
3
8
  class Account < Base
4
- # @attribute user_id
5
- # @return [String] A unique user ID associated with the end-user in your system.
6
- # If your system allows the login name for the account to be changed, this should not be the login name for the account,
7
- # but rather should be an internal ID that does not change. This is not your MaxMind user ID
9
+ include Minfraud::Validates
10
+
11
+ # A unique user ID associated with the end-user in your system. If your
12
+ # system allows the login name for the account to be changed, this should
13
+ # not be the login name for the account, but rather should be an internal
14
+ # ID that does not change. This is not your MaxMind account ID. No
15
+ # specific format is required.
16
+ #
17
+ # @return [String, nil]
8
18
  attr_accessor :user_id
9
19
 
10
- # @attribute username_md5
11
- # @return [String] An MD5 hash as a hexadecimal string of the username or login name associated with the account
20
+ # An MD5 hash as a hexadecimal string of the username or login name
21
+ # associated with the account.
22
+ #
23
+ # @return [String, nil]
12
24
  attr_accessor :username_md5
13
25
 
14
- # Creates Minfraud::Components::Account instance
15
- # @param [Hash] params hash of parameters
16
- # @return [Minfraud::Components::Account] an Account instance
26
+ # @param params [Hash] Hash of parameters. Each key/value should
27
+ # correspond to one of the available attributes.
17
28
  def initialize(params = {})
18
29
  @user_id = params[:user_id]
19
30
  @username_md5 = params[:username_md5]
31
+
32
+ validate
33
+ end
34
+
35
+ private
36
+
37
+ def validate
38
+ return if !Minfraud.enable_validation
39
+
40
+ validate_string('user_id', 255, @user_id)
41
+ validate_md5('username_md5', @username_md5)
20
42
  end
21
43
  end
22
44
  end
@@ -1,54 +1,81 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
5
+ # This is a parent class for the Billing and Shipping components.
3
6
  class Addressable < Base
4
- # @attribute first_name
5
- # @return [String] The first name of the end user as provided in their billing / shipping information
7
+ include Minfraud::Validates
8
+
9
+ # The first name of the end user as provided in their billing / shipping
10
+ # information.
11
+ #
12
+ # @return [String, nil]
6
13
  attr_accessor :first_name
7
14
 
8
- # @attribute last_name
9
- # @return [String] The last name of the end user as provided in their billing / shipping information
15
+ # The last name of the end user as provided in their billing / shipping
16
+ # information.
17
+ #
18
+ # @return [String, nil]
10
19
  attr_accessor :last_name
11
20
 
12
- # @attribute company
13
- # @return [String] The company of the end user as provided in their billing / shipping information
21
+ # The company of the end user as provided in their billing / shipping
22
+ # information.
23
+ #
24
+ # @return [String, nil]
14
25
  attr_accessor :company
15
26
 
16
- # @attribute address
17
- # @return [String] The first line of the user’s billing / shipping address
27
+ # The first line of the user's billing / shipping address.
28
+ #
29
+ # @return [String, nil]
18
30
  attr_accessor :address
19
31
 
20
- # @attribute address_2
21
- # @return [String] The second line of the user’s billing / shipping address
32
+ # The second line of the user's billing / shipping address.
33
+ #
34
+ # @return [String, nil]
22
35
  attr_accessor :address_2
23
36
 
24
- # @attribute city
25
- # @return [String] The city of the user’s billing / shipping address
37
+ # The city of the user's billing / shipping address.
38
+ #
39
+ # @return [String, nil]
26
40
  attr_accessor :city
27
41
 
28
- # @attribute region
29
- # @return [String] The ISO 3166-2 subdivision code for the user’s billing / shipping address
42
+ # The ISO 3166-2 subdivision code for the user's billing / shipping
43
+ # address.
44
+ #
45
+ # @see https://en.wikipedia.org/wiki/ISO_3166-2
46
+ #
47
+ # @return [String, nil]
30
48
  attr_accessor :region
31
49
 
32
- # @attribute country
33
- # @return [String] The two character ISO 3166-1 alpha-2 country code of the user’s billing / shipping address
50
+ # The two character ISO 3166-1 alpha-2 country code of the user's billing
51
+ # / shipping address.
52
+ #
53
+ # @see https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
54
+ #
55
+ # @return [String, nil]
34
56
  attr_accessor :country
35
57
 
36
- # @attribute postal
37
- # @return [String] The postal code of the user’s billing / shipping address
58
+ # The postal code of the user's billing / shipping address.
59
+ #
60
+ # @return [String, nil]
38
61
  attr_accessor :postal
39
62
 
40
- # @attribute phone_number
41
- # @return [String] The phone number without the country code for the user’s billing / shipping address
63
+ # The phone number without the country code for the user's billing /
64
+ # shipping address. Punctuation characters will be stripped. After
65
+ # stripping punctuation characters, the number must contain only digits.
66
+ #
67
+ # @return [String, nil]
42
68
  attr_accessor :phone_number
43
69
 
44
- # @attribute phone_country_code
45
- # @return [String] The country code for phone number associated with the user’s billing / shipping address
70
+ # The country code for the phone number associated with the user's
71
+ # billing / shipping address. If you provide this information then you
72
+ # must provide at least one digit.
73
+ #
74
+ # @return [String, nil]
46
75
  attr_accessor :phone_country_code
47
76
 
48
- # Creates Minfraud::Components::Addressable instance
49
- # @note This class is used as a parent class for Billing and Shipping components
50
- # @param [Hash] params hash of parameters
51
- # @return [Minfraud::Components::Addressable] an Addressable instance
77
+ # @param params [Hash] Hash of parameters. Each key/value should
78
+ # correspond to one of the available attributes.
52
79
  def initialize(params = {})
53
80
  @first_name = params[:first_name]
54
81
  @last_name = params[:last_name]
@@ -61,6 +88,26 @@ module Minfraud
61
88
  @postal = params[:postal]
62
89
  @phone_number = params[:phone_number]
63
90
  @phone_country_code = params[:phone_country_code]
91
+
92
+ validate
93
+ end
94
+
95
+ private
96
+
97
+ def validate
98
+ return if !Minfraud.enable_validation
99
+
100
+ validate_string('first_name', 255, @first_name)
101
+ validate_string('last_name', 255, @last_name)
102
+ validate_string('company', 255, @company)
103
+ validate_string('address', 255, @address)
104
+ validate_string('address_2', 255, @address_2)
105
+ validate_string('city', 255, @city)
106
+ validate_subdivision_code('region', @region)
107
+ validate_country_code('country', @country)
108
+ validate_string('postal', 255, @postal)
109
+ validate_string('phone_number', 255, @phone_number)
110
+ validate_telephone_country_code('phone_country_code', @phone_country_code)
64
111
  end
65
112
  end
66
113
  end
@@ -1,23 +1,47 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
3
- # @note This class is used as a parent class for all other components
4
- # @note It defines a method which is used for basic JSON representation of PORO objects
5
+ # This is a parent class for all components. It defines a method which is
6
+ # used for basic JSON representation of the component objects.
5
7
  class Base
6
- # @return [Hash] a JSON representation of component attributes
7
- def to_json
8
- instance_variables.inject({}) { |mem, e| populate!(mem, e) }
8
+ # A JSON representation of component attributes.
9
+ #
10
+ # @return [Hash]
11
+ def to_json(*_args)
12
+ instance_variables.reduce({}) { |mem, e| populate!(mem, e) }
9
13
  end
10
14
 
11
15
  private
12
16
 
13
- # @note This method may modify passed hash. Non-existing instance variables are ignored
14
- # @param [Hash] hash an accumulator
15
- # @param [Symbol] v_sym an instance variable symbol
16
- # @return [Hash] a hash containing a JSON representation of instance variable name and it's value
17
+ # Create a hash containing a JSON representation of instance variable
18
+ # name and its value.
19
+ #
20
+ # @param hash [Hash] An accumulator.
21
+ #
22
+ # @param v_sym [Symbol] An instance variable symbol.
23
+ #
24
+ # @return [Hash]
17
25
  def populate!(hash, v_sym)
18
- return hash unless value = instance_variable_get(v_sym)
19
- hash.merge!(v_sym.to_s.gsub(/@/, '') => value.to_s)
26
+ return hash unless (value = instance_variable_get(v_sym))
27
+
28
+ key = v_sym.to_s.gsub(/@/, '')
29
+ hash.merge!(key => represent(key, value))
20
30
  end
31
+
32
+ # Return the value according to the request format.
33
+ #
34
+ # @param key [Symbol] An instance variable symbol.
35
+ #
36
+ # @param value [Object] An instance variable value.
37
+ #
38
+ # @return [Object]
39
+ def represent(key, value)
40
+ BOOLS.include?(key) ? value : value.to_s
41
+ end
42
+
43
+ # Keys that have to remain boolean
44
+ BOOLS = %w[was_authorized is_gift has_gift_message].freeze
21
45
  end
22
46
  end
23
47
  end
@@ -1,5 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
5
+ # Billing corresponds to the billing object of a minFraud request.
6
+ #
7
+ # @see https://dev.maxmind.com/minfraud/#Billing_(/billing)
3
8
  class Billing < Addressable; end
4
9
  end
5
10
  end
@@ -1,38 +1,69 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
5
+ # CreditCard corresponds to the credit_card object of a minFraud request.
6
+ #
7
+ # @see https://dev.maxmind.com/minfraud/#Credit_Card_(/creditcard)
3
8
  class CreditCard < Base
4
- # @attribute issuer_id_number
5
- # # @return [String] The issuer ID number for the credit card. This is the first 6 digits of the credit card number.
6
- # It identifies the issuing bank
9
+ include Minfraud::Validates
10
+
11
+ # The issuer ID number for the credit card. This is the first 6 digits of
12
+ # the credit card number. It identifies the issuing bank.
13
+ #
14
+ # @return [String, nil]
7
15
  attr_accessor :issuer_id_number
8
16
 
9
- # @attribute last_4_digits
10
- # @return [String] The last four digits of the credit card number
17
+ # The last four digits of the credit card number.
18
+ #
19
+ # @return [String, nil]
11
20
  attr_accessor :last_4_digits
12
21
 
13
- # @attribute bank_name
14
- # @return [String] The name of the issuing bank as provided by the end user
22
+ # The name of the issuing bank as provided by the end user.
23
+ #
24
+ # @return [String, nil]
15
25
  attr_accessor :bank_name
16
26
 
17
- # @attribute bank_phone_country_code
18
- # @return [String] The phone country code for the issuing bank as provided by the end user
27
+ # The phone country code for the issuing bank as provided by the end
28
+ # user. If you provide this information then you must provide at least
29
+ # one digit.
30
+ #
31
+ # @return [String, nil]
19
32
  attr_accessor :bank_phone_country_code
20
33
 
21
- # @attribute phone_phone_number
22
- # @return [String] The phone number, without the country code, for the issuing bank as provided by the end user
34
+ # The phone number, without the country code, for the issuing bank as
35
+ # provided by the end user. Punctuation characters will be stripped.
36
+ # After stripping punctuation characters, the number must contain only
37
+ # digits.
38
+ #
39
+ # @return [String, nil]
23
40
  attr_accessor :bank_phone_number
24
41
 
25
- # @attribute avs_result
26
- # @return [String] The address verification system (AVS) check result, as returned to you by the credit card processor
42
+ # A token uniquely identifying the card. The token should consist of
43
+ # non-space printable ASCII characters. If the token is all digits, it
44
+ # must be more than 19 characters long. The token must not be a primary
45
+ # account number (PAN) or a simple transformation of it. If you have a
46
+ # valid token that looks like a PAN but is not one, you may prefix that
47
+ # token with a fixed string, e.g., +token-+.
48
+ #
49
+ # @return [String, nil]
50
+ attr_accessor :token
51
+
52
+ # The address verification system (AVS) check result, as returned to you
53
+ # by the credit card processor. The minFraud service supports the
54
+ # standard AVS codes.
55
+ #
56
+ # @return [String, nil]
27
57
  attr_accessor :avs_result
28
58
 
29
- # @attribute cvv_result
30
- # @return [String] The card verification value (CVV) code as provided by the payment processor
59
+ # The card verification value (CVV) code as provided by the payment
60
+ # processor.
61
+ #
62
+ # @return [String, nil]
31
63
  attr_accessor :cvv_result
32
64
 
33
- # Creates Minfraud::Components::CreditCard instance
34
- # @param [Hash] params hash of parameters
35
- # @return [Minfraud::Components::CreditCard] a CreditCard instance
65
+ # @param params [Hash] Hash of parameters. Each key/value should
66
+ # correspond to one of the available attributes.
36
67
  def initialize(params = {})
37
68
  @bank_phone_country_code = params[:bank_phone_country_code]
38
69
  @issuer_id_number = params[:issuer_id_number]
@@ -41,6 +72,24 @@ module Minfraud
41
72
  @bank_phone_number = params[:bank_phone_number]
42
73
  @avs_result = params[:avs_result]
43
74
  @cvv_result = params[:cvv_result]
75
+ @token = params[:token]
76
+
77
+ validate
78
+ end
79
+
80
+ private
81
+
82
+ def validate
83
+ return if !Minfraud.enable_validation
84
+
85
+ validate_telephone_country_code('bank_phone_country_code', @bank_phone_country_code)
86
+ validate_regex('issuer_id_number', /\A[0-9]{6}\z/, @issuer_id_number)
87
+ validate_regex('last_4_digits', /\A[0-9]{4}\z/, @last_4_digits)
88
+ validate_string('bank_name', 255, @bank_name)
89
+ validate_string('bank_phone_number', 255, @bank_phone_number)
90
+ validate_string('avs_result', 1, @avs_result)
91
+ validate_string('cvv_result', 1, @cvv_result)
92
+ validate_credit_card_token('token', @token)
44
93
  end
45
94
  end
46
95
  end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Minfraud
4
+ module Components
5
+ # CustomInputs corresponds to the custom_inputs object of a minFraud
6
+ # request.
7
+ #
8
+ # @see https://dev.maxmind.com/minfraud/#Custom_Inputs_(/custominputs)
9
+ class CustomInputs < Base
10
+ include Minfraud::Validates
11
+
12
+ # @param params [Hash] Each key/value should correspond to your defined
13
+ # custom inputs.
14
+ def initialize(params = {})
15
+ params.each do |name, value|
16
+ instance_variable_set("@#{name}", value)
17
+
18
+ if Minfraud.enable_validation
19
+ validate_custom_input_value(name, value)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,26 +1,67 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Minfraud
2
4
  module Components
5
+ # Device corresponds to the device object of a minFraud request.
6
+ #
7
+ # @see https://dev.maxmind.com/minfraud/#Device_(/device)
3
8
  class Device < Base
4
- # @!attribute ip_address
5
- # @return [String] The IP address associated with the device used by the customer in the transaction.
6
- # The IP address must be in IPv4 or IPv6 presentation format
9
+ include Minfraud::Validates
10
+
11
+ # The IP address associated with the device used by the customer in the
12
+ # transaction. The IP address must be in IPv4 or IPv6 presentation
13
+ # format, i.e., dotted-quad notation or the IPv6 hexadecimal-colon
14
+ # notation. (Required)
15
+ #
16
+ # @return [String, nil]
7
17
  attr_accessor :ip_address
8
18
 
9
- # @attribute user_agent
10
- # @return [String] The HTTP "User-Agent" header of the browser used in the transaction
19
+ # The HTTP "User-Agent" header of the browser used in the transaction.
20
+ #
21
+ # @return [String, nil]
11
22
  attr_accessor :user_agent
12
23
 
13
- # @attribute :accept_language
14
- # @return [String] The HTTP "Accept-Language" header of the browser used in the transaction
24
+ # The HTTP "Accept-Language" header of the browser used in the
25
+ # transaction.
26
+ #
27
+ # @return [String, nil]
15
28
  attr_accessor :accept_language
16
29
 
17
- # Creates Minfraud::Components::Device instance
18
- # @param [Hash] params hash of parameters
19
- # @return [Minfraud::Components::Device] a Device instance
30
+ # The number of seconds between the creation of the user's session and
31
+ # the time of the transaction. Note that session_age is not the duration
32
+ # of the current visit, but the time since the start of the first visit.
33
+ # The value must be at least 0 and at most 10^13-1.
34
+ #
35
+ # @return [Float, nil]
36
+ attr_accessor :session_age
37
+
38
+ # An ID that uniquely identifies a visitor's session on the site.
39
+ #
40
+ # @return [String, nil]
41
+ attr_accessor :session_id
42
+
43
+ # @param params [Hash] Hash of parameters. Each key/value should
44
+ # correspond to one of the available attributes.
20
45
  def initialize(params = {})
21
46
  @ip_address = params[:ip_address]
22
47
  @user_agent = params[:user_agent]
23
48
  @accept_language = params[:accept_language]
49
+ @session_age = params[:session_age]
50
+ @session_id = params[:session_id]
51
+
52
+ validate
53
+ end
54
+
55
+ private
56
+
57
+ def validate
58
+ return if !Minfraud.enable_validation
59
+
60
+ validate_ip('ip_address', @ip_address)
61
+ validate_string('user_agent', 512, @user_agent)
62
+ validate_string('accept_language', 255, @accept_language)
63
+ validate_nonnegative_number('session_age', @session_age)
64
+ validate_string('session_id', 255, @session_id)
24
65
  end
25
66
  end
26
67
  end