mojodna-oauth 0.3.1.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 +59 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +71 -0
  4. data/README.rdoc +71 -0
  5. data/Rakefile +36 -0
  6. data/TODO +30 -0
  7. data/bin/oauth +5 -0
  8. data/lib/oauth/cli.rb +144 -0
  9. data/lib/oauth/client/action_controller_request.rb +53 -0
  10. data/lib/oauth/client/helper.rb +75 -0
  11. data/lib/oauth/client/net_http.rb +80 -0
  12. data/lib/oauth/client.rb +4 -0
  13. data/lib/oauth/consumer.rb +249 -0
  14. data/lib/oauth/helper.rb +17 -0
  15. data/lib/oauth/oauth_test_helper.rb +25 -0
  16. data/lib/oauth/request_proxy/action_controller_request.rb +62 -0
  17. data/lib/oauth/request_proxy/base.rb +106 -0
  18. data/lib/oauth/request_proxy/jabber_request.rb +41 -0
  19. data/lib/oauth/request_proxy/mock_request.rb +44 -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 +65 -0
  24. data/lib/oauth/signature/base.rb +91 -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 +45 -0
  33. data/lib/oauth/signature/sha1.rb +13 -0
  34. data/lib/oauth/signature.rb +28 -0
  35. data/lib/oauth/token.rb +135 -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 +10 -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 +176 -0
