class Trustly::Api

Attributes

api_host[RW]
api_is_https[RW]
api_port[RW]
last_request[RW]
trustly_publickey[RW]
trustly_verifyer[RW]

Public Class Methods

new(host,port,is_https,pem_file) click to toggle source
# File lib/trustly/api.rb, line 25
def initialize(host,port,is_https,pem_file)
  self.api_host     = host
  self.api_port     = port
  self.api_is_https = is_https

  self.load_trustly_publickey(pem_file)
end

Public Instance Methods

handle_response(request,httpcall) click to toggle source
# File lib/trustly/api.rb, line 41
def handle_response(request,httpcall)
  raise NotImplementedError
end
insert_credentials(request) click to toggle source
# File lib/trustly/api.rb, line 45
def insert_credentials(request)
  raise NotImplementedError
end
load_trustly_publickey(file) click to toggle source
# File lib/trustly/api.rb, line 33
def load_trustly_publickey(file)
  self.trustly_publickey = OpenSSL::PKey::RSA.new(File.read(file)) #.public_key
end
serialize_data(object) click to toggle source
# File lib/trustly/api.rb, line 6
def serialize_data(object)
  serialized  = ""
  if object.is_a?(Array)
    # Its an array
    object.each do |obj|
      serialized.concat(obj.is_a?(Hash) ? serialize_data(obj) : obj.to_s)
    end
  elsif object.is_a?(Hash)
    # Its a Hash
    object.sort.to_h.each do |key,value|
      serialized.concat(key.to_s).concat(serialize_data(value))
    end
  else
    # Anything else: numbers, symbols, values
    serialized.concat object.to_s
  end
  return serialized
end
url_path(request=nil) click to toggle source
# File lib/trustly/api.rb, line 37
def url_path(request=nil)
  raise NotImplementedError
end
verify_trustly_signed_notification(response) click to toggle source
# File lib/trustly/api.rb, line 49
def verify_trustly_signed_notification(response)
  method    = response.get_method()
  uuid      = response.get_uuid()
  signature = response.get_signature()
  data      = response.get_data()
  return self._verify_trustly_signed_data(method, uuid, signature, data)
end

Protected Instance Methods

_verify_trustly_signed_data(method, uuid, signature, data) click to toggle source
# File lib/trustly/api.rb, line 59
def _verify_trustly_signed_data(method, uuid, signature, data)
  method        = '' if method.nil?
  uuid          = '' if uuid.nil?
  serial_data   = "#{method}#{uuid}#{self.serialize_data(data)}"
  raw_signature = Base64.decode64(signature)
  return self.trustly_publickey.public_key.verify(OpenSSL::Digest::SHA1.new, raw_signature, serial_data)
end
base_url() click to toggle source
# File lib/trustly/api.rb, line 83
def base_url
  if self.api_is_https
    return (self.api_port == 443) ? "https://#{self.api_host}" : "https://#{self.api_host}:#{self.api_port}"
  else
    return (self.api_port == 80)  ? "http://#{self.api_host}"  : "http://#{self.api_host}:#{self.api_port}"
  end
end
call_rpc(request) click to toggle source
# File lib/trustly/api.rb, line 95
def call_rpc(request)
  self.insert_credentials(request)
  self.last_request    = request
  uri                  = self.uri(request)
  http_req             = Net::HTTP::Post.new(uri.path, initheader = {'Content-Type' =>'application/json'})
  http_req.body        = request.json()
  http_res             = Net::HTTP.start(uri.hostname, uri.port,{use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE}) { |http| http.request(http_req) }
  return self.handle_response(request,http_res)
end
set_host(host=nil,port=nil,is_https=nil) click to toggle source
# File lib/trustly/api.rb, line 76
def set_host(host=nil,port=nil,is_https=nil)
  self.api_host = host          unless host.nil?
  self.load_trustly_publickey() unless host.nil?
  self.api_port = port          unless port.nil?
  self.is_https = is_https      unless is_https.nil?
end
uri(request) click to toggle source
# File lib/trustly/api.rb, line 91
def uri(request)
  return URI("#{self.base_url}#{self.url_path(request)}")
end
verify_trustly_signed_response(response) click to toggle source
# File lib/trustly/api.rb, line 67
def verify_trustly_signed_response(response)
  method    = response.get_method()
  uuid      = response.get_uuid()
  signature = response.get_signature()
  data      = response.get_data()
  return self._verify_trustly_signed_data(method, uuid, signature, data)
end