oauth 0.5.6 → 1.1.0

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +504 -0
  3. data/CODE_OF_CONDUCT.md +84 -0
  4. data/CONTRIBUTING.md +40 -0
  5. data/LICENSE +19 -17
  6. data/README.md +390 -0
  7. data/SECURITY.md +26 -0
  8. data/lib/oauth/client/action_controller_request.rb +23 -21
  9. data/lib/oauth/client/em_http.rb +99 -99
  10. data/lib/oauth/client/helper.rb +83 -82
  11. data/lib/oauth/client/net_http.rb +112 -105
  12. data/lib/oauth/client.rb +2 -0
  13. data/lib/oauth/consumer.rb +147 -133
  14. data/lib/oauth/errors/error.rb +2 -0
  15. data/lib/oauth/errors/problem.rb +3 -0
  16. data/lib/oauth/errors/unauthorized.rb +7 -1
  17. data/lib/oauth/errors.rb +5 -3
  18. data/lib/oauth/helper.rb +26 -18
  19. data/lib/oauth/oauth.rb +6 -4
  20. data/lib/oauth/oauth_test_helper.rb +6 -4
  21. data/lib/oauth/request_proxy/action_controller_request.rb +49 -71
  22. data/lib/oauth/request_proxy/action_dispatch_request.rb +8 -4
  23. data/lib/oauth/request_proxy/base.rb +136 -132
  24. data/lib/oauth/request_proxy/curb_request.rb +49 -43
  25. data/lib/oauth/request_proxy/em_http_request.rb +59 -49
  26. data/lib/oauth/request_proxy/jabber_request.rb +12 -9
  27. data/lib/oauth/request_proxy/mock_request.rb +5 -3
  28. data/lib/oauth/request_proxy/net_http.rb +61 -54
  29. data/lib/oauth/request_proxy/rack_request.rb +35 -31
  30. data/lib/oauth/request_proxy/rest_client_request.rb +54 -50
  31. data/lib/oauth/request_proxy/typhoeus_request.rb +51 -45
  32. data/lib/oauth/request_proxy.rb +7 -4
  33. data/lib/oauth/server.rb +14 -12
  34. data/lib/oauth/signature/base.rb +78 -71
  35. data/lib/oauth/signature/hmac/sha1.rb +16 -10
  36. data/lib/oauth/signature/hmac/sha256.rb +16 -10
  37. data/lib/oauth/signature/plaintext.rb +18 -20
  38. data/lib/oauth/signature/rsa/sha1.rb +46 -38
  39. data/lib/oauth/signature.rb +8 -5
  40. data/lib/oauth/token.rb +7 -5
  41. data/lib/oauth/tokens/access_token.rb +5 -3
  42. data/lib/oauth/tokens/consumer_token.rb +4 -2
  43. data/lib/oauth/tokens/request_token.rb +12 -10
  44. data/lib/oauth/tokens/server_token.rb +2 -1
  45. data/lib/oauth/tokens/token.rb +2 -0
  46. data/lib/oauth/version.rb +5 -1
  47. data/lib/oauth.rb +17 -9
  48. metadata +105 -98
  49. data/README.rdoc +0 -88
  50. data/bin/oauth +0 -11
  51. data/lib/oauth/cli/authorize_command.rb +0 -71
  52. data/lib/oauth/cli/base_command.rb +0 -208
  53. data/lib/oauth/cli/help_command.rb +0 -22
  54. data/lib/oauth/cli/query_command.rb +0 -25
  55. data/lib/oauth/cli/sign_command.rb +0 -81
  56. data/lib/oauth/cli/version_command.rb +0 -7
  57. data/lib/oauth/cli.rb +0 -56
data/lib/oauth/client.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth
2
4
  module Client
3
5
  end
@@ -1,23 +1,26 @@
1
- require 'net/http'
2
- require 'net/https'
3
- require 'oauth/oauth'
4
- require 'oauth/client/net_http'
5
- require 'oauth/errors'
6
- require 'cgi'
1
+ # frozen_string_literal: true
2
+
3
+ require "net/http"
4
+ require "net/https"
5
+ require "oauth/oauth"
6
+ require "oauth/client/net_http"
7
+ require "oauth/errors"
8
+ require "cgi"
7
9
 
8
10
  module OAuth
9
11
  class Consumer
10
12
  # determine the certificate authority path to verify SSL certs
