oauth 0.5.8 → 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 +136 -115
  3. data/CODE_OF_CONDUCT.md +0 -0
  4. data/CONTRIBUTING.md +19 -2
  5. data/LICENSE +2 -1
  6. data/README.md +267 -67
  7. data/SECURITY.md +18 -8
  8. data/TODO +0 -0
  9. data/lib/oauth/client/action_controller_request.rb +17 -15
  10. data/lib/oauth/client/em_http.rb +30 -30
  11. data/lib/oauth/client/helper.rb +76 -75
  12. data/lib/oauth/client/net_http.rb +109 -102
  13. data/lib/oauth/client.rb +2 -0
  14. data/lib/oauth/consumer.rb +113 -110
  15. data/lib/oauth/errors/error.rb +2 -0
  16. data/lib/oauth/errors/problem.rb +3 -0
  17. data/lib/oauth/errors/unauthorized.rb +4 -0
  18. data/lib/oauth/errors.rb +2 -0
  19. data/lib/oauth/helper.rb +16 -12
  20. data/lib/oauth/oauth.rb +6 -4
  21. data/lib/oauth/oauth_test_helper.rb +2 -0
  22. data/lib/oauth/request_proxy/action_controller_request.rb +3 -24
  23. data/lib/oauth/request_proxy/action_dispatch_request.rb +0 -0
  24. data/lib/oauth/request_proxy/base.rb +2 -2
  25. data/lib/oauth/request_proxy/curb_request.rb +0 -0
  26. data/lib/oauth/request_proxy/em_http_request.rb +0 -0
  27. data/lib/oauth/request_proxy/jabber_request.rb +0 -0
  28. data/lib/oauth/request_proxy/mock_request.rb +1 -1
  29. data/lib/oauth/request_proxy/net_http.rb +5 -7
  30. data/lib/oauth/request_proxy/rack_request.rb +0 -0
  31. data/lib/oauth/request_proxy/rest_client_request.rb +2 -1
  32. data/lib/oauth/request_proxy/typhoeus_request.rb +0 -0
  33. data/lib/oauth/request_proxy.rb +7 -4
  34. data/lib/oauth/server.rb +12 -10
  35. data/lib/oauth/signature/base.rb +71 -66
  36. data/lib/oauth/signature/hmac/sha1.rb +15 -9
  37. data/lib/oauth/signature/hmac/sha256.rb +15 -9
  38. data/lib/oauth/signature/plaintext.rb +18 -20
  39. data/lib/oauth/signature/rsa/sha1.rb +46 -38
  40. data/lib/oauth/signature.rb +8 -5
  41. data/lib/oauth/token.rb +2 -0
  42. data/lib/oauth/tokens/access_token.rb +2 -0
  43. data/lib/oauth/tokens/consumer_token.rb +4 -2
  44. data/lib/oauth/tokens/request_token.rb +12 -10
  45. data/lib/oauth/tokens/server_token.rb +2 -1
  46. data/lib/oauth/tokens/token.rb +2 -0
  47. data/lib/oauth/version.rb +5 -1
  48. data/lib/oauth.rb +9 -2
  49. metadata +87 -35
  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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "net/http"
2
4
  require "net/https"
3
5
  require "oauth/oauth"
@@ -16,8 +18,9 @@ module OAuth
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
- # https://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,18 +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(
161
- http_method,
162
- (request_token_url? ? request_token_url : request_token_path),
163
- nil,
164
- request_options,
165
- *arguments,
166
- &block
167
- )
168
- else
169
- response = token_request(http_method, (request_token_url? ? request_token_url : request_token_path), nil, request_options, *arguments)
170
- 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
171
180
  OAuth::RequestToken.from_hash(self, response)
172
181
  end
173
182
 
@@ -182,7 +191,7 @@ module OAuth
182
191
  # @consumer.request(:post, '/people', @token, {}, @person.to_xml, { 'Content-Type' => 'application/xml' })
183
192
  #
184
193
  def request(http_method, path, token = nil, request_options = {}, *arguments)
185
- if path !~ /^\//
194
+ unless %r{^/}.match?(path)
186
195
  @http = create_http(path)
187
196
  _uri = URI.parse(path)
188
197
  path = "#{_uri.path}#{_uri.query ? "?#{_uri.query}" : ""}"
@@ -190,18 +199,19 @@ module OAuth
190
199
 
191
200
  # override the request with your own, this is useful for file uploads which Net::HTTP does not do
192
201
  req = create_signed_request(http_method, path, token, request_options, *arguments)
193
- return nil if block_given? and yield(req) == :done
202
+ return nil if block_given? && (yield(req) == :done)
203
+
194
204
  rsp = http.request(req)
195
205
  # check for an error reported by the Problem Reporting extension
