monkeyhelper-oauth 0.3.1 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. data/History.txt +62 -17
  2. data/Manifest.txt +14 -1
  3. data/README.rdoc +7 -9
  4. data/Rakefile +7 -5
  5. data/TODO +17 -0
  6. data/bin/oauth +2 -2
  7. data/examples/yql.rb +44 -0
  8. data/lib/oauth/cli.rb +267 -31
  9. data/lib/oauth/client/action_controller_request.rb +14 -12
  10. data/lib/oauth/client/helper.rb +22 -14
  11. data/lib/oauth/client/net_http.rb +53 -22
  12. data/lib/oauth/consumer.rb +217 -111
  13. data/lib/oauth/errors/error.rb +4 -0
  14. data/lib/oauth/errors/problem.rb +14 -0
  15. data/lib/oauth/errors/unauthorized.rb +12 -0
  16. data/lib/oauth/errors.rb +3 -0
  17. data/lib/oauth/helper.rb +67 -6
  18. data/lib/oauth/oauth.rb +11 -0
  19. data/lib/oauth/oauth_test_helper.rb +12 -13
  20. data/lib/oauth/request_proxy/action_controller_request.rb +8 -8
  21. data/lib/oauth/request_proxy/base.rb +102 -44
  22. data/lib/oauth/request_proxy/jabber_request.rb +1 -2
  23. data/lib/oauth/request_proxy/mock_request.rb +8 -0
  24. data/lib/oauth/request_proxy/net_http.rb +2 -2
  25. data/lib/oauth/request_proxy/rack_request.rb +7 -7
  26. data/lib/oauth/server.rb +31 -33
  27. data/lib/oauth/signature/base.rb +23 -21
  28. data/lib/oauth/signature/hmac/base.rb +1 -1
  29. data/lib/oauth/signature/hmac/sha1.rb +0 -1
  30. data/lib/oauth/signature/plaintext.rb +2 -2
  31. data/lib/oauth/signature/rsa/sha1.rb +5 -4
  32. data/lib/oauth/signature.rb +9 -0
  33. data/lib/oauth/token.rb +6 -136
  34. data/lib/oauth/tokens/access_token.rb +68 -0
  35. data/lib/oauth/tokens/consumer_token.rb +33 -0
  36. data/lib/oauth/tokens/request_token.rb +32 -0
  37. data/lib/oauth/tokens/server_token.rb +9 -0
  38. data/lib/oauth/tokens/token.rb +17 -0
  39. data/lib/oauth/version.rb +1 -1
  40. data/lib/oauth.rb +1 -0
  41. data/oauth.gemspec +12 -6
  42. data/test/cases/spec/1_0-final/test_construct_request_url.rb +1 -1
  43. data/test/test_access_token.rb +28 -0
  44. data/test/test_action_controller_request_proxy.rb +105 -6
  45. data/test/test_consumer.rb +41 -5
  46. data/test/test_helper.rb +0 -5
  47. data/test/test_net_http_client.rb +38 -20
  48. data/test/test_net_http_request_proxy.rb +43 -8
  49. data/test/test_oauth_helper.rb +50 -0
  50. data/test/test_request_token.rb +53 -0
  51. data/test/test_server.rb +1 -1
  52. data/test/test_signature.rb +19 -11
  53. data/website/index.html +2 -2
  54. metadata +41 -3
data/lib/oauth/cli.rb CHANGED
@@ -3,67 +3,198 @@ require 'oauth'
3
3
 
4
4
  module OAuth
5
5
  class CLI
6
- SUPPORTED_COMMANDS = %w(sign)
6
+ SUPPORTED_COMMANDS = {
7
+ "authorize" => "Obtain an access token and secret for a user",
8
+ "debug" => "Verbosely generate an OAuth signature",
9
+ "query" => "Query a protected resource",
10
+ "sign" => "Generate an OAuth signature",
11
+ "version" => "Display the current version of the library"
12
+ }
7
13
 
8
14
  attr_reader :command
9
15
  attr_reader :options
10
- attr_reader :stdout
16
+ attr_reader :stdout, :stdin
11
17
 
12
- def self.execute(stdout, arguments = [])
13
- self.new.execute(stdout, arguments)
18
+ def self.execute(stdout, stdin, stderr, arguments = [])
19
+ self.new.execute(stdout, stdin, stderr, arguments)
14
20
  end