11
- if ENV['SSL_CERT_FILE']
12
- if File.exist?(ENV['SSL_CERT_FILE'])
13
- CA_FILE = ENV['SSL_CERT_FILE']
13
+ if ENV["SSL_CERT_FILE"]
14
+ if File.exist?(ENV["SSL_CERT_FILE"])
15
+ CA_FILE = ENV["SSL_CERT_FILE"]
14
16
  else
15
17
  raise "The SSL CERT provided does not exist."
16
18
  end
17
19
  end
18
20
 
19
- if !defined?(CA_FILE)
20
- CA_FILES = %W(/etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt /usr/share/curl/curl-ca-bundle.crt)
21
+ unless defined?(CA_FILE)
22
+ CA_FILES = %w[/etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt
23
+ /usr/share/curl/curl-ca-bundle.crt].freeze
21
24
  CA_FILES.each do |ca_file|
22
25
  if File.exist?(ca_file)
23
26
  CA_FILE = ca_file
@@ -27,42 +30,49 @@ module OAuth
27
30
  end
28
31
  CA_FILE = nil unless defined?(CA_FILE)
29
32
 
30
- @@default_options = {
31
- # Signature method used by server. Defaults to HMAC-SHA1
32
- :signature_method => 'HMAC-SHA1',
33
-
34
- # default paths on site. These are the same as the defaults set up by the generators
35
- :request_token_path => '/oauth/request_token',
36
- :authenticate_path => '/oauth/authenticate',
37
- :authorize_path => '/oauth/authorize',
38
- :access_token_path => '/oauth/access_token',
39
-
40
- :proxy => nil,
41
- # How do we send the oauth values to the server see
42
- # http://oauth.net/core/1.0/#consumer_req_param for more info
43
- #
44
- # Possible values:
45
- #
46
- # :header - via the Authorize header (Default) ( option 1. in spec)
47
- # :body - url form encoded in body of POST request ( option 2. in spec)
48
- # :query_string - via the query part of the url ( option 3. in spec)
49
- :scheme => :header,
50
-
51
- # Default http method used for OAuth Token Requests (defaults to :post)
52
- :http_method => :post,
53
-
54
- # Add a custom ca_file for consumer
55
- # :ca_file => '/etc/certs.pem'
56
-
57
- # Possible values:
58
- #
59
- # nil, false - no debug output
60
- # true - uses $stdout
61
- # some_value - uses some_value
62
- :debug_output => nil,
63
-
64
- :oauth_version => "1.0"
65
- }
33
+ @@default_options = SnakyHash::SymbolKeyed.new(
34
+ {
35
+ # Signature method used by server. Defaults to HMAC-SHA1
36
+ signature_method: "HMAC-SHA1",
37
+
38
+ # default paths on site. These are the same as the defaults set up by the generators
39
+ request_token_path: "/oauth/request_token",
40
+ authenticate_path: "/oauth/authenticate",
41
+ authorize_path: "/oauth/authorize",
42
+ access_token_path: "/oauth/access_token",
43
+
44
+ proxy: nil,
45
+ # How do we send the oauth values to the server see
46
+ # https://oauth.net/core/1.0/#consumer_req_param for more info
47
+ #
48
+ # Possible values:
49
+ #
50
+ # :header - via the Authorize header (Default) ( option 1. in spec)
51
+ # :body - url form encoded in body of POST request ( option 2. in spec)
52
+ # :query_string - via the query part of the url ( option 3. in spec)
53
+ scheme: :header,
54
+
55
+ # Default http method used for OAuth Token Requests (defaults to :post)
56
+ http_method: :post,
57
+
58
+ # Add a custom ca_file for consumer
59
+ # :ca_file => '/etc/certs.pem'
60
+
61
+ # Possible values:
62
+ #
63
+ # nil, false - no debug output
64
+ # true - uses $stdout
65
+ # some_value - uses some_value
66
+ debug_output: nil,
67
+
68
+ # Defaults to producing a body_hash as part of the signature but
69
+ # can be disabled since it's not officially part of the OAuth 1.0
70
+ # spec. Possible values are true and false
71
+ body_hash_enabled: true,
72
+
73
+ oauth_version: "1.0"
74
+ }
75
+ )
66
76
 
67
77
  attr_accessor :options, :key, :secret
68
78
  attr_writer :site, :http
@@ -75,7 +85,8 @@ module OAuth
75
85
  # :http_method => :post,
