monkeyhelper-oauth 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. data/History.txt +48 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +71 -0
  4. data/README.rdoc +73 -0
  5. data/Rakefile +34 -0
  6. data/TODO +14 -0
  7. data/bin/oauth +5 -0
  8. data/lib/oauth/cli.rb +130 -0
  9. data/lib/oauth/client/action_controller_request.rb +52 -0
  10. data/lib/oauth/client/helper.rb +75 -0
  11. data/lib/oauth/client/net_http.rb +75 -0
  12. data/lib/oauth/client.rb +4 -0
  13. data/lib/oauth/consumer.rb +242 -0
  14. data/lib/oauth/helper.rb +17 -0
  15. data/lib/oauth/oauth_test_helper.rb +26 -0
  16. data/lib/oauth/request_proxy/action_controller_request.rb +62 -0
  17. data/lib/oauth/request_proxy/base.rb +107 -0
  18. data/lib/oauth/request_proxy/jabber_request.rb +42 -0
  19. data/lib/oauth/request_proxy/mock_request.rb +36 -0
  20. data/lib/oauth/request_proxy/net_http.rb +65 -0
  21. data/lib/oauth/request_proxy/rack_request.rb +40 -0
  22. data/lib/oauth/request_proxy.rb +24 -0
  23. data/lib/oauth/server.rb +68 -0
  24. data/lib/oauth/signature/base.rb +89 -0
  25. data/lib/oauth/signature/hmac/base.rb +12 -0
  26. data/lib/oauth/signature/hmac/md5.rb +9 -0
  27. data/lib/oauth/signature/hmac/rmd160.rb +9 -0
  28. data/lib/oauth/signature/hmac/sha1.rb +10 -0
  29. data/lib/oauth/signature/hmac/sha2.rb +9 -0
  30. data/lib/oauth/signature/md5.rb +13 -0
  31. data/lib/oauth/signature/plaintext.rb +23 -0
  32. data/lib/oauth/signature/rsa/sha1.rb +44 -0
  33. data/lib/oauth/signature/sha1.rb +13 -0
  34. data/lib/oauth/signature.rb +28 -0
  35. data/lib/oauth/token.rb +137 -0
  36. data/lib/oauth/version.rb +3 -0
  37. data/lib/oauth.rb +3 -0
  38. data/oauth.gemspec +43 -0
  39. data/script/destroy +14 -0
  40. data/script/generate +14 -0
  41. data/script/txt2html +74 -0
  42. data/setup.rb +1585 -0
  43. data/tasks/deployment.rake +34 -0
  44. data/tasks/environment.rake +7 -0
  45. data/tasks/website.rake +17 -0
  46. data/test/cases/oauth_case.rb +19 -0
  47. data/test/cases/spec/1_0-final/test_construct_request_url.rb +62 -0
  48. data/test/cases/spec/1_0-final/test_normalize_request_parameters.rb +88 -0
  49. data/test/cases/spec/1_0-final/test_parameter_encodings.rb +86 -0
  50. data/test/cases/spec/1_0-final/test_signature_base_strings.rb +77 -0
  51. data/test/keys/rsa.cert +11 -0
  52. data/test/keys/rsa.pem +16 -0
  53. data/test/test_action_controller_request_proxy.rb +28 -0
  54. data/test/test_consumer.rb +328 -0
  55. data/test/test_helper.rb +15 -0
  56. data/test/test_hmac_sha1.rb +21 -0
  57. data/test/test_net_http_client.rb +169 -0
  58. data/test/test_net_http_request_proxy.rb +38 -0
  59. data/test/test_rack_request_proxy.rb +40 -0
  60. data/test/test_rsa_sha1.rb +59 -0
  61. data/test/test_server.rb +40 -0
  62. data/test/test_signature.rb +11 -0
  63. data/test/test_signature_base.rb +32 -0
  64. data/test/test_signature_plain_text.rb +31 -0
  65. data/test/test_token.rb +14 -0
  66. data/website/index.html +87 -0
  67. data/website/index.txt +73 -0
  68. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  69. data/website/stylesheets/screen.css +138 -0
  70. data/website/template.rhtml +48 -0
  71. metadata +177 -0