196
206
  # (https://wiki.oauth.net/ProblemReporting)
197
207
  # note: a 200 may actually be an error; check for an oauth_problem key to be sure
198
208
  if !(headers = rsp.to_hash["www-authenticate"]).nil? &&
199
- (h = headers.select { |hdr| hdr =~ /^OAuth / }).any? &&
200
- h.first =~ /oauth_problem/
209
+ (h = headers.grep(/^OAuth /)).any? &&
210
+ h.first.include?("oauth_problem")
201
211
 
202
212
  # puts "Header: #{h.first}"
203
213
 
204
- # TODO doesn't handle broken responses from api.login.yahoo.com
214
+ # TODO: doesn't handle broken responses from api.login.yahoo.com
205
215
  # remove debug code when done
206
216
  params = OAuth::Helper.parse_header(h.first)
207
217
 
@@ -235,10 +245,9 @@ module OAuth
235
245
  # symbolize keys
236
246
  # TODO this could be considered unexpected behavior; symbols or not?
237
247
  # TODO this also drops subsequent values from multi-valued keys
238
- CGI.parse(response.body).inject({}) do |h,(k,v)|
248
+ CGI.parse(response.body).each_with_object({}) do |(k, v), h|
239
249
  h[k.strip.to_sym] = v.first
240
250
  h[k.strip] = v.first
241
- h
242
251
  end
243
252
  end
244
253
  when (300..399)
@@ -250,11 +259,11 @@ module OAuth
250
259
  response.error! if uri.path == path && our_uri.host == uri.host
251
260
 
252
261
  if uri.path == path && our_uri.host != uri.host
253
- options[:site] = "#{uri.scheme}://#{uri.host}"
254
- @http = create_http
262
+ options[:site] = "#{uri.scheme}://#{uri.host}"
263
+ @http = create_http
255
264
  end
256
265
 
257
- self.token_request(http_method, uri.path, token, request_options, arguments)
266
+ token_request(http_method, uri.path, token, request_options, arguments)
258
267
  when (400..499)
259
268
  raise OAuth::Unauthorized, response
260
269
  else
@@ -278,6 +287,7 @@ module OAuth
278
287
 
279
288
  def request_endpoint
280
289
  return nil if @options[:request_endpoint].nil?
290
+
281
291
  @options[:request_endpoint].to_s
282
292
  end
283
293
 
@@ -301,37 +311,37 @@ module OAuth
301
311
  @options[:access_token_path]
302
312
  end
303
313
 
304
- # TODO this is ugly, rewrite
314
+ # TODO: this is ugly, rewrite
305
315
  def request_token_url
306
- @options[:request_token_url] || site + request_token_path
316
+ @options[:request_token_url] || (site + request_token_path)
307
317
  end
308
318
 
309
319
  def request_token_url?
310
- @options.has_key?(:request_token_url)
320
+ @options.key?(:request_token_url)
311
321
  end
312
322
 
313
323
  def authenticate_url
314
- @options[:authenticate_url] || site + authenticate_path
324
+ @options[:authenticate_url] || (site + authenticate_path)
315
325
  end
316
326
 
317
327
  def authenticate_url?
318
- @options.has_key?(:authenticate_url)
328
+ @options.key?(:authenticate_url)
319
329
  end
320
330
 
321
331
  def authorize_url
322
- @options[:authorize_url] || site + authorize_path
332
+ @options[:authorize_url] || (site + authorize_path)
323
333
  end
324
334
 
325
335
  def authorize_url?
326
- @options.has_key?(:authorize_url)
336
+ @options.key?(:authorize_url)
327
337
  end
328
338
 
329
339
  def access_token_url
330
- @options[:access_token_url] || site + access_token_path
340
+ @options[:access_token_url] || (site + access_token_path)
331
341
  end
332
342
 
333
343
  def access_token_url?
334
- @options.has_key?(:access_token_url)
344
+ @options.key?(:access_token_url)
335
345
  end
336
346
 
337
347
  def proxy
@@ -342,12 +352,9 @@ module OAuth
342
352
 
343
353
  # Instantiates the http object
344
354
  def create_http(_url = nil)
355
+ _url = request_endpoint unless request_endpoint.nil?
345
356
 
346
- if !request_endpoint.nil?
347
- _url = request_endpoint
348
- end
349
-
350
- our_uri = if _url.nil? || _url[0] =~ /^\//
357
+ our_uri = if _url.nil? || _url[0] =~ %r{^/}
351
358
  URI.parse(site)
352
359
  else
353
360
  your_uri = URI.parse(_url)
@@ -364,7 +371,8 @@ module OAuth
364
371
  http_object = Net::HTTP.new(our_uri.host, our_uri.port)
365
372
  else
366
373
  proxy_uri = proxy.is_a?(URI) ? proxy : URI.parse(proxy)
