rack-signature 0.0.6 → 0.0.7

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.
@@ -0,0 +1,40 @@
1
+ require_relative 'build_message'
2
+ require_relative 'hmac_signature'
3
+
4
+ module Rack
5
+ module Signature
6
+ module TestHelpers
7
+ include Rack::Test::Methods
8
+
9
+ def generate_shared_token; ::SecureRandom.hex(8); end
10
+
11
+ def stringify_request_message(env)
12
+ ::Rack::Signature::BuildMessage.new(env).build!
13
+ end
14
+
15
+ def hmac_message(key, message)
16
+ ::Rack::Signature::HmacSignature.new(key, message).sign
17
+ end
18
+
19
+ def expected_signature(shared_key, env)
20
+ msg = stringify_request_message(env)
21
+ hmac_message(shared_key, msg)
22
+ end
23
+
24
+ def setup_request(uri, opts, key)
25
+ env = ::Rack::MockRequest.env_for(uri, opts)
26
+ sig = sign(env, key)
27
+ req = Rack::Request.new(env)
28
+ query_params = req.params
29
+
30
+ [uri, sig, opts, query_params, env]
31
+ end
32
+
33
+ def sign(env, key)
34
+ message = stringify_request_message(env)
35
+ hmac_message(key, message)
36
+ end
37
+
38
+ end
39
+ end
40
+ end
@@ -40,7 +40,7 @@ module Rack
40
40
  # compares the received Signature against what the Signature should be
41
41
  # (computed signature)
42
42
  def signature_is_valid?(env)
43
- received_signature = env["HTTP_X_AUTH_SIG"]
43
+ received_signature = env["X-Auth-Sig"]
44
44
  expected_signature = compute_signature(env)
45
45
 
46
46
  expected_signature == received_signature
@@ -55,7 +55,7 @@ module Rack
55
55
  # FIXME: This is here for now for a quick implementation within another
56
56
  # app. This will eventually need to be a rack app itself
57
57
  def shared_key(env)
58
- token = env["HTTP_#{options[:header_token]}"]
58
+ token = env[options[:header_token]]
59
59
  return '' if token.nil? || token == ''
60
60
  options[:klass].send(options[:method].to_s, token)
61
61
  end
@@ -2,7 +2,7 @@ module Rack
2
2
  module Signature
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- PATCH = 6
5
+ PATCH = 7
6
6
 
7
7
  def self.version
8
8
  [MAJOR, MINOR, PATCH].join('.')
data/test/test_helper.rb CHANGED
@@ -2,3 +2,5 @@ require 'minitest/autorun'
2
2
  require 'rack/test'
3
3
  require 'rack/mock'
4
4
  require 'digest/sha2'
5
+ require 'securerandom'
6
+ require_relative '../lib/rack/signature/test_helpers'
data/test/verify_test.rb CHANGED
@@ -2,20 +2,40 @@ require_relative '../lib/rack/signature'
2
2
  require 'test_helper'
3
3
 
4
4
  describe "Verifying a signed request" do
5
- include Rack::Test::Methods
5
+ include Rack::Signature::TestHelpers
6
6
 
7
+ TOKEN = ::SecureRandom.hex(8)
7
8
  def setup
8
- @options = get_app_options
9
- @shared_key = key
10
- @signature = expected_signature
9
+ @klass_options = {klass: DemoClass, method: :get_shared_token, header_token: 'LOCKER-API-KEY'}
10
+ @uri, @sig, @headers, @params, @env = setup_request("http://example.com/api/login",
11
+ {"Content-Type" => "application/json",
12
+ "REQUEST_METHOD" => "POST",
13
+ "LOCKER-API-KEY" => '123',
14
+ input: "password=123456&email=me@home.com&name=me&age=1"
15
+ }, TOKEN)
11
16
  end
12
17
 
13
18
  let(:app) { lambda { |env| [200, {}, ['Hello World']] } }
14
- let(:rack_signature) { Rack::Signature.new(app, @options) }
19
+ let(:rack_signature) { Rack::Signature.new(app, @klass_options) }
15
20
  let(:mock_request) { Rack::MockRequest.new(rack_signature) }
16
21
 
22
+ class DemoClass
23
+ def self.get_shared_token(token = '')
24
+ TOKEN if token
25
+ end
26
+ end
27
+
28
+ let(:uri) { @uri }
29
+ let(:signature) { @sig }
30
+ let(:headers) { @headers }
31
+ let(:query_params) { @params }
32
+ let(:env) { @env }
33
+
17
34
  describe "when a request is made without a signature" do
18
- let(:response) { mock_request.get '/api/login?password=123456&email=me@home.com' }
35
+ before {
36
+ @response = mock_request.get '/api/login?password=123456&email=me@home.com'
37
+ }
38
+ let(:response) { @response }
19
39
 
20
40
  it 'returns a 403 status' do
21
41
  assert_equal 403, response.status
@@ -33,11 +53,11 @@ describe "Verifying a signed request" do
33
53
 
34
54
  describe "when a requests is sent with a valid signature" do
35
55
  let(:response) do
36
- mock_request.post("http://example.com/api/login",
56
+ mock_request.post(uri,
37
57
  "Content-Type" => "application/json",
38
58
  "REQUEST_METHOD" => "POST",
39
- "HTTP_X_AUTH_SIG" => @signature,
40
- "HTTP_API_TOKEN" => '123',
59
+ "LOCKER-API-KEY" => '123',
60
+ "X-Auth-Sig" => signature,
41
61
  input: "password=123456&email=me@home.com&name=me&age=1")
42
62
  end
43
63
 
@@ -50,14 +70,15 @@ describe "Verifying a signed request" do
50
70
  end
51
71
  end
52
72
 
73
+
53
74
  describe "when a requests is sent with a tampered signature" do
54
75
  let(:response) do
55
- mock_request.post("http://example.com/api/login",
56
- "Content-Type" => "application/json",
76
+ mock_request.post(uri,
77
+ {"Content-Type" => "application/json",
57
78
  "REQUEST_METHOD" => "POST",
58
- "HTTP_X_AUTH_SIG" => @signature,
59
- "HTTP_API_TOKEN" => '123',
60
- input: "password=1234567&email=me@home.com&name=me&age=1")
79
+ "LOCKER-API-KEY" => '123',
80
+ "X-Auth-Sig" => signature,
81
+ input: "password=1234567&email=me@home.com&name=me&age=1"})
61
82
  end
62
83
 
63
84
  it 'returns a 403 status' do
@@ -74,23 +95,4 @@ describe "Verifying a signed request" do
74
95
  end
75
96
  end
76
97
 
77
- # Helper Methods
78
- def key
79
- ::Digest::SHA2.hexdigest("shared-key")
80
- end
81
-
82
- def expected_signature
83
- "Z0qY8Hy4a/gJkGZI0gklzM6vZztsAVVDjA18vb1BvHg="
84
- end
85
-
86
- class DemoClass
87
- def self.get_shared_token(token = '')
88
- ::Digest::SHA2.hexdigest("shared-key") if token == '123'
89
- end
90
- end
91
-
92
- def get_app_options
93
- { klass: DemoClass, method: :get_shared_token, header_token: 'API_TOKEN' }
94
- end
95
-
96
98
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-signature
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -91,6 +91,7 @@ files:
91
91
  - lib/rack/signature.rb
92
92
  - lib/rack/signature/build_message.rb
93
93
  - lib/rack/signature/hmac_signature.rb
94
+ - lib/rack/signature/test_helpers.rb
94
95
  - lib/rack/signature/verify.rb
95
96
  - lib/rack/signature/version.rb
96
97
  - rack-signature.gemspec