simple_oauth 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -1,9 +1,9 @@
1
1
  *.rbc
2
- .DS_Store
3
2
  .bundle
3
+ .DS_Store
4
4
  .yardoc
5
- Gemfile.lock
6
5
  coverage
7
6
  doc
7
+ Gemfile.lock
8
8
  pkg
9
9
  rdoc
@@ -3,6 +3,7 @@ rvm:
3
3
  - 1.8.7
4
4
  - 1.9.2
5
5
  - 1.9.3
6
+ - ruby-head
6
7
  - jruby-18mode
7
8
  - jruby-19mode
8
9
  - rbx-18mode
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'http://rubygems.org'
1
+ source 'https://rubygems.org'
2
2
 
3
3
  platforms :jruby do
4
4
  gem 'jruby-openssl', '~> 0.7'
@@ -1,4 +1,6 @@
1
- Copyright (c) 2010 Steve Richert, Erik Michaels-Ober.
1
+ Copyright (c) 2012 Steve Richert, Erik Michaels-Ober
2
+
3
+ MIT License
2
4
 
3
5
  Permission is hereby granted, free of charge, to any person obtaining
4
6
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -2,16 +2,14 @@
2
2
 
3
3
  Simply builds and verifies OAuth headers
4
4
 
5
- ## <a name="pulls"></a>Submitting a Pull Request
5
+ ## <a name="pulls"></a>Contributing
6
6
  1. Fork the project.
7
7
  2. Create a topic branch.
8
- 3. Implement your feature or bug fix.
9
- 4. Add documentation for your feature or bug fix.
10
- 5. Run <tt>bundle exec rake doc:yard</tt>. If your changes are not 100% documented, go back to step 4.
11
- 6. Add tests for your feature or bug fix.
12
- 7. Run <tt>bundle exec rake test</tt>. If your changes are not 100% covered, go back to step 6.
13
- 8. Commit and push your changes.
14
- 9. Submit a pull request. Please do not include changes to the gemspec or version file. (If you want to create your own version for some reason, please do so in a separate commit.)
8
+ 3. Add failing tests.
9
+ 4. Add code to pass the failing tests.
10
+ 5. Run `bundle exec rake`. If failing, repeat step 4.
11
+ 6. Commit and push your changes.
12
+ 7. Submit a pull request. Please do not include changes to the gemspec.
15
13
 
16
14
  ## <a name="rubies"></a>Supported Rubies