15
21
 
16
- def execute(stdout, arguments = [])
22
+ def initialize
23
+ @options = {}
24
+
25
+ # don't dump a backtrace on a ^C
26
+ trap(:INT) {
27
+ exit
28
+ }
29
+ end
30
+
31
+ def execute(stdout, stdin, stderr, arguments = [])
17
32
  @stdout = stdout
33
+ @stdin = stdin
34
+ @stderr = stderr
18
35
  extract_command_and_parse_options(arguments)
19
36
 
20
37
  if sufficient_options? && valid_command?
38
+ if command == "debug"
39
+ @command = "sign"
40
+ @options[:verbose] = true
41
+ end
42
+
21
43
  case command
44
+ # TODO move command logic elsewhere
45
+ when "authorize"
46
+ begin
47
+ consumer = OAuth::Consumer.new \
48
+ options[:oauth_consumer_key],
49
+ options[:oauth_consumer_secret],
50
+ :access_token_url => options[:access_token_url],
51
+ :authorize_url => options[:authorize_url],
52
+ :request_token_url => options[:request_token_url],
53
+ :scheme => options[:scheme]
54
+
55
+ # parameters for OAuth 1.0a
56
+ oauth_verifier = nil
57
+
58
+ # get a request token
59
+ request_token = consumer.get_request_token({ :oauth_callback => options[:oauth_callback] }, { :scope => options[:scope] })
60
+
61
+ if request_token.callback_confirmed?
62
+ stdout.puts "Server appears to support OAuth 1.0a; enabling support."
63
+ options[:version] = "1.0a"
64
+ end
65
+
66
+ stdout.puts "Please visit this url to authorize:"
67
+ stdout.puts request_token.authorize_url
68
+
69
+ if options[:version] == "1.0a"
70
+ stdout.puts "Please enter the verification code provided by the SP (oauth_verifier):"
71
+ oauth_verifier = stdin.gets.chomp
72
+ else
73
+ stdout.puts "Press return to continue..."
74
+ stdin.gets
75
+ end
76
+
77
+ begin
78
+ # get an access token
79
+ access_token = request_token.get_access_token(:oauth_verifier => oauth_verifier)
80
+
81
+ stdout.puts "Response:"
82
+ access_token.params.each do |k,v|
83
+ stdout.puts " #{k}: #{v}" unless k.is_a?(Symbol)
84
+ end
85
+ rescue OAuth::Unauthorized => e
86
+ stderr.puts "A problem occurred while attempting to obtain an access token:"
87
+ stderr.puts e
88
+ stderr.puts e.request.body
89
+ end
90
+ rescue OAuth::Unauthorized => e
91
+ stderr.puts "A problem occurred while attempting to authorize:"
92
+ stderr.puts e
93
+ stderr.puts e.request.body
94
+ end
95
+ when "query"
96
+ consumer = OAuth::Consumer.new \
97
+ options[:oauth_consumer_key],
98
+ options[:oauth_consumer_secret],
99
+ :scheme => options[:scheme]
100
+
101
+ access_token = OAuth::AccessToken.new(consumer, options[:oauth_token], options[:oauth_token_secret])
102
+
103
+ response = access_token.request(options[:method].downcase.to_sym, options[:uri])
104
+ puts "#{response.code} #{response.message}"
105
+ puts response.body
22
106
  when "sign"
107
+ parameters = prepare_parameters
108
+
23
109
  request = OAuth::RequestProxy.proxy \
24
110
  "method" => options[:method],
25
111
  "uri" => options[:uri],
26
- "parameters" => prepare_parameters
112
+ "parameters" => parameters
27
113
 
28
- # can't pass options unless they respond to :secret, so use this alternative
29
- signature = OAuth::Signature.sign \
30
- request,
31
- :consumer_secret => options[:oauth_consumer_secret],
32
- :token_secret => options[:oauth_token_secret] do |request|
33
-
34
- # while we have access to the request being signed, display some internals
35
- if verbose?
36
- stdout.puts "Method: #{request.method}"
37
- stdout.puts "URI: #{request.uri}"
38
- stdout.puts "Normalized params: #{request.normalized_parameters}"
39
- stdout.puts "Signature base string: #{request.signature_base_string}"
114
+ if verbose?
115
+ stdout.puts "OAuth parameters:"
116
+ request.oauth_parameters.each do |k,v|
117
+ stdout.puts " " + [k, v] * ": "
118
+ end
119
+ stdout.puts
120
+
121
+ if request.non_oauth_parameters.any?
122
+ stdout.puts "Parameters:"
123
+ request.non_oauth_parameters.each do |k,v|
124
+ stdout.puts " " + [k, v] * ": "
125
+ end
126
+ stdout.puts
40
127
  end
