Module: OpenQq::Signature

Included in:
Gateway
Defined in:
lib/open_qq/signature.rb

Instance Method Summary collapse

Instance Method Details

#each_pair_escape(options) ⇒ Object



22
23
24
# File 'lib/open_qq/signature.rb', line 22

def each_pair_escape(options)
  options.inject({}){|h,(k,v)| h[url_escape(k.to_s)] = url_escape(v.to_s);h}
end

#make_callback_source(http_method, url, options) ⇒ Object



35
36
37
38
39
40
41
# File 'lib/open_qq/signature.rb', line 35

def make_callback_source(http_method, url, options)
  escape_opt = options.sort_by{|k,v| k.to_s}.map do |kv|
    value = URI.escape(kv.last, /[^0-9a-zA-Z!*()]/)
    "#{kv.first}=#{value}"
  end.join('&')
  "#{http_method}&#{url_escape(url)}&#{url_escape(escape_opt)}"
end

#make_source(http_method, url, options) ⇒ Object



30
31
32
33
# File 'lib/open_qq/signature.rb', line 30

def make_source(http_method, url, options)
  escape_opt = url_escape( options.sort_by{|k,v| k.to_s}.map{|kv| "#{kv.first}=#{kv.last}" }.join('&') )
  "#{http_method}&#{url_escape(url)}&#{escape_opt}"
end

#parsed_params(params) ⇒ Object



26
27
28
# File 'lib/open_qq/signature.rb', line 26

def parsed_params(params)
  each_pair_escape(params).map{|k,v| "#{k}=#{v}"}.join('&')
end

#signature(key, source) ⇒ Object



14
15
16
# File 'lib/open_qq/signature.rb', line 14

def signature(key, source)
  Base64.encode64( OpenSSL::HMAC.digest('sha1', key, source) ).rstrip
end

#url_escape(url) ⇒ Object



18
19
20
# File 'lib/open_qq/signature.rb', line 18

def url_escape(url)
  URI.escape(url, /[^\.\-_\da-zA-Z]/)
end

#verify_sig(sig, key, http_method, url, options) ⇒ Object



43
44
45
# File 'lib/open_qq/signature.rb', line 43

def verify_sig(sig, key, http_method, url, options)
  sig == url_escape( signature(key, make_callback_source(http_method, url, options)) )
end