17
15
  This library aims to support and is [tested
@@ -21,6 +19,7 @@ implementations:
21
19
  * Ruby 1.8.7
22
20
  * Ruby 1.9.2
23
21
  * Ruby 1.9.3
22
+ # Ruby head
24
23
  * [JRuby](http://www.jruby.org/)
25
24
  * [Rubinius](http://rubini.us/)
26
25
 
@@ -40,4 +39,4 @@ time of a major release, support for that Ruby version may be dropped.
40
39
 
41
40
  ## <a name="copyright"></a>Copyright
42
41
  Copyright (c) 2010 Steve Richert, Erik Michaels-Ober.
43
- See [LICENSE](https://github.com/laserlemon/simple_oauth/blob/master/LICENSE.md) for details.
42
+ See [LICENSE](https://github.com/laserlemon/simple_oauth/blob/master/LICENSE) for details.
data/Rakefile CHANGED
@@ -1,24 +1,8 @@
1
1
  #!/usr/bin/env rake
2
2
 
3
- require 'bundler'
4
- Bundler::GemHelper.install_tasks
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
5
 
6
- require 'rake/testtask'
7
- Rake::TestTask.new do |test|
8
- test.libs << 'lib' << 'test'
9
- test.pattern = 'test/**/*_test.rb'
10
- test.verbose = true
11
- end
6
+ RSpec::Core::RakeTask.new(:spec)
12
7
 
13
- task :default => :test
14
-
15
- namespace :doc do
16
- require 'yard'
17
- YARD::Rake::YardocTask.new do |task|
18
- task.files = ['README.md', 'LICENSE.md', 'lib/**/*.rb']
19
- task.options = [
20
- '--output-dir', 'doc/yard',
21
- '--markup', 'markdown',
22
- ]
23
- end
24
- end
8
+ task :default => :spec
@@ -1,6 +1 @@
1
- require 'base64'
2
- require 'cgi'
3
- require 'openssl'
4
- require 'uri'
5
- require 'simple_oauth/core_ext/object'
6
1
  require 'simple_oauth/header'
@@ -1,3 +1,8 @@
1
+ require 'openssl'
2
+ require 'uri'
3
+ require 'base64'
4
+ require 'cgi'
5
+
1
6
  module SimpleOAuth
2
7
  class Header
3
8
  ATTRIBUTE_KEYS = [:consumer_key, :nonce, :signature_method, :timestamp, :token, :version] unless defined? ::SimpleOAuth::Header::ATTRIBUTE_KEYS
@@ -30,17 +35,18 @@ module SimpleOAuth
30
35
 
31
36
  def initialize(method, url, params, oauth = {})
32
37
  @method = method.to_s.upcase
33
- @uri = URI.parse(url.to_s).tap do |uri|
34
- uri.scheme = uri.scheme.downcase
35
- uri.normalize!
36
- uri.fragment = nil
37
- end
38
+ @uri = URI.parse(url.to_s)
39
+ @uri.scheme = @uri.scheme.downcase
40
+ @uri.normalize!
41
+ @uri.fragment = nil
38
42
  @params = params
39
43
  @options = oauth.is_a?(Hash) ? self.class.default_options.merge(oauth) : self.class.parse(oauth)
40
44
  end
41
45
 
42
46
  def url
43
- @uri.dup.tap{|u| u.query = nil }.to_s
47
+ uri = @uri.dup
48
+ uri.query = nil
49
+ uri.to_s
44
50
  end
45
51
 
46
52
  def to_s
@@ -95,7 +101,7 @@ module SimpleOAuth
95
101
  end
96
102
 
97
103
  def url_params
98
- CGI.parse(@uri.query || '').inject([]){|p,(k,vs)| p + vs.map{|v| [k, v] } }
104
+ CGI.parse(@uri.query || '').inject([]){|p,(k,vs)| p + vs.sort.map{|v| [k, v] } }
99
105
  end
100
106
 
101
107
  def rsa_sha1_signature
@@ -1,20 +1,20 @@
1
1
  # encoding: utf-8
2
- require File.expand_path('../lib/simple_oauth/version', __FILE__)
3
2
 
4
3
  Gem::Specification.new do |gem|
5
- gem.add_development_dependency 'minitest'
6
- gem.add_development_dependency 'mocha', '~> 0.10.0'
4
+ gem.name = 'simple_oauth'
5
+ gem.version = '0.1.7'
6
+
7
+ gem.authors = ["Steve Richert", "Erik Michaels-Ober"]
8
+ gem.email = ['steve.richert@gmail.com', 'sferik@gmail.com']
9
+ gem.description = 'Simply builds and verifies OAuth headers'
10
+ gem.summary = gem.description
11
+ gem.homepage = 'https://github.com/laserlemon/simple_oauth'
12
+
7
13
  gem.add_development_dependency 'rake'
14
+ gem.add_development_dependency 'rspec', '~> 2.0'
8
15
  gem.add_development_dependency 'simplecov'
9
- gem.add_development_dependency 'yard'
10
- gem.authors = ["Steve Richert", "Erik Michaels-Ober"]
11
- gem.description = 'Simply builds and verifies OAuth headers'
12
- gem.email = ['steve.richert@gmail.com', 'sferik@gmail.com']
13
- gem.files = `git ls-files`.split("\n")
14
- gem.homepage = 'http://github.com/laserlemon/simple_oauth'
15
- gem.name = 'simple_oauth'
16
- gem.required_rubygems_version = Gem::Requirement.new('>= 1.3.6')
17
- gem.summary = gem.description
18
- gem.test_files = `git ls-files -- test/**/*_test.rb`.split("\n")
19
- gem.version = SimpleOAuth::Version::STRING
16
+
17
+ gem.files = `git ls-files`.split($\)
18
+ gem.test_files = gem.files.grep(/^test\//)
19
+ gem.require_paths = ["lib"]
20
20
  end
@@ -0,0 +1,354 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe SimpleOAuth::Header do
6
+ describe '.default_options' do
7
+ let(:default_options){ SimpleOAuth::Header.default_options }
8
+
9
+ it 'is different every time' do
10
+ SimpleOAuth::Header.default_options.should_not == default_options
11
+ end
12
+
13
+ it 'is used for new headers' do
14
+ SimpleOAuth::Header.stub(:default_options => default_options)
15
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {})
16
+ header.options.should == default_options
17
+ end
18
+
19
+ it 'includes a signature method and an OAuth version' do
20
+ default_options[:signature_method].should_not be_nil
21
+ default_options[:version].should_not be_nil
22
+ end
23
+ end
24
+
25
+ describe '.encode' do
26
+ it 'encodes (most) non-word characters' do
27
+ [' ', '!', '@', '#', '$', '%', '^', '&'].each do |character|
28
+ encoded = SimpleOAuth::Header.encode(character)
29
+ encoded.should_not == character
30
+ encoded.should == URI.encode(character, /.*/)
31
+ end
32
+ end
33
+
34
+ it 'does not encode - . or ~' do
35
+ ['-', '.', '~'].each do |character|
36
+ encoded = SimpleOAuth::Header.encode(character)
37
+ encoded.should == character
38
+ end
39
+ end
40
+
41
+ def self.test_special_characters
42
+ it 'encodes non-ASCII characters' do
43
+ SimpleOAuth::Header.encode('é').should == '%C3%A9'
44
+ end
45
+
46
+ it 'encodes multibyte characters' do
47
+ SimpleOAuth::Header.encode('あ').should == '%E3%81%82'
48
+ end
49
+ end
50
+
51
+ if RUBY_VERSION >= '1.9'
52
+ test_special_characters
53
+ else
54
+ %w(n N e E s S u U).each do |kcode|
55
+ describe %(when $KCODE = "#{kcode}") do
56
+ original_kcode = $KCODE
57
+ begin
58
+ $KCODE = kcode
59
+ test_special_characters
60
+ ensure
61
+ $KCODE = original_kcode
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+
68
+ describe '.decode' do
69
+ pending
70
+ end
71
+
72
+ describe '.parse' do
73
+ let(:header){ SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}) }
74
+ let(:parsed_options){ SimpleOAuth::Header.parse(header) }
75
+
76
+ it 'returns a hash' do
77
+ parsed_options.should be_a(Hash)
78
+ end
79
+
80
+ it 'includes the options used to build the header' do
81
+ parsed_options.reject{|k,_| k == :signature }.should == header.options
82
+ end
83
+
84
+ it 'includes a signature' do
85
+ header.options.should_not have_key(:signature)
86
+ parsed_options.should have_key(:signature)
87
+ parsed_options[:signature].should_not be_nil
88
+ end
89
+ end
90
+
91
+ describe '#initialize' do
92
+ let(:header){ SimpleOAuth::Header.new(:get, 'HTTPS://api.TWITTER.com:443/1/statuses/friendships.json?foo=bar#anchor', {}) }
93
+
94
+ it 'stringifies and uppercases the request method' do
95
+ header.method.should == 'GET'
96
+ end
97
+
98
+ it 'downcases the scheme and authority' do
99
+ header.url.should =~ %r(^https://api\.twitter\.com/)
100
+ end
101
+
102
+ it 'ignores the query and fragment' do
103
+ header.url.should =~ %r(/1/statuses/friendships\.json$)
104
+ end
105
+ end
106
+
107
+ describe '#valid?' do
108
+ context 'using the HMAC-SHA1 signature method' do
109
+ it 'requires consumer and token secrets' do
110
+ secrets = {:consumer_secret => 'CONSUMER_SECRET', :token_secret => 'TOKEN_SECRET'}
111
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, secrets)
112
+ parsed_header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, header)
113
+ parsed_header.should_not be_valid
114
+ parsed_header.should be_valid(secrets)
115
+ end
116
+ end
117
+
118
+ context 'using the RSA-SHA1 signature method' do
119
+ it 'requires an identical private key' do
120
+ secrets = {:consumer_secret => rsa_private_key}
121
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, secrets.merge(:signature_method => 'RSA-SHA1'))
122
+ parsed_header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, header)
123
+ expect{ parsed_header.valid? }.to raise_error(TypeError)
124
+ parsed_header.should be_valid(secrets)
125
+ end
126
+ end
127
+
128
+ context 'using the RSA-SHA1 signature method' do
129
+ it 'requires consumer and token secrets' do
130
+ secrets = {:consumer_secret => 'CONSUMER_SECRET', :token_secret => 'TOKEN_SECRET'}
131
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, secrets.merge(:signature_method => 'PLAINTEXT'))
132
+ parsed_header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, header)
133
+ parsed_header.should_not be_valid
134
+ parsed_header.should be_valid(secrets)
135
+ end
136
+ end
137
+ end
138
+
139
+ describe '#normalized_attributes' do
140
+ let(:header){ SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}) }
141
+ let(:normalized_attributes){ header.send(:normalized_attributes) }
142
+
143
+ it 'returns a sorted-key, quoted-value and comma-separated list' do
144
+ header.stub(:signed_attributes => {:d => 1, :c => 2, :b => 3, :a => 4})
145
+ normalized_attributes.should == 'a="4", b="3", c="2", d="1"'
146
+ end
147
+
148
+ it 'url-encodes its values' do
149
+ header.stub(:signed_attributes => {1 => '!', 2 => '@', 3 => '#', 4 => '$'})
150
+ normalized_attributes.should == '1="%21", 2="%40", 3="%23", 4="%24"'
151
+ end
152
+ end
153
+
154
+ describe '#signed_attributes' do
155
+ it 'includes the OAuth signature' do
156
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {})
157
+ header.send(:signed_attributes).should have_key(:oauth_signature)
158
+ end
159
+ end
160
+
161
+ describe '#attributes' do
162
+ let(:header) do
163
+ options = {}
164
+ SimpleOAuth::Header::ATTRIBUTE_KEYS.each{|k| options[k] = k.to_s.upcase }
165
+ options[:other] = 'OTHER'
166
+ SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {}, options)
167
+ end
168
+ let(:attributes){ header.send(:attributes) }
169
+
170
+ it 'prepends keys with "oauth_"' do
171
+ attributes.keys.should be_all{|k| k.to_s =~ /^oauth_/ }
172
+ end
173
+
174
+ it 'excludes keys not included in the list of valid attributes' do
175
+ attributes.keys.should be_all{|k| k.is_a?(Symbol) }
176
+ attributes.should_not have_key(:oauth_other)
177
+ end
178
+
179
+ it 'preserves values for valid keys' do
180
+ attributes.size.should == SimpleOAuth::Header::ATTRIBUTE_KEYS.size
181
+ attributes.should be_all{|k,v| k.to_s == "oauth_#{v.downcase}" }
182
+ end
183
+ end
184
+
185
+ describe '#signature' do
186
+ context 'calls the appropriate signature method' do
187
+ specify 'when using HMAC-SHA1' do
188
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, :signature_method => 'HMAC-SHA1')
189
+ header.should_receive(:hmac_sha1_signature).once.and_return('HMAC_SHA1_SIGNATURE')
190
+ header.send(:signature).should == 'HMAC_SHA1_SIGNATURE'
191
+ end
192
+
193
+ specify 'when using RSA-SHA1' do
194
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, :signature_method => 'RSA-SHA1')
195
+ header.should_receive(:rsa_sha1_signature).once.and_return('RSA_SHA1_SIGNATURE')
196
+ header.send(:signature).should == 'RSA_SHA1_SIGNATURE'
197
+ end
198
+
199
+ specify 'when using PLAINTEXT' do
200
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, :signature_method => 'PLAINTEXT')
201
+ header.should_receive(:plaintext_signature).once.and_return('PLAINTEXT_SIGNATURE')
202
+ header.send(:signature).should == 'PLAINTEXT_SIGNATURE'
203
+ end
204
+ end
205
+ end
206
+
207
+ describe '#hmac_sha1_signature' do
208
+ it 'reproduces a successful Twitter GET' do
209
+ options = {
210
+ :consumer_key => '8karQBlMg6gFOwcf8kcoYw',
211
+ :consumer_secret => '3d0vcHyUiiqADpWxolW8nlDIpSWMlyK7YNgc5Qna2M',
212
+ :nonce => '547fed103e122eecf84c080843eedfe6',
213
+ :signature_method => 'HMAC-SHA1',
214
+ :timestamp => '1286830180',
215
+ :token => '201425800-Sv4sTcgoffmHGkTCue0JnURT8vrm4DiFAkeFNDkh',
216
+ :token_secret => 'T5qa1tF57tfDzKmpM89DHsNuhgOY4NT6DlNLsTFcuQ'
217
+ }
218
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, options)
219
+ header.to_s.should == 'OAuth oauth_consumer_key="8karQBlMg6gFOwcf8kcoYw", oauth_nonce="547fed103e122eecf84c080843eedfe6", oauth_signature="i9CT6ahDRAlfGX3hKYf78QzXsaw%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1286830180", oauth_token="201425800-Sv4sTcgoffmHGkTCue0JnURT8vrm4DiFAkeFNDkh", oauth_version="1.0"'
220
+ end
221
+
222
+ it 'reproduces a successful Twitter POST' do
223
+ options = {
224
+ :consumer_key => '8karQBlMg6gFOwcf8kcoYw',
225
+ :consumer_secret => '3d0vcHyUiiqADpWxolW8nlDIpSWMlyK7YNgc5Qna2M',
226
+ :nonce => 'b40a3e0f18590ecdcc0e273f7d7c82f8',
227
+ :signature_method => 'HMAC-SHA1',
228
+ :timestamp => '1286830181',
229
+ :token => '201425800-Sv4sTcgoffmHGkTCue0JnURT8vrm4DiFAkeFNDkh',
230
+ :token_secret => 'T5qa1tF57tfDzKmpM89DHsNuhgOY4NT6DlNLsTFcuQ'
231
+ }
232
+ header = SimpleOAuth::Header.new(:post, 'https://api.twitter.com/1/statuses/update.json', {:status => 'hi, again'}, options)
233
+ header.to_s.should == 'OAuth oauth_consumer_key="8karQBlMg6gFOwcf8kcoYw", oauth_nonce="b40a3e0f18590ecdcc0e273f7d7c82f8", oauth_signature="mPqSFKejrWWk3ZT9bTQjhO5b2xI%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1286830181", oauth_token="201425800-Sv4sTcgoffmHGkTCue0JnURT8vrm4DiFAkeFNDkh", oauth_version="1.0"'
234
+ end
235
+ end
236
+
237
+ describe '#secret' do
238
+ let(:header){ SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {}) }
239
+ let(:secret){ header.send(:secret) }
240
+
241
+ it 'combines the consumer and token secrets with an ampersand' do
242
+ header.stub(:options => {:consumer_secret => 'CONSUMER_SECRET', :token_secret => 'TOKEN_SECRET'})
243
+ secret.should == 'CONSUMER_SECRET&TOKEN_SECRET'
244
+ end
245
+
246
+ it 'URL encodes each secret value before combination' do
247
+ header.stub(:options => {:consumer_secret => 'CONSUM#R_SECRET', :token_secret => 'TOKEN_S#CRET'})
248
+ secret.should == 'CONSUM%23R_SECRET&TOKEN_S%23CRET'
249
+ end
250
+ end
251
+
252
+ describe '#signature_base' do
253
+ let(:header){ SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {}) }
254
+ let(:signature_base){ header.send(:signature_base) }
255
+
256
+ it 'combines the request method, URL and normalized parameters using ampersands' do
257
+ header.stub(:method => 'METHOD', :url => 'URL', :normalized_params => 'NORMALIZED_PARAMS')
258
+ signature_base.should == 'METHOD&URL&NORMALIZED_PARAMS'
259
+ end
260
+
261
+ it 'URL encodes each value before combination' do
262
+ header.stub(:method => 'ME#HOD', :url => 'U#L', :normalized_params => 'NORMAL#ZED_PARAMS')
263
+ signature_base.should == 'ME%23HOD&U%23L&NORMAL%23ZED_PARAMS'
264
+ end
265
+ end
266
+
267
+ describe '#normalized_params' do
268
+ let(:header) do
269
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {})
270
+ header.stub(:signature_params => [['A', '4'], ['B', '3'], ['B', '2'], ['C', '1'], ['D[]', '0 ']])
271
+ header
272
+ end
273
+ let(:signature_params){ header.send(:signature_params) }
274
+ let(:normalized_params){ header.send(:normalized_params) }
275
+
276
+ it 'joins key/value pairs with equal signs and ampersands' do
277
+ normalized_params.should be_a(String)
278
+ parts = normalized_params.split('&')
279
+ parts.size.should == signature_params.size
280
+ pairs = parts.map{|p| p.split('=') }
281
+ pairs.should be_all{|p| p.size == 2 }
282
+ end
283
+ end
284
+
285
+ describe '#signature_params' do
286
+ let(:header){ SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {}) }
287
+ let(:signature_params){ header.send(:signature_params) }
288
+
289
+ it 'combines OAuth header attributes, body parameters and URL parameters into an flattened array of key/value pairs' do
290
+ header.stub(
291
+ :attributes => {:attribute => 'ATTRIBUTE'},
292
+ :params => {'param' => 'PARAM'},
293
+ :url_params => [['url_param', '1'], ['url_param', '2']]
294
+ )
295
+ signature_params.should == [
296
+ [:attribute, 'ATTRIBUTE'],
297
+ ['param', 'PARAM'],
298
+ ['url_param', '1'],
299
+ ['url_param', '2']
300
+ ]
301
+ end
302
+ end
303
+
304
+ describe '#url_params' do
305
+ it 'returns an empty array when the URL has no query parameters' do
306
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {})
307
+ header.send(:url_params).should == []
308
+ end
309
+
310
+ it 'returns an array of key/value pairs for each query parameter' do
311
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json?test=TEST', {})
312
+ header.send(:url_params).should == [['test', 'TEST']]
313
+ end
314
+
315
+ it 'sorts values for repeated keys' do
316
+ header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json?test=3&test=1&test=2', {})
317
+ header.send(:url_params).should == [['test', '1'], ['test', '2'], ['test', '3']]
318
+ end
319
+ end
320
+
321
+ describe '#rsa_sha1_signature' do
322
+ it 'reproduces a successful OAuth example GET' do
323
+ options = {
324
+ :consumer_key => 'dpf43f3p2l4k3l03',
325
+ :consumer_secret => rsa_private_key,
326
+ :nonce => '13917289812797014437',
327
+ :signature_method => 'RSA-SHA1',
328
+ :timestamp => '1196666512'
329
+ }
330
+ header = SimpleOAuth::Header.new(:get, 'http://photos.example.net/photos', {:file => 'vacaction.jpg', :size => 'original'}, options)
331
+ header.to_s.should == 'OAuth oauth_consumer_key="dpf43f3p2l4k3l03", oauth_nonce="13917289812797014437", oauth_signature="jvTp%2FwX1TYtByB1m%2BPbyo0lnCOLIsyGCH7wke8AUs3BpnwZJtAuEJkvQL2%2F9n4s5wUmUl4aCI4BwpraNx4RtEXMe5qg5T1LVTGliMRpKasKsW%2F%2Fe%2BRinhejgCuzoH26dyF8iY2ZZ%2F5D1ilgeijhV%2FvBka5twt399mXwaYdCwFYE%3D", oauth_signature_method="RSA-SHA1", oauth_timestamp="1196666512", oauth_version="1.0"'
332
+ end
333
+ end
334
+
335
+ describe '#private_key' do
336
+ pending
337
+ end
338
+
339
+ describe '#plaintext_signature' do
340
+ it 'reproduces a successful OAuth example GET' do
341
+ options = {
342
+ :consumer_key => 'abcd',
343
+ :consumer_secret => 'efgh',
344
+ :nonce => 'oLKtec51GQy',
345
+ :signature_method => 'PLAINTEXT',
346
+ :timestamp => '1286977095',
347
+ :token => 'ijkl',
348
+ :token_secret => 'mnop'
349
+ }
350
+ header = SimpleOAuth::Header.new(:get, 'http://host.net/resource?name=value', {:name => 'value'}, options)
351
+ header.to_s.should == 'OAuth oauth_consumer_key="abcd", oauth_nonce="oLKtec51GQy", oauth_signature="efgh%26mnop", oauth_signature_method="PLAINTEXT", oauth_timestamp="1286977095", oauth_token="ijkl", oauth_version="1.0"'
352
+ end
353
+ end
354
+ end
@@ -3,8 +3,6 @@ unless ENV['CI']
3
3
  SimpleCov.start