41
128
  end
42
129
 
130
+ request.sign! \
131
+ :consumer_secret => options[:oauth_consumer_secret],
132
+ :token_secret => options[:oauth_token_secret]
133
+
43
134
  if verbose?
44
- stdout.puts "Signature: #{signature}"
45
- stdout.puts "Escaped signature: #{OAuth::Helper.escape(signature)}"
135
+ stdout.puts "Method: #{request.method}"
136
+ stdout.puts "URI: #{request.uri}"
137
+ stdout.puts "Normalized params: #{request.normalized_parameters}" unless options[:xmpp]
138
+ stdout.puts "Signature base string: #{request.signature_base_string}"
139
+
140
+ if options[:xmpp]
141
+ stdout.puts
142
+ stdout.puts "XMPP Stanza:"
143
+ stdout.puts <<-EOS
144
+ <oauth xmlns='urn:xmpp:oauth:0'>
145
+ <oauth_consumer_key>#{request.oauth_consumer_key}</oauth_consumer_key>
146
+ <oauth_token>#{request.oauth_token}</oauth_token>
147
+ <oauth_signature_method>#{request.oauth_signature_method}</oauth_signature_method>
148
+ <oauth_signature>#{request.oauth_signature}</oauth_signature>
149
+ <oauth_timestamp>#{request.oauth_timestamp}</oauth_timestamp>
150
+ <oauth_nonce>#{request.oauth_nonce}</oauth_nonce>
151
+ <oauth_version>#{request.oauth_version}</oauth_version>
152
+ </oauth>
153
+ EOS
154
+ stdout.puts
155
+ stdout.puts "Note: You may want to use bare JIDs in your URI."
156
+ stdout.puts
157
+ else
158
+ stdout.puts "OAuth Request URI: #{request.signed_uri}"
159
+ stdout.puts "Request URI: #{request.signed_uri(false)}"
160
+ stdout.puts "Authorization header: #{request.oauth_header(:realm => options[:realm])}"
161
+ end
162
+ stdout.puts "Signature: #{request.oauth_signature}"
163
+ stdout.puts "Escaped signature: #{OAuth::Helper.escape(request.oauth_signature)}"
46
164
  else
47
- stdout.puts signature
165
+ stdout.puts request.oauth_signature
48
166
  end
167
+ when "version"
168
+ puts "OAuth for Ruby #{OAuth::VERSION}"
49
169
  end
50
170
  else
51
171
  usage
52
172
  end
53
173
  end
54
174
 
175
+ protected
176
+
55
177
  def extract_command_and_parse_options(arguments)
56
178
  @command = arguments[-1]
57
179
  parse_options(arguments[0..-1])
58
180
  end
59
181
 
60
- def parse_options(arguments)
61
- @options = {}
62
- OptionParser.new do |opts|
182
+ def option_parser(arguments = "")
183
+ # TODO add realm parameter
184
+ # TODO add user-agent parameter
185
+ option_parser = OptionParser.new do |opts|
63
186
  opts.banner = "Usage: #{$0} [options] <command>"
64
187
 
65
188
  # defaults
189
+ options[:oauth_nonce] = OAuth::Helper.generate_key
66
190
  options[:oauth_signature_method] = "HMAC-SHA1"
191
+ options[:oauth_timestamp] = OAuth::Helper.generate_timestamp
192
+ options[:oauth_version] = "1.0"
193
+ options[:params] = []
194
+ options[:scheme] = :header
195
+ options[:version] = "1.0"
196
+
197
+ ## Common Options
67
198
 
68
199
  opts.on("--consumer-key KEY", "Specifies the consumer key to use.") do |v|
69
200
  options[:oauth_consumer_key] = v
@@ -73,12 +204,32 @@ module OAuth
73
204
  options[:oauth_consumer_secret] = v
74
205
  end
75
206
 
