rares-oauth 0.2.7

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 (56) hide show
  1. data/History.txt +33 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +55 -0
  4. data/Rakefile +4 -0
  5. data/config/hoe.rb +71 -0
  6. data/config/requirements.rb +17 -0
  7. data/lib/oauth.rb +3 -0
  8. data/lib/oauth/client.rb +4 -0
  9. data/lib/oauth/client/action_controller_request.rb +52 -0
  10. data/lib/oauth/client/helper.rb +88 -0
  11. data/lib/oauth/client/net_http.rb +75 -0
  12. data/lib/oauth/consumer.rb +218 -0
  13. data/lib/oauth/helper.rb +14 -0
  14. data/lib/oauth/request_proxy.rb +24 -0
  15. data/lib/oauth/request_proxy/action_controller_request.rb +64 -0
  16. data/lib/oauth/request_proxy/base.rb +76 -0
  17. data/lib/oauth/request_proxy/net_http.rb +67 -0
  18. data/lib/oauth/request_proxy/rack_request.rb +42 -0
  19. data/lib/oauth/server.rb +68 -0
  20. data/lib/oauth/signature.rb +28 -0
  21. data/lib/oauth/signature/base.rb +76 -0
  22. data/lib/oauth/signature/hmac/base.rb +12 -0
  23. data/lib/oauth/signature/hmac/md5.rb +9 -0
  24. data/lib/oauth/signature/hmac/rmd160.rb +9 -0
  25. data/lib/oauth/signature/hmac/sha1.rb +10 -0
  26. data/lib/oauth/signature/hmac/sha2.rb +9 -0
  27. data/lib/oauth/signature/md5.rb +13 -0
  28. data/lib/oauth/signature/plaintext.rb +23 -0
  29. data/lib/oauth/signature/rsa/sha1.rb +44 -0
  30. data/lib/oauth/signature/sha1.rb +13 -0
  31. data/lib/oauth/token.rb +163 -0
  32. data/lib/oauth/version.rb +9 -0
  33. data/script/destroy +14 -0
  34. data/script/generate +14 -0
  35. data/script/txt2html +74 -0
  36. data/setup.rb +1585 -0
  37. data/tasks/deployment.rake +34 -0
  38. data/tasks/environment.rake +7 -0
  39. data/tasks/website.rake +17 -0
  40. data/test/test_action_controller_request_proxy.rb +27 -0
  41. data/test/test_consumer.rb +285 -0
  42. data/test/test_helper.rb +7 -0
  43. data/test/test_hmac_sha1.rb +21 -0
  44. data/test/test_net_http_client.rb +169 -0
  45. data/test/test_net_http_request_proxy.rb +38 -0
  46. data/test/test_rack_request_proxy.rb +40 -0
  47. data/test/test_server.rb +40 -0
  48. data/test/test_signature.rb +11 -0
  49. data/test/test_signature_base.rb +32 -0
  50. data/test/test_token.rb +15 -0
  51. data/website/index.html +87 -0
  52. data/website/index.txt +73 -0
  53. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  54. data/website/stylesheets/screen.css +138 -0
  55. data/website/template.rhtml +48 -0
  56. metadata +137 -0
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_generate, :website_upload, :publish_docs]
@@ -0,0 +1,27 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+ require 'oauth/request_proxy/action_controller_request.rb'
3
+ require 'action_controller'
4
+ require 'action_controller/test_process'
5
+
6
+ class ActionControllerRequestProxyTest < Test::Unit::TestCase
7
+
8
+ def request_proxy(parameters)
9
+ request = ActionController::TestRequest.new({}, parameters)
10
+ request.env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'
11
+ OAuth::RequestProxy.proxy(request)
12
+ end
13
+
14
+ def test_parameter_keys_should_preserve_brackets_from_hash
15
+ assert_equal(
16
+ [["message[body]", "This is a test"]],
17
+ request_proxy({ :message => { :body => 'This is a test' }}).parameters_for_signature
18
+ )
19
+ end
20
+
21
+ def test_parameter_keys_should_preserve_brackets_from_array
22
+ assert_equal(
23
+ [["foo[]", "123"], ["foo[]", "456"]],
24
+ request_proxy({ :foo => [123, 456] }).parameters_for_signature.sort
25
+ )
26
+ end
27
+ end
@@ -0,0 +1,285 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+ require 'test/unit'
3
+ require 'oauth/consumer'
4
+ require 'oauth/signature/rsa/sha1'
5
+ require 'oauth/signature/plaintext'
6
+
7
+ # This performs testing against Andy Smith's test server http://term.ie/oauth/example/
8
+ # Thanks Andy.
9
+ # This also means you have to be online to be able to run these.
10
+ class ConsumerTest < Test::Unit::TestCase
11
+ def setup
12
+ @consumer=OAuth::Consumer.new(
13
+ 'consumer_key_86cad9', '5888bf0345e5d237',
14
+ {
15
+ :site=>"http://blabla.bla",
16
+ :request_token_path=>"/oauth/example/request_token.php",
17
+ :access_token_path=>"/oauth/example/access_token.php",
18
+ :authorize_path=>"/oauth/example/authorize.php",
19
+ :scheme=>:header,
20
+ :http_method=>:get
21
+ })
22
+ @token = OAuth::ConsumerToken.new(@consumer,'token_411a7f', '3196ffd991c8ebdb')
23
+ @request_uri = URI.parse('http://example.com/test?key=value')
24
+ @request_parameters = { 'key' => 'value' }
25
+ @nonce = 225579211881198842005988698334675835446
26
+ @timestamp = "1199645624"
27
+ @consumer.http=Net::HTTP.new(@request_uri.host, @request_uri.port)
28
+ end
29
+
30
+ def test_initializer
31
+ assert_equal "consumer_key_86cad9",@consumer.key
32
+ assert_equal "5888bf0345e5d237",@consumer.secret
33
+ assert_equal "http://blabla.bla",@consumer.site
34
+ assert_equal "/oauth/example/request_token.php",@consumer.request_token_path
35
+ assert_equal "/oauth/example/access_token.php",@consumer.access_token_path
36
+ assert_equal "http://blabla.bla/oauth/example/request_token.php",@consumer.request_token_url
37
+ assert_equal "http://blabla.bla/oauth/example/access_token.php",@consumer.access_token_url
38
+ assert_equal "http://blabla.bla/oauth/example/authorize.php",@consumer.authorize_url
39
+ assert_equal :header,@consumer.scheme
40
+ assert_equal :get,@consumer.http_method
41
+ end
42
+
43
+ def test_defaults
44
+ @consumer=OAuth::Consumer.new(
45
+ "key",
46
+ "secret",
47
+ {
48
+ :site=>"http://twitter.com"
49
+ })
50
+ assert_equal "key",@consumer.key
51
+ assert_equal "secret",@consumer.secret
52
+ assert_equal "http://twitter.com",@consumer.site
53
+ assert_equal "/oauth/request_token",@consumer.request_token_path
54
+ assert_equal "/oauth/access_token",@consumer.access_token_path
55
+ assert_equal "http://twitter.com/oauth/request_token",@consumer.request_token_url
56
+ assert_equal "http://twitter.com/oauth/access_token",@consumer.access_token_url
57
+ assert_equal "http://twitter.com/oauth/authorize",@consumer.authorize_url
58
+ assert_equal :header,@consumer.scheme
59
+ assert_equal :post,@consumer.http_method
60
+ end
61
+
62
+ def test_override_paths
63
+ @consumer=OAuth::Consumer.new(
64
+ "key",
65
+ "secret",
66
+ {
67
+ :site=>"http://twitter.com",
68
+ :request_token_url=>"http://oauth.twitter.com/request_token",
69
+ :access_token_url=>"http://oauth.twitter.com/access_token",
70
+ :authorize_url=>"http://site.twitter.com/authorize"
71
+ })
72
+ assert_equal "key",@consumer.key
73
+ assert_equal "secret",@consumer.secret
74
+ assert_equal "http://twitter.com",@consumer.site
75
+ assert_equal "/oauth/request_token",@consumer.request_token_path
76
+ assert_equal "/oauth/access_token",@consumer.access_token_path
77
+ assert_equal "http://oauth.twitter.com/request_token",@consumer.request_token_url
78
+ assert_equal "http://oauth.twitter.com/access_token",@consumer.access_token_url
79
+ assert_equal "http://site.twitter.com/authorize",@consumer.authorize_url
80
+ assert_equal :header,@consumer.scheme
81
+ assert_equal :post,@consumer.http_method
82
+ end
83
+
84
+ def test_that_signing_auth_headers_on_get_requests_works
85
+ request = Net::HTTP::Get.new(@request_uri.path + "?" + request_parameters_to_s)
86
+ @token.sign!(request, {:nonce => @nonce, :timestamp => @timestamp})
87
+
88
+ assert_equal 'GET', request.method
89
+ assert_equal '/test?key=value', request.path
90
+ assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"1oO2izFav1GP4kEH2EskwXkCRFg%3D\", oauth_version=\"1.0\"".split(', ').sort, request['authorization'].split(', ').sort
91
+ end
92
+
93
+ def test_that_setting_signature_method_on_consumer_effects_signing
94
+ require 'oauth/signature/plaintext'
95
+ request = Net::HTTP::Get.new(@request_uri.path)
96
+ consumer = @consumer.dup
97
+ consumer.options[:signature_method] = 'PLAINTEXT'
98
+ token = OAuth::ConsumerToken.new(consumer, 'token_411a7f', '3196ffd991c8ebdb')
99
+ token.sign!(request, {:nonce => @nonce, :timestamp => @timestamp})
100
+
101
+ assert_no_match( /oauth_signature_method="HMAC-SHA1"/, request['authorization'])
102
+ assert_match( /oauth_signature_method="PLAINTEXT"/, request['authorization'])
103
+ end
104
+
105
+ def test_that_setting_signature_method_on_consumer_effects_signature_base_string
106
+ require 'oauth/signature/plaintext'
107
+ request = Net::HTTP::Get.new(@request_uri.path)
108
+ consumer = @consumer.dup
109
+ consumer.options[:signature_method] = 'PLAINTEXT'
110
+
111
+ request = Net::HTTP::Get.new('/')
112
+ signature_base_string = consumer.signature_base_string(request)
113
+
114
+ assert_no_match( /HMAC-SHA1/, signature_base_string)
115
+ assert_equal( "#{consumer.secret}%26", signature_base_string)
116
+ end
117
+
118
+ def test_that_plaintext_signature_works
119
+ require 'oauth/signature/plaintext'
120
+ consumer = OAuth::Consumer.new("key", "secret",
121
+ :site => "http://term.ie", :signature_method => 'PLAINTEXT')
122
+ access_token = OAuth::AccessToken.new(consumer, 'accesskey', 'accesssecret')
123
+ response = access_token.get("/oauth/example/echo_api.php?echo=hello")
124
+
125
+ assert_equal 'echo=hello', response.body
126
+ end
127
+
128
+ def test_that_signing_auth_headers_on_post_requests_works
129
+ request = Net::HTTP::Post.new(@request_uri.path)
130
+ request.set_form_data( @request_parameters )
131
+ @token.sign!(request, {:nonce => @nonce, :timestamp => @timestamp})
132
+ # assert_equal "",request.oauth_helper.signature_base_string
133
+
134
+ assert_equal 'POST', request.method
135
+ assert_equal '/test', request.path
136
+ assert_equal 'key=value', request.body
137
+ assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"26g7wHTtNO6ZWJaLltcueppHYiI%3D\", oauth_version=\"1.0\"".split(', ').sort, request['authorization'].split(', ').sort
138
+ end
139
+
140
+ def test_that_signing_post_params_works
141
+ request = Net::HTTP::Post.new(@request_uri.path)
142
+ request.set_form_data( @request_parameters )
143
+ @token.sign!(request, {:scheme => 'body', :nonce => @nonce, :timestamp => @timestamp})
144
+
145
+ assert_equal 'POST', request.method
146
+ assert_equal '/test', request.path
147
+ assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=iMZaUTbQof%2fHMFyIde%2bOIkhW5is%3d&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", request.body.split("&").sort.join("&")
148
+ assert_equal nil, request['authorization']
149
+ end
150
+
151
+ def test_that_using_auth_headers_on_get_on_create_signed_requests_works
152
+ request=@consumer.create_signed_request(:get,@request_uri.path+ "?" + request_parameters_to_s,@token,{:nonce => @nonce, :timestamp => @timestamp},@request_parameters)
153
+
154
+ assert_equal 'GET', request.method
155
+ assert_equal '/test?key=value', request.path
156
+ assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"1oO2izFav1GP4kEH2EskwXkCRFg%3D\", oauth_version=\"1.0\"".split(', ').sort, request['authorization'].split(', ').sort
157
+ end
158
+
159
+ def test_that_using_auth_headers_on_post_on_create_signed_requests_works
160
+ request=@consumer.create_signed_request(:post,@request_uri.path,@token,{:nonce => @nonce, :timestamp => @timestamp},@request_parameters,{})
161
+ assert_equal 'POST', request.method
162
+ assert_equal '/test', request.path
163
+ assert_equal 'key=value', request.body
164
+ assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"26g7wHTtNO6ZWJaLltcueppHYiI%3D\", oauth_version=\"1.0\"".split(', ').sort, request['authorization'].split(', ').sort
165
+ end
166
+
167
+ def test_that_signing_post_params_works
168
+ request=@consumer.create_signed_request(:post,@request_uri.path,@token,{:scheme => 'body', :nonce => @nonce, :timestamp => @timestamp},@request_parameters,{})
169
+
170
+ assert_equal 'POST', request.method
171
+ assert_equal '/test', request.path
172
+ assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=26g7wHTtNO6ZWJaLltcueppHYiI%3d&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", request.body.split("&").sort.join("&")
173
+ assert_equal nil, request['authorization']
174
+ end
175
+
176
+ def test_step_by_step_token_request
177
+ @consumer=OAuth::Consumer.new(
178
+ "key",
179
+ "secret",
180
+ {
181
+ :site=>"http://term.ie",
182
+ :request_token_path=>"/oauth/example/request_token.php",
183
+ :access_token_path=>"/oauth/example/access_token.php",
184
+ :authorize_path=>"/oauth/example/authorize.php",
185
+ :scheme=>:header
186
+ })
187
+ options={:nonce=>'nonce',:timestamp=>Time.now.to_i.to_s}
188
+
189
+ request = Net::HTTP::Get.new("/oauth/example/request_token.php")
190
+ signature_base_string=@consumer.signature_base_string(request,nil,options)
191
+ assert_equal "GET&http%3A%2F%2Fterm.ie%2Foauth%2Fexample%2Frequest_token.php&oauth_consumer_key%3Dkey%26oauth_nonce%3D#{options[:nonce]}%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D#{options[:timestamp]}%26oauth_version%3D1.0",signature_base_string
192
+ @consumer.sign!(request, nil,options)
193
+
194
+ assert_equal 'GET', request.method
195
+ assert_equal nil, request.body
196
+ response=@consumer.http.request(request)
197
+ assert_equal "200",response.code
198
+ assert_equal "oauth_token=requestkey&oauth_token_secret=requestsecret",response.body
199
+ end
200
+
201
+ def test_get_token_sequence
202
+ #explicitly changing to PLAINTEXT because the signing fails
203
+ @consumer=OAuth::Consumer.new(
204
+ "key",
205
+ "secret",
206
+ {
207
+ :site => "http://term.ie",
208
+ :signature_method => "PLAINTEXT",
209
+ :request_token_path => "/oauth/example/request_token.php",
210
+ :access_token_path => "/oauth/example/access_token.php",
211
+ :authorize_path => "/oauth/example/authorize.php"
212
+ })
213
+
214
+ @request_token=@consumer.get_request_token
215
+ assert_not_nil @request_token
216
+ assert_equal "requestkey",@request_token.token
217
+ assert_equal "requestsecret",@request_token.secret
218
+ assert_equal "http://term.ie/oauth/example/authorize.php?oauth_token=requestkey",@request_token.authorize_url
219
+
220
+ @access_token=@request_token.get_access_token
221
+ assert_not_nil @access_token
222
+ assert_equal "accesskey",@access_token.token
223
+ assert_equal "accesssecret",@access_token.secret
224
+
225
+ @response=@access_token.get("/oauth/example/echo_api.php?ok=hello&test=this")
226
+ assert_not_nil @response
227
+ assert_equal "200",@response.code
228
+ assert_equal( "ok=hello&test=this",@response.body)
229
+
230
+ @response=@access_token.post("/oauth/example/echo_api.php",{'ok'=>'hello','test'=>'this'})
231
+ assert_not_nil @response
232
+ assert_equal "200",@response.code
233
+ assert_equal( "ok=hello&test=this",@response.body)
234
+ end
235
+
236
+
237
+ # This test does an actual https request (the result doesn't matter)
238
+ # to initialize the same way as get_request_token does. Can be any
239
+ # site that supports https.
240
+ #
241
+ # It also generates "warning: using default DH parameters." which I
242
+ # don't know how to get rid of
243
+ def test_serialization_with_https
244
+ consumer = OAuth::Consumer.new('token', 'secret', :site => 'https://plazes.net')
245
+ consumer.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
246
+ consumer.http.get('/')
247
+
248
+ assert_nothing_raised do
249
+ # Specifically this should not raise TypeError: no marshal_dump
250
+ # is defined for class OpenSSL::SSL::SSLContext
251
+ Marshal.dump(consumer)
252
+ end
253
+ end
254
+
255
+ def test_get_request_token_with_custom_arguments
256
+ @consumer=OAuth::Consumer.new(
257
+ "key",
258
+ "secret",
259
+ {
260
+ :site=>"http://term.ie",
261
+ :request_token_path=>"/oauth/example/request_token.php",
262
+ :access_token_path=>"/oauth/example/access_token.php",
263
+ :authorize_path=>"/oauth/example/authorize.php"
264
+ })
265
+
266
+
267
+ debug = ""
268
+ @consumer.http.set_debug_output(debug)
269
+
270
+ # get_request_token should receive our custom request_options and *arguments parameters from get_request_token.
271
+ @consumer.get_request_token({}, {:scope => "http://www.google.com/calendar/feeds http://picasaweb.google.com/data"})
272
+
273
+ # Because this is a POST request, create_http_request should take the first element of *arguments
274
+ # and turn it into URL-encoded data in the body of the POST.
275
+ assert_match( /^<- "scope=http%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%20http%3a%2f%2fpicasaweb.google.com%2fdata"/,
276
+ debug)
277
+ end
278
+
279
+ protected
280
+
281
+ def request_parameters_to_s
282
+ @request_parameters.map { |k,v| "#{k}=#{v}" }.join("&")
283
+ end
284
+
285
+ end
@@ -0,0 +1,7 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/oauth'
3
+
4
+ def requests(request)
5
+ Marshal.load(File.read(File.dirname(__FILE__) + '/fixtures/' + request))
6
+ end
7
+
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+ require 'oauth/signature/hmac/sha1'
3
+
4
+ class TestSignatureHmacSha1 < Test::Unit::TestCase
5
+ def test_that_hmac_sha1_implements_hmac_sha1
6
+ assert OAuth::Signature.available_methods.include?('hmac-sha1')
7
+ end
8
+
9
+ def test_that_get_request_from_oauth_test_cases_produces_matching_signature
10
+ request = Net::HTTP::Get.new('/photos?file=vacation.jpg&size=original&oauth_version=1.0&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_token=nnch734d00sl2jdk&oauth_timestamp=1191242096&oauth_nonce=kllo9940pd9333jh&oauth_signature_method=HMAC-SHA1')
11
+
12
+ consumer = OAuth::Consumer.new('dpf43f3p2l4k3l03', 'kd94hf93k423kf44')
13
+ token = OAuth::Token.new('nnch734d00sl2jdk', 'pfkkdhi9sl3r4s00')
14
+
15
+ signature = OAuth::Signature.sign(request, { :consumer => consumer,
16
+ :token => token,
17
+ :uri => 'http://photos.example.net/photos' } )
18
+
19
+ assert_equal 'tR3+Ty81lMeYAr/Fid0kMTYa/WM=', signature
20
+ end
21
+ end
@@ -0,0 +1,169 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+ require 'oauth/client/net_http'
3
+
4
+ class NetHTTPClientTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @consumer = OAuth::Consumer.new('consumer_key_86cad9', '5888bf0345e5d237')
8
+ @token = OAuth::Token.new('token_411a7f', '3196ffd991c8ebdb')
9
+ @request_uri = URI.parse('http://example.com/test?key=value')
10
+ @request_parameters = { 'key' => 'value' }
11
+ @nonce = 225579211881198842005988698334675835446
12
+ @timestamp = "1199645624"
13
+ @http = Net::HTTP.new(@request_uri.host, @request_uri.port)
14
+ end
15
+
16
+ def test_that_using_auth_headers_on_get_requests_works
17
+ request = Net::HTTP::Get.new(@request_uri.path + "?" + request_parameters_to_s)
18
+ request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
19
+
20
+ assert_equal 'GET', request.method
21
+ assert_equal '/test?key=value', request.path
22
+ assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"1oO2izFav1GP4kEH2EskwXkCRFg%3D\", oauth_version=\"1.0\"".split(', ').sort, request['authorization'].split(', ').sort
23
+ end
24
+
25
+ def test_that_using_auth_headers_on_post_requests_works
26
+ request = Net::HTTP::Post.new(@request_uri.path)
27
+ request.set_form_data( @request_parameters )
28
+ request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
29
+
30
+ assert_equal 'POST', request.method
31
+ assert_equal '/test', request.path
32
+ assert_equal 'key=value', request.body
33
+ assert_equal "OAuth realm=\"\", oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"HMAC-SHA1\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"26g7wHTtNO6ZWJaLltcueppHYiI%3D\", oauth_version=\"1.0\"".split(', ').sort, request['authorization'].split(', ').sort
34
+ end
35
+
36
+ def test_that_using_post_params_works
37
+ request = Net::HTTP::Post.new(@request_uri.path)
38
+ request.set_form_data( @request_parameters )
39
+ request.oauth!(@http, @consumer, @token, {:scheme => 'body', :nonce => @nonce, :timestamp => @timestamp})
40
+
41
+ assert_equal 'POST', request.method
42
+ assert_equal '/test', request.path
43
+ assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=26g7wHTtNO6ZWJaLltcueppHYiI%3d&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", request.body.split("&").sort.join("&")
44
+ assert_equal nil, request['authorization']
45
+ end
46
+
47
+ def test_that_using_get_params_works
48
+ request = Net::HTTP::Get.new(@request_uri.path + "?" + request_parameters_to_s)
49
+ request.oauth!(@http, @consumer, @token, {:scheme => 'query_string', :nonce => @nonce, :timestamp => @timestamp})
50
+
51
+ assert_equal 'GET', request.method
52
+ uri = URI.parse(request.path)
53
+ assert_equal '/test', uri.path
54
+ assert_equal nil, uri.fragment
55
+ assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=1oO2izFav1GP4kEH2EskwXkCRFg%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", uri.query.split("&").sort.join("&")
56
+ assert_equal nil, request['authorization']
57
+ end
58
+
59
+ def test_that_using_get_params_works_with_post_requests
60
+ request = Net::HTTP::Post.new(@request_uri.path + "?" + request_parameters_to_s)
61
+ request.oauth!(@http, @consumer, @token, {:scheme => 'query_string', :nonce => @nonce, :timestamp => @timestamp})
62
+
63
+ assert_equal 'POST', request.method
64
+ uri = URI.parse(request.path)
65
+ assert_equal '/test', uri.path
66
+ assert_equal nil, uri.fragment
67
+ assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=26g7wHTtNO6ZWJaLltcueppHYiI%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", uri.query.split("&").sort.join('&')
68
+ assert_equal nil, request.body
69
+ assert_equal nil, request['authorization']
70
+ end
71
+
72
+ def test_that_using_get_params_works_with_post_requests_that_have_post_bodies
73
+ request = Net::HTTP::Post.new(@request_uri.path + "?" + request_parameters_to_s)
74
+ request.set_form_data( { 'key2' => 'value2' } )
75
+ request.oauth!(@http, @consumer, @token, {:scheme => :query_string, :nonce => @nonce, :timestamp => @timestamp})
76
+
77
+ assert_equal 'POST', request.method
78
+ uri = URI.parse(request.path)
79
+ assert_equal '/test', uri.path
80
+ assert_equal nil, uri.fragment
81
+ assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=4kSU8Zd1blWo3W6qJH7eaRTMkg0%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", uri.query.split("&").sort.join('&')
82
+ assert_equal "key2=value2", request.body
83
+ assert_equal nil, request['authorization']
84
+ end
85
+
86
+
87
+ def test_example_from_specs
88
+ consumer=OAuth::Consumer.new("dpf43f3p2l4k3l03","kd94hf93k423kf44")
89
+ token = OAuth::Token.new('nnch734d00sl2jdk', 'pfkkdhi9sl3r4s00')
90
+ request_uri = URI.parse('http://photos.example.net/photos?file=vacation.jpg&size=original')
91
+ nonce = 'kllo9940pd9333jh'
92
+ timestamp = "1191242096"
93
+ http = Net::HTTP.new(request_uri.host, request_uri.port)
94
+
95
+ request = Net::HTTP::Get.new(request_uri.path + "?" + request_uri.query)
96
+ signature_base_string=request.signature_base_string(http, consumer, token, {:nonce => nonce, :timestamp => timestamp})
97
+ assert_equal 'GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal',signature_base_string
98
+
99
+ # request = Net::HTTP::Get.new(request_uri.path + "?" + request_uri.query)
100
+ request.oauth!(http, consumer, token, {:nonce => nonce, :timestamp => timestamp,:realm=>"http://photos.example.net/"})
101
+
102
+ assert_equal 'GET', request.method
103
+ assert_equal 'OAuth realm="http://photos.example.net/", oauth_nonce="kllo9940pd9333jh", oauth_signature_method="HMAC-SHA1", oauth_token="nnch734d00sl2jdk", oauth_timestamp="1191242096", oauth_consumer_key="dpf43f3p2l4k3l03", oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D", oauth_version="1.0"'.split(', ').sort, request['authorization'].split(', ').sort
104
+
105
+ end
106
+
107
+ def test_step_by_step_token_request
108
+ consumer=OAuth::Consumer.new(
109
+ "key",
110
+ "secret")
111
+ request_uri = URI.parse('http://term.ie/oauth/example/request_token.php')
112
+ nonce = rand(2**128).to_s
113
+ timestamp = Time.now.to_i.to_s
114
+ http = Net::HTTP.new(request_uri.host, request_uri.port)
115
+
116
+ request = Net::HTTP::Get.new(request_uri.path)
117
+ signature_base_string=request.signature_base_string(http, consumer, nil, {:scheme=>:query_string,:nonce => nonce, :timestamp => timestamp})
118
+ assert_equal "GET&http%3A%2F%2Fterm.ie%2Foauth%2Fexample%2Frequest_token.php&oauth_consumer_key%3Dkey%26oauth_nonce%3D#{nonce}%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D#{timestamp}%26oauth_version%3D1.0",signature_base_string
119
+
120
+ # request = Net::HTTP::Get.new(request_uri.path)
121
+ request.oauth!(http, consumer, nil, {:scheme=>:query_string,:nonce => nonce, :timestamp => timestamp})
122
+ assert_equal 'GET', request.method
123
+ assert_nil request.body
124
+ assert_nil request['authorization']
125
+ # assert_equal 'OAuth oauth_nonce="kllo9940pd9333jh", oauth_signature_method="HMAC-SHA1", oauth_token="", oauth_timestamp="'+timestamp+'", oauth_consumer_key="key", oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D", oauth_version="1.0"', request['authorization']
126
+
127
+ response=http.request(request)
128
+ assert_equal "200",response.code
129
+ # assert_equal request['authorization'],response.body
130
+ assert_equal "oauth_token=requestkey&oauth_token_secret=requestsecret",response.body
131
+ end
132
+
133
+ def test_that_put_bodies_not_signed
134
+ request = Net::HTTP::Put.new(@request_uri.path)
135
+ request.body = "<?xml version=\"1.0\"?><foo><bar>baz</bar></foo>"
136
+ request["Content-Type"] = "application/xml"
137
+ signature_base_string=request.signature_base_string(@http, @consumer, nil, { :nonce => @nonce, :timestamp => @timestamp })
138
+ assert_equal "PUT&http%3A%2F%2Fexample.com%2Ftest&oauth_consumer_key%3Dconsumer_key_86cad9%26oauth_nonce%3D225579211881198842005988698334675835446%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1199645624%26oauth_version%3D1.0", signature_base_string
139
+ end
140
+
141
+ def test_that_put_bodies_not_signed_even_if_form_urlencoded
142
+ request = Net::HTTP::Put.new(@request_uri.path)
143
+ request.set_form_data( { 'key2' => 'value2' } )
144
+ signature_base_string=request.signature_base_string(@http, @consumer, nil, { :nonce => @nonce, :timestamp => @timestamp })
145
+ assert_equal "PUT&http%3A%2F%2Fexample.com%2Ftest&oauth_consumer_key%3Dconsumer_key_86cad9%26oauth_nonce%3D225579211881198842005988698334675835446%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1199645624%26oauth_version%3D1.0", signature_base_string
146
+ end
147
+
148
+ def test_that_post_bodies_signed_if_form_urlencoded
149
+ request = Net::HTTP::Post.new(@request_uri.path)
150
+ request.set_form_data( { 'key2' => 'value2' } )
151
+ signature_base_string=request.signature_base_string(@http, @consumer, nil, { :nonce => @nonce, :timestamp => @timestamp })
152
+ assert_equal "POST&http%3A%2F%2Fexample.com%2Ftest&key2%3Dvalue2%26oauth_consumer_key%3Dconsumer_key_86cad9%26oauth_nonce%3D225579211881198842005988698334675835446%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1199645624%26oauth_version%3D1.0", signature_base_string
153
+ end
154
+
155
+ def test_that_post_bodies_not_signed_if_other_content_type
156
+ request = Net::HTTP::Post.new(@request_uri.path)
157
+ request.body = "<?xml version=\"1.0\"?><foo><bar>baz</bar></foo>"
158
+ request["Content-Type"] = "application/xml"
159
+ signature_base_string=request.signature_base_string(@http, @consumer, nil, { :nonce => @nonce, :timestamp => @timestamp })
160
+ assert_equal "POST&http%3A%2F%2Fexample.com%2Ftest&oauth_consumer_key%3Dconsumer_key_86cad9%26oauth_nonce%3D225579211881198842005988698334675835446%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1199645624%26oauth_version%3D1.0", signature_base_string
161
+ end
162
+
163
+ protected
164
+
165
+ def request_parameters_to_s
166
+ @request_parameters.map { |k,v| "#{k}=#{v}" }.join("&")
167
+ end
168
+
169
+ end