class Adyen::AdyenError

Attributes

code[R]
msg[R]
request[R]
response[R]

Public Class Methods

new(request = nil, response = nil, msg = nil, code = nil) click to toggle source
Calls superclass method
# File lib/adyen/errors.rb, line 5
def initialize(request = nil, response = nil, msg = nil, code = nil)
  mask_fields(request)

  # components of formatted error message
  attributes = {
    code: code,
    msg: msg,
    request: request,
    response: response
  }.select { |_k, v| v }.map { |k, v| "#{k}:#{v}" }.join(', ')
  message = "#{self.class.name} #{attributes}"
  super(message)

  # internal variables
  @code = code
  @response = response
  @request = request
  @msg = msg
end

Public Instance Methods

mask_fields(request) click to toggle source

mask PCI data in request

# File lib/adyen/errors.rb, line 26
def mask_fields(request)
  return if request.nil?

  # sensitive fields
  fields_to_mask = [
    :expiryMonth,
    :expiryYear,
    :encryptedCardNumber,
    :encryptedExpiryMonth,
    :encryptedExpiryYear,
    :encryptedSecurityCode
  ]

  # convert to hash if necessary
  request = request.is_a?(Hash) ? request : JSON.parse(request)

  # iterate through request to find fields to mask
  request.each do |k, v|
    if request[k].is_a?(Hash)
      # recursively traverse multi-level hashes
      mask_fields(request[k])
    else
      if k == :number
        # show first 6 and last 4 for cards
        request[k] = "#{v[0,6]}******#{v[12,16]}"
      elsif k == :cvc
        # show length of cvc for debugging
        request[k] = "*" * v.length
      elsif fields_to_mask.include? k
        # generic mask for other fields
        request[k] = "***"
      end
    end
  end
end