207
+ opts.on("-H", "--header", "Use the 'Authorization' header for OAuth parameters (default).") do
208
+ options[:scheme] = :header
209
+ end
210
+
211
+ opts.on("-Q", "--query-string", "Use the query string for OAuth parameters.") do
212
+ options[:scheme] = :query_string
213
+ end
214
+
215
+ opts.on("-O", "--options FILE", "Read options from a file") do |v|
216
+ arguments.unshift(*open(v).readlines.map { |l| l.chomp.split(" ") }.flatten)
217
+ end
218
+
219
+ ## Options for signing and making requests
220
+
221
+ opts.separator("\n options for signing and querying")
222
+
76
223
  opts.on("--method METHOD", "Specifies the method (e.g. GET) to use when signing.") do |v|
77
224
  options[:method] = v
78
225
  end
79
226
 
227
+ opts.on("--nonce NONCE", "Specifies the none to use.") do |v|
228
+ options[:oauth_nonce] = v
229
+ end
230
+
80
231
  opts.on("--parameters PARAMS", "Specifies the parameters to use when signing.") do |v|
81
- options[:params] = v
232
+ options[:params] << v
82
233
  end
83
234
 
84
235
  opts.on("--signature-method METHOD", "Specifies the signature method to use; defaults to HMAC-SHA1.") do |v|
@@ -89,38 +240,123 @@ module OAuth
89
240
  options[:oauth_token_secret] = v
90
241
  end
91
242
 
243
+ opts.on("--timestamp TIMESTAMP", "Specifies the timestamp to use.") do |v|
244
+ options[:oauth_timestamp] = v
245
+ end
246
+
92
247
  opts.on("--token TOKEN", "Specifies the token to use.") do |v|
93
248
  options[:oauth_token] = v
94
249
  end
95
250
 
251
+ opts.on("--realm REALM", "Specifies the realm to use.") do |v|
252
+ options[:realm] = v
253
+ end
254
+
96
255
  opts.on("--uri URI", "Specifies the URI to use when signing.") do |v|
97
256
  options[:uri] = v
98
257
  end
99
258
 
259
+ opts.on(:OPTIONAL, "--version VERSION", "Specifies the OAuth version to use.") do |v|
260
+ if v
261
+ options[:oauth_version] = v
262
+ else
263
+ @command = "version"
264
+ end
265
+ end
266
+
267
+ opts.on("--no-version", "Omit oauth_version.") do
268
+ options[:oauth_version] = nil
269
+ end
270
+
271
+ opts.on("--xmpp", "Generate XMPP stanzas.") do
272
+ options[:xmpp] = true
273
+ options[:method] ||= "iq"
274
+ end
275
+
100
276
  opts.on("-v", "--verbose", "Be verbose.") do
101
277
  options[:verbose] = true
102
278
  end
103
- end.parse!(arguments)
279
+
280
+ ## Options for authorization
281
+
282
+ opts.separator("\n options for authorization")
283
+
284
+ opts.on("--access-token-url URL", "Specifies the access token URL.") do |v|
285
+ options[:access_token_url] = v
286
+ end
287
+
288
+ opts.on("--authorize-url URL", "Specifies the authorization URL.") do |v|
289
+ options[:authorize_url] = v
290
+ end
291
+
292
+ opts.on("--callback-url URL", "Specifies a callback URL.") do |v|
293
+ options[:oauth_callback] = v
294
+ end
295
+
296
+ opts.on("--request-token-url URL", "Specifies the request token URL.") do |v|
297
+ options[:request_token_url] = v
298
+ end
299
+
300
+ opts.on("--scope SCOPE", "Specifies the scope (Google-specific).") do |v|
301
+ options[:scope] = v
302
+ end
303
+ end
304
+ end
305
+
306
+ def parse_options(arguments)
307
+ option_parser(arguments).parse!(arguments)
104
308
  end
105
309
 
106
310
  def prepare_parameters
