class SageoneSdk::Signature

Signature

Attributes

http_method[R]
nonce[R]

Public Class Methods

generate_nonce() click to toggle source
# File lib/sageone_sdk/signature.rb, line 20
def self.generate_nonce
  SecureRandom.hex
end
new(http_method, url, request_body, nonce, secret, token) click to toggle source

Constructor

# File lib/sageone_sdk/signature.rb, line 11
def initialize(http_method, url, request_body, nonce, secret, token)
  @http_method = http_method.to_s.upcase
  @url = URI(url)
  @request_body = request_body.to_s
  @nonce = nonce
  @secret = secret
  @token = token
end

Public Instance Methods

base_url() click to toggle source

Set the base URL

# File lib/sageone_sdk/signature.rb, line 25
def base_url
  base_array = []
  base_array << @url.scheme
  base_array << "://"
  base_array << @url.host
  base_array << ":#{@url.port}" if @url.port != @url.default_port
  base_array << @url.path

  base_array.join
end
body_params() click to toggle source

Request body params

# File lib/sageone_sdk/signature.rb, line 42
def body_params
  get_params_hash(@request_body)
end
query_params() click to toggle source

Request query params

# File lib/sageone_sdk/signature.rb, line 37
def query_params
  get_params_hash(@url.query)
end
request_params() click to toggle source

Generate the request params from the request query and body params

# File lib/sageone_sdk/signature.rb, line 47
def request_params
  request_hash = query_params.merge(body_params).sort
  request_array = []

  request_hash.each do |key, value|
    request_array << "#{key}=#{value}"
  end

  request_array.join('&')
end
signature_base_string() click to toggle source

Generate the base signature string

# File lib/sageone_sdk/signature.rb, line 59
def signature_base_string
  s = @http_method.dup
  s << '&'
  s << percent_encode(base_url)
  s << '&'
  s << percent_encode(request_params.to_s)
  s << '&'
  s << percent_encode(nonce.to_s)

  s
end
signing_key() click to toggle source

Generate the signing key

# File lib/sageone_sdk/signature.rb, line 72
def signing_key
  s = percent_encode(@secret)
  s << '&'
  s << percent_encode(@token)

  s
end
to_s() click to toggle source

Generates the signature

# File lib/sageone_sdk/signature.rb, line 81
def to_s
  s = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'), signing_key, signature_base_string))

  s
end

Private Instance Methods

get_params_hash(params) click to toggle source

Generates a hash from a params string

# File lib/sageone_sdk/signature.rb, line 90
def get_params_hash(params)
  params_hash = {}

  if !params.nil? and !params.empty?
    params = percent_decode(params)
    params.split('&').each do |param|
      param_pair = param.split('=')
      params_hash[percent_encode(param_pair[0])] = percent_encode(param_pair[1])
    end
  end

  params_hash
end
percent_decode(str) click to toggle source
# File lib/sageone_sdk/signature.rb, line 111
def percent_decode(str)
  CGI.unescape(str).gsub("%20", "+")
end
percent_encode(str) click to toggle source

Percent encodes special characters in a string

# File lib/sageone_sdk/signature.rb, line 105
def percent_encode(str)
  # Replaced deprecated URI.escape with CGI.escape
  # CGI.escape replaces spaces with "+", so we also need to substitute them with "%20"
  CGI.escape(str).gsub("+", "%20")
end