@@ -0,0 +1,249 @@
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 :options, :key, :secret
33
+ attr_writer :site, :http
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
+ def initialize(consumer_key, consumer_secret, options = {})
58
+ @key = consumer_key
59
+ @secret = consumer_secret
60
+
61
+ # ensure that keys are symbols
62
+ @options = @@default_options.merge(options.inject({}) { |options, (key, value)|
63
+ options[key.to_sym] = value
64
+ options
65
+ })
66
+ end
67
+
68
+ # The default http method
69
+ def http_method
70
+ @http_method ||= @options[:http_method] || :post
71
+ end
72
+
73
+ # The HTTP object for the site. The HTTP Object is what you get when you do Net::HTTP.new
74
+ def http
75
+ @http ||= create_http
76
+ end
77
+
78
+ # Contains the root URI for this site
79
+ def uri(custom_uri = nil)
80
+ if custom_uri
81
+ @uri = custom_uri
82
+ @http = create_http # yike, oh well. less intrusive this way
83
+ else # if no custom passed, we use existing, which, if unset, is set to site uri
84
+ @uri ||= URI.parse(site)
85
+ end
86
+ end
87
+
88
+ # Makes a request to the service for a new OAuth::RequestToken
89
+ #
90
+ # @request_token = @consumer.get_request_token
91
+ #
92
+ def get_request_token(request_options = {}, *arguments)
93
+ response = token_request(http_method, (request_token_url? ? request_token_url : request_token_path), nil, request_options, *arguments)
94
+ OAuth::RequestToken.new(self, response[:oauth_token], response[:oauth_token_secret])
95
+ end
96
+
97
+ # Creates, signs and performs an http request.
98
+ # It's recommended to use the OAuth::Token classes to set this up correctly.
99
+ # The arguments parameters are a hash or string encoded set of parameters if it's a post request as well as optional http headers.
100
+ #
101
+ # @consumer.request(:get, '/people', @token, { :scheme => :query_string })
102
+ # @consumer.request(:post, '/people', @token, {}, @person.to_xml, { 'Content-Type' => 'application/xml' })
103
+ #
104
+ def request(http_method, path, token = nil, request_options = {}, *arguments)
105
+ if path = ~/^\//
106
+ _http = http
107
+ else
108
+ _http = create_http(path)
109
+ _uri = URI.parse(path)
110
+ path = "#{_uri.path}#{_uri.query ? "?#{_uri.query}" : ""}"
111
+ end
112
+
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
+
199
+ http_object = Net::HTTP.new(our_uri.host, our_uri.port)
200
+ http_object.use_ssl = true if our_uri.scheme == "https"
201
+
202
+ http_object
203
+ end
204
+
205
+ # create the http request object for a given http_method and path
206
+ def create_http_request(http_method, path, *arguments)
207
+ http_method = http_method.to_sym
208
+
209
+ if [:post, :put].include?(http_method)
210
+ data = arguments.shift
211
+ end
212
+
213
+ headers = arguments.first.is_a?(Hash) ? arguments.shift : {}
214
+
215
+ case http_method
216
+ when :post
217
+ request = Net::HTTP::Post.new(path,headers)
218
+ request["Content-Length"] = 0 # Default to 0
219
+ when :put
220
+ request = Net::HTTP::Put.new(path,headers)
221
+ request["Content-Length"] = 0 # Default to 0
222
+ when :get
223
+ request = Net::HTTP::Get.new(path,headers)
224
+ when :delete
225
+ request = Net::HTTP::Delete.new(path,headers)
226
+ when :head
227
+ request = Net::HTTP::Head.new(path,headers)
228
+ else
229
+ raise ArgumentError, "Don't know how to handle http_method: :#{http_method.to_s}"
230
+ end
231
+
232
+ if data.is_a?(Hash)
233
+ request.set_form_data(data)
234
+ elsif data
235
+ request.body = data.to_s
236
+ request["Content-Length"] = request.body.length
237
+ end
238
+
239
+ request
240
+ end
241
+
242
+ # Unset cached http instance because it cannot be marshalled when
243
+ # it has already been used and use_ssl is set to true
244
+ def marshal_dump(*args)
245
+ @http = nil
246
+ self
247
+ end
248
+ end
249
+ end
@@ -0,0 +1,17 @@
1
+ require 'openssl'
2
+ require 'base64'
3
+ require 'cgi'
4
+
5
+ module OAuth
6
+ module Helper
7
+ extend self
8
+
9
+ def escape(value)
10
+ CGI.escape(value.to_s).gsub("%7E", '~').gsub("+", "%20")
11
+ end
12
+
13
+ def generate_key(size=32)
14
+ Base64.encode64(OpenSSL::Random.random_bytes(size)).gsub(/\W/, '')
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ require 'action_controller'
2
+ require 'action_controller/test_process'
3
+
4
+ module OAuth
5
+ module OAuthTestHelper
6
+ def mock_incoming_request_with_query(request)
7
+ incoming = ActionController::TestRequest.new(request.to_hash)
8
+ incoming.request_uri = request.path
9
+ incoming.host = request.uri.host
10
+ incoming.env["SERVER_PORT"] = request.uri.port
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.request_uri = request.path
18
+ incoming.host = request.uri.host
19
+ incoming.env["HTTP_AUTHORIZATION"] = request.to_auth_string
20
+ incoming.env["SERVER_PORT"] = request.uri.port
21
+ incoming.env['REQUEST_METHOD'] = request.http_method
22
+ incoming
23
+ end
24
+ end
25
+ 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,106 @@
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
44
+ parameters['oauth_signature_method'].first
45
+ else
46
+ parameters['oauth_signature_method']
47
+ end
48
+ end
49
+
50
+ def signature
51
+ parameters['oauth_signature'] || ""
52
+ end
53
+
54
+ # See 9.1.2 in specs
55
+ def normalized_uri
56
+ u = URI.parse(uri)
57
+ "#{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 : '/'}"
58
+ end
59
+
60
+ # See 9.1.1. in specs Normalize Request Parameters
61
+ def normalized_parameters
62
+ parameters_for_signature.sort.map do |k, values|
63
+
64
+ if values.is_a?(Array)
65
+ # multiple values were provided for a single key
66
+ values.sort.collect do |v|
67
+ [escape(k),escape(v)] * "="
68
+ end
69
+ else
70
+ [escape(k),escape(values)] * "="
71
+ end
72
+ end * "&"
73
+ end
74
+
75
+ # See 9.1 in specs
76
+ def signature_base_string
77
+ base = [method, normalized_uri, normalized_parameters]
78
+ base.map { |v| escape(v) }.join("&")
79
+ end
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
+ end
106
+ end
@@ -0,0 +1,41 @@
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
+ end
40
+ end
41
+ end
@@ -0,0 +1,44 @@
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 normalized_uri
32
+ super
33
+ rescue
34
+ # if this is a non-standard URI, it may not parse properly
35
+ # in that case, assume that it's already been normalized
36
+ uri
37
+ end
38
+
39
+ def uri
40
+ @request["uri"]
41
+ end
42
+ end
43
+ end
44
+ 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