367
- 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)
368
376
  end
369
377
 
370
378
  http_object.use_ssl = (our_uri.scheme == "https")
@@ -372,10 +380,8 @@ module OAuth
372
380
  if @options[:no_verify]
373
381
  http_object.verify_mode = OpenSSL::SSL::VERIFY_NONE
374
382
  else
375
- ca_file = @options[:ca_file] || CA_FILE
376
- if ca_file
377
- http_object.ca_file = ca_file
378
- end
383
+ ca_file = @options[:ca_file] || CA_FILE
384
+ http_object.ca_file = ca_file if ca_file
379
385
  http_object.verify_mode = OpenSSL::SSL::VERIFY_PEER
380
386
  http_object.verify_depth = 5
381
387
  end
@@ -384,7 +390,7 @@ module OAuth
384
390
  http_object.open_timeout = @options[:open_timeout] if @options[:open_timeout]
385
391
  http_object.ssl_version = @options[:ssl_version] if @options[:ssl_version]
386
392
  http_object.cert = @options[:ssl_client_cert] if @options[:ssl_client_cert]
387
- http_object.key = @options[:ssl_client_key] if @options[:ssl_client_key]
393
+ http_object.key = @options[:ssl_client_key] if @options[:ssl_client_key]
388
394
  http_object.set_debug_output(debug_output) if debug_output
389
395
 
390
396
  http_object
@@ -394,36 +400,34 @@ module OAuth
394
400
  def create_http_request(http_method, path, *arguments)
395
401
  http_method = http_method.to_sym
396
402
 
397
- if [:post, :put, :patch].include?(http_method)
398
- data = arguments.shift
399
- end
403
+ data = arguments.shift if %i[post put patch].include?(http_method)
400
404
 
401
405
  # if the base site contains a path, add it now
402
406
  # only add if the site host matches the current http object's host
403
407
  # (in case we've specified a full url for token requests)
404
- uri = URI.parse(site)
408
+ uri = URI.parse(site)
405
409
  path = uri.path + path if uri.path && uri.path != "/" && uri.host == http.address
406
410
 
407
411
  headers = arguments.first.is_a?(Hash) ? arguments.shift : {}
408
412
 
409
413
  case http_method
410
414
  when :post
411
- request = Net::HTTP::Post.new(path,headers)
415
+ request = Net::HTTP::Post.new(path, headers)
412
416
  request["Content-Length"] = "0" # Default to 0
413
417
  when :put
414
- request = Net::HTTP::Put.new(path,headers)
418
+ request = Net::HTTP::Put.new(path, headers)
415
419
  request["Content-Length"] = "0" # Default to 0
416
420
  when :patch
417
- request = Net::HTTP::Patch.new(path,headers)
421
+ request = Net::HTTP::Patch.new(path, headers)
418
422
  request["Content-Length"] = "0" # Default to 0
419
423
  when :get
420
- request = Net::HTTP::Get.new(path,headers)
424
+ request = Net::HTTP::Get.new(path, headers)
421
425
  when :delete
422
- request = Net::HTTP::Delete.new(path,headers)
426
+ request = Net::HTTP::Delete.new(path, headers)
423
427
  when :head
424
- request = Net::HTTP::Head.new(path,headers)
428
+ request = Net::HTTP::Head.new(path, headers)
425
429
  else
426
- 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}"
427
431
  end
428
432
 
429
433
  if data.is_a?(Hash)
@@ -448,13 +452,12 @@ module OAuth
448
452
  request
449
453
  end
450
454
 
451
- def marshal_dump(*args)
452
- {:key => @key, :secret => @secret, :options => @options}
455
+ def marshal_dump(*_args)
456
+ { key: @key, secret: @secret, options: @options }
453
457
  end
454
458
 
455
459
  def marshal_load(data)
456
460
  initialize(data[:key], data[:secret], data[:options])
457
461
  end
458
-
459
462
  end
460
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,7 +1,11 @@
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
 
data/lib/oauth/errors.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "oauth/errors/error"
2
4
  require "oauth/errors/unauthorized"
3
5
  require "oauth/errors/problem"
data/lib/oauth/helper.rb CHANGED
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "time"
1
4
  require "openssl"
2
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
  #
@@ -24,13 +27,13 @@ module OAuth
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)
30
+ def generate_key(size = 32)
28
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,7 +46,8 @@ 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
@@ -51,13 +55,13 @@ module OAuth
51
55
  normalize_nested_query(values, k)
52
56
  else
53
57
  values.sort.collect do |v|
54
- [escape(k),escape(v)] * "="
58
+ [escape(k), escape(v)].join("=")
55
59
  end
56
60
  end
57
- elsif values.is_a?(Hash)
61
+ when Hash
58
62
  normalize_nested_query(values, k)