76
86
  # :request_token_path => "/oauth/example/request_token.php",
77
87
  # :access_token_path => "/oauth/example/access_token.php",
78
- # :authorize_path => "/oauth/example/authorize.php"
88
+ # :authorize_path => "/oauth/example/authorize.php",
89
+ # :body_hash_enabled => false
79
90
  # })
80
91
  #
81
92
  # Start the process by requesting a token
@@ -94,10 +105,8 @@ module OAuth
94
105
  @secret = consumer_secret
95
106
 
96
107
  # ensure that keys are symbols
97
- @options = @@default_options.merge(options.inject({}) do |opts, (key, value)|
98
- opts[key.to_sym] = value
99
- opts
100
- end)
108
+ snaky_options = SnakyHash::SymbolKeyed.new(options)
109
+ @options = @@default_options.merge(snaky_options)
101
110
  end
102
111
 
103
112
  # The default http method
@@ -106,15 +115,13 @@ module OAuth
106
115
  end
107
116
 
108
117
  def debug_output
109
- @debug_output ||= begin
110
- case @options[:debug_output]
111
- when nil, false
112
- when true
113
- $stdout
114
- else
115
- @options[:debug_output]
116
- end
117
- end
118
+ @debug_output ||= case @options[:debug_output]
119
+ when nil, false
120
+ when true
121
+ $stdout
122
+ else
123
+ @options[:debug_output]
124
+ end
118
125
  end
119
126
 
120
127
  # The HTTP object for the site. The HTTP Object is what you get when you do Net::HTTP.new
@@ -127,13 +134,14 @@ module OAuth
127
134
  if custom_uri
128
135
  @uri = custom_uri
129
136
  @http = create_http # yike, oh well. less intrusive this way
130
- else # if no custom passed, we use existing, which, if unset, is set to site uri
137
+ else # if no custom passed, we use existing, which, if unset, is set to site uri
131
138
  @uri ||= URI.parse(site)
132
139
  end
133
140
  end
134
141
 
135
142
  def get_access_token(request_token, request_options = {}, *arguments, &block)
136
- response = token_request(http_method, (access_token_url? ? access_token_url : access_token_path), request_token, request_options, *arguments, &block)
143
+ response = token_request(http_method, (access_token_url? ? access_token_url : access_token_path), request_token,
144
+ request_options, *arguments, &block)
137
145
  OAuth::AccessToken.from_hash(self, response)
138
146
  end
139
147
 
@@ -156,15 +164,19 @@ module OAuth
156
164
  # will be exchanged out of band
157
165
  request_options[:oauth_callback] ||= OAuth::OUT_OF_BAND unless request_options[:exclude_callback]
158
166
 
159
- if block_given?
160
- response = token_request(http_method,
161
- (request_token_url? ? request_token_url : request_token_path),
162
- nil,
163
- request_options,
164
- *arguments, &block)
165
- else
166
- response = token_request(http_method, (request_token_url? ? request_token_url : request_token_path), nil, request_options, *arguments)
167
- end
167
+ response = if block
168
+ token_request(
169
+ http_method,
170
+ (request_token_url? ? request_token_url : request_token_path),
171
+ nil,
172
+ request_options,
173
+ *arguments,
174
+ &block
175
+ )
176
+ else
177
+ token_request(http_method, (request_token_url? ? request_token_url : request_token_path), nil,
178
+ request_options, *arguments)
179
+ end
168
180
  OAuth::RequestToken.from_hash(self, response)
169
181
  end
170
182
 
@@ -179,7 +191,7 @@ module OAuth
179
191
  # @consumer.request(:post, '/people', @token, {}, @person.to_xml, { 'Content-Type' => 'application/xml' })
180
192
  #
181
193
  def request(http_method, path, token = nil, request_options = {}, *arguments)
182
- if path !~ /^\//
194
+ unless %r{^/}.match?(path)
183
195
  @http = create_http(path)
184
196
  _uri = URI.parse(path)
185
197
  path = "#{_uri.path}#{_uri.query ? "?#{_uri.query}" : ""}"
@@ -187,18 +199,19 @@ module OAuth
187
199
 
188
200
  # override the request with your own, this is useful for file uploads which Net::HTTP does not do
189
201
  req = create_signed_request(http_method, path, token, request_options, *arguments)
