class ClinchTalent::HmacSigningMiddleware

Public Class Methods

new(app, options, &block) click to toggle source
Calls superclass method
# File lib/clinch_talent/hmac_signing_middleware.rb, line 3
def initialize(app, options, &block)
  super(app)
  @options = options
  @block = block
end

Public Instance Methods

call(env) click to toggle source
# File lib/clinch_talent/hmac_signing_middleware.rb, line 9
def call(env)
  env.request_headers['Content-MD5'] = calculated_md5(env)
  env.request_headers['DATE'] = Time.now.utc.httpdate
  env.request_headers['Authorization'] = "APIAuth #{@options[:access_id]}:#{hmac_signature(env, @options[:secret])}"
  @app.call(env)
end

Private Instance Methods

calculated_md5(env) click to toggle source
# File lib/clinch_talent/hmac_signing_middleware.rb, line 18
def calculated_md5(env)
  Digest::MD5.base64digest(env.body || '')
end
canonical_string(env) click to toggle source
# File lib/clinch_talent/hmac_signing_middleware.rb, line 38
def canonical_string(env)
  [content_type(env),
   content_md5(env),
   parse_uri(env.url.to_s),
   timestamp(env)
  ].join(',')
end
capitalize_keys(hsh) click to toggle source
# File lib/clinch_talent/hmac_signing_middleware.rb, line 26
def capitalize_keys(hsh)
  capitalized_hash = {}
  hsh.each_pair {|k, v| capitalized_hash[k.to_s.upcase] = v}
  capitalized_hash
end
content_md5(env) click to toggle source
# File lib/clinch_talent/hmac_signing_middleware.rb, line 56
def content_md5(env)
  value = find_header(env, %w(CONTENT-MD5 CONTENT_MD5 HTTP-CONTENT-MD5 HTTP_CONTENT_MD5))
  value.nil? ? '' : value
end
content_type(env) click to toggle source
# File lib/clinch_talent/hmac_signing_middleware.rb, line 51
def content_type(env)
  value = find_header(env, %w(CONTENT-TYPE CONTENT_TYPE HTTP_CONTENT_TYPE))
  value.nil? ? '' : value
end
fetch_headers(env) click to toggle source
# File lib/clinch_talent/hmac_signing_middleware.rb, line 22
def fetch_headers(env)
  capitalize_keys env.request_headers
end
find_header(env, keys) click to toggle source
# File lib/clinch_talent/hmac_signing_middleware.rb, line 61
def find_header(env, keys)
  keys.map {|key| env.request_headers[key]}.compact.first
end
hmac_signature(env, secret_key) click to toggle source
# File lib/clinch_talent/hmac_signing_middleware.rb, line 32
def hmac_signature(env, secret_key)
  canonical_string = canonical_string(env)
  digest = OpenSSL::Digest.new('sha1')
  Base64.strict_encode64(OpenSSL::HMAC.digest(digest, secret_key, canonical_string))
end
parse_uri(uri) click to toggle source
# File lib/clinch_talent/hmac_signing_middleware.rb, line 65
def parse_uri(uri)
  uri_without_host = uri.gsub(/https?:\/\/[^(,|\?|\/)]*/, '')
  return '/' if uri_without_host.empty?
  uri_without_host
end
timestamp(env) click to toggle source
# File lib/clinch_talent/hmac_signing_middleware.rb, line 46
def timestamp(env)
  value = find_header(env, %w(DATE HTTP_DATE))
  value.nil? ? '' : value
end