sutto-oauth 0.3.6

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 (85) hide show
  1. data/History.txt +114 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +86 -0
  4. data/README.rdoc +71 -0
  5. data/Rakefile +38 -0
  6. data/TODO +31 -0
  7. data/bin/oauth +5 -0
  8. data/examples/yql.rb +44 -0
  9. data/lib/oauth.rb +4 -0
  10. data/lib/oauth/cli.rb +378 -0
  11. data/lib/oauth/client.rb +4 -0
  12. data/lib/oauth/client/action_controller_request.rb +54 -0
  13. data/lib/oauth/client/helper.rb +85 -0
  14. data/lib/oauth/client/net_http.rb +106 -0
  15. data/lib/oauth/consumer.rb +370 -0
  16. data/lib/oauth/errors.rb +3 -0
  17. data/lib/oauth/errors/error.rb +4 -0
  18. data/lib/oauth/errors/problem.rb +14 -0
  19. data/lib/oauth/errors/unauthorized.rb +12 -0
  20. data/lib/oauth/helper.rb +78 -0
  21. data/lib/oauth/oauth.rb +11 -0
  22. data/lib/oauth/oauth_test_helper.rb +25 -0
  23. data/lib/oauth/request_proxy.rb +24 -0
  24. data/lib/oauth/request_proxy/action_controller_request.rb +61 -0
  25. data/lib/oauth/request_proxy/base.rb +166 -0
  26. data/lib/oauth/request_proxy/jabber_request.rb +41 -0
  27. data/lib/oauth/request_proxy/mock_request.rb +44 -0
  28. data/lib/oauth/request_proxy/net_http.rb +65 -0
  29. data/lib/oauth/request_proxy/rack_request.rb +40 -0
  30. data/lib/oauth/server.rb +66 -0
  31. data/lib/oauth/signature.rb +40 -0
  32. data/lib/oauth/signature/base.rb +91 -0
  33. data/lib/oauth/signature/hmac/base.rb +12 -0
  34. data/lib/oauth/signature/hmac/md5.rb +9 -0
  35. data/lib/oauth/signature/hmac/rmd160.rb +9 -0
  36. data/lib/oauth/signature/hmac/sha1.rb +9 -0
  37. data/lib/oauth/signature/hmac/sha2.rb +9 -0
  38. data/lib/oauth/signature/md5.rb +13 -0
  39. data/lib/oauth/signature/plaintext.rb +23 -0
  40. data/lib/oauth/signature/rsa/sha1.rb +45 -0
  41. data/lib/oauth/signature/sha1.rb +13 -0
  42. data/lib/oauth/token.rb +7 -0
  43. data/lib/oauth/tokens/access_token.rb +68 -0
  44. data/lib/oauth/tokens/consumer_token.rb +33 -0
  45. data/lib/oauth/tokens/request_token.rb +32 -0
  46. data/lib/oauth/tokens/server_token.rb +9 -0
  47. data/lib/oauth/tokens/token.rb +17 -0
  48. data/lib/oauth/version.rb +3 -0
  49. data/oauth.gemspec +49 -0
  50. data/script/destroy +14 -0
  51. data/script/generate +14 -0
  52. data/script/txt2html +74 -0
  53. data/setup.rb +1585 -0
  54. data/tasks/deployment.rake +34 -0
  55. data/tasks/environment.rake +7 -0
  56. data/tasks/website.rake +17 -0
  57. data/test/cases/oauth_case.rb +19 -0
  58. data/test/cases/spec/1_0-final/test_construct_request_url.rb +62 -0
  59. data/test/cases/spec/1_0-final/test_normalize_request_parameters.rb +88 -0
  60. data/test/cases/spec/1_0-final/test_parameter_encodings.rb +86 -0
  61. data/test/cases/spec/1_0-final/test_signature_base_strings.rb +77 -0
  62. data/test/keys/rsa.cert +11 -0
  63. data/test/keys/rsa.pem +16 -0
  64. data/test/test_access_token.rb +26 -0
  65. data/test/test_action_controller_request_proxy.rb +132 -0
  66. data/test/test_consumer.rb +159 -0
  67. data/test/test_helper.rb +14 -0
  68. data/test/test_hmac_sha1.rb +20 -0
  69. data/test/test_net_http_client.rb +221 -0
  70. data/test/test_net_http_request_proxy.rb +72 -0
  71. data/test/test_oauth_helper.rb +49 -0
  72. data/test/test_rack_request_proxy.rb +40 -0
  73. data/test/test_request_token.rb +51 -0
  74. data/test/test_rsa_sha1.rb +59 -0
  75. data/test/test_server.rb +40 -0
  76. data/test/test_signature.rb +19 -0
  77. data/test/test_signature_base.rb +32 -0
  78. data/test/test_signature_plain_text.rb +31 -0
  79. data/test/test_token.rb +14 -0
  80. data/website/index.html +87 -0
  81. data/website/index.txt +73 -0
  82. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  83. data/website/stylesheets/screen.css +138 -0
  84. data/website/template.rhtml +48 -0
  85. metadata +217 -0