190
- return nil if block_given? and yield(req) == :done
202
+ return nil if block_given? && (yield(req) == :done)
203
+
191
204
  rsp = http.request(req)
192
205
  # check for an error reported by the Problem Reporting extension
193
- # (http://wiki.oauth.net/ProblemReporting)
206
+ # (https://wiki.oauth.net/ProblemReporting)
194
207
  # note: a 200 may actually be an error; check for an oauth_problem key to be sure
195
208
  if !(headers = rsp.to_hash["www-authenticate"]).nil? &&
196
- (h = headers.select { |hdr| hdr =~ /^OAuth / }).any? &&
197
- h.first =~ /oauth_problem/
209
+ (h = headers.grep(/^OAuth /)).any? &&
210
+ h.first.include?("oauth_problem")
198
211
 
199
212
  # puts "Header: #{h.first}"
200
213
 
201
- # TODO doesn't handle broken responses from api.login.yahoo.com
214
+ # TODO: doesn't handle broken responses from api.login.yahoo.com
202
215
  # remove debug code when done
203
216
  params = OAuth::Helper.parse_header(h.first)
204
217
 
@@ -232,24 +245,25 @@ module OAuth
232
245
  # symbolize keys
233
246
  # TODO this could be considered unexpected behavior; symbols or not?
234
247
  # TODO this also drops subsequent values from multi-valued keys
235
- CGI.parse(response.body).inject({}) do |h,(k,v)|
248
+ CGI.parse(response.body).each_with_object({}) do |(k, v), h|
236
249
  h[k.strip.to_sym] = v.first
237
250
  h[k.strip] = v.first
238
- h
239
251
  end
240
252
  end
241
253
  when (300..399)
242
- # this is a redirect
243
- uri = URI.parse(response['location'])
254
+ # Parse redirect to follow
255
+ uri = URI.parse(response["location"])
244
256
  our_uri = URI.parse(site)
245
257
 
258
+ # Guard against infinite redirects
259
+ response.error! if uri.path == path && our_uri.host == uri.host
260
+
246
261
  if uri.path == path && our_uri.host != uri.host
247
- options[:site] = "#{uri.scheme}://#{uri.host}"
248
- @http = create_http
262
+ options[:site] = "#{uri.scheme}://#{uri.host}"
263
+ @http = create_http
249
264
  end
250
265
 
251
- response.error! if uri.path == path && our_uri.host == uri.host # careful of those infinite redirects
252
- self.token_request(http_method, uri.path, token, request_options, arguments)
266
+ token_request(http_method, uri.path, token, request_options, arguments)
253
267
  when (400..499)
254
268
  raise OAuth::Unauthorized, response
255
269
  else
@@ -273,6 +287,7 @@ module OAuth
273
287
 
274
288
  def request_endpoint
275
289
  return nil if @options[:request_endpoint].nil?
290
+
276
291
  @options[:request_endpoint].to_s
277
292
  end
278
293
 
@@ -296,37 +311,37 @@ module OAuth
296
311
  @options[:access_token_path]
297
312
  end
298
313
 
299
- # TODO this is ugly, rewrite
314
+ # TODO: this is ugly, rewrite
300
315
  def request_token_url
301
- @options[:request_token_url] || site + request_token_path
316
+ @options[:request_token_url] || (site + request_token_path)
302
317
  end
303
318
 
304
319
  def request_token_url?
305
- @options.has_key?(:request_token_url)
320
+ @options.key?(:request_token_url)
306
321
  end
307
322
 
308
323
  def authenticate_url
309
- @options[:authenticate_url] || site + authenticate_path
324
+ @options[:authenticate_url] || (site + authenticate_path)
310
325
  end
311
326
 
312
327
  def authenticate_url?
313
- @options.has_key?(:authenticate_url)
328
+ @options.key?(:authenticate_url)
314
329
  end
315
330
 
316
331
  def authorize_url
317
- @options[:authorize_url] || site + authorize_path
332
+ @options[:authorize_url] || (site + authorize_path)
318
333
  end
319
334
 
320
335
  def authorize_url?
321
- @options.has_key?(:authorize_url)
336
+ @options.key?(:authorize_url)
322
337
  end
323
338
 
324
339
  def access_token_url
325
- @options[:access_token_url] || site + access_token_path
340
+ @options[:access_token_url] || (site + access_token_path)
326
341
  end
327
342
 
328
343
  def access_token_url?
