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.
- data/History.txt +48 -0
- data/License.txt +20 -0
- data/Manifest.txt +71 -0
- data/README.rdoc +73 -0
- data/Rakefile +34 -0
- data/TODO +14 -0
- data/bin/oauth +5 -0
- data/lib/oauth/cli.rb +130 -0
- data/lib/oauth/client/action_controller_request.rb +52 -0
- data/lib/oauth/client/helper.rb +75 -0
- data/lib/oauth/client/net_http.rb +75 -0
- data/lib/oauth/client.rb +4 -0
- data/lib/oauth/consumer.rb +246 -0
- data/lib/oauth/helper.rb +17 -0
- data/lib/oauth/oauth_test_helper.rb +26 -0
- data/lib/oauth/request_proxy/action_controller_request.rb +62 -0
- data/lib/oauth/request_proxy/base.rb +107 -0
- data/lib/oauth/request_proxy/jabber_request.rb +42 -0
- data/lib/oauth/request_proxy/mock_request.rb +36 -0
- data/lib/oauth/request_proxy/net_http.rb +65 -0
- data/lib/oauth/request_proxy/rack_request.rb +40 -0
- data/lib/oauth/request_proxy.rb +24 -0
- data/lib/oauth/server.rb +68 -0
- data/lib/oauth/signature/base.rb +89 -0
- data/lib/oauth/signature/hmac/base.rb +12 -0
- data/lib/oauth/signature/hmac/md5.rb +9 -0
- data/lib/oauth/signature/hmac/rmd160.rb +9 -0
- data/lib/oauth/signature/hmac/sha1.rb +10 -0
- data/lib/oauth/signature/hmac/sha2.rb +9 -0
- data/lib/oauth/signature/md5.rb +13 -0
- data/lib/oauth/signature/plaintext.rb +23 -0
- data/lib/oauth/signature/rsa/sha1.rb +44 -0
- data/lib/oauth/signature/sha1.rb +13 -0
- data/lib/oauth/signature.rb +28 -0
- data/lib/oauth/token.rb +137 -0
- data/lib/oauth/version.rb +3 -0
- data/lib/oauth.rb +3 -0
- data/oauth.gemspec +43 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1585 -0
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/cases/oauth_case.rb +19 -0
- data/test/cases/spec/1_0-final/test_construct_request_url.rb +62 -0
- data/test/cases/spec/1_0-final/test_normalize_request_parameters.rb +88 -0
- data/test/cases/spec/1_0-final/test_parameter_encodings.rb +86 -0
- data/test/cases/spec/1_0-final/test_signature_base_strings.rb +77 -0
- data/test/keys/rsa.cert +11 -0
- data/test/keys/rsa.pem +16 -0
- data/test/test_action_controller_request_proxy.rb +28 -0
- data/test/test_consumer.rb +328 -0
- data/test/test_helper.rb +15 -0
- data/test/test_hmac_sha1.rb +21 -0
- data/test/test_net_http_client.rb +169 -0
- data/test/test_net_http_request_proxy.rb +38 -0
- data/test/test_rack_request_proxy.rb +40 -0
- data/test/test_rsa_sha1.rb +59 -0
- data/test/test_server.rb +40 -0
- data/test/test_signature.rb +11 -0
- data/test/test_signature_base.rb +32 -0
- data/test/test_signature_plain_text.rb +31 -0
- data/test/test_token.rb +14 -0
- data/website/index.html +87 -0
- data/website/index.txt +73 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.rhtml +48 -0
- 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
|
data/lib/oauth/helper.rb
ADDED
@@ -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
|