@@ -0,0 +1,132 @@
1
+ gem 'actionpack','2.2.2'
2
+ require File.dirname(__FILE__) + '/test_helper.rb'
3
+
4
+ require 'oauth/request_proxy/action_controller_request'
5
+ require 'action_controller/test_process'
6
+
7
+ class ActionControllerRequestProxyTest < Test::Unit::TestCase
8
+ def request_proxy(request_method = :get, uri_params = {}, body_params = {})
9
+ request = ActionController::TestRequest.new
10
+ request.set_REQUEST_URI('/')
11
+
12
+ case request_method
13
+ when :post
14
+ request.env['REQUEST_METHOD'] = 'POST'
15
+ when :put
16
+ request.env['REQUEST_METHOD'] = 'PUT'
17
+ end
18
+
19
+ request.env['REQUEST_URI'] = '/'
20
+ request.env['RAW_POST_DATA'] = body_params.to_query
21
+ request.env['QUERY_STRING'] = body_params.to_query
22
+ request.env['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'
23
+
24
+ yield request if block_given?
25
+ OAuth::RequestProxy.proxy(request, :parameters => uri_params)
26
+ end
27
+
28
+ def test_that_proxy_simple_get_request_works_with_query_params
29
+ request_proxy = request_proxy(:get, {'key'=>'value'})
30
+
31
+ expected_parameters = [["key", "value"]]
32
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
33
+ assert_equal 'GET', request_proxy.method
34
+ end
35
+
36
+ def test_that_proxy_simple_post_request_works_with_query_params
37
+ request_proxy = request_proxy(:post, {'key'=>'value'})
38
+
39
+ expected_parameters = [["key", "value"]]
40
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
41
+ assert_equal 'POST', request_proxy.method
42
+ end
43
+
44
+ def test_that_proxy_simple_put_request_works_with_query_params
45
+ request_proxy = request_proxy(:put, {'key'=>'value'})
46
+
47
+ expected_parameters = [["key", "value"]]
48
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
49
+ assert_equal 'PUT', request_proxy.method
50
+ end
51
+
52
+ def test_that_proxy_simple_get_request_works_with_post_params
53
+ request_proxy = request_proxy(:get, {}, {'key'=>'value'})
54
+
55
+ expected_parameters = []
56
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
57
+ assert_equal 'GET', request_proxy.method
58
+ end
59
+
60
+ def test_that_proxy_simple_post_request_works_with_post_params
61
+ request_proxy = request_proxy(:post, {}, {'key'=>'value'})
62
+
63
+ expected_parameters = [["key", "value"]]
64
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
65
+ assert_equal 'POST', request_proxy.method
66
+ end
67
+
68
+ def test_that_proxy_simple_put_request_works_with_post_params
69
+ request_proxy = request_proxy(:put, {}, {'key'=>'value'})
70
+
71
+ expected_parameters = []
72
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
73
+ assert_equal 'PUT', request_proxy.method
74
+ end
75
+
76
+ def test_that_proxy_simple_get_request_works_with_mixed_params
77
+ request_proxy = request_proxy(:get, {'key'=>'value'}, {'key2'=>'value2'})
78
+
79
+ expected_parameters = [["key", "value"]]
80
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
81
+ assert_equal 'GET', request_proxy.method
82
+ end
83
+
84
+ def test_that_proxy_simple_post_request_works_with_mixed_params
85
+ request_proxy = request_proxy(:post, {'key'=>'value'}, {'key2'=>'value2'})
86
+
87
+ expected_parameters = [["key", "value"],["key2", "value2"]]
88
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
89
+ assert_equal 'POST', request_proxy.method
90
+ end
91
+
92
+ def test_that_proxy_simple_put_request_works_with_mixed_params
93
+ request_proxy = request_proxy(:put, {'key'=>'value'}, {'key2'=>'value2'})
94
+
95
+ expected_parameters = [["key", "value"]]
96
+ assert_equal expected_parameters, request_proxy.parameters_for_signature
97
+ assert_equal 'PUT', request_proxy.method
98
+ end
99
+
100
+ def test_parameter_keys_should_preserve_brackets_from_hash
101
+ assert_equal(
102
+ [["message[body]", "This is a test"]],
103
+ request_proxy(:post, { :message => { :body => 'This is a test' }}).parameters_for_signature
104
+ )
105
+ end
106
+
107
+ def test_parameter_values_with_amps_should_not_break_parameter_parsing
108
+ assert_equal(
109
+ [['message[body]', 'http://foo.com/?a=b&c=d']],
110
+ request_proxy(:post, { :message => { :body => 'http://foo.com/?a=b&c=d'}}).parameters_for_signature
111
+ )
112
+ end
113
+
114
+ def test_parameter_keys_should_preserve_brackets_from_array
115
+ assert_equal(
116
+ [["foo[]", "123"], ["foo[]", "456"]],
117
+ request_proxy(:post, { :foo => [123, 456] }).parameters_for_signature.sort
118
+ )
119
+ end
120
+
121
+ # TODO disabled; ActionController::TestRequest does not appear to parse
122
+ # QUERY_STRING
123
+ def x_test_query_string_parameter_values_should_be_cgi_unescaped
124
+ request = request_proxy do |r|
125
+ r.env['QUERY_STRING'] = 'url=http%3A%2F%2Ffoo.com%2F%3Fa%3Db%26c%3Dd'
126
+ end
127
+ assert_equal(
128
+ [['url', 'http://foo.com/?a=b&c=d']],
129
+ request.parameters_for_signature.sort
130
+ )
131
+ end
132
+ end
@@ -0,0 +1,159 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+ require 'mocha'
3
+
4
+ require 'stringio'
5
+
6
+ # This performs testing against Andy Smith's test server http://term.ie/oauth/example/
7
+ # Thanks Andy.
8
+ # This also means you have to be online to be able to run these.
9
+ class ConsumerTest < Test::Unit::TestCase
10
+ def setup
11
+ @consumer=OAuth::Consumer.new(
12
+ 'consumer_key_86cad9', '5888bf0345e5d237',
13
+ {
14
+ :site=>"http://blabla.bla",
15
+ :proxy=>"http://user:password@proxy.bla:8080",
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 "http://user:password@proxy.bla:8080",@consumer.proxy
35
+ assert_equal "/oauth/example/request_token.php",@consumer.request_token_path
36
+ assert_equal "/oauth/example/access_token.php",@consumer.access_token_path
37
+ assert_equal "http://blabla.bla/oauth/example/request_token.php",@consumer.request_token_url
38
+ assert_equal "http://blabla.bla/oauth/example/access_token.php",@consumer.access_token_url
39
+ assert_equal "http://blabla.bla/oauth/example/authorize.php",@consumer.authorize_url
40
+ assert_equal :header,@consumer.scheme
41
+ assert_equal :get,@consumer.http_method
42
+ end
43
+
44
+ def test_defaults
45
+ @consumer=OAuth::Consumer.new(
46
+ "key",
47
+ "secret",
48
+ {
49
+ :site=>"http://twitter.com"
50
+ })
51
+ assert_equal "key",@consumer.key
52
+ assert_equal "secret",@consumer.secret
53
+ assert_equal "http://twitter.com",@consumer.site
54
+ assert_nil @consumer.proxy
55
+ assert_equal "/oauth/request_token",@consumer.request_token_path
56
+ assert_equal "/oauth/access_token",@consumer.access_token_path
57
+ assert_equal "http://twitter.com/oauth/request_token",@consumer.request_token_url
58
+ assert_equal "http://twitter.com/oauth/access_token",@consumer.access_token_url
59
+ assert_equal "http://twitter.com/oauth/authorize",@consumer.authorize_url
60
+ assert_equal :header,@consumer.scheme
61
+ assert_equal :post,@consumer.http_method
62
+ end
63
+
64
+ def test_override_paths
65
+ @consumer=OAuth::Consumer.new(
66
+ "key",
67
+ "secret",
68
+ {
69
+ :site=>"http://twitter.com",
70
+ :request_token_url=>"http://oauth.twitter.com/request_token",
71
+ :access_token_url=>"http://oauth.twitter.com/access_token",
72
+ :authorize_url=>"http://site.twitter.com/authorize"
73
+ })
74
+ assert_equal "key",@consumer.key
75
+ assert_equal "secret",@consumer.secret
76
+ assert_equal "http://twitter.com",@consumer.site
77
+ assert_equal "/oauth/request_token",@consumer.request_token_path
78
+ assert_equal "/oauth/access_token",@consumer.access_token_path
79
+ assert_equal "http://oauth.twitter.com/request_token",@consumer.request_token_url
80
+ assert_equal "http://oauth.twitter.com/access_token",@consumer.access_token_url
81
+ assert_equal "http://site.twitter.com/authorize",@consumer.authorize_url
82
+ assert_equal :header,@consumer.scheme
83
+ assert_equal :post,@consumer.http_method
84
+ end
85
+
86
+ def test_that_token_response_should_be_uri_parameter_format_as_default
87
+ @consumer.expects(:request).returns(create_stub_http_response("oauth_token=token&oauth_token_secret=secret"))
88
+
89
+ hash = @consumer.token_request(:get, "")
90
+
91
+ assert_equal "token", hash[:oauth_token]
92
+ assert_equal "secret", hash[:oauth_token_secret]
93
+ end
94
+
95
+ def test_can_provided_a_block_to_interpret_token_response
96
+ @consumer.expects(:request).returns(create_stub_http_response)
97
+
98
+ hash = @consumer.token_request(:get, '') {{ :oauth_token => 'token', :oauth_token_secret => 'secret' }}
99
+
100
+ assert_equal 'token', hash[:oauth_token]
101
+ assert_equal 'secret', hash[:oauth_token_secret]
102
+ end
103
+
104
+ def test_that_can_provide_a_block_to_interpret_a_request_token_response
105
+ @consumer.expects(:request).returns(create_stub_http_response)
106
+
107
+ token = @consumer.get_request_token {{ :oauth_token => 'token', :oauth_token_secret => 'secret' }}
108
+
109
+ assert_equal 'token', token.token
110
+ assert_equal 'secret', token.secret
111
+ end
112
+
113
+ def test_that_block_is_not_mandatory_for_getting_an_access_token
114
+ stub_token = mock
115
+ @consumer.expects(:request).returns(create_stub_http_response("oauth_token=token&oauth_token_secret=secret"))
116
+
117
+ token = @consumer.get_access_token(stub_token)
118
+
119
+ assert_equal 'token', token.token
120
+ assert_equal 'secret', token.secret
121
+ end
122
+
123
+ def test_that_can_provide_a_block_to_interpret_an_access_token_response
124
+ stub_token = mock
125
+ @consumer.expects(:request).returns(create_stub_http_response)
126
+
127
+ token = @consumer.get_access_token(stub_token) {{ :oauth_token => 'token', :oauth_token_secret => 'secret' }}
128
+
129
+ assert_equal 'token', token.token
130
+ assert_equal 'secret', token.secret
131
+ end
132
+
133
+ def test_that_not_setting_ignore_callback_will_include_oauth_callback_in_request_options
134
+ request_options = {}
135
+ @consumer.stubs(:request).returns(create_stub_http_response)
136
+
137
+ @consumer.get_request_token(request_options) {{ :oauth_token => 'token', :oauth_token_secret => 'secret' }}
138
+
139
+ assert_equal 'oob', request_options[:oauth_callback]
140
+ end
141
+
142
+ def test_that_setting_ignore_callback_will_exclude_oauth_callback_in_request_options
143
+ request_options = { :exclude_callback=> true }
144
+ @consumer.stubs(:request).returns(create_stub_http_response)
145
+
146
+ @consumer.get_request_token(request_options) {{ :oauth_token => 'token', :oauth_token_secret => 'secret' }}
147
+
148
+ assert_nil request_options[:oauth_callback]
149
+ end
150
+
151
+ private
152
+
153
+ def create_stub_http_response expected_body=nil
154
+ stub_http_response = stub
155
+ stub_http_response.stubs(:code).returns(200)
156
+ stub_http_response.stubs(:body).tap {|expectation| expectation.returns(expected_body) unless expected_body.nil? }
157
+ return stub_http_response
158
+ end
159
+ end
@@ -0,0 +1,14 @@
1
+ require 'test/unit'
2
+
3
+ $LOAD_PATH << File.dirname(__FILE__) + '/../lib/'
4
+ require 'oauth'
5
+
6
+ # require File.dirname(__FILE__) + '/../lib/oauth'
7
+
8
+ begin
9
+ # load redgreen unless running from within TextMate (in which case ANSI
10
+ # color codes mess with the output)
11
+ require 'redgreen' unless ENV['TM_CURRENT_LINE']
12
+ rescue LoadError
13
+ nil
14
+ end
@@ -0,0 +1,20 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestSignatureHmacSha1 < Test::Unit::TestCase
4
+ def test_that_hmac_sha1_implements_hmac_sha1
5
+ assert OAuth::Signature.available_methods.include?('hmac-sha1')
6
+ end
7
+
8
+ def test_that_get_request_from_oauth_test_cases_produces_matching_signature
9
+ 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')
10
+
11
+ consumer = OAuth::Consumer.new('dpf43f3p2l4k3l03', 'kd94hf93k423kf44')
12
+ token = OAuth::Token.new('nnch734d00sl2jdk', 'pfkkdhi9sl3r4s00')
13
+
14
+ signature = OAuth::Signature.sign(request, { :consumer => consumer,
15
+ :token => token,
16
+ :uri => 'http://photos.example.net/photos' } )
17
+
18
+ assert_equal 'tR3+Ty81lMeYAr/Fid0kMTYa/WM=', signature
19
+ end
20
+ end
@@ -0,0 +1,221 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class NetHTTPClientTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @consumer = OAuth::Consumer.new('consumer_key_86cad9', '5888bf0345e5d237')
7
+ @token = OAuth::Token.new('token_411a7f', '3196ffd991c8ebdb')
8
+ @request_uri = URI.parse('http://example.com/test?key=value')
9
+ @request_parameters = { 'key' => 'value' }
10
+ @nonce = 225579211881198842005988698334675835446
11
+ @timestamp = "1199645624"
12
+ @http = Net::HTTP.new(@request_uri.host, @request_uri.port)
13
+ end
14
+
15
+ def test_that_using_auth_headers_on_get_requests_works
16
+ request = Net::HTTP::Get.new(@request_uri.path + "?" + request_parameters_to_s)
17
+ request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
18
+
19
+ assert_equal 'GET', request.method
20
+ assert_equal '/test?key=value', request.path
21
+ assert_equal "OAuth 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
22
+ end
23
+
24
+ def test_that_using_auth_headers_on_get_requests_works_with_plaintext
25
+ require 'oauth/signature/plaintext'
26
+ c = OAuth::Consumer.new('consumer_key_86cad9', '5888bf0345e5d237',{
27
+ :signature_method => 'PLAINTEXT'
28
+ })
29
+ request = Net::HTTP::Get.new(@request_uri.path + "?" + request_parameters_to_s)
30
+ request.oauth!(@http, c, @token, {:nonce => @nonce, :timestamp => @timestamp, :signature_method => 'PLAINTEXT'})
31
+
32
+ assert_equal 'GET', request.method
33
+ assert_equal '/test?key=value', request.path
34
+ assert_equal "OAuth oauth_nonce=\"225579211881198842005988698334675835446\", oauth_signature_method=\"PLAINTEXT\", oauth_token=\"token_411a7f\", oauth_timestamp=\"1199645624\", oauth_consumer_key=\"consumer_key_86cad9\", oauth_signature=\"5888bf0345e5d237%263196ffd991c8ebdb\", oauth_version=\"1.0\"".split(', ').sort, request['authorization'].split(', ').sort
35
+ end
36
+
37
+ def test_that_using_auth_headers_on_post_requests_works
38
+ request = Net::HTTP::Post.new(@request_uri.path)
39
+ request.set_form_data( @request_parameters )
40
+ request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
41
+
42
+ assert_equal 'POST', request.method
43
+ assert_equal '/test', request.path
44
+ assert_equal 'key=value', request.body
45
+ assert_equal "OAuth 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
46
+ end
47
+
48
+ def test_that_version_is_added_to_existing_user_agent
49
+ request = Net::HTTP::Post.new(@request_uri.path)
50
+ request['User-Agent'] = "MyApp"
51
+ request.set_form_data( @request_parameters )
52
+ request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
53
+
54
+ assert_equal "MyApp (OAuth gem v#{OAuth::VERSION})", request['User-Agent']
55
+ end
56
+
57
+ def test_that_version_is_set_when_no_user_agent
58
+ request = Net::HTTP::Post.new(@request_uri.path)
59
+ request.set_form_data( @request_parameters )
60
+ request.oauth!(@http, @consumer, @token, {:nonce => @nonce, :timestamp => @timestamp})
61
+
62
+ assert_equal "OAuth gem v#{OAuth::VERSION}", request['User-Agent']
63
+ end
64
+
65
+ def test_that_using_get_params_works
66
+ request = Net::HTTP::Get.new(@request_uri.path + "?" + request_parameters_to_s)
67
+ request.oauth!(@http, @consumer, @token, {:scheme => 'query_string', :nonce => @nonce, :timestamp => @timestamp})
68
+
69
+ assert_equal 'GET', request.method
70
+ uri = URI.parse(request.path)
71
+ assert_equal '/test', uri.path
72
+ assert_equal nil, uri.fragment
73
+ 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("&")
74
+ assert_equal nil, request['authorization']
75
+ end
76
+
77
+ def test_that_using_get_params_works_with_plaintext
78
+ request = Net::HTTP::Get.new(@request_uri.path + "?" + request_parameters_to_s)
79
+ request.oauth!(@http, @consumer, @token, {:scheme => 'query_string', :nonce => @nonce, :timestamp => @timestamp, :signature_method => 'PLAINTEXT'})
80
+
81
+ assert_equal 'GET', request.method
82
+ uri = URI.parse(request.path)
83
+ assert_equal '/test', uri.path
84
+ assert_equal nil, uri.fragment
85
+ assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=5888bf0345e5d237%263196ffd991c8ebdb&oauth_signature_method=PLAINTEXT&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", uri.query.split("&").sort.join("&")
86
+ assert_equal nil, request['authorization']
87
+ end
88
+
89
+ def test_that_using_post_params_works
90
+ request = Net::HTTP::Post.new(@request_uri.path)
91
+ request.set_form_data( @request_parameters )
92
+ request.oauth!(@http, @consumer, @token, {:scheme => 'body', :nonce => @nonce, :timestamp => @timestamp})
93
+
94
+ assert_equal 'POST', request.method
95
+ assert_equal '/test', request.path
96
+ 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("&")
97
+ assert_equal nil, request['authorization']
98
+ end
99
+
100
+ def test_that_using_post_params_works_with_plaintext
101
+ request = Net::HTTP::Post.new(@request_uri.path)
102
+ request.set_form_data( @request_parameters )
103
+ request.oauth!(@http, @consumer, @token, {:scheme => 'body', :nonce => @nonce, :timestamp => @timestamp, :signature_method => 'PLAINTEXT'})
104
+
105
+ assert_equal 'POST', request.method
106
+ assert_equal '/test', request.path
107
+ assert_equal "key=value&oauth_consumer_key=consumer_key_86cad9&oauth_nonce=225579211881198842005988698334675835446&oauth_signature=5888bf0345e5d237%263196ffd991c8ebdb&oauth_signature_method=PLAINTEXT&oauth_timestamp=1199645624&oauth_token=token_411a7f&oauth_version=1.0", request.body.split("&").sort.join("&")
108
+ assert_equal nil, request['authorization']
109
+ end
110
+
111
+ def test_that_using_post_with_uri_params_works
112
+ request = Net::HTTP::Post.new(@request_uri.path + "?" + request_parameters_to_s)
113
+ request.oauth!(@http, @consumer, @token, {:scheme => 'query_string', :nonce => @nonce, :timestamp => @timestamp})
114
+
115
+ assert_equal 'POST', request.method
116
+ uri = URI.parse(request.path)
117
+ assert_equal '/test', uri.path
118
+ assert_equal nil, uri.fragment
119
+ 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('&')
120
+ assert_equal nil, request.body
121
+ assert_equal nil, request['authorization']
122
+ end
123
+
124
+ def test_that_using_post_with_uri_and_form_params_works
125
+ request = Net::HTTP::Post.new(@request_uri.path + "?" + request_parameters_to_s)
126
+ request.set_form_data( { 'key2' => 'value2' } )
127
+ request.oauth!(@http, @consumer, @token, {:scheme => :query_string, :nonce => @nonce, :timestamp => @timestamp})
128
+
129
+ assert_equal 'POST', request.method
130
+ uri = URI.parse(request.path)
131
+ assert_equal '/test', uri.path
132
+ assert_equal nil, uri.fragment
133
+ 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('&')
134
+ assert_equal "key2=value2", request.body
135
+ assert_equal nil, request['authorization']
136
+ end
137
+
138
+
139
+ def test_example_from_specs
140
+ consumer=OAuth::Consumer.new("dpf43f3p2l4k3l03","kd94hf93k423kf44")
141
+ token = OAuth::Token.new('nnch734d00sl2jdk', 'pfkkdhi9sl3r4s00')
142
+ request_uri = URI.parse('http://photos.example.net/photos?file=vacation.jpg&size=original')
143
+ nonce = 'kllo9940pd9333jh'
144
+ timestamp = "1191242096"
145
+ http = Net::HTTP.new(request_uri.host, request_uri.port)
146
+
147
+ request = Net::HTTP::Get.new(request_uri.path + "?" + request_uri.query)
148
+ signature_base_string=request.signature_base_string(http, consumer, token, {:nonce => nonce, :timestamp => timestamp})
149
+ 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
150
+
151
+ # request = Net::HTTP::Get.new(request_uri.path + "?" + request_uri.query)
152
+ request.oauth!(http, consumer, token, {:nonce => nonce, :timestamp => timestamp,:realm=>"http://photos.example.net/"})
153
+
154
+ assert_equal 'GET', request.method
155
+ 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
156
+
157
+ end
158
+
159
+ def test_step_by_step_token_request
160
+ consumer=OAuth::Consumer.new(
161
+ "key",
162
+ "secret")
163
+ request_uri = URI.parse('http://term.ie/oauth/example/request_token.php')
164
+ nonce = rand(2**128).to_s
165
+ timestamp = Time.now.to_i.to_s
166
+ http = Net::HTTP.new(request_uri.host, request_uri.port)
167
+
168
+ request = Net::HTTP::Get.new(request_uri.path)
169
+ signature_base_string=request.signature_base_string(http, consumer, nil, {:scheme=>:query_string,:nonce => nonce, :timestamp => timestamp})
170
+ 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
171
+
172
+ # request = Net::HTTP::Get.new(request_uri.path)
173
+ request.oauth!(http, consumer, nil, {:scheme=>:query_string,:nonce => nonce, :timestamp => timestamp})
174
+ assert_equal 'GET', request.method
175
+ assert_nil request.body
176
+ assert_nil request['authorization']
177
+ # 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']
178
+
179
+ response=http.request(request)
180
+ assert_equal "200",response.code
181
+ # assert_equal request['authorization'],response.body
182
+ assert_equal "oauth_token=requestkey&oauth_token_secret=requestsecret",response.body
183
+ end
184
+
185
+ def test_that_put_bodies_not_signed
186
+ request = Net::HTTP::Put.new(@request_uri.path)
187
+ request.body = "<?xml version=\"1.0\"?><foo><bar>baz</bar></foo>"
188
+ request["Content-Type"] = "application/xml"
189
+ signature_base_string=request.signature_base_string(@http, @consumer, nil, { :nonce => @nonce, :timestamp => @timestamp })
190
+ 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
191
+ end
192
+
193
+ def test_that_put_bodies_not_signed_even_if_form_urlencoded
194
+ request = Net::HTTP::Put.new(@request_uri.path)
195
+ request.set_form_data( { 'key2' => 'value2' } )
196
+ signature_base_string=request.signature_base_string(@http, @consumer, nil, { :nonce => @nonce, :timestamp => @timestamp })
197
+ 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
198
+ end
199
+
200
+ def test_that_post_bodies_signed_if_form_urlencoded
201
+ request = Net::HTTP::Post.new(@request_uri.path)
202
+ request.set_form_data( { 'key2' => 'value2' } )
203
+ signature_base_string=request.signature_base_string(@http, @consumer, nil, { :nonce => @nonce, :timestamp => @timestamp })
204
+ 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
205
+ end
206
+
207
+ def test_that_post_bodies_not_signed_if_other_content_type
208
+ request = Net::HTTP::Post.new(@request_uri.path)
209
+ request.body = "<?xml version=\"1.0\"?><foo><bar>baz</bar></foo>"
210
+ request["Content-Type"] = "application/xml"
211
+ signature_base_string=request.signature_base_string(@http, @consumer, nil, { :nonce => @nonce, :timestamp => @timestamp })
212
+ 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
213
+ end
214
+
215
+ protected
216
+
217
+ def request_parameters_to_s
218
+ @request_parameters.map { |k,v| "#{k}=#{v}" }.join("&")
219
+ end
220
+
221
+ end