class Adyen::Utils::HmacValidator

Constants

DATA_SEPARATOR
HMAC_ALGORITHM
NOTIFICATION_VALIDATION_KEYS

Public Instance Methods

calculate_notification_hmac(notification_request_item, hmac_key) click to toggle source
# File lib/adyen/utils/hmac_validator.rb, line 18
def calculate_notification_hmac(notification_request_item, hmac_key)
  data = data_to_sign(notification_request_item)

  Base64.strict_encode64(OpenSSL::HMAC.digest(HMAC_ALGORITHM, [hmac_key].pack('H*'), data))
end
data_to_sign(notification_request_item) click to toggle source
# File lib/adyen/utils/hmac_validator.rb, line 24
def data_to_sign(notification_request_item)
  NOTIFICATION_VALIDATION_KEYS.map { |key| fetch(notification_request_item, key).to_s }
                              .map { |value| value.gsub('\\', '\\\\').gsub(':', '\\:') }
                              .join(DATA_SEPARATOR)
end
valid_notification_hmac?(notification_request_item, hmac_key) click to toggle source
# File lib/adyen/utils/hmac_validator.rb, line 11
def valid_notification_hmac?(notification_request_item, hmac_key)
  expected_sign = calculate_notification_hmac(notification_request_item, hmac_key)
  merchant_sign = fetch(notification_request_item, 'additionalData.hmacSignature')

  expected_sign == merchant_sign
end

Private Instance Methods

fetch(hash, keys) click to toggle source
# File lib/adyen/utils/hmac_validator.rb, line 32
def fetch(hash, keys)
  value = hash

  keys.to_s.split('.').each do |key|
    value = if key.to_i.to_s == key
              value[key.to_i]
            else
              value[key].nil? ? value[key.to_sym] : value[key]
            end
    break if value.nil?
  end

  value
end