class Miasma::Contrib::AzureApiCore::SignatureAzure

Constants

SIGNATURE_HEADERS

Required Header Items

Attributes

account_name[R]

@return [String] name of account

hmac[R]

@return [Hmac]

shared_key[R]

@return [String] shared private key

Public Class Methods

new(shared_key, account_name) click to toggle source
# File lib/miasma/contrib/azure.rb, line 132
def initialize(shared_key, account_name)
  shared_key = Base64.decode64(shared_key)
  @hmac = Hmac.new('sha256', shared_key)
  @shared_key = shared_key
  @account_name = account_name
end

Public Instance Methods

build_canonical_headers(headers) click to toggle source
# File lib/miasma/contrib/azure.rb, line 167
def build_canonical_headers(headers)
  headers.map do |key, value|
    key = key.to_s.downcase
    if(key.start_with?('x-ms-'))
      [key, value].map(&:strip).join(':')
    end
  end.compact.sort.join("\n")
end
build_canonical_resource(resource) click to toggle source
# File lib/miasma/contrib/azure.rb, line 176
def build_canonical_resource(resource)
  [
    "/#{account_name}#{resource[:path]}",
    *resource.fetch(:params, {}).map{|key, value|
      key = key.downcase.strip
      value = value.is_a?(Array) ? value.map(&:strip).sort.join(',') : value
      [key, value].join(':')
    }.sort
  ].join("\n")
end
generate(http_method, path, opts) click to toggle source
# File lib/miasma/contrib/azure.rb, line 139
def generate(http_method, path, opts)
  signature = generate_signature(
    http_method,
    opts[:headers],
    opts.merge(:path => path)
  )
  "SharedKey #{account_name}:#{signature}"
end
generate_signature(http_method, headers, resource) click to toggle source
# File lib/miasma/contrib/azure.rb, line 148
def generate_signature(http_method, headers, resource)
  headers = headers.to_smash
  headers.delete('Content-Length') if headers['Content-Length'].to_s == '0'
  to_sign = [
    http_method.to_s.upcase,
    *self.class.const_get(:SIGNATURE_HEADERS).map{|head_name|
      headers.fetch(head_name, '')
    },
    build_canonical_headers(headers),
    build_canonical_resource(resource)
  ].join("\n")
  signature = sign_request(to_sign)
end
sign_request(request) click to toggle source
# File lib/miasma/contrib/azure.rb, line 162
def sign_request(request)
  result = hmac.sign(request)
  Base64.encode64(result).strip
end