ey_api_hmac 0.3.1 → 0.4.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.
@@ -10,7 +10,7 @@ module EY
10
10
  env["HTTP_AUTHORIZATION"] = auth_string(key_id, signature(env, secret))
11
11
  end
12
12
 
13
- def self.canonical_string(env)
13
+ def self.canonical_string(env, legacy = false)
14
14
  parts = []
15
15
  expect = Proc.new do |var|
16
16
  unless env[var]
@@ -20,7 +20,7 @@ module EY
20
20
  end
21
21
  parts << expect["REQUEST_METHOD"]
22
22
  parts << env["CONTENT_TYPE"]
23
- parts << generated_md5(env)
23
+ parts << generated_md5(env, legacy)
24
24
  parts << expect["HTTP_DATE"]
25
25
  if env["REQUEST_URI"]
26
26
  parts << URI.parse(env["REQUEST_URI"]).path
@@ -38,6 +38,10 @@ module EY
38
38
  base64digest(canonical_string(env), secret)
39
39
  end
40
40
 
41
+ def self.signature_legacy(env, secret)
42
+ base64digest(canonical_string(env, true), secret)
43
+ end
44
+
41
45
  def self.base64digest(data,secret)
42
46
  digest = OpenSSL::Digest::Digest.new('sha1')
43
47
  [OpenSSL::HMAC.digest(digest, secret, data)].pack('m').strip
@@ -54,7 +58,7 @@ module EY
54
58
  unless secret
55
59
  raise HmacAuthFail, "couldn't find auth for #{access_key_id}"
56
60
  end
57
- unless hmac == signature(env, secret)
61
+ unless hmac == signature(env, secret) || hmac == signature_legacy(env, secret)
58
62
  raise HmacAuthFail, "signature mismatch. Calculated canonical_string: #{canonical_string(env).inspect}"
59
63
  end
60
64
  else
@@ -73,11 +77,15 @@ module EY
73
77
 
74
78
  private
75
79
 
76
- def self.generated_md5(env)
80
+ def self.generated_md5(env, legacy = false)
77
81
  env["rack.input"].rewind
78
82
  request_body = env["rack.input"].read
79
83
  env["rack.input"].rewind
80
- request_body.empty? ? nil : OpenSSL::Digest::MD5.hexdigest(request_body)
84
+ if legacy
85
+ OpenSSL::Digest::MD5.hexdigest(request_body)
86
+ else
87
+ request_body.empty? ? nil : OpenSSL::Digest::MD5.hexdigest(request_body)
88
+ end
81
89
  end
82
90
 
83
91
  end
@@ -1,5 +1,5 @@
1
1
  module EY
2
2
  module ApiHMAC
3
- VERSION = "0.3.1"
3
+ VERSION = "0.4.0"
4
4
  end
5
5
  end
@@ -109,8 +109,17 @@ describe EY::ApiHMAC::ApiAuth do
109
109
  end
110
110
 
111
111
  describe "authenticated?" do
112
- describe "request signed by AuthHMAC" do
113
112
 
113
+ it "verifies the old signing method without body" do
114
+ @env['rack.input'] = StringIO.new
115
+ @env.delete('HTTP_CONTENT_MD5')
116
+ @request = Rack::Request.new(@env)
117
+ @env["HTTP_AUTHORIZATION"] = "AuthHMAC access key 1:isJ7zHHPrpnSdZ/XbvqxFhVUf0c="
118
+ @lookup = Proc.new{ |key| 'secret' if key == 'access key 1' }
119
+ EY::ApiHMAC.authenticated?(@env, &@lookup).should be_true
120
+ end
121
+
122
+ describe "request signed by AuthHMAC" do
114
123
  describe do
115
124
  before do
116
125
  AuthHMAC.sign!(@request, 'access key 1', 'secret')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ey_api_hmac
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-12-16 00:00:00.000000000 Z
12
+ date: 2011-12-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack-client
16
- requirement: &2161109420 !ruby/object:Gem::Requirement
16
+ requirement: &70174232520240 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2161109420
24
+ version_requirements: *70174232520240
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &2161108660 !ruby/object:Gem::Requirement
27
+ requirement: &70174232519780 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2161108660
35
+ version_requirements: *70174232519780
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &2161107340 !ruby/object:Gem::Requirement
38
+ requirement: &70174232519200 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *2161107340
46
+ version_requirements: *70174232519200
47
47
  description: basic wrapper for rack-client + middlewares for HMAC auth + helpers for
48
48
  SSO auth
49
49
  email:
@@ -90,7 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
90
  version: '0'
91
91
  requirements: []
92
92
  rubyforge_project: ey_api_hmac
93
- rubygems_version: 1.8.12
93
+ rubygems_version: 1.8.10
94
94
  signing_key:
95
95
  specification_version: 3
96
96
  summary: HMAC Rack basic implementation for Engine Yard services