4
4
  end
5
5
 
6
- require 'bundler'
7
- Bundler.setup
8
- require 'test/unit'
9
- require 'mocha'
10
6
  require 'simple_oauth'
7
+
8
+ Dir[File.expand_path('../support/**/*.rb', __FILE__)].each{|f| require f }
@@ -0,0 +1,11 @@
1
+ module RSAHelpers
2
+ PRIVATE_KEY_PATH = File.expand_path('../fixtures/rsa-private-key', __FILE__)
3
+
4
+ def rsa_private_key
5
+ @rsa_private_key ||= File.read(PRIVATE_KEY_PATH)
6
+ end
7
+ end
8
+
9
+ RSpec.configure do |config|
10
+ config.include RSAHelpers
11
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_oauth
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ cert_chain: []
13
13
  date: 2012-04-23 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: minitest
16
+ name: rake
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
@@ -29,13 +29,13 @@ dependencies:
29
29
  - !ruby/object:Gem::Version
30
30
  version: '0'
31
31
  - !ruby/object:Gem::Dependency
32
- name: mocha
32
+ name: rspec
33
33
  requirement: !ruby/object:Gem::Requirement
34
34
  none: false
35
35
  requirements:
36
36
  - - ~>
37
37
  - !ruby/object:Gem::Version