59
63
  else
60
- [escape(k),escape(values)] * "="
64
+ [escape(k), escape(values)].join("=")
61
65
  end
62
66
  end * "&"
63
67
  end
@@ -76,7 +80,7 @@ module OAuth
76
80
  normalize_nested_query(v, prefix ? "#{prefix}[#{k}]" : k)
77
81
  end.flatten.sort
78
82
  else
79
- [escape(prefix), escape(value)] * "="
83
+ [escape(prefix), escape(value)].join("=")
80
84
  end
81
85
  end
82
86
 
@@ -90,16 +94,16 @@ module OAuth
90
94
  #
91
95
  def parse_header(header)
92
96
  # decompose
93
- params = header[6,header.length].split(/[,=&]/)
97
+ params = header[6, header.length].split(/[,=&]/)
94
98
 
95
99
  # odd number of arguments - must be a malformed header.
96
- raise OAuth::Problem.new("Invalid authorization header") if params.size % 2 != 0
100
+ raise OAuth::Problem, "Invalid authorization header" if params.size.odd?
97
101
 
98
102
  params.map! do |v|
99
103
  # strip and unescape
100
104
  val = unescape(v.strip)
101
105
  # strip quotes
102
- val.sub(/^\"(.*)\"$/, '\1')
106
+ val.sub(/^"(.*)"$/, '\1')
103
107
  end
104
108
 
105
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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "action_controller"
2
4
  require "action_controller/test_process"
3
5
 
@@ -1,36 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "active_support"
4
- require "active_support/version"
5
4
  require "action_controller"
6
5
  require "uri"
7
6
 
8
- if Gem::Version.new(ActiveSupport::VERSION::STRING) < Gem::Version.new("3")
9
- # rails 2.x
10
- require "action_controller/request"
11
- unless ActionController::Request::HTTP_METHODS.include?("patch")
12
- ActionController::Request::HTTP_METHODS << "patch"
13
- ActionController::Request::HTTP_METHOD_LOOKUP["PATCH"] = :patch
14
- ActionController::Request::HTTP_METHOD_LOOKUP["patch"] = :patch
15
- end
16
-
17
- elsif Gem::Version.new(ActiveSupport::VERSION::STRING) < Gem::Version.new("4")
18
- # rails 3.x
19
- require "action_dispatch/http/request"
20
- unless ActionDispatch::Request::HTTP_METHODS.include?("patch")
21
- ActionDispatch::Request::HTTP_METHODS << "patch"
22
- ActionDispatch::Request::HTTP_METHOD_LOOKUP["PATCH"] = :patch
23
- ActionDispatch::Request::HTTP_METHOD_LOOKUP["patch"] = :patch
24
- end
25
-
26
- else # rails 4.x and later - already has patch
27
- require "action_dispatch/http/request"
28
- end
7
+ require "action_dispatch/http/request"
29
8
 
30
9
  module OAuth
31
10
  module RequestProxy
32
11
  class ActionControllerRequest < OAuth::RequestProxy::Base
33
- proxies(defined?(::ActionDispatch::AbstractRequest) ? ::ActionDispatch::AbstractRequest : ::ActionDispatch::Request)
12
+ proxies(::ActionDispatch::Request)
34
13
 
35
14
  def method
36
15
  request.method.to_s.upcase
@@ -50,7 +29,7 @@ module OAuth
50
29
  end
51
30
  end
52
31
 
53
- # Override from OAuth::RequestProxy::Base to avoid roundtrip
32
+ # Override from OAuth::RequestProxy::Base to avoid round-trip
54
33
  # conversion to Hash or Array and thus preserve the original
55
34
  # parameter names
56
35
  def parameters_for_signature
File without changes
@@ -83,7 +83,7 @@ module OAuth
83
83
  end
84
84
 
85
85
  def oauth_parameters
86
- parameters.select { |k, _v| OAuth::PARAMETERS.include?(k) }.select { |_k, v| v != "" }
86
+ parameters.select { |k, v| OAuth::PARAMETERS.include?(k) && !v.nil? && v != "" }
87
87
  end
88
88
 
89
89
  def non_oauth_parameters
@@ -127,7 +127,7 @@ module OAuth
127
127
  end
128
128
 
129
129
  # URI, including OAuth parameters
130
- def signed_uri(with_oauth = true)
130
+ def signed_uri(with_oauth: true)
131
131
  if signed?
132
132
  params = if with_oauth
133
133
  parameters
File without changes
File without changes
File without changes
@@ -32,7 +32,7 @@ module OAuth
32
32
 
33
33
  def normalized_uri
34
34
  super
35
- rescue
35
+ rescue StandardError
36
36
  # if this is a non-standard URI, it may not parse properly
37
37
  # in that case, assume that it's already been normalized
38
38
  uri