proletarian-oauth 0.3.2

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 +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