38
- version: 0.10.0
38
+ version: '2.0'
39
39
  type: :development
40
40
  prerelease: false
41
41
  version_requirements: !ruby/object:Gem::Requirement
@@ -43,23 +43,7 @@ dependencies:
43
43
  requirements:
44
44
  - - ~>
45
45
  - !ruby/object:Gem::Version
46
- version: 0.10.0
47
- - !ruby/object:Gem::Dependency
48
- name: rake
49
- requirement: !ruby/object:Gem::Requirement
50
- none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- type: :development
56
- prerelease: false
57
- version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
- requirements:
60
- - - ! '>='
61
- - !ruby/object:Gem::Version
62
- version: '0'
46
+ version: '2.0'
63
47
  - !ruby/object:Gem::Dependency
64
48
  name: simplecov
65
49
  requirement: !ruby/object:Gem::Requirement
@@ -76,22 +60,6 @@ dependencies:
76
60
  - - ! '>='
77
61
  - !ruby/object:Gem::Version
78
62
  version: '0'
79
- - !ruby/object:Gem::Dependency
80
- name: yard
81
- requirement: !ruby/object:Gem::Requirement
82
- none: false
83
- requirements:
84
- - - ! '>='
85
- - !ruby/object:Gem::Version
86
- version: '0'
87
- type: :development
88
- prerelease: false
89
- version_requirements: !ruby/object:Gem::Requirement
90
- none: false
91
- requirements:
92
- - - ! '>='
93
- - !ruby/object:Gem::Version
94
- version: '0'
95
63
  description: Simply builds and verifies OAuth headers