@@ -0,0 +1,242 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+ require 'oauth/client/net_http'
4
+ module OAuth
5
+ class Consumer
6
+
7
+ @@default_options={
8
+ # Signature method used by server. Defaults to HMAC-SHA1
9
+ :signature_method => 'HMAC-SHA1',
10
+
11
+ # default paths on site. These are the same as the defaults set up by the generators
12
+ :request_token_path=>'/oauth/request_token',
13
+ :authorize_path=>'/oauth/authorize',
14
+ :access_token_path=>'/oauth/access_token',
15
+
16
+ # How do we send the oauth values to the server see
17
+ # http://oauth.net/core/1.0/#consumer_req_param for more info
18
+ #
19
+ # Possible values:
20
+ #
21
+ # :header - via the Authorize header (Default) ( option 1. in spec)
22
+ # :body - url form encoded in body of POST request ( option 2. in spec)
23
+ # :query_string - via the query part of the url ( option 3. in spec)
24
+ :scheme=>:header,
25
+
26
+ # Default http method used for OAuth Token Requests (defaults to :post)
27
+ :http_method=>:post,
28
+
29
+ :oauth_version=>"1.0"
30
+ }
31
+
32
+ attr_accessor :site,:options, :key, :secret,:http
33
+
34
+
35
+ # Create a new consumer instance by passing it a configuration hash:
36
+ #
37
+ # @consumer=OAuth::Consumer.new( key,secret,{
38
+ # :site=>"http://term.ie",
39
+ # :scheme=>:header,
40
+ # :http_method=>:post,
41
+ # :request_token_path=>"/oauth/example/request_token.php",
42
+ # :access_token_path=>"/oauth/example/access_token.php",
43
+ # :authorize_path=>"/oauth/example/authorize.php"
44
+ # })
45
+ #
46
+ # Start the process by requesting a token
47
+ #
48
+ # @request_token=@consumer.get_request_token
49
+ # session[:request_token]=@request_token
50
+ # redirect_to @request_token.authorize_url
51
+ #
52
+ # When user returns create an access_token
53
+ #
54
+ # @access_token=@request_token.get_access_token
55
+ # @photos=@access_token.get('/photos.xml')
56
+ #
57
+ #
58
+
59
+ def initialize(consumer_key,consumer_secret,options={})
60
+ # ensure that keys are symbols
61
+ @options=@@default_options.merge( options.inject({}) do |options, (key, value)|
62
+ options[key.to_sym] = value
63
+ options
64
+ end)
65
+ @key = consumer_key
66
+ @secret = consumer_secret
67
+ end
68
+
69
+ # The default http method
70
+ def http_method
71
+ @http_method||=@options[:http_method]||:post
72
+ end
73
+
74
+ # The HTTP object for the site. The HTTP Object is what you get when you do Net::HTTP.new
75
+ def http
76
+ @http ||= create_http
77
+ end
78
+
79
+ # Contains the root URI for this site
80
+ def uri(custom_uri=nil)
81
+ if custom_uri
82
+ @uri = custom_uri
83
+ @http = create_http # yike, oh well. less intrusive this way
84
+ else # if no custom passed, we use existing, which, if unset, is set to site uri
85
+ @uri ||= URI.parse(site)
86
+ end
87
+ end
88
+
89
+ # Makes a request to the service for a new OAuth::RequestToken
90
+ #
91
+ # @request_token=@consumer.get_request_token
92
+ #
93
+ def get_request_token(request_options={}, *arguments)
94
+ response=token_request(http_method,(request_token_url? ? request_token_url : request_token_path), nil, request_options, *arguments)
95
+ OAuth::RequestToken.new(self,response[:oauth_token],response[:oauth_token_secret])
96
+ end
97
+
98
+ # Creates, signs and performs an http request.
99
+ # It's recommended to use the OAuth::Token classes to set this up correctly.
100
+ # The arguments parameters are a hash or string encoded set of parameters if it's a post request as well as optional http headers.
101
+ #
102
+ # @consumer.request(:get,'/people',@token,{:scheme=>:query_string})
103
+ # @consumer.request(:post,'/people',@token,{},@person.to_xml,{ 'Content-Type' => 'application/xml' })
104
+ #
105
+ def request(http_method,path, token=nil,request_options={},*arguments)
106
+ if path=~/^\//
107
+ _http=http
108
+ else
109
+ _http=create_http(path)
110
+ _uri=URI.parse(path)
111
+ path="#{_uri.path}#{_uri.query ? "?#{_uri.query}" : ""}"
112
+ end
113
+ _http.request(create_signed_request(http_method,path,token,request_options,*arguments))
114
+ end
115
+
116
+ # Creates and signs an http request.
117
+ # It's recommended to use the Token classes to set this up correctly
118
+ def create_signed_request(http_method,path, token=nil,request_options={},*arguments)
119
+ request=create_http_request(http_method,path,*arguments)
120
+ sign!(request,token,request_options)
121
+ request
122
+ end
123
+
124
+ # Creates a request and parses the result as url_encoded. This is used internally for the RequestToken and AccessToken requests.
125
+ def token_request(http_method,path,token=nil,request_options={},*arguments)
126
+ response=request(http_method,path,token,request_options,*arguments)
127
+ if response.code=="200"
128
+ CGI.parse(response.body).inject({}){|h,(k,v)| h[k.to_sym]=v.first;h}
129
+ else
130
+ response.error!
131
+ end
132
+ end
133
+
134
+ # Sign the Request object. Use this if you have an externally generated http request object you want to sign.
135
+ def sign!(request,token=nil, request_options = {})
136
+ request.oauth!(http, self, token, options.merge(request_options))
137
+ end
138
+
139
+ # Return the signature_base_string
140
+ def signature_base_string(request,token=nil, request_options = {})
141
+ request.signature_base_string(http, self, token, options.merge(request_options))
142
+ end
143
+
144
+ def site
145
+ @options[:site].to_s
146
+ end
147
+
148
+ def scheme
149
+ @options[:scheme]
150
+ end
151
+
152
+ def request_token_path
153
+ @options[:request_token_path]
154
+ end
155
+
156
+ def authorize_path
157
+ @options[:authorize_path]
158
+ end
159
+
160
+ def access_token_path
161
+ @options[:access_token_path]
162
+ end
163
+
164
+ # TODO this is ugly, rewrite
165
+ def request_token_url
166
+ @options[:request_token_url]||site+request_token_path
167
+ end
168
+
169
+ def request_token_url?
170
+ @options[:request_token_url]!=nil
171
+ end
172
+
173
+ def authorize_url
174
+ @options[:authorize_url]||site+authorize_path
175
+ end
176
+
177
+ def authorize_url?
178
+ @options[:authorize_url]!=nil
179
+ end
180
+
181
+ def access_token_url
182
+ @options[:access_token_url]||site+access_token_path
183
+ end
184
+
185
+ def access_token_url?
186
+ @options[:access_token_url]!=nil
187
+ end
188
+
189
+ protected
190
+
191
+ #Instantiates the http object
192
+ def create_http(_url=nil)
193
+ if _url.nil?||_url[0]=~/^\//
194
+ our_uri=URI.parse(site)
195
+ else
196
+ our_uri=URI.parse(_url)
197
+ end
198
+ http_object=Net::HTTP.new(our_uri.host, our_uri.port)
199
+ http_object.use_ssl = true if our_uri.scheme=="https"
200
+ http_object
201
+ end
202
+
203
+ # create the http request object for a given http_method and path
204
+ def create_http_request(http_method,path,*arguments)
205
+ http_method=http_method.to_sym
206
+ if [:post,:put].include?(http_method)
207
+ data=arguments.shift
208
+ end
209
+ headers=(arguments.first.is_a?(Hash) ? arguments.shift : {})
210
+ case http_method
211
+ when :post
212
+ request=Net::HTTP::Post.new(path,headers)
213
+ request["Content-Length"]=0 # Default to 0
214
+ when :put
215
+ request=Net::HTTP::Put.new(path,headers)
216
+ request["Content-Length"]=0 # Default to 0
217
+ when :get
218
+ request=Net::HTTP::Get.new(path,headers)
219
+ when :delete
220
+ request=Net::HTTP::Delete.new(path,headers)
221
+ when :head
222
+ request=Net::HTTP::Head.new(path,headers)
223
+ else
224
+ raise ArgumentError, "Don't know how to handle http_method: :#{http_method.to_s}"
225
+ end
226
+ if data.is_a?(Hash)
227
+ request.set_form_data(data)
228
+ elsif data
229
+ request.body=data.to_s
230
+ request["Content-Length"]=request.body.length
231
+ end
232
+ request
233
+ end
234
+
235
+ # Unset cached http instance because it cannot be marshalled when
236
+ # it has already been used and use_ssl is set to true
237
+ def marshal_dump(*args)
238
+ @http = nil
239
+ self
240
+ end
241
+ end
242
+ end
@@ -0,0 +1,17 @@
1
+ require 'openssl'
2
+ require 'base64'
3
+ require 'cgi'
4
+ module OAuth
5
+ module Helper
6
+ extend self
7
+
8
+ def escape(value)
9
+ CGI.escape(value.to_s).gsub("%7E", '~').gsub("+", "%20")
10
+ end
11
+
12
+ def generate_key(size=32)
13
+ Base64.encode64(OpenSSL::Random.random_bytes(size)).gsub(/\W/,'')
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ require 'action_controller'
2
+ require 'action_controller/test_process'
3
+ module OAuth
4
+ module OAuthTestHelper
5
+
6
+ def mock_incoming_request_with_query(request)
7
+ incoming=ActionController::TestRequest.new(request.to_hash)
8
+ incoming.request_uri=request.path
9
+ incoming.env["SERVER_PORT"]=request.uri.port
10
+ incoming.host=request.uri.host
11
+ incoming.env['REQUEST_METHOD']=request.http_method
12
+ incoming
13
+ end
14
+
15
+ def mock_incoming_request_with_authorize_header(request)
16
+ incoming=ActionController::TestRequest.new
17
+ incoming.env["HTTP_AUTHORIZATION"]=request.to_auth_string
18
+ incoming.request_uri=request.path
19
+ incoming.env["SERVER_PORT"]=request.uri.port
20
+ incoming.host=request.uri.host
21
+ incoming.env['REQUEST_METHOD']=request.http_method
22
+ incoming
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,62 @@
1
+ require 'rubygems'
2
+ require 'active_support'
3
+ require 'action_controller/request'
4
+ require 'oauth/request_proxy/base'
5
+ require 'uri'
6
+
7
+ module OAuth::RequestProxy
8
+ class ActionControllerRequest < OAuth::RequestProxy::Base
9
+ proxies(defined?(ActionController::AbstractRequest) ? ActionController::AbstractRequest : ActionController::Request)
10
+
11
+ def method
12
+ request.method.to_s.upcase
13
+ end
14
+
15
+ def uri
16
+ request.url
17
+ end
18
+
19
+ def parameters
20
+ if options[:clobber_request]
21
+ options[:parameters] || {}
22
+ else
23
+ params = request_params.merge(query_params).merge(header_params)
24
+ params.stringify_keys! if params.respond_to?(:stringify_keys!)
25
+ params.merge(options[:parameters] || {})
26
+ end
27
+ end
28
+
29
+ # Override from OAuth::RequestProxy::Base to avoid roundtrip
30
+ # conversion to Hash or Array and thus preserve the original
31
+ # parameter names
32
+ def parameters_for_signature
33
+ params = []
34
+ params << options[:parameters].to_query if options[:parameters]
35
+
36
+ unless options[:clobber_request]
37
+ params << header_params.to_query
38
+ params << request.query_string unless request.query_string.blank?
39
+ if request.content_type == Mime::Type.lookup("application/x-www-form-urlencoded")
40
+ params << CGI.unescape(request.raw_post)
41
+ end
42
+ end
43
+
44
+ params.
45
+ join('&').split('&').
46
+ reject { |kv| kv =~ /^oauth_signature=.*/}.
47
+ reject(&:blank?).
48
+ map { |p| p.split('=') }
49
+ end
50
+
51
+ protected
52
+
53
+ def query_params
54
+ request.query_parameters
55
+ end
56
+
57
+ def request_params
58
+ request.request_parameters
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,107 @@
1
+ require 'oauth/request_proxy'
2
+ require 'oauth/helper'
3
+
4
+ module OAuth::RequestProxy
5
+ class Base
6
+ include OAuth::Helper
7
+
8
+ def self.proxies(klass)
9
+ OAuth::RequestProxy.available_proxies[klass] = self
10
+ end
11
+
12
+ attr_accessor :request, :options
13
+
14
+ def initialize(request, options = {})
15
+ @request = request
16
+ @options = options
17
+ end
18
+
19
+ def token
20
+ parameters['oauth_token']
21
+ end
22
+
23
+ def consumer_key
24
+ parameters['oauth_consumer_key']
25
+ end
26
+
27
+ def parameters_for_signature
28
+ p = parameters.dup
29
+ p.delete("oauth_signature")
30
+ p
31
+ end
32
+
33
+ def nonce
34
+ parameters['oauth_nonce']
35
+ end
36
+
37
+ def timestamp
38
+ parameters['oauth_timestamp']
39
+ end
40
+
41
+ def signature_method
42
+ case parameters['oauth_signature_method']
43
+ when Array: parameters['oauth_signature_method'].first
44
+ else
45
+ parameters['oauth_signature_method']
46
+ end
47
+ end
48
+
49
+ def signature
50
+ parameters['oauth_signature'] || ""
51
+ end
52
+
53
+ # See 9.1.2 in specs
54
+ def normalized_uri
55
+ u=URI.parse(uri)
56
+ "#{u.scheme.downcase}://#{u.host.downcase}#{(u.scheme.downcase=='http'&&u.port!=80)||(u.scheme.downcase=='https'&&u.port!=443) ? ":#{u.port}" : ""}#{(u.path&&u.path!='') ? u.path : '/'}"
57
+ end
58
+
59
+ # See 9.1.1. in specs Normalize Request Parameters
60
+ def normalized_parameters
61
+ parameters_for_signature.sort.map do |k, values|
62
+
63
+ if values.is_a?(Array)
64
+ # multiple values were provided for a single key
65
+ values.sort.collect do |v|
66
+ [escape(k),escape(v)] * "="
67
+ end
68
+ else
69
+ [escape(k),escape(values)] * "="
70
+ end
71
+ end * "&"
72
+ end
73
+
74
+ # See 9.1 in specs
75
+ def signature_base_string
76
+ base = [method, normalized_uri, normalized_parameters]
77
+ base.map { |v| escape(v) }.join("&")
78
+ end
79
+
80
+
81
+ protected
82
+
83
+ def header_params
84
+ %w( X-HTTP_AUTHORIZATION Authorization HTTP_AUTHORIZATION ).each do |header|
85
+ next unless request.env.include?(header)
86
+
87
+ header = request.env[header]
88
+ next unless header[0,6] == 'OAuth '
89
+
90
+ oauth_param_string = header[6,header.length].split(/[,=]/)
91
+ oauth_param_string.map! { |v| unescape(v.strip) }
92
+ oauth_param_string.map! { |v| v =~ /^\".*\"$/ ? v[1..-2] : v }
93
+ oauth_params = Hash[*oauth_param_string.flatten]
94
+ oauth_params.reject! { |k,v| k !~ /^oauth_/ }
95
+
96
+ return oauth_params
97
+ end
98
+
99
+ return {}
100
+ end
101
+
102
+ def unescape(value)
103
+ URI.unescape(value.gsub('+', '%2B'))
104
+ end
105
+
106
+ end
107
+ end
@@ -0,0 +1,42 @@
1
+ require 'xmpp4r'
2
+ require 'oauth/request_proxy/base'
3
+
4
+ module OAuth
5
+ module RequestProxy
6
+ class JabberRequest < OAuth::RequestProxy::Base
7
+ proxies Jabber::Iq
8
+ proxies Jabber::Presence
9
+ proxies Jabber::Message
10
+
11
+ def parameters
12
+ return @params if @params
13
+
14
+ @params = {}
15
+
16
+ oauth = @request.get_elements('//oauth').first
17
+ return @params unless oauth
18
+
19
+ %w( oauth_token oauth_consumer_key oauth_signature_method oauth_signature
20
+ oauth_timestamp oauth_nonce oauth_version ).each do |param|
21
+ next unless element = oauth.first_element(param)
22
+ @params[param] = element.text
23
+ end
24
+
25
+ @params
26
+ end
27
+
28
+ def method
29
+ @request.name
30
+ end
31
+
32
+ def uri
33
+ [@request.from.strip.to_s, @request.to.strip.to_s].join("&")
34
+ end
35
+
36
+ def normalized_uri
37
+ uri
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,36 @@
1
+ require 'oauth/request_proxy/base'
2
+
3
+ module OAuth
4
+ module RequestProxy
5
+ # RequestProxy for Hashes to facilitate simpler signature creation.
6
+ # Usage:
7
+ # request = OAuth::RequestProxy.proxy \
8
+ # "method" => "iq",
9
+ # "uri" => [from, to] * "&",
10
+ # "parameters" => {
11
+ # "oauth_consumer_key" => oauth_consumer_key,
12
+ # "oauth_token" => oauth_token,
13
+ # "oauth_signature_method" => "HMAC-SHA1"
14
+ # }
15
+ #
16
+ # signature = OAuth::Signature.sign \
17
+ # request,
18
+ # :consumer_secret => oauth_consumer_secret,
19
+ # :token_secret => oauth_token_secret,
20
+ class MockRequest < OAuth::RequestProxy::Base
21
+ proxies Hash
22
+
23
+ def parameters
24
+ @request["parameters"]
25
+ end
26
+
27
+ def method
28
+ @request["method"]
29
+ end
30
+
31
+ def uri
32
+ @request["uri"]
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,65 @@
1
+ require 'oauth/request_proxy/base'
2
+ require 'net/http'
3
+ require 'uri'
4
+ require 'cgi'
5
+
6
+ module OAuth::RequestProxy::Net
7
+ module HTTP
8
+ class HTTPRequest < OAuth::RequestProxy::Base
9
+ proxies ::Net::HTTPRequest
10
+
11
+ def method
12
+ request.method
13
+ end
14
+
15
+ def uri
16
+ uri = options[:uri]
17
+ uri.to_s
18
+ end
19
+
20
+ def parameters
21
+ if options[:clobber_request]
22
+ options[:parameters]
23
+ else
24
+ all_parameters
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def all_parameters
31
+ request_params = CGI.parse(query_string)
32
+ if options[:parameters]
33
+ options[:parameters].each do |k,v|
34
+ if request_params.has_key?(k)
35
+ request_params[k] << v
36
+ else
37
+ request_params[k] = [v].flatten
38
+ end
39
+ end
40
+ end
41
+ request_params
42
+ end
43
+
44
+ def query_string
45
+ params = [ query_params, auth_header_params ]
46
+ is_form_urlencoded = request['Content-Type'] != nil && request['Content-Type'].downcase == 'application/x-www-form-urlencoded'
47
+ params << post_params if method.to_s.upcase == 'POST' && is_form_urlencoded
48
+ params.compact.join('&')
49
+ end
50
+
51
+ def query_params
52
+ URI.parse(request.path).query
53
+ end
54
+
55
+ def post_params
56
+ request.body
57
+ end
58
+
59
+ def auth_header_params
60
+ return nil unless request['Authorization'] && request['Authorization'][0,5] == 'OAuth'
61
+ auth_params = request['Authorization']
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,40 @@
1
+ require 'oauth/request_proxy/base'
2
+ require 'uri'
3
+ require 'rack'
4
+
5
+ module OAuth::RequestProxy
6
+ class RackRequest < OAuth::RequestProxy::Base
7
+ proxies Rack::Request
8
+
9
+ def method
10
+ request.request_method
11
+ end
12
+
13
+ def uri
14
+ request.url
15
+ end
16
+
17
+ def parameters
18
+ if options[:clobber_request]
19
+ options[:parameters] || {}
20
+ else
21
+ params = request_params.merge(query_params).merge(header_params)
22
+ params.merge(options[:parameters] || {})
23
+ end
24
+ end
25
+
26
+ def signature
27
+ parameters['oauth_signature']
28
+ end
29
+
30
+ protected
31
+
32
+ def query_params
33
+ request.GET
34
+ end
35
+
36
+ def request_params
37
+ request.params
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,24 @@
1
+ module OAuth
2
+ module RequestProxy
3
+ def self.available_proxies #:nodoc:
4
+ @available_proxies ||= {}
5
+ end
6
+
7
+ def self.proxy(request, options = {})
8
+ return request if request.kind_of?(OAuth::RequestProxy::Base)
9
+
10
+ klass = available_proxies[request.class]
11
+
12
+ # Search for possible superclass matches.
13
+ if klass.nil?
14
+ request_parent = available_proxies.keys.find { |rc| request.kind_of?(rc) }
15
+ klass = available_proxies[request_parent]
16
+ end
17
+
18
+ raise UnknownRequestType, request.class.to_s unless klass
19
+ klass.new(request, options)
20
+ end
21
+
22
+ class UnknownRequestType < Exception; end
23
+ end
24
+ end