329
- @options.has_key?(:access_token_url)
344
+ @options.key?(:access_token_url)
330
345
  end
331
346
 
332
347
  def proxy
@@ -337,36 +352,36 @@ module OAuth
337
352
 
338
353
  # Instantiates the http object
339
354
  def create_http(_url = nil)
340
-
341
-
342
- if !request_endpoint.nil?
343
- _url = request_endpoint
344
- end
345
-
346
-
347
- if _url.nil? || _url[0] =~ /^\//
348
- our_uri = URI.parse(site)
349
- else
350
- our_uri = URI.parse(_url)
351
- end
352
-
355
+ _url = request_endpoint unless request_endpoint.nil?
356
+
357
+ our_uri = if _url.nil? || _url[0] =~ %r{^/}
358
+ URI.parse(site)
359
+ else
360
+ your_uri = URI.parse(_url)
361
+ if your_uri.host.nil?
362
+ # If the _url is a path, missing the leading slash, then it won't have a host,
363
+ # and our_uri *must* have a host, so we parse site instead.
364
+ URI.parse(site)
365
+ else
366
+ your_uri
367
+ end
368
+ end
353
369
 
354
370
  if proxy.nil?
355
371
  http_object = Net::HTTP.new(our_uri.host, our_uri.port)
356
372
  else
357
373
  proxy_uri = proxy.is_a?(URI) ? proxy : URI.parse(proxy)
358
- http_object = Net::HTTP.new(our_uri.host, our_uri.port, proxy_uri.host, proxy_uri.port, proxy_uri.user, proxy_uri.password)
374
+ http_object = Net::HTTP.new(our_uri.host, our_uri.port, proxy_uri.host, proxy_uri.port, proxy_uri.user,
375
+ proxy_uri.password)
359
376
  end
360
377
 
361
- http_object.use_ssl = (our_uri.scheme == 'https')
378
+ http_object.use_ssl = (our_uri.scheme == "https")
362
379
 
363
380
  if @options[:no_verify]
364
381
  http_object.verify_mode = OpenSSL::SSL::VERIFY_NONE
365
382
  else
366
- ca_file = @options[:ca_file] || CA_FILE
367
- if ca_file
368
- http_object.ca_file = ca_file
369
- end
383
+ ca_file = @options[:ca_file] || CA_FILE
384
+ http_object.ca_file = ca_file if ca_file
370
385
  http_object.verify_mode = OpenSSL::SSL::VERIFY_PEER
371
386
  http_object.verify_depth = 5
372
387
  end
@@ -374,6 +389,8 @@ module OAuth
374
389
  http_object.read_timeout = http_object.open_timeout = @options[:timeout] || 60
375
390
  http_object.open_timeout = @options[:open_timeout] if @options[:open_timeout]
376
391
  http_object.ssl_version = @options[:ssl_version] if @options[:ssl_version]
392
+ http_object.cert = @options[:ssl_client_cert] if @options[:ssl_client_cert]
393
+ http_object.key = @options[:ssl_client_key] if @options[:ssl_client_key]
377
394
  http_object.set_debug_output(debug_output) if debug_output
378
395
 
379
396
  http_object
@@ -383,41 +400,39 @@ module OAuth
383
400
  def create_http_request(http_method, path, *arguments)
384
401
  http_method = http_method.to_sym
385
402
 
386
- if [:post, :put, :patch].include?(http_method)
387
- data = arguments.shift
388
- end
403
+ data = arguments.shift if %i[post put patch].include?(http_method)
389
404
 
390
405
  # if the base site contains a path, add it now
391
406
  # only add if the site host matches the current http object's host
392
407
  # (in case we've specified a full url for token requests)
393
- uri = URI.parse(site)
394
- path = uri.path + path if uri.path && uri.path != '/' && uri.host == http.address
408
+ uri = URI.parse(site)
409
+ path = uri.path + path if uri.path && uri.path != "/" && uri.host == http.address
395
410
 
396
411
  headers = arguments.first.is_a?(Hash) ? arguments.shift : {}
397
412
 
398
413
  case http_method
399
414
  when :post
400
- request = Net::HTTP::Post.new(path,headers)
401
- request["Content-Length"] = '0' # Default to 0
415
+ request = Net::HTTP::Post.new(path, headers)
416
+ request["Content-Length"] = "0" # Default to 0
402
417
  when :put