311
+ escaped_pairs = options[:params].collect do |pair|
312
+ if pair =~ /:/
313
+ Hash[*pair.split(":", 2)].collect do |k,v|
314
+ [CGI.escape(k.strip), CGI.escape(v.strip)] * "="
315
+ end
316
+ else
317
+ pair
318
+ end
319
+ end
320
+
321
+ querystring = escaped_pairs * "&"
322
+ cli_params = CGI.parse(querystring)
323
+
107
324
  {
108
325
  "oauth_consumer_key" => options[:oauth_consumer_key],
326
+ "oauth_nonce" => options[:oauth_nonce],
327
+ "oauth_timestamp" => options[:oauth_timestamp],
109
328
  "oauth_token" => options[:oauth_token],
110
- "oauth_signature_method" => options[:oauth_signature_method]
111
- }.merge(CGI.parse(options[:params]))
329
+ "oauth_signature_method" => options[:oauth_signature_method],
330
+ "oauth_version" => options[:oauth_version]
331
+ }.reject { |k,v| v.nil? || v == "" }.merge(cli_params)
112
332
  end
113
333
 
114
334
  def sufficient_options?
115
- options[:oauth_consumer_key] && options[:oauth_consumer_secret] && options[:method] && options[:uri]
335
+ case command
336
+ # TODO move command logic elsewhere
337
+ when "authorize"
338
+ options[:oauth_consumer_key] && options[:oauth_consumer_secret] &&
339
+ options[:access_token_url] && options[:authorize_url] &&
340
+ options[:request_token_url]
341
+ when "version"
342
+ true
343
+ else
344
+ options[:oauth_consumer_key] && options[:oauth_consumer_secret] &&
345
+ options[:method] && options[:uri]
346
+ end
116
347
  end
117
348
 
118
349
  def usage
119
- stdout.puts "Should be generated by OptionParser"
350
+ stdout.puts option_parser.help
351
+ stdout.puts
352
+ stdout.puts "Available commands:"
353
+ SUPPORTED_COMMANDS.each do |command, desc|
354
+ puts " #{command.ljust(15)}#{desc}"
355
+ end
120
356
  end
121
357
 
122
358
  def valid_command?
123
- SUPPORTED_COMMANDS.include?(command)
359
+ SUPPORTED_COMMANDS.keys.include?(command)
124
360
  end
125
361
 
126
362
  def verbose?
@@ -4,9 +4,9 @@ require 'action_controller/test_process'
4
4
 
5
5
  module ActionController
6
6
  class Base
7
- def process_with_oauth(request,response=nil)
7
+ def process_with_oauth(request, response=nil)
8
8
  request.apply_oauth!
9
- process_without_oauth(request,response)
9
+ process_without_oauth(request, response)
10
10
  end
11
11
 
12
12
  alias_method_chain :process, :oauth
@@ -18,21 +18,23 @@ module ActionController
18
18
  end
19
19
 
20
20
  def self.use_oauth?
21
- @use_oauth
21
+ @use_oauth
22
22
  end
23
23
 
24
24
  def configure_oauth(consumer = nil, token = nil, options = {})
25
- @oauth_options = { :consumer => consumer,
26
- :token => token,
27
- :scheme => 'header',
28
- :signature_method => nil,
29
- :nonce => nil,
30
- :timestamp => nil }.merge(options)
25
+ @oauth_options = { :consumer => consumer,
26
+ :token => token,
27
+ :scheme => 'header',
28
+ :signature_method => nil,
29
+ :nonce => nil,
30
+ :timestamp => nil }.merge(options)
31
31
  end
32
32
 
33
33
  def apply_oauth!
34
34
  return unless ActionController::TestRequest.use_oauth? && @oauth_options
35
- @oauth_helper = OAuth::Client::Helper.new(self, @oauth_options.merge( { :request_uri => request_uri } ))
35
+
36
+ @oauth_helper = OAuth::Client::Helper.new(self, @oauth_options.merge(:request_uri => request_uri))
37
+ @oauth_helper.amend_user_agent_header(env)
36
38
 
37
39
  self.send("set_oauth_#{@oauth_options[:scheme]}")
38
40
  end
@@ -43,9 +45,9 @@ module ActionController
43
45
 
44
46
  def set_oauth_parameters
45
47
  @query_parameters = @oauth_helper.parameters_with_oauth
46
- @query_parameters.merge!( { :oauth_signature => @oauth_helper.signature } )
48
+ @query_parameters.merge!(:oauth_signature => @oauth_helper.signature)
47
49
  end
48
-
50
+
49
51
  def set_oauth_query_string
50
52
  end
51
53
  end
@@ -2,12 +2,13 @@ require 'oauth/client'
2
2
  require 'oauth/consumer'