96
64
  email:
97
65
  - steve.richert@gmail.com
@@ -105,19 +73,17 @@ files:
105
73
  - .travis.yml
106
74
  - .yardopts
107
75
  - Gemfile
108
- - LICENSE.md
76
+ - LICENSE
109
77
  - README.md
110
78
  - Rakefile
111
- - init.rb
112
79
  - lib/simple_oauth.rb
113
- - lib/simple_oauth/core_ext/object.rb
114
80
  - lib/simple_oauth/header.rb
115
- - lib/simple_oauth/version.rb
116
81
  - simple_oauth.gemspec
117
- - test/helper.rb
118
- - test/rsa_private_key
119
- - test/simple_oauth_test.rb
120
- homepage: http://github.com/laserlemon/simple_oauth
82
+ - spec/simple_oauth/header_spec.rb
83
+ - spec/spec_helper.rb
84
+ - spec/support/fixtures/rsa-private-key
85
+ - spec/support/rsa.rb
86
+ homepage: https://github.com/laserlemon/simple_oauth
121
87
  licenses: []
122
88
  post_install_message:
123
89
  rdoc_options: []
@@ -134,10 +100,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
100
  requirements:
135
101
  - - ! '>='
136
102
  - !ruby/object:Gem::Version
137
- version: 1.3.6
103
+ version: '0'
138
104
  requirements: []