403
- request = Net::HTTP::Put.new(path,headers)
404
- request["Content-Length"] = '0' # Default to 0
418
+ request = Net::HTTP::Put.new(path, headers)
419
+ request["Content-Length"] = "0" # Default to 0
405
420
  when :patch
406
- request = Net::HTTP::Patch.new(path,headers)
407
- request["Content-Length"] = '0' # Default to 0
421
+ request = Net::HTTP::Patch.new(path, headers)
422
+ request["Content-Length"] = "0" # Default to 0
408
423
  when :get
409
- request = Net::HTTP::Get.new(path,headers)
424
+ request = Net::HTTP::Get.new(path, headers)
410
425
  when :delete
411
- request = Net::HTTP::Delete.new(path,headers)
426
+ request = Net::HTTP::Delete.new(path, headers)
412
427
  when :head
413
- request = Net::HTTP::Head.new(path,headers)
428
+ request = Net::HTTP::Head.new(path, headers)
414
429
  else
415
- raise ArgumentError, "Don't know how to handle http_method: :#{http_method.to_s}"
430
+ raise ArgumentError, "Don't know how to handle http_method: :#{http_method}"
416
431
  end
417
432
 
418
433
  if data.is_a?(Hash)
419
434
  request.body = OAuth::Helper.normalize(data)
420
- request.content_type = 'application/x-www-form-urlencoded'
435
+ request.content_type = "application/x-www-form-urlencoded"
421
436
  elsif data
422
437
  if data.respond_to?(:read)
423
438
  request.body_stream = data
@@ -437,13 +452,12 @@ module OAuth
437
452
  request
438
453
  end
439
454
 
440
- def marshal_dump(*args)
441
- {:key => @key, :secret => @secret, :options => @options}
455
+ def marshal_dump(*_args)
456
+ { key: @key, secret: @secret, options: @options }
442
457
  end
443
458
 
444
459
  def marshal_load(data)
445
460
  initialize(data[:key], data[:secret], data[:options])
446
461
  end
447
-
448
462
  end
449
463
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth
2
4
  class Error < StandardError
3
5
  end
@@ -1,6 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth
2
4
  class Problem < OAuth::Unauthorized
3
5
  attr_reader :problem, :params
6
+
4
7
  def initialize(problem, request = nil, params = {})
5
8
  super(request)
6
9
  @problem = problem
@@ -1,12 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth
2
4
  class Unauthorized < OAuth::Error
3
5
  attr_reader :request
6
+
4
7
  def initialize(request = nil)
8
+ super()
5
9
  @request = request
6
10
  end
7
11
 
8
12
  def to_s
9
- [request.code, request.message] * " "
13
+ return "401 Unauthorized" if request.nil?
14
+
15
+ "#{request.code} #{request.message}"
10
16
  end
11
17
  end
12
18
  end
data/lib/oauth/errors.rb CHANGED
@@ -1,3 +1,5 @@
1
- require 'oauth/errors/error'
2
- require 'oauth/errors/unauthorized'
3
- require 'oauth/errors/problem'
1
+ # frozen_string_literal: true
2
+
3
+ require "oauth/errors/error"
4
+ require "oauth/errors/unauthorized"
5
+ require "oauth/errors/problem"
data/lib/oauth/helper.rb CHANGED
@@ -1,9 +1,12 @@
1
- require 'openssl'
2
- require 'base64'
1
+ # frozen_string_literal: true
2
+
3
+ require "time"
4
+ require "openssl"
5
+ require "base64"
3
6
 
4
7
  module OAuth
5
8
  module Helper
6
- extend self
9
+ module_function
7
10
 
8
11
  # Escape +value+ by URL encoding all non-reserved character.
9
12
  #
@@ -19,18 +22,18 @@ module OAuth
19
22
  end
20
23
 
21
24
  def unescape(value)
22
- URI::DEFAULT_PARSER.unescape(value.gsub('+', '%2B'))
25
+ URI::DEFAULT_PARSER.unescape(value.gsub("+", "%2B"))
23
26
  end
24
27
 
25
28
  # Generate a random key of up to +size+ bytes. The value returned is Base64 encoded with non-word
26
29
  # characters removed.
27
- def generate_key(size=32)
28
- Base64.encode64(OpenSSL::Random.random_bytes(size)).gsub(/\W/, '')
30
+ def generate_key(size = 32)
31
+ Base64.encode64(OpenSSL::Random.random_bytes(size)).gsub(/\W/, "")
29
32
  end
