simple-hmac 0.3.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rest-client/request.rb +2 -20
- data/lib/simple-hmac/helper.rb +25 -6
- data/lib/simple-hmac/version.rb +1 -2
- data/spec/authentication_headers_spec.rb +34 -0
- data/spec/sign_request_spec.rb +30 -0
- data/spec/spec_helper.rb +1 -0
- metadata +20 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8df9b536189c550e347e8957860c825671827340
|
4
|
+
data.tar.gz: b212b86247013ebfa722bacebf794e933bb02cac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50544713054a17897ca7bc22e390485adf670acec661bf774adc9fd64ad07e34a1f5c43ed3318d2ddaaa5b3e6012b6db5e3a5253ad90690371837ef809e28589
|
7
|
+
data.tar.gz: 54677f8d988498a8fbac9b92dde9724ba26c43c9715440f2adfae7bed991363052c73936fb127eaf65d816857fcb3e2e83443a06d2165275952acb3de2ac4db4
|
data/lib/rest-client/request.rb
CHANGED
@@ -1,27 +1,9 @@
|
|
1
|
-
require 'time'
|
2
|
-
require 'digest'
|
3
|
-
|
4
1
|
module RestClient
|
5
2
|
class Request
|
6
3
|
include SimpleHmac::Helper
|
7
4
|
|
8
5
|
def sign!(api_id, api_secret, options={})
|
9
|
-
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def set_md5_header
|
15
|
-
return '' unless [:post, :put, :patch].include?(method)
|
16
|
-
if payload
|
17
|
-
body = payload.read
|
18
|
-
payload.instance_variable_get(:@stream).seek(0)
|
19
|
-
else
|
20
|
-
body = ''
|
21
|
-
end
|
22
|
-
content_md5 = Digest::MD5.base64digest(body)
|
23
|
-
processed_headers.merge! 'Content-MD5' => content_md5
|
24
|
-
content_md5
|
6
|
+
processed_headers.merge! authentication_headers(method, processed_headers['Content-Type'], payload, url, api_id, api_secret, options={})
|
25
7
|
end
|
26
8
|
end
|
27
|
-
end
|
9
|
+
end
|
data/lib/simple-hmac/helper.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'base64'
|
2
2
|
require 'openssl'
|
3
3
|
require 'time'
|
4
|
+
require 'digest'
|
4
5
|
|
5
6
|
module SimpleHmac
|
6
7
|
module Helper
|
@@ -13,14 +14,32 @@ module SimpleHmac
|
|
13
14
|
Base64.strict_encode64(OpenSSL::HMAC.digest(options[:algorithm], api_secret, string_to_sign))
|
14
15
|
end
|
15
16
|
|
16
|
-
def
|
17
|
+
def authentication_headers(verb, content_type, payload, url, api_key, api_secret, options={})
|
17
18
|
options = { auth_prefix: 'WIZYPAY' }.merge(options)
|
18
19
|
auth_prefix = options.delete :auth_prefix
|
19
20
|
date = Time.now.httpdate
|
20
|
-
|
21
|
-
|
22
|
-
hmac_token = hmac_token(verb, content_type,
|
23
|
-
|
21
|
+
content_type ||= 'text/plain'
|
22
|
+
content_md5 = digest_md5(verb, payload)
|
23
|
+
hmac_token = hmac_token(verb, content_type, content_md5, url, date, api_secret, options)
|
24
|
+
{
|
25
|
+
'Date' => date,
|
26
|
+
'Content-Type' => content_type,
|
27
|
+
'Content-MD5' => content_md5,
|
28
|
+
'Authorization' => "#{auth_prefix} #{api_key}:#{hmac_token}"
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def digest_md5(verb, payload)
|
33
|
+
return '' unless [:post, :put, :patch].include?(verb.downcase.to_sym)
|
34
|
+
if payload.nil?
|
35
|
+
body = ''
|
36
|
+
elsif payload.respond_to? :read
|
37
|
+
body = payload.read
|
38
|
+
payload.instance_variable_get(:@stream).seek(0)
|
39
|
+
else
|
40
|
+
body = payload
|
41
|
+
end
|
42
|
+
Digest::MD5.base64digest(body)
|
24
43
|
end
|
25
44
|
end
|
26
|
-
end
|
45
|
+
end
|
data/lib/simple-hmac/version.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
RSpec.describe SimpleHmac::Helper do
|
2
|
+
context '#authentication_headers' do
|
3
|
+
before do
|
4
|
+
@signer = Object.new
|
5
|
+
@signer.extend SimpleHmac::Helper
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'returns the correct GET headers' do
|
9
|
+
Timecop.freeze do
|
10
|
+
expect(@signer).to receive(:hmac_token).and_return 'hmac_token'
|
11
|
+
h = @signer.authentication_headers('GET', nil, nil, '/something', 'my_key', 'my_secret', auth_prefix: 'TEST')
|
12
|
+
expect(h).to match({
|
13
|
+
'Date' => Time.now.httpdate,
|
14
|
+
'Content-Type' => 'text/plain',
|
15
|
+
'Content-MD5' => '',
|
16
|
+
'Authorization' => "TEST my_key:hmac_token"
|
17
|
+
})
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'returns the correct POST headers' do
|
22
|
+
Timecop.freeze do
|
23
|
+
expect(@signer).to receive(:hmac_token).and_return 'hmac_token'
|
24
|
+
h = @signer.authentication_headers('POST', 'application/json', '{a: 1}', '/something', 'my_key', 'my_secret', auth_prefix: 'TEST')
|
25
|
+
expect(h).to match({
|
26
|
+
'Date' => Time.now.httpdate,
|
27
|
+
'Content-Type' => 'application/json',
|
28
|
+
'Content-MD5' => 'B9JGFlnJCn1YCMEwtd2eFA==',
|
29
|
+
'Authorization' => "TEST my_key:hmac_token"
|
30
|
+
})
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
|
3
|
+
RSpec.describe RestClient::Request do
|
4
|
+
context '#sign!' do
|
5
|
+
let!(:req) do
|
6
|
+
RestClient::Request.new({
|
7
|
+
url: 'http://example.com/something',
|
8
|
+
method: :post,
|
9
|
+
headers: { accept: :json, content_type: :json },
|
10
|
+
payload: '{a: 1}'
|
11
|
+
})
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'is signed' do
|
15
|
+
Timecop.freeze do
|
16
|
+
expect(req).to receive(:hmac_token).and_return 'hmac_token'
|
17
|
+
req.sign!('my_key', 'my_secret')
|
18
|
+
expect(req.processed_headers).to match({
|
19
|
+
'Date' => Time.now.httpdate,
|
20
|
+
'Accept' => 'application/json',
|
21
|
+
'Accept-Encoding' => 'gzip, deflate',
|
22
|
+
'Authorization' => 'WIZYPAY my_key:hmac_token',
|
23
|
+
'Content-Length' => '6',
|
24
|
+
'Content-MD5' => 'B9JGFlnJCn1YCMEwtd2eFA==',
|
25
|
+
'Content-Type' => 'application/json'
|
26
|
+
})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple-hmac
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chaker Nakhli
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '1.20'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: timecop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.8.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.8.0
|
83
97
|
description:
|
84
98
|
email:
|
85
99
|
- chaker@wizypay.com
|
@@ -94,7 +108,9 @@ files:
|
|
94
108
|
- lib/simple-hmac.rb
|
95
109
|
- lib/simple-hmac/helper.rb
|
96
110
|
- lib/simple-hmac/version.rb
|
111
|
+
- spec/authentication_headers_spec.rb
|
97
112
|
- spec/hmac_token_spec.rb
|
113
|
+
- spec/sign_request_spec.rb
|
98
114
|
- spec/spec_helper.rb
|
99
115
|
homepage: http://www.wizypay.com
|
100
116
|
licenses:
|
@@ -122,5 +138,7 @@ signing_key:
|
|
122
138
|
specification_version: 4
|
123
139
|
summary: Lightweight HMAC implementation for Rails + Restclient.
|
124
140
|
test_files:
|
141
|
+
- spec/authentication_headers_spec.rb
|
125
142
|
- spec/hmac_token_spec.rb
|
143
|
+
- spec/sign_request_spec.rb
|
126
144
|
- spec/spec_helper.rb
|