3
3
  require 'oauth/helper'
4
4
  require 'oauth/token'
5
+ require 'oauth/version'
5
6
  require 'oauth/signature/hmac/sha1'
6
7
 
7
8
  module OAuth::Client
8
9
  class Helper
9
10
  include OAuth::Helper
10
-
11
+
11
12
  def initialize(request, options = {})
12
13
  @request = request
13
14
  @options = options
@@ -26,37 +27,44 @@ module OAuth::Client
26
27
  options[:timestamp] ||= generate_timestamp
27
28
  end
28
29
 
29
- def generate_timestamp
30
- Time.now.to_i.to_s
31
- end
32
-
33
30
  def oauth_parameters
34
31
  {
32
+ 'oauth_callback' => options[:oauth_callback],
35
33
  'oauth_consumer_key' => options[:consumer].key,
36
34
  'oauth_token' => options[:token] ? options[:token].token : '',
37
35
  'oauth_signature_method' => options[:signature_method],
38
36
  'oauth_timestamp' => timestamp,
39
37
  'oauth_nonce' => nonce,
38
+ 'oauth_verifier' => options[:oauth_verifier],
40
39
  'oauth_version' => '1.0'
41
- }.reject { |k,v| v == "" }
40
+ }.reject { |k,v| v.to_s == "" }
42
41
  end
43
42
 
44
43
  def signature(extra_options = {})
45
44
  OAuth::Signature.sign(@request, { :uri => options[:request_uri],
46
- :consumer => options[:consumer],
47
- :token => options[:token] }.merge(extra_options) )
45
+ :consumer => options[:consumer],
46
+ :token => options[:token] }.merge(extra_options) )
48
47
  end
49
48
 
50
49
  def signature_base_string(extra_options = {})
51
- OAuth::Signature.signature_base_string(@request, { :uri => options[:request_uri],
52
- :consumer => options[:consumer],
53
- :token => options[:token],
54
- :parameters => oauth_parameters}.merge(extra_options) )
50
+ OAuth::Signature.signature_base_string(@request, { :uri => options[:request_uri],
51
+ :consumer => options[:consumer],
52
+ :token => options[:token],
53
+ :parameters => oauth_parameters}.merge(extra_options) )
54
+ end
55
+
56
+ def amend_user_agent_header(headers)
57
+ @oauth_ua_string ||= "OAuth gem v#{OAuth::VERSION}"
58
+ if headers['User-Agent']
59
+ headers['User-Agent'] += " (#{@oauth_ua_string})"
60
+ else
61
+ headers['User-Agent'] = @oauth_ua_string
62
+ end
55
63
  end
56
64
 
57
65
  def header
58
66
  parameters = oauth_parameters
59
- parameters.merge!( { 'oauth_signature' => signature( options.merge({ :parameters => parameters }) ) } )
67
+ parameters.merge!('oauth_signature' => signature(options.merge(:parameters => parameters)))
60
68
 
61
69
  header_params_str = parameters.map { |k,v| "#{k}=\"#{escape(v)}\"" }.join(', ')
62
70
 
@@ -69,7 +77,7 @@ module OAuth::Client
69
77
  end
70
78
 
71
79
  def parameters_with_oauth
72
- oauth_parameters.merge( parameters )
80
+ oauth_parameters.merge(parameters)
73
81
  end
74
82
  end
75
83
  end
@@ -5,43 +5,74 @@ require 'oauth/request_proxy/net_http'
5
5
  class Net::HTTPRequest
6
6
  include OAuth::Helper
7
7
 
8
+ attr_reader :oauth_helper
9
+
10
+ # Add the OAuth information to an HTTP request. Depending on the <tt>options[:scheme]</tt> setting
11
+ # this may add a header, additional query string parameters, or additional POST body parameters.
12
+ # The default scheme is +header+, in which the OAuth parameters as put into the +Authorization+
13
+ # header.
14
+ #
15
+ # * http - Configured Net::HTTP instance
16
+ # * consumer - OAuth::Consumer instance
17
+ # * token - OAuth::Token instance
18
+ # * options - Request-specific options (e.g. +request_uri+, +consumer+, +token+, +scheme+,
19
+ # +signature_method+, +nonce+, +timestamp+)
20
+ #
21
+ # This method also modifies the <tt>User-Agent</tt> header to add the OAuth gem version.
22
+ #
23
+ # See Also: {OAuth core spec version 1.0, section 5.4.1}[http://oauth.net/core/1.0#rfc.section.5.4.1]
8
24
  def oauth!(http, consumer = nil, token = nil, options = {})