30
33
 
31
- alias_method :generate_nonce, :generate_key
34
+ alias generate_nonce generate_key
32
35
 
33
- def generate_timestamp #:nodoc:
36
+ def generate_timestamp # :nodoc:
34
37
  Time.now.to_i.to_s
35
38
  end
36
39
 
@@ -43,22 +46,27 @@ module OAuth
43
46
  # See Also: {OAuth core spec version 1.0, section 9.1.1}[http://oauth.net/core/1.0#rfc.section.9.1.1]
44
47
  def normalize(params)
45
48
  params.sort.map do |k, values|
46
- if values.is_a?(Array)
49
+ case values
50
+ when Array
47
51
  # make sure the array has an element so we don't lose the key
48
52
  values << nil if values.empty?
49
53
  # multiple values were provided for a single key
50
- values.sort.collect do |v|
51
- [escape(k),escape(v)] * "="
54
+ if values[0].is_a?(Hash)
55
+ normalize_nested_query(values, k)
56
+ else
57
+ values.sort.collect do |v|
58
+ [escape(k), escape(v)].join("=")
59
+ end
52
60
  end
53
- elsif values.is_a?(Hash)
61
+ when Hash
54
62
  normalize_nested_query(values, k)
55
63
  else
56
- [escape(k),escape(values)] * "="
64
+ [escape(k), escape(values)].join("=")
57
65
  end
58
66
  end * "&"
59
67
  end
60
68
 
61
- #Returns a string representation of the Hash like in URL query string
69
+ # Returns a string representation of the Hash like in URL query string
62
70
  # build_nested_query({:level_1 => {:level_2 => ['value_1','value_2']}}, 'prefix'))
63
71
  # #=> ["prefix%5Blevel_1%5D%5Blevel_2%5D%5B%5D=value_1", "prefix%5Blevel_1%5D%5Blevel_2%5D%5B%5D=value_2"]
64
72
  def normalize_nested_query(value, prefix = nil)
@@ -72,7 +80,7 @@ module OAuth
72
80
  normalize_nested_query(v, prefix ? "#{prefix}[#{k}]" : k)
73
81
  end.flatten.sort
74
82
  else
75
- [escape(prefix), escape(value)] * "="
83
+ [escape(prefix), escape(value)].join("=")
76
84
  end
77
85
  end
78
86
 
@@ -86,16 +94,16 @@ module OAuth
86
94
  #
87
95
  def parse_header(header)
88
96
  # decompose
89
- params = header[6,header.length].split(/[,=&]/)
97
+ params = header[6, header.length].split(/[,=&]/)
90
98
 
91
99
  # odd number of arguments - must be a malformed header.
92
- raise OAuth::Problem.new("Invalid authorization header") if params.size % 2 != 0
100
+ raise OAuth::Problem, "Invalid authorization header" if params.size.odd?
93
101
 
94
102
  params.map! do |v|
95
103
  # strip and unescape
96
104
  val = unescape(v.strip)
97
105
  # strip quotes
98
- val.sub(/^\"(.*)\"$/, '\1')
106
+ val.sub(/^"(.*)"$/, '\1')
99
107
  end
100
108
 
101
109
  # convert into a Hash
data/lib/oauth/oauth.rb CHANGED
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module OAuth
2
4
  # request tokens are passed between the consumer and the provider out of
3
5
  # band (i.e. callbacks cannot be used), per section 6.1.1
4
6
  OUT_OF_BAND = "oob"
5
7
 
6
8
  # required parameters, per sections 6.1.1, 6.3.1, and 7
7
- PARAMETERS = %w(oauth_callback oauth_consumer_key oauth_token
8
- oauth_signature_method oauth_timestamp oauth_nonce oauth_verifier
9
- oauth_version oauth_signature oauth_body_hash)
9
+ PARAMETERS = %w[oauth_callback oauth_consumer_key oauth_token
10
+ oauth_signature_method oauth_timestamp oauth_nonce oauth_verifier
11
+ oauth_version oauth_signature oauth_body_hash].freeze
10
12
 
11
13
  # reserved character regexp, per section 5.1
12
- RESERVED_CHARACTERS = /[^a-zA-Z0-9\-\.\_\~]/
14
+ RESERVED_CHARACTERS = /[^a-zA-Z0-9\-._~]/.freeze
13
15
  end