proletarian-oauth 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
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 +246 -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,246 @@
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 authentication_path
161
+ 'yabadadooo!!!!'
162
+ end
163
+
164
+ def access_token_path
165
+ @options[:access_token_path]
166
+ end
167
+
168
+ # TODO this is ugly, rewrite
169
+ def request_token_url
170
+ @options[:request_token_url]||site+request_token_path
171
+ end
172
+
173
+ def request_token_url?
174
+ @options[:request_token_url]!=nil
175
+ end
176
+
177
+ def authorize_url
178
+ @options[:authorize_url]||site+authorize_path
179
+ end
180
+
181
+ def authorize_url?
182
+ @options[:authorize_url]!=nil
183
+ end
184
+
185
+ def access_token_url
186
+ @options[:access_token_url]||site+access_token_path
187
+ end
188
+
189
+ def access_token_url?
190
+ @options[:access_token_url]!=nil
191
+ end
192
+
193
+ protected
194
+
195
+ #Instantiates the http object
196
+ def create_http(_url=nil)
197
+ if _url.nil?||_url[0]=~/^\//
198
+ our_uri=URI.parse(site)
199
+ else
200
+ our_uri=URI.parse(_url)
201
+ end
202
+ http_object=Net::HTTP.new(our_uri.host, our_uri.port)
203
+ http_object.use_ssl = true if our_uri.scheme=="https"
204
+ http_object
205
+ end
206
+
207
+ # create the http request object for a given http_method and path
208
+ def create_http_request(http_method,path,*arguments)
209
+ http_method=http_method.to_sym
210
+ if [:post,:put].include?(http_method)
211
+ data=arguments.shift
212
+ end
213
+ headers=(arguments.first.is_a?(Hash) ? arguments.shift : {})
214
+ case http_method
215
+ when :post
216
+ request=Net::HTTP::Post.new(path,headers)
217
+ request["Content-Length"]=0 # Default to 0
218
+ when :put
219
+ request=Net::HTTP::Put.new(path,headers)
220
+ request["Content-Length"]=0 # Default to 0
221
+ when :get
222
+ request=Net::HTTP::Get.new(path,headers)
223
+ when :delete
224
+ request=Net::HTTP::Delete.new(path,headers)
225
+ when :head
226
+ request=Net::HTTP::Head.new(path,headers)
227
+ else
228
+ raise ArgumentError, "Don't know how to handle http_method: :#{http_method.to_s}"
229
+ end
230
+ if data.is_a?(Hash)
231
+ request.set_form_data(data)
232
+ elsif data
233
+ request.body=data.to_s
234
+ request["Content-Length"]=request.body.length
235
+ end
236
+ request
237
+ end
238
+
239
+ # Unset cached http instance because it cannot be marshalled when
240
+ # it has already been used and use_ssl is set to true
241
+ def marshal_dump(*args)
242
+ @http = nil
243
+ self
244
+ end
245
+ end
246
+ 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