9
- options = { :request_uri => oauth_full_request_uri(http),
10
- :consumer => consumer,
11
- :token => token,
12
- :scheme => 'header',
25
+ options = { :request_uri => oauth_full_request_uri(http),
26
+ :consumer => consumer,
27
+ :token => token,
28
+ :scheme => 'header',
13
29
  :signature_method => nil,
14
- :nonce => nil,
15
- :timestamp => nil }.merge(options)
30
+ :nonce => nil,
31
+ :timestamp => nil }.merge(options)
16
32
 
17
33
  @oauth_helper = OAuth::Client::Helper.new(self, options)
34
+ @oauth_helper.amend_user_agent_header(self)
18
35
  self.send("set_oauth_#{options[:scheme]}")
19
36
  end
20
37
 
38
+ # Create a string suitable for signing for an HTTP request. This process involves parameter
39
+ # normalization as specified in the OAuth specification. The exact normalization also depends
40
+ # on the <tt>options[:scheme]</tt> being used so this must match what will be used for the request
41
+ # itself. The default scheme is +header+, in which the OAuth parameters as put into the +Authorization+
42
+ # header.
43
+ #
44
+ # * http - Configured Net::HTTP instance
45
+ # * consumer - OAuth::Consumer instance
46
+ # * token - OAuth::Token instance
47
+ # * options - Request-specific options (e.g. +request_uri+, +consumer+, +token+, +scheme+,
48
+ # +signature_method+, +nonce+, +timestamp+)
49
+ #
50
+ # See Also: {OAuth core spec version 1.0, section 9.1.1}[http://oauth.net/core/1.0#rfc.section.9.1.1]
21
51
  def signature_base_string(http, consumer = nil, token = nil, options = {})
22
- options = { :request_uri => oauth_full_request_uri(http),
23
- :consumer => consumer,
24
- :token => token,
25
- :scheme => 'header',
52
+ options = { :request_uri => oauth_full_request_uri(http),
53
+ :consumer => consumer,
54
+ :token => token,
55
+ :scheme => 'header',
26
56
  :signature_method => nil,
27
- :nonce => nil,
28
- :timestamp => nil }.merge(options)
57
+ :nonce => nil,
58
+ :timestamp => nil }.merge(options)
29
59
 
30
60
  OAuth::Client::Helper.new(self, options).signature_base_string
31
61
  end
32
-
33
- def oauth_helper
34
- @oauth_helper
35
- end
36
- private
62
+
63
+ private
37
64
 
38
65
  def oauth_full_request_uri(http)
39
66
  uri = URI.parse(self.path)
40
67
  uri.host = http.address
41
68
  uri.port = http.port
42
- if http.respond_to?(:use_ssl?)
43
- uri.scheme = http.use_ssl? ? 'https' : 'http'
69
+
70
+ if http.respond_to?(:use_ssl?) && http.use_ssl?
71
+ uri.scheme = "https"
72
+ else
73
+ uri.scheme = "http"
44
74
  end
75
+
45
76
  uri.to_s
46
77
  end
47
78
 
@@ -59,10 +90,10 @@ class Net::HTTPRequest
59
90
  end
60
91
 
61
92
  def set_oauth_query_string
62
- oauth_params_str = @oauth_helper.oauth_parameters.map { |k,v| "#{k}=#{v}" }.join("&")
93
+ oauth_params_str = @oauth_helper.oauth_parameters.map { |k,v| [escape(k), escape(v)] * "=" }.join("&")
63
94
 
64
95
  uri = URI.parse(path)
65
- if !uri.query || uri.query == ''
96
+ if uri.query.to_s == ""
66
97
  uri.query = oauth_params_str
67
98
  else
68
99
  uri.query = uri.query + "&" + oauth_params_str
@@ -70,6 +101,6 @@ class Net::HTTPRequest
70
101
 
71
102
  @path = uri.to_s
72
103
 
73
- @path << "&oauth_signature=#{escape(@oauth_helper.signature)}"
104
+ @path << "&oauth_signature=#{escape(oauth_helper.signature)}"
74
105
  end
75
106
  end