lib/simple_oauth.rb in simple_oauth-0.1.2 vs lib/simple_oauth.rb in simple_oauth-0.1.3
- old
+ new
@@ -1,121 +1,6 @@
require 'base64'
require 'cgi'
require 'openssl'
require 'uri'
-
-module SimpleOAuth
- module Version
- MAJOR = 0
- MINOR = 1
- PATCH = 2
- STRING = [MAJOR, MINOR, PATCH].join('.')
- end
-
- class Header
- ATTRIBUTE_KEYS = [:consumer_key, :nonce, :signature_method, :timestamp, :token, :version]
-
- def self.default_options
- {
- :nonce => OpenSSL::Random.random_bytes(16).unpack('H*')[0],
- :signature_method => 'HMAC-SHA1',
- :timestamp => Time.now.to_i.to_s,
- :version => '1.0'
- }
- end
-
- def self.encode(value)
- URI.encode(value.to_s, /[^a-z0-9\-\.\_\~]/i)
- end
-
- def self.decode(value)
- URI.decode(value.to_s)
- end
-
- def self.parse(header)
- header.to_s.sub(/^OAuth\s/, '').split(', ').inject({}) do |attributes, pair|
- match = pair.match(/^(\w+)\=\"([^\"]*)\"$/)
- attributes.merge(match[1].sub(/^oauth_/, '').to_sym => decode(match[2]))
- end
- end
-
- attr_reader :method, :params, :options
-
- def initialize(method, url, params, oauth = {})
- @method = method.to_s.upcase
- @uri = URI.parse(url).tap do |uri|
- uri.scheme = uri.scheme.downcase
- uri.normalize!
- uri.fragment = nil
- end
- @params = params
- @options = oauth.is_a?(Hash) ? self.class.default_options.merge(oauth) : self.class.parse(oauth)
- end
-
- def url
- @uri.dup.tap{|u| u.query = nil }.to_s
- end
-
- def to_s
- "OAuth #{normalized_attributes}"
- end
-
- def valid?(secrets = {})
- original_options = options.dup
- options.merge!(secrets)
- valid = options[:signature] == signature
- options.replace(original_options)
- valid
- end
-
- def signed_attributes
- attributes.merge(:oauth_signature => signature)
- end
-
- private
- def normalized_attributes
- signed_attributes.sort_by{|k,v| k.to_s }.map{|k,v| %(#{k}="#{self.class.encode(v)}") }.join(', ')
- end
-
- def attributes
- ATTRIBUTE_KEYS.inject({}){|a,k| options.key?(k) ? a.merge(:"oauth_#{k}" => options[k]) : a }
- end
-
- def signature
- send(options[:signature_method].downcase.tr('-', '_') + '_signature')
- end
-
- def hmac_sha1_signature
- Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, secret, signature_base)).chomp.gsub(/\n/, '')
- end
-
- def secret
- options.values_at(:consumer_secret, :token_secret).map{|v| self.class.encode(v) }.join('&')
- end
-
- def signature_base
- [method, url, normalized_params].map{|v| self.class.encode(v) }.join('&')
- end
-
- def normalized_params
- signature_params.map{|p| p.map{|v| self.class.encode(v) } }.sort.map{|p| p.join('=') }.join('&')
- end
-
- def signature_params
- attributes.to_a + params.to_a + url_params
- end
-
- def url_params
- CGI.parse(@uri.query || '').inject([]){|p,(k,vs)| p + vs.map{|v| [k, v] } }
- end
-
- def rsa_sha1_signature
- Base64.encode64(private_key.sign(OpenSSL::Digest::SHA1.new, signature_base)).chomp.gsub(/\n/, '')
- end
-
- def private_key
- OpenSSL::PKey::RSA.new(options[:consumer_secret])
- end
-
- alias_method :plaintext_signature, :secret
- end
-end
+require File.expand_path('../simple_oauth/core_ext/object', __FILE__)
+require File.expand_path('../simple_oauth/header', __FILE__)