139
105
  rubyforge_project:
140
- rubygems_version: 1.8.23
106
+ rubygems_version: 1.8.21
141
107
  signing_key:
142
108
  specification_version: 3
143
109
  summary: Simply builds and verifies OAuth headers
data/init.rb DELETED
@@ -1 +0,0 @@
1
- require File.expand_path('../lib/simple_oauth', __FILE__)
@@ -1,10 +0,0 @@
1
- major, minor, patch = RUBY_VERSION.split('.')
2
-
3
- if major.to_i == 1 && minor.to_i == 8 && patch.to_i <= 6
4
- class Object
5
- def tap
6
- yield self
7
- self
8
- end
9
- end
10
- end
@@ -1,8 +0,0 @@
1
- module SimpleOAuth
2
- module Version
3
- MAJOR = 0 unless defined? ::SimpleOAuth::Version::MAJOR
4
- MINOR = 1 unless defined? ::SimpleOAuth::Version::MINOR
5
- PATCH = 6 unless defined? ::SimpleOAuth::Version::PATCH
6
- STRING = [MAJOR, MINOR, PATCH].join('.') unless defined? ::SimpleOAuth::Version::STRING
7
- end
8
- end
@@ -1,309 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- require 'helper'
3
-
4
- class SimpleOAuthTest < Test::Unit::TestCase
5
- def test_default_options
6
- # Default header options should change with each call due to generation of
7
- # a unique "timestamp" and "nonce" value combination.
8
- default_options = SimpleOAuth::Header.default_options
9
- assert_not_equal default_options, SimpleOAuth::Header.default_options
10
-
11
- SimpleOAuth::Header.stubs(:default_options).returns(default_options)
12
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {})
13
-
14
- # Given no options argument, header options defer to the default options.
15
- assert_equal default_options, header.options
16
-
17
- # Default options should include a signature method and the OAuth version.
18
- assert_equal 'HMAC-SHA1', default_options[:signature_method]
19
- assert_equal '1.0', default_options[:version]
20
- end
21
-
22
- def test_encode
23
- # Non-word characters should be URL encoded...
24
- [' ', '!', '@', '#', '$', '%', '^', '&'].each do |character|
25
- encoded = SimpleOAuth::Header.encode(character)
26
- assert_not_equal character, encoded
27
- assert_equal URI.encode(character, /.*/), encoded
28
- end
29
-
30
- # ...except for the "-", "." and "~" characters.
31
- ['-', '.', '~'].each do |character|
32
- assert_equal character, SimpleOAuth::Header.encode(character)
33
- end
34
-
35
- major, minor, patch = RUBY_VERSION.split('.')
36
- new_ruby = major.to_i >= 2 || major.to_i == 1 && minor.to_i >= 9
37
- old_kcode = $KCODE if !new_ruby
38
- begin
39
- %w(n N e E s S u U).each do |kcode|
40
- $KCODE = kcode if !new_ruby
41
- assert_equal '%E3%81%82', SimpleOAuth::Header.encode('あ'), "Failed to correctly escape Japanese under $KCODE = #{kcode}"
42
- assert_equal '%C3%A9', SimpleOAuth::Header.encode('é'), "Failed to correctly escape e+acute under $KCODE = #{kcode}"
43
- end
44
- ensure
45
- $KCODE = old_kcode if !new_ruby
46
- end
47
- end
48
-
49
- def test_decode
50
- # Pending
51
- end
52
-
53
- def test_parse
54
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {})
55
- parsed_options = SimpleOAuth::Header.parse(header)
56
-
57
- # Parsed options should be a Hash.
58
- assert_kind_of Hash, parsed_options
59
-
60
- # Parsed options should equal the options used to build the header, along
61
- # with the additional signature.
62
- assert_equal header.options, parsed_options.reject{|k,v| k == :signature }
63
- end
64
-
65
- def test_initialize
66
- header = SimpleOAuth::Header.new(:get, 'HTTPS://api.TWITTER.com:443/1/statuses/friendships.json#anchor', {})
67
-
68
- # HTTP method should be an uppercase string.
69
- #
70
- # See: http://oauth.net/core/1.0/#rfc.section.9.1.3
71
- assert_equal 'GET', header.method
72
-
73
- # Request URL should downcase the scheme and authority parts as well as
74
- # remove the query and fragment parts.
75
- #
76
- # See: http://oauth.net/core/1.0/#rfc.section.9.1.2
77
- assert_equal 'https://api.twitter.com/1/statuses/friendships.json', header.url
78
- end
79
-
80
- def test_url
81
- # Pending
82
- end
83
-
84
- def test_to_s
85
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {})
86
- assert_equal "OAuth #{header.send(:normalized_attributes)}", header.to_s
87
- end
88
-
89
- def test_valid?
90
- # When given consumer and token secrets, those secrets must be passed into
91
- # the parsed header validation in order for the validity check to pass.
92
- secrets = {:consumer_secret => 'CONSUMER_SECRET', :token_secret => 'TOKEN_SECRET'}
93
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, secrets)
94
- parsed_header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, header)
95
- assert !parsed_header.valid?
96
- assert parsed_header.valid?(secrets)
97
-
98
- # Using the RSA-SHA1 signature method, the consumer secret must be a valid
99
- # RSA private key. When parsing the header on the server side, the same
100
- # consumer secret must be included in order for the header to validate.
101
- secrets = {:consumer_secret => File.read('test/rsa_private_key')}
102
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, secrets.merge(:signature_method => 'RSA-SHA1'))
103
- parsed_header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, header)
104
- assert_raise(TypeError){ parsed_header.valid? }
105
- assert parsed_header.valid?(secrets)
106
-
107
- # Like the default HMAC-RSA1 signature method, the PLAINTEXT method
108
- # requires use of both a consumer secret and a token secret. A parsed
109
- # header will not validate without these secret values.
110
- secrets = {:consumer_secret => 'CONSUMER_SECRET', :token_secret => 'TOKEN_SECRET'}
111
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, secrets.merge(:signature_method => 'PLAINTEXT'))
112
- parsed_header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, header)
113
- assert !parsed_header.valid?
114
- assert parsed_header.valid?(secrets)
115
- end
116
-
117
- def test_normalized_attributes
118
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {})
119
- header.stubs(:signed_attributes).returns(:d => 1, :c => 2, :b => 3, :a => 4)
120
-
121
- # Should return the OAuth header attributes, sorted by name, with quoted
122
- # values and comma-separated.
123
- assert_equal 'a="4", b="3", c="2", d="1"', header.send(:normalized_attributes)
124
-
125
- # Values should also be URL encoded.
126
- header.stubs(:signed_attributes).returns(1 => '!', 2 => '@', 3 => '#', 4 => '$')
127
- assert_equal '1="%21", 2="%40", 3="%23", 4="%24"', header.send(:normalized_attributes)
128
- end
129
-
130
- def test_signed_attributes
131
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {})
132
- assert header.send(:signed_attributes).keys.include?(:oauth_signature)
133
- end
134
-
135
- def test_attributes
136
- attribute_options = SimpleOAuth::Header::ATTRIBUTE_KEYS.inject({}){|o,a| o.merge(a => a.to_s.upcase) }
137
- options = attribute_options.merge(:other => 'OTHER')
138
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {}, options)
139
- attributes = header.send(:attributes)
140
-
141
- # OAuth header attributes are all to begin with the "oauth_" prefix.
142
- assert attributes.all?{|k,v| k.to_s =~ /^oauth_/ }
143
-
144
- # Custom options not included in the list of valid attribute keys should
145
- # not be included in the header attributes.
146
- assert !attributes.key?(:oauth_other)
147
-
148
- # Valid attribute option values should be preserved.
149
- assert_equal attribute_options.size, attributes.size
150
- assert attributes.all?{|k,v| k.to_s == "oauth_#{v.downcase}" }
151
- end
152
-
153
- def test_signature
154
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, :signature_method => 'HMAC-SHA1')
155
- header.expects(:hmac_sha1_signature).once.returns('HMAC_SHA1_SIGNATURE')
156
- assert_equal 'HMAC_SHA1_SIGNATURE', header.send(:signature)
157
-
158
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, :signature_method => 'RSA-SHA1')
159
- header.expects(:rsa_sha1_signature).once.returns('RSA_SHA1_SIGNATURE')
160
- assert_equal 'RSA_SHA1_SIGNATURE', header.send(:signature)
161
-
162
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, :signature_method => 'PLAINTEXT')
163
- header.expects(:plaintext_signature).once.returns('PLAINTEXT_SIGNATURE')
164
- assert_equal 'PLAINTEXT_SIGNATURE', header.send(:signature)
165
- end
166
-
167
- def test_hmac_sha1_signature
168
- # Reproduce an actual successful call to the Twitter API using the
169
- # HMAC-SHA1 signature method, GETting a list of friends.
170
- options = {
171
- :consumer_key => '8karQBlMg6gFOwcf8kcoYw',
172
- :consumer_secret => '3d0vcHyUiiqADpWxolW8nlDIpSWMlyK7YNgc5Qna2M',
173
- :nonce => '547fed103e122eecf84c080843eedfe6',
174
- #:signature_method => 'HMAC-SHA1',
175
- :timestamp => '1286830180',
176
- :token => '201425800-Sv4sTcgoffmHGkTCue0JnURT8vrm4DiFAkeFNDkh',
177
- :token_secret => 'T5qa1tF57tfDzKmpM89DHsNuhgOY4NT6DlNLsTFcuQ'
178
- }
179
- successful = 'OAuth oauth_consumer_key="8karQBlMg6gFOwcf8kcoYw", oauth_nonce="547fed103e122eecf84c080843eedfe6", oauth_signature="i9CT6ahDRAlfGX3hKYf78QzXsaw%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1286830180", oauth_token="201425800-Sv4sTcgoffmHGkTCue0JnURT8vrm4DiFAkeFNDkh", oauth_version="1.0"'
180
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friends.json', {}, options)
181
- assert_equal successful, header.to_s
182
-
183
- # Reproduce a successful Twitter call, POSTing a new status.
184
- options.merge!(
185
- :nonce => 'b40a3e0f18590ecdcc0e273f7d7c82f8',
186
- :timestamp => '1286830181'
187
- )
188
- successful = 'OAuth oauth_consumer_key="8karQBlMg6gFOwcf8kcoYw", oauth_nonce="b40a3e0f18590ecdcc0e273f7d7c82f8", oauth_signature="mPqSFKejrWWk3ZT9bTQjhO5b2xI%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1286830181", oauth_token="201425800-Sv4sTcgoffmHGkTCue0JnURT8vrm4DiFAkeFNDkh", oauth_version="1.0"'
189
- header = SimpleOAuth::Header.new(:post, 'https://api.twitter.com/1/statuses/update.json', {:status => 'hi, again'}, options)
190
- assert_equal successful, header.to_s
191
- end
192
-
193
- def test_secret
194
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {})
195
- header.stubs(:options).returns(:consumer_secret => 'CONSUMER_SECRET', :token_secret => 'TOKEN_SECRET')
196
-
197
- # Should combine the consumer and token secrets with an ampersand.
198
- assert_equal 'CONSUMER_SECRET&TOKEN_SECRET', header.send(:secret)
199
-
200
- header.stubs(:options).returns(:consumer_secret => 'CONSUM#R_SECRET', :token_secret => 'TOKEN_S#CRET')
201
-
202
- # Should URL encode each secret value before combination.
203
- assert_equal 'CONSUM%23R_SECRET&TOKEN_S%23CRET', header.send(:secret)
204
- end
205
-
206
- def test_signature_base
207
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {})
208
- header.stubs(:method).returns('METHOD')
209
- header.stubs(:url).returns('URL')
210
- header.stubs(:normalized_params).returns('NORMALIZED_PARAMS')
211
-
212
- # Should combine HTTP method, URL and normalized parameters string using
213
- # ampersands.
214
- assert_equal 'METHOD&URL&NORMALIZED_PARAMS', header.send(:signature_base)
215
-
216
- header.stubs(:method).returns('ME#HOD')
217
- header.stubs(:url).returns('U#L')
218
- header.stubs(:normalized_params).returns('NORMAL#ZED_PARAMS')
219
-
220
- # Each of the three combined values should be URL encoded.
221
- assert_equal 'ME%23HOD&U%23L&NORMAL%23ZED_PARAMS', header.send(:signature_base)
222
- end
223
-
224
- def test_normalized_params
225
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {})
226
- header.stubs(:signature_params).returns([['A', '4'], ['B', '3'], ['B', '2'], ['C', '1'], ['D[]', '0 ']])
227
-
228
- # The +normalized_params+ string should join key=value pairs with
229
- # ampersands.
230
- signature_params = header.send(:signature_params)
231
- normalized_params = header.send(:normalized_params)
232
- parts = normalized_params.split('&')
233
- pairs = parts.map{|p| p.split('=') }
234
- assert_kind_of String, normalized_params
235
- assert_equal signature_params.size, parts.size
236
- assert pairs.all?{|p| p.size == 2 }
237
-
238
- # The signature parameters should be sorted and the keys/values URL encoded
239
- # first.
240
- assert_equal signature_params.sort_by{|p| p.to_s}, pairs.map{|k, v| [URI.decode(k), URI.decode(v)]}
241
- end
242
-
243
- def test_signature_params
244
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {})
245
- header.stubs(:attributes).returns(:attribute => 'ATTRIBUTE')
246
- header.stubs(:params).returns('param' => 'PARAM')
247
- header.stubs(:url_params).returns([['url_param', '1'], ['url_param', '2']])
248
-
249
- # Should combine OAuth header attributes, body parameters and URL
250
- # parameters into an array of key value pairs.
251
- signature_params = header.send(:signature_params)
252
- assert_kind_of Array, signature_params
253
- assert_equal [:attribute, 'param', 'url_param', 'url_param'], signature_params.map{|p| p.first}
254
- assert_equal ['ATTRIBUTE', 'PARAM', '1', '2'], signature_params.map{|p| p.last}
255
- end
256
-
257
- def test_url_params
258
- # A URL with no query parameters should produce empty +url_params+
259
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json', {})
260
- assert_equal [], header.send(:url_params)
261
-
262
- # A URL with query parameters should return a hash having array values
263
- # containing the given query parameters.
264
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json?test=TEST', {})
265
- url_params = header.send(:url_params)
266
- assert_kind_of Array, url_params
267
- assert_equal [['test', 'TEST']], url_params
268
-
269
- # If a query parameter is repeated, the values should be sorted.
270
- header = SimpleOAuth::Header.new(:get, 'https://api.twitter.com/1/statuses/friendships.json?test=1&test=2', {})
271
- assert_equal [['test', '1'], ['test', '2']], header.send(:url_params)
272
- end
273
-
274
- def test_rsa_sha1_signature
275
- # Sample request taken from:
276
- # http://wiki.oauth.net/TestCases
277
- options = {
278
- :consumer_key => 'dpf43f3p2l4k3l03',
279
- :consumer_secret => File.read('test/rsa_private_key'),
280
- :nonce => '13917289812797014437',
281
- :signature_method => 'RSA-SHA1',
282
- :timestamp => '1196666512'
283
- }
284
- successful = 'OAuth oauth_consumer_key="dpf43f3p2l4k3l03", oauth_nonce="13917289812797014437", oauth_signature="jvTp%2FwX1TYtByB1m%2BPbyo0lnCOLIsyGCH7wke8AUs3BpnwZJtAuEJkvQL2%2F9n4s5wUmUl4aCI4BwpraNx4RtEXMe5qg5T1LVTGliMRpKasKsW%2F%2Fe%2BRinhejgCuzoH26dyF8iY2ZZ%2F5D1ilgeijhV%2FvBka5twt399mXwaYdCwFYE%3D", oauth_signature_method="RSA-SHA1", oauth_timestamp="1196666512", oauth_version="1.0"'
285
- header = SimpleOAuth::Header.new(:get, 'http://photos.example.net/photos', {:file => 'vacaction.jpg', :size => 'original'}, options)
286
- assert_equal successful, header.to_s
287
- end
288
-
289
- def test_private_key
290
- # Pending
291
- end
292
-
293
- def plaintext_signature
294
- # Sample request taken from:
295
- # http://oauth.googlecode.com/svn/code/javascript/example/signature.html
296
- options = {
297
- :consumer_key => 'abcd',
298
- :consumer_secret => 'efgh',
299
- :nonce => 'oLKtec51GQy',
300
- :signature_method => 'PLAINTEXT',
301
- :timestamp => '1286977095',
302
- :token => 'ijkl',
303
- :token_secret => 'mnop'
304
- }
305
- successful = 'OAuth oauth_consumer_key="abcd", oauth_nonce="oLKtec51GQy", oauth_signature="efgh%26mnop", oauth_signature_method="PLAINTEXT", oauth_timestamp="1286977095", oauth_token="ijkl", oauth_version="1.0"'
306
- header = SimpleOAuth::Header.new(:get, 'http://host.net/resource?name=value', {:name => 'value'}, options)
307
- assert_equal successful, header.to_s
308
- end
309
- end