class Idcf::FaradayMiddleware::ComputingSignature

コンピューティング用のシグネチャ生成を実施します。

Public Class Methods

new(app, keys = {}) click to toggle source
Calls superclass method
# File lib/idcf/faraday_middleware/computing_signature.rb, line 10
def initialize(app, keys = {})
  super(app)
  @api_key    = keys[:api_key]
  @secret_key = keys[:secret_key]
end

Public Instance Methods

call(env) click to toggle source
# File lib/idcf/faraday_middleware/computing_signature.rb, line 16
def call(env)
  raise InvalidKeys, errors.messages.to_s if invalid?

  if env.body.nil?
    env.url.query = make_get_params(env)
  else
    env.body = make_params_body(env)
  end
  @app.call env
end

Private Instance Methods

add_query_param(query, key, value) click to toggle source
# File lib/idcf/faraday_middleware/computing_signature.rb, line 45
def add_query_param(query, key, value)
  query = query.to_s
  query << '&' unless query.empty?
  query << "#{Faraday::Utils.escape key}=#{Faraday::Utils.escape value}"
end
command_check(query) click to toggle source
# File lib/idcf/faraday_middleware/computing_signature.rb, line 78
def command_check(query)
  list = query.find do |x|
    x[0] == 'command' && x[1].present?
  end
  raise InvalidParameter, 'Must be set command=...' if list.nil?
end
make_get_params(env) click to toggle source
# File lib/idcf/faraday_middleware/computing_signature.rb, line 38
def make_get_params(env)
  query = env.url.query
  query = add_query_param query, 'apikey', api_key
  query = add_query_param query, 'response', 'json'
  add_query_param query, 'signature', signature(query)
end
make_params_body(env) click to toggle source
# File lib/idcf/faraday_middleware/computing_signature.rb, line 29
def make_params_body(env)
  params = URI.decode_www_form(env.url.query)
  params.concat(URI.decode_www_form(env.body))
  params << ['apikey', api_key]
  params << %w(response json)
  params << ['signature', signature(URI.encode_www_form(params))]
  URI.encode_www_form(params)
end
signature(query) click to toggle source
# File lib/idcf/faraday_middleware/computing_signature.rb, line 51
def signature(query)
  Base64.strict_encode64(
    OpenSSL::HMAC.digest(
      OpenSSL::Digest::SHA1.new,
      secret_key,
      signature_seed(query)
    )
  )
end
signature_seed(query) click to toggle source
# File lib/idcf/faraday_middleware/computing_signature.rb, line 61
def signature_seed(query)
  raise InvalidParameter, 'Must be set command=...' if query.nil?
  query = URI.decode_www_form(query.downcase)
  command_check query
  query = query.sort do |x, y|
    x[0] <=> y[0]
  end
  signeture_seed_part_decode(URI.encode_www_form(query)).downcase
end
signeture_seed_part_decode(query) click to toggle source
# File lib/idcf/faraday_middleware/computing_signature.rb, line 71
def signeture_seed_part_decode(query)
  PARTIALLY_DECODE.each do |list|
    query = query.gsub(*list)
  end
  query
end