api-auth 2.1.0 → 2.2.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.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -40
- data/.travis.yml +10 -41
- data/Appraisals +16 -42
- data/Gemfile +1 -4
- data/README.md +28 -4
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/api_auth.gemspec +9 -10
- data/gemfiles/rails_5.gemfile +2 -2
- data/gemfiles/rails_51.gemfile +9 -0
- data/lib/api_auth/base.rb +10 -10
- data/lib/api_auth/headers.rb +9 -9
- data/lib/api_auth/helpers.rb +2 -11
- data/lib/api_auth/railtie.rb +5 -13
- data/lib/api_auth/request_drivers/action_controller.rb +8 -7
- data/lib/api_auth/request_drivers/curb.rb +8 -7
- data/lib/api_auth/request_drivers/faraday.rb +10 -9
- data/lib/api_auth/request_drivers/httpi.rb +8 -7
- data/lib/api_auth/request_drivers/net_http.rb +8 -7
- data/lib/api_auth/request_drivers/rack.rb +10 -9
- data/lib/api_auth/request_drivers/rest_client.rb +10 -9
- data/spec/.rubocop.yml +5 -0
- data/spec/api_auth_spec.rb +23 -12
- data/spec/headers_spec.rb +49 -12
- data/spec/railtie_spec.rb +33 -59
- data/spec/request_drivers/rack_spec.rb +17 -17
- data/spec/request_drivers/rest_client_spec.rb +44 -45
- metadata +27 -15
- data/gemfiles/rails_23.gemfile +0 -12
- data/gemfiles/rails_30.gemfile +0 -12
- data/gemfiles/rails_31.gemfile +0 -14
- data/gemfiles/rails_32.gemfile +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 51fee150bf8e85fbaa3195608e96a25ad4ef7cb19bcc026137c1831c94f652c1
|
4
|
+
data.tar.gz: 7c0aeeefdf36f93e53cef4ac76f0015efa587c5a7b572dafe6670276d786e92a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cf7349cdbed677337b82e3c0ad87ce1271ce0a92c65a9bda8514dadde6c3a6fd40e962fc9b23cb937e0b1b804d456930d6ddeb245d5d3d5ed021639c077a3c8
|
7
|
+
data.tar.gz: c4935420257b03f3f90460c7caffb64d0da2792f9793c24c02bf00e7abdc1a80a509d73c3ed86a95098de3cb5aaeb96776e383a537dfab3233fd043a6077c928
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -12,11 +12,6 @@ Lint/AssignmentInCondition:
|
|
12
12
|
Exclude:
|
13
13
|
- 'lib/api_auth/base.rb'
|
14
14
|
|
15
|
-
# Offense count: 1
|
16
|
-
Lint/UselessAssignment:
|
17
|
-
Exclude:
|
18
|
-
- 'spec/request_drivers/rest_client_spec.rb'
|
19
|
-
|
20
15
|
# Offense count: 2
|
21
16
|
Metrics/AbcSize:
|
22
17
|
Max: 25
|
@@ -60,43 +55,9 @@ Style/Documentation:
|
|
60
55
|
- 'lib/api_auth/railtie.rb'
|
61
56
|
- 'lib/api_auth/request_drivers/rest_client.rb'
|
62
57
|
|
63
|
-
# Offense count: 1
|
64
|
-
# Cop supports --auto-correct.
|
65
|
-
# Configuration parameters: AllowForAlignment, ForceEqualSignAlignment.
|
66
|
-
Style/ExtraSpacing:
|
67
|
-
Exclude:
|
68
|
-
- 'lib/api_auth/railtie.rb'
|
69
|
-
|
70
58
|
# Offense count: 1
|
71
59
|
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts.
|
72
60
|
Style/FileName:
|
73
61
|
Exclude:
|
74
62
|
- 'lib/api-auth.rb'
|
75
|
-
|
76
|
-
# Offense count: 110
|
77
|
-
# Cop supports --auto-correct.
|
78
|
-
# Configuration parameters: SupportedStyles, UseHashRocketsWithSymbolValues.
|
79
|
-
# SupportedStyles: ruby19, ruby19_no_mixed_keys, hash_rockets
|
80
|
-
Style/HashSyntax:
|
81
|
-
EnforcedStyle: hash_rockets
|
82
|
-
|
83
|
-
# Offense count: 4
|
84
|
-
# Cop supports --auto-correct.
|
85
|
-
# Configuration parameters: PreferredDelimiters.
|
86
|
-
Style/PercentLiteralDelimiters:
|
87
|
-
Exclude:
|
88
|
-
- 'api_auth.gemspec'
|
89
|
-
|
90
|
-
# Offense count: 1
|
91
|
-
# Cop supports --auto-correct.
|
92
|
-
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
93
|
-
# SupportedStyles: use_perl_names, use_english_names
|
94
|
-
Style/SpecialGlobalVars:
|
95
|
-
Enabled: false
|
96
|
-
|
97
|
-
# Offense count: 4
|
98
|
-
# Cop supports --auto-correct.
|
99
|
-
Style/UnneededPercentQ:
|
100
|
-
Exclude:
|
101
|
-
- 'api_auth.gemspec'
|
102
|
-
|
63
|
+
- 'Appraisals'
|
data/.travis.yml
CHANGED
@@ -2,64 +2,33 @@ language: ruby
|
|
2
2
|
sudo: false
|
3
3
|
cache: bundler
|
4
4
|
rvm:
|
5
|
-
- 1.8.7-p374
|
6
|
-
- 1.9.3
|
7
5
|
- 2.1.9
|
8
|
-
- 2.2.
|
9
|
-
- 2.3.
|
6
|
+
- 2.2.6
|
7
|
+
- 2.3.3
|
8
|
+
- 2.4.1
|
10
9
|
gemfile:
|
11
|
-
- gemfiles/rails_23.gemfile
|
12
|
-
- gemfiles/rails_30.gemfile
|
13
|
-
- gemfiles/rails_31.gemfile
|
14
|
-
- gemfiles/rails_32.gemfile
|
15
10
|
- gemfiles/rails_4.gemfile
|
16
11
|
- gemfiles/rails_41.gemfile
|
17
12
|
- gemfiles/rails_42.gemfile
|
18
13
|
- gemfiles/rails_5.gemfile
|
14
|
+
- gemfiles/rails_51.gemfile
|
19
15
|
env:
|
20
16
|
- TEST_SUITE=rake
|
21
17
|
|
18
|
+
before_install:
|
19
|
+
- gem update bundler
|
20
|
+
|
22
21
|
script:
|
23
22
|
- bundle exec $TEST_SUITE
|
24
23
|
|
25
24
|
matrix:
|
26
25
|
exclude:
|
27
|
-
- rvm: 1.8.7-p374
|
28
|
-
gemfile: gemfiles/rails_4.gemfile
|
29
|
-
- rvm: 1.8.7-p374
|
30
|
-
gemfile: gemfiles/rails_41.gemfile
|
31
|
-
- rvm: 1.8.7-p374
|
32
|
-
gemfile: gemfiles/rails_42.gemfile
|
33
|
-
- rvm: 1.8.7-p374
|
34
|
-
gemfile: gemfiles/rails_5.gemfile
|
35
|
-
- rvm: 1.9.3
|
36
|
-
gemfile: gemfiles/rails_5.gemfile
|
37
|
-
- rvm: 2.1.9
|
38
|
-
gemfile: gemfiles/rails_23.gemfile
|
39
|
-
- rvm: 2.1.9
|
40
|
-
gemfile: gemfiles/rails_30.gemfile
|
41
|
-
- rvm: 2.1.9
|
42
|
-
gemfile: gemfiles/rails_31.gemfile
|
43
26
|
- rvm: 2.1.9
|
44
27
|
gemfile: gemfiles/rails_5.gemfile
|
45
|
-
- rvm: 2.
|
46
|
-
gemfile: gemfiles/
|
47
|
-
- rvm: 2.2.5
|
48
|
-
gemfile: gemfiles/rails_30.gemfile
|
49
|
-
- rvm: 2.2.5
|
50
|
-
gemfile: gemfiles/rails_31.gemfile
|
51
|
-
- rvm: 2.2.5
|
52
|
-
gemfile: gemfiles/rails_32.gemfile
|
53
|
-
- rvm: 2.3.1
|
54
|
-
gemfile: gemfiles/rails_23.gemfile
|
55
|
-
- rvm: 2.3.1
|
56
|
-
gemfile: gemfiles/rails_30.gemfile
|
57
|
-
- rvm: 2.3.1
|
58
|
-
gemfile: gemfiles/rails_31.gemfile
|
59
|
-
- rvm: 2.3.1
|
60
|
-
gemfile: gemfiles/rails_32.gemfile
|
28
|
+
- rvm: 2.1.9
|
29
|
+
gemfile: gemfiles/rails_51.gemfile
|
61
30
|
include:
|
62
|
-
- rvm: 2.
|
31
|
+
- rvm: 2.4.1
|
63
32
|
gemfile: gemfiles/rails_5.gemfile
|
64
33
|
env: TEST_SUITE="rubocop lib/ spec/"
|
65
34
|
|
data/Appraisals
CHANGED
@@ -1,49 +1,23 @@
|
|
1
|
-
appraise
|
2
|
-
gem
|
3
|
-
gem
|
4
|
-
gem
|
1
|
+
appraise 'rails-5' do
|
2
|
+
gem 'actionpack', '~> 5.0.2'
|
3
|
+
gem 'activeresource', '~> 5.0.2'
|
4
|
+
gem 'activesupport', '~> 5.0.2'
|
5
5
|
end
|
6
6
|
|
7
|
-
appraise
|
8
|
-
gem
|
9
|
-
gem
|
10
|
-
gem
|
7
|
+
appraise 'rails-42' do
|
8
|
+
gem 'actionpack', '~> 4.2.0'
|
9
|
+
gem 'activeresource', '~> 4.0.0'
|
10
|
+
gem 'activesupport', '~> 4.2.0'
|
11
11
|
end
|
12
12
|
|
13
|
-
appraise
|
14
|
-
gem
|
15
|
-
gem
|
16
|
-
gem
|
13
|
+
appraise 'rails-41' do
|
14
|
+
gem 'actionpack', '~> 4.1.0'
|
15
|
+
gem 'activeresource', '~> 4.0.0'
|
16
|
+
gem 'activesupport', '~> 4.1.0'
|
17
17
|
end
|
18
18
|
|
19
|
-
appraise
|
20
|
-
gem
|
21
|
-
gem
|
22
|
-
gem
|
23
|
-
gem "httpi", "< 2.3"
|
24
|
-
gem "i18n", "< 0.7.0"
|
25
|
-
gem "rack-cache", "< 1.3"
|
26
|
-
end
|
27
|
-
|
28
|
-
appraise "rails-31" do
|
29
|
-
gem "actionpack", "~> 3.1.0"
|
30
|
-
gem "activeresource", "~> 3.1.0"
|
31
|
-
gem "activesupport", "~> 3.1.0"
|
32
|
-
gem "httpi", "< 2.3"
|
33
|
-
gem "i18n", "< 0.7.0"
|
34
|
-
gem "rack-cache", "< 1.3"
|
35
|
-
end
|
36
|
-
|
37
|
-
appraise "rails-30" do
|
38
|
-
gem "actionpack", "~> 3.0.20"
|
39
|
-
gem "activeresource", "~> 3.0.20"
|
40
|
-
gem "activesupport", "~> 3.0.20"
|
41
|
-
gem "httpi", "< 2.3"
|
42
|
-
end
|
43
|
-
|
44
|
-
appraise "rails-23" do
|
45
|
-
gem "actionpack", "~> 2.3.2"
|
46
|
-
gem "activeresource", "~> 2.3.2"
|
47
|
-
gem "activesupport", "~> 2.3.2"
|
48
|
-
gem "httpi", "< 2.3"
|
19
|
+
appraise 'rails-4' do
|
20
|
+
gem 'actionpack', '~> 4.0.4'
|
21
|
+
gem 'activeresource', '~> 4.0.0'
|
22
|
+
gem 'activesupport', '~> 4.0.4'
|
49
23
|
end
|
data/Gemfile
CHANGED
@@ -1,7 +1,4 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
gemspec
|
3
3
|
|
4
|
-
gem '
|
5
|
-
gem 'tins', '< 1.7', :platforms => :ruby_19 # amatch dependency
|
6
|
-
|
7
|
-
gem 'rubocop', :platforms => [:ruby_19, :ruby_20, :ruby_21, :ruby_22, :ruby_23]
|
4
|
+
gem 'rubocop', platforms: %i[ruby_20 ruby_21 ruby_22 ruby_23 ruby_24]
|
data/README.md
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
|
3
3
|
[](https://travis-ci.org/mgomes/api_auth)
|
4
4
|
|
5
|
-
## IMPORTANT: v2.0.0 is backwards incompatible with the default settings of v1.x to address a security vulnerability. See [CHANGELOG.md](/CHANGELOG.md) for security update information.
|
6
|
-
|
7
5
|
Logins and passwords are for humans. Communication between applications need to
|
8
6
|
be protected through different means.
|
9
7
|
|
@@ -51,6 +49,14 @@ minutes in order to avoid replay attacks.
|
|
51
49
|
* [HMAC algorithm](http://en.wikipedia.org/wiki/HMAC)
|
52
50
|
* [RFC 2104 (HMAC)](http://tools.ietf.org/html/rfc2104)
|
53
51
|
|
52
|
+
## Requirement
|
53
|
+
|
54
|
+
v3.X require Ruby 2.X and if you use Rails at least Rails 4.0.
|
55
|
+
|
56
|
+
For older version of Ruby or Rails, please use ApiAuth v2.X.
|
57
|
+
|
58
|
+
**IMPORTANT: v2.0.0 is backwards incompatible with the default settings of v1.x to address a security vulnerability. See [CHANGELOG.md](/CHANGELOG.md) for security update information.**
|
59
|
+
|
54
60
|
## Install
|
55
61
|
|
56
62
|
The gem doesn't have any dependencies outside of having a working OpenSSL
|
@@ -72,6 +78,7 @@ Here is the current list of supported request objects:
|
|
72
78
|
* Curb (Curl::Easy)
|
73
79
|
* RestClient
|
74
80
|
* Faraday
|
81
|
+
* HTTParty
|
75
82
|
* Httpi
|
76
83
|
|
77
84
|
### HTTP Client Objects
|
@@ -171,7 +178,7 @@ To validate whether or not a request is authentic:
|
|
171
178
|
```
|
172
179
|
|
173
180
|
The `authentic?` method uses the digest specified in the `Authorization` header.
|
174
|
-
For
|
181
|
+
For example SHA256 for:
|
175
182
|
|
176
183
|
Authorization = APIAuth-HMAC-SHA256 'client access id':'signature'
|
177
184
|
|
@@ -183,6 +190,17 @@ If you want to force the usage of another digest method, you should pass it as a
|
|
183
190
|
ApiAuth.authentic?(signed_request, secret_key, :digest => 'sha256')
|
184
191
|
```
|
185
192
|
|
193
|
+
For security, requests dated older or newer than a certain timespan are considered inauthentic.
|
194
|
+
|
195
|
+
This prevents old requests from being reused in replay attacks, and also ensures requests
|
196
|
+
can't be dated into the far future.
|
197
|
+
|
198
|
+
The default span is 15 minutes, but you can override this:
|
199
|
+
|
200
|
+
```ruby
|
201
|
+
ApiAuth.authentic?(signed_request, secret_key, :clock_skew => 60) # or 1.minute in ActiveSupport
|
202
|
+
```
|
203
|
+
|
186
204
|
If your server is a Rails app, the signed request will be the `request` object.
|
187
205
|
|
188
206
|
In order to obtain the secret key for the client, you first need to look up the
|
@@ -217,7 +235,13 @@ take care of all that for you.
|
|
217
235
|
|
218
236
|
To run the tests:
|
219
237
|
|
220
|
-
|
238
|
+
Install the dependencies for a particular Rails version by specifying a gemfile in `gemfiles` directory:
|
239
|
+
|
240
|
+
BUNDLE_GEMFILE=gemfiles/rails_5.gemfile bundle install
|
241
|
+
|
242
|
+
Run the tests with those dependencies:
|
243
|
+
|
244
|
+
BUNDLE_GEMFILE=gemfiles/rails_5.gemfile bundle exec rake
|
221
245
|
|
222
246
|
If you'd like to add support for additional HTTP clients, check out the already
|
223
247
|
implemented drivers in `lib/api_auth/request_drivers` for reference. All of
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.2.0
|
data/api_auth.gemspec
CHANGED
@@ -1,11 +1,10 @@
|
|
1
|
-
|
2
|
-
$:.push File.expand_path('../lib', __FILE__)
|
1
|
+
$LOAD_PATH.push File.expand_path('../lib', __FILE__)
|
3
2
|
|
4
3
|
Gem::Specification.new do |s|
|
5
|
-
s.name =
|
6
|
-
s.summary =
|
7
|
-
s.description =
|
8
|
-
s.homepage =
|
4
|
+
s.name = 'api-auth'
|
5
|
+
s.summary = 'Simple HMAC authentication for your APIs'
|
6
|
+
s.description = 'Full HMAC auth implementation for use in your gems and Rails apps.'
|
7
|
+
s.homepage = 'https://github.com/mgomes/api_auth'
|
9
8
|
s.version = File.read(File.join(File.dirname(__FILE__), 'VERSION'))
|
10
9
|
s.authors = ['Mauricio Gomes']
|
11
10
|
s.email = 'mauricio@edge14.com'
|
@@ -14,15 +13,15 @@ Gem::Specification.new do |s|
|
|
14
13
|
s.add_development_dependency 'rake'
|
15
14
|
s.add_development_dependency 'amatch'
|
16
15
|
s.add_development_dependency 'rspec', '~> 3.4'
|
17
|
-
s.add_development_dependency 'actionpack', '<
|
18
|
-
s.add_development_dependency 'activesupport', '<
|
16
|
+
s.add_development_dependency 'actionpack', '< 6.0', '> 4.0'
|
17
|
+
s.add_development_dependency 'activesupport', '< 6.0', '> 4.0'
|
19
18
|
s.add_development_dependency 'activeresource', '~> 4.0'
|
20
19
|
s.add_development_dependency 'rest-client', '~> 1.6.0'
|
21
20
|
s.add_development_dependency 'curb', '~> 0.8.1'
|
22
21
|
s.add_development_dependency 'httpi'
|
23
|
-
|
24
|
-
s.add_development_dependency 'faraday', faraday_version
|
22
|
+
s.add_development_dependency 'faraday', '>= 0.10'
|
25
23
|
s.add_development_dependency 'multipart-post', '~> 2.0'
|
24
|
+
s.add_development_dependency 'httparty', '~> 0.13.0'
|
26
25
|
|
27
26
|
s.files = `git ls-files`.split("\n")
|
28
27
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/gemfiles/rails_5.gemfile
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
source "https://rubygems.org"
|
4
4
|
|
5
|
-
gem "actionpack", "~> 5.0.
|
5
|
+
gem "actionpack", "~> 5.0.2"
|
6
6
|
gem "activeresource", "~> 5.0.0", git: 'https://github.com/rails/activeresource.git'
|
7
|
-
gem "activesupport", "~> 5.0.
|
7
|
+
gem "activesupport", "~> 5.0.2"
|
8
8
|
|
9
9
|
gem "rubocop"
|
10
10
|
|
data/lib/api_auth/base.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# api-auth is a Ruby gem designed to be used both in your client and server
|
3
2
|
# HTTP-based applications. It implements the same authentication methods (HMAC)
|
4
3
|
# used by Amazon Web Services.
|
@@ -21,7 +20,7 @@ module ApiAuth
|
|
21
20
|
#
|
22
21
|
# secret_key: assigned secret key that is known to both parties
|
23
22
|
def sign!(request, access_id, secret_key, options = {})
|
24
|
-
options = { :
|
23
|
+
options = { override_http_method: nil, digest: 'sha1' }.merge(options)
|
25
24
|
headers = Headers.new(request)
|
26
25
|
headers.calculate_md5
|
27
26
|
headers.set_date
|
@@ -33,15 +32,18 @@ module ApiAuth
|
|
33
32
|
def authentic?(request, secret_key, options = {})
|
34
33
|
return false if secret_key.nil?
|
35
34
|
|
36
|
-
options = { :
|
35
|
+
options = { override_http_method: nil }.merge(options)
|
37
36
|
|
38
37
|
headers = Headers.new(request)
|
39
38
|
|
39
|
+
# 900 seconds is 15 minutes
|
40
|
+
clock_skew = options.fetch(:clock_skew, 900)
|
41
|
+
|
40
42
|
if headers.md5_mismatch?
|
41
43
|
false
|
42
44
|
elsif !signatures_match?(headers, secret_key, options)
|
43
45
|
false
|
44
|
-
elsif !request_within_time_window?(headers)
|
46
|
+
elsif !request_within_time_window?(headers, clock_skew)
|
45
47
|
false
|
46
48
|
else
|
47
49
|
true
|
@@ -71,11 +73,9 @@ module ApiAuth
|
|
71
73
|
|
72
74
|
AUTH_HEADER_PATTERN = /APIAuth(?:-HMAC-(MD5|SHA(?:1|224|256|384|512)?))? ([^:]+):(.+)$/
|
73
75
|
|
74
|
-
def request_within_time_window?(headers)
|
75
|
-
|
76
|
-
|
77
|
-
Time.httpdate(headers.timestamp).utc > (Time.now.utc - 900) &&
|
78
|
-
Time.httpdate(headers.timestamp).utc < (Time.now.utc + 900)
|
76
|
+
def request_within_time_window?(headers, clock_skew)
|
77
|
+
Time.httpdate(headers.timestamp).utc > (Time.now.utc - clock_skew) &&
|
78
|
+
Time.httpdate(headers.timestamp).utc < (Time.now.utc + clock_skew)
|
79
79
|
rescue ArgumentError
|
80
80
|
false
|
81
81
|
end
|
@@ -87,7 +87,7 @@ module ApiAuth
|
|
87
87
|
digest = match_data[1].nil? ? 'SHA1' : match_data[1].upcase
|
88
88
|
raise InvalidRequestDigest if !options[:digest].nil? && !options[:digest].casecmp(digest).zero?
|
89
89
|
|
90
|
-
options = { :
|
90
|
+
options = { digest: digest }.merge(options)
|
91
91
|
|
92
92
|
header_sig = match_data[3]
|
93
93
|
calculated_sig = hmac_signature(headers, secret_key, options)
|
data/lib/api_auth/headers.rb
CHANGED
@@ -57,7 +57,7 @@ module ApiAuth
|
|
57
57
|
[request_method.upcase,
|
58
58
|
@request.content_type,
|
59
59
|
@request.content_md5,
|
60
|
-
parse_uri(@request.request_uri),
|
60
|
+
parse_uri(@request.original_uri || @request.request_uri),
|
61
61
|
@request.timestamp].join(',')
|
62
62
|
end
|
63
63
|
|
@@ -67,15 +67,15 @@ module ApiAuth
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def set_date
|
70
|
-
@request.set_date if @request.timestamp.
|
70
|
+
@request.set_date if @request.timestamp.nil?
|
71
71
|
end
|
72
72
|
|
73
73
|
def calculate_md5
|
74
|
-
@request.populate_content_md5 if @request.content_md5.
|
74
|
+
@request.populate_content_md5 if @request.content_md5.nil?
|
75
75
|
end
|
76
76
|
|
77
77
|
def md5_mismatch?
|
78
|
-
if @request.content_md5.
|
78
|
+
if @request.content_md5.nil?
|
79
79
|
false
|
80
80
|
else
|
81
81
|
@request.md5_mismatch?
|
@@ -93,12 +93,12 @@ module ApiAuth
|
|
93
93
|
|
94
94
|
private
|
95
95
|
|
96
|
-
URI_WITHOUT_HOST_REGEXP = %r{https?://[^,?/]*}
|
97
|
-
|
98
96
|
def parse_uri(uri)
|
99
|
-
|
100
|
-
|
101
|
-
|
97
|
+
parsed_uri = URI.parse(uri)
|
98
|
+
|
99
|
+
return parsed_uri.request_uri if parsed_uri.respond_to?(:request_uri)
|
100
|
+
|
101
|
+
uri.empty? ? '/' : uri
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|