escher 0.3.7 → 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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +3 -3
- data/Rakefile +5 -0
- data/escher.gemspec +1 -0
- data/lib/escher/auth.rb +38 -10
- data/lib/escher/request/hash_request.rb +3 -15
- data/lib/escher/version.rb +1 -1
- data/scripts/checkout_test_suite.sh +3 -0
- data/spec/emarsys_test_suite_spec.rb +45 -0
- data/spec/escher/auth_spec.rb +3 -61
- data/spec/helpers/emarsys_test_suite/test_case.rb +43 -0
- data/spec/helpers/emarsys_test_suite/test_suite.rb +18 -0
- data/spec/helpers/emarsys_test_suite_helpers.rb +41 -0
- data/spec/spec_helper.rb +8 -1
- metadata +26 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d4de4f3f3b3d16060cff1ca9157b781a2d5039a
|
4
|
+
data.tar.gz: a6982455c5ad1c086f4fbf99466dae4272e12f30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0234c0322a91d4787e82945ba4ec4831cd2158829192d779773282b49fe51999328c1998fb349d1e336e655373af95b5861ab0cfc42bd91b67358511af8b16d1
|
7
|
+
data.tar.gz: 5c1e6281e2608991d4691565d1397a3db070cb4e565e6223ed28e8e2e1e7798176c07bd8297a6341fbe5887c1762f59d1d56d3423174e8aa2e3348e7175239c3
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Rakefile
CHANGED
data/escher.gemspec
CHANGED
data/lib/escher/auth.rb
CHANGED
@@ -9,7 +9,7 @@ module Escher
|
|
9
9
|
@current_time = options[:current_time] || Time.now
|
10
10
|
@auth_header_name = options[:auth_header_name] || 'X-Escher-Auth'
|
11
11
|
@date_header_name = options[:date_header_name] || 'X-Escher-Date'
|
12
|
-
@clock_skew = options[:clock_skew] ||
|
12
|
+
@clock_skew = options[:clock_skew] || 300
|
13
13
|
@algo = create_algo
|
14
14
|
@algo_id = @algo_prefix + '-HMAC-' + @hash_algo
|
15
15
|
end
|
@@ -22,7 +22,7 @@ module Escher
|
|
22
22
|
request = wrap_request req
|
23
23
|
raise EscherError, 'The host header is missing' unless request.has_header? 'host'
|
24
24
|
|
25
|
-
request.set_header(@date_header_name, format_date_for_header) unless request.has_header? @date_header_name
|
25
|
+
request.set_header(@date_header_name.downcase, format_date_for_header) unless request.has_header? @date_header_name
|
26
26
|
|
27
27
|
signature = generate_signature(client[:api_secret], request.body, request.headers, request.method, headers_to_sign, request.path, request.query_values)
|
28
28
|
request.set_header(@auth_header_name, "#{@algo_id} Credential=#{client[:api_key_id]}/#{short_date(@current_time)}/#{@credential_scope}, SignedHeaders=#{prepare_headers_to_sign headers_to_sign}, Signature=#{signature}")
|
@@ -43,7 +43,7 @@ module Escher
|
|
43
43
|
|
44
44
|
|
45
45
|
|
46
|
-
def authenticate(req, key_db)
|
46
|
+
def authenticate(req, key_db, mandatory_signed_headers = nil)
|
47
47
|
request = wrap_request req
|
48
48
|
method = request.method
|
49
49
|
body = request.body
|
@@ -54,7 +54,7 @@ module Escher
|
|
54
54
|
signature_from_query = get_signing_param('Signature', query_parts)
|
55
55
|
|
56
56
|
(['Host'] + (signature_from_query ? [] : [@auth_header_name, @date_header_name])).each do |header|
|
57
|
-
raise EscherError, 'The ' + header + ' header is missing' unless request.header header
|
57
|
+
raise EscherError, 'The ' + header.downcase + ' header is missing' unless request.header header
|
58
58
|
end
|
59
59
|
|
60
60
|
if method == 'GET' && signature_from_query
|
@@ -76,11 +76,20 @@ module Escher
|
|
76
76
|
api_secret = key_db[api_key_id]
|
77
77
|
|
78
78
|
raise EscherError, 'Invalid Escher key' unless api_secret
|
79
|
-
raise EscherError, '
|
80
|
-
raise EscherError, 'The
|
79
|
+
raise EscherError, 'Invalid hash algorithm, only SHA256 and SHA512 are allowed' unless %w(SHA256 SHA512).include?(algorithm)
|
80
|
+
raise EscherError, 'The request method is invalid' unless valid_request_method?(method)
|
81
|
+
raise EscherError, "The request body shouldn't be empty if the request method is POST" if (method.upcase == 'POST' && body.empty?)
|
82
|
+
raise EscherError, "The request url shouldn't contains http or https" if path.match /^https?:\/\//
|
83
|
+
raise EscherError, 'Invalid date in authorization header, it should equal with date header' unless short_date(date) == short_date
|
81
84
|
raise EscherError, 'The request date is not within the accepted time range' unless is_date_within_range?(date, expires)
|
82
|
-
raise EscherError, '
|
85
|
+
raise EscherError, 'Invalid Credential Scope' unless credential_scope == @credential_scope
|
86
|
+
raise EscherError, 'The mandatorySignedHeaders parameter must be undefined or array of strings' unless mandatory_signed_headers_valid?(mandatory_signed_headers)
|
83
87
|
raise EscherError, 'The host header is not signed' unless signed_headers.include? 'host'
|
88
|
+
unless mandatory_signed_headers.nil?
|
89
|
+
mandatory_signed_headers.each do |header|
|
90
|
+
raise EscherError, "The #{header} header is not signed" unless signed_headers.include? header
|
91
|
+
end
|
92
|
+
end
|
84
93
|
raise EscherError, 'Only the host header should be signed' if signature_from_query && signed_headers != ['host']
|
85
94
|
raise EscherError, 'The date header is not signed' if !signature_from_query && !signed_headers.include?(@date_header_name.downcase)
|
86
95
|
|
@@ -163,7 +172,7 @@ module Escher
|
|
163
172
|
def get_auth_parts_from_header(auth_header)
|
164
173
|
m = /#{@algo_prefix}-HMAC-(?<algo>[A-Z0-9\,]+) Credential=(?<api_key_id>[A-Za-z0-9\-_]+)\/(?<short_date>[0-9]{8})\/(?<credentials>[A-Za-z0-9\-_ \/]+), SignedHeaders=(?<signed_headers>[A-Za-z\-;]+), Signature=(?<signature>[0-9a-f]+)$/
|
165
174
|
.match auth_header
|
166
|
-
raise EscherError, '
|
175
|
+
raise EscherError, 'Invalid auth header format' unless m && m['credentials']
|
167
176
|
return m['algo'], m['api_key_id'], m['short_date'], m['credentials'], m['signed_headers'].split(';'), m['signature'], 0
|
168
177
|
end
|
169
178
|
|
@@ -215,7 +224,7 @@ module Escher
|
|
215
224
|
|
216
225
|
|
217
226
|
def prepare_headers_to_sign(headers_to_sign)
|
218
|
-
headers_to_sign.sort.uniq.join(';')
|
227
|
+
headers_to_sign.sort.uniq.join(';').downcase
|
219
228
|
end
|
220
229
|
|
221
230
|
|
@@ -272,6 +281,25 @@ module Escher
|
|
272
281
|
|
273
282
|
|
274
283
|
|
284
|
+
def valid_request_method?(method)
|
285
|
+
%w(OPTIONS GET HEAD POST PUT DELETE TRACE PATCH CONNECT).include? method.upcase
|
286
|
+
end
|
287
|
+
|
288
|
+
|
289
|
+
|
290
|
+
def mandatory_signed_headers_valid?(mandatory_signed_headers)
|
291
|
+
if mandatory_signed_headers.nil?
|
292
|
+
return true
|
293
|
+
else
|
294
|
+
return false unless mandatory_signed_headers.is_a? Array
|
295
|
+
return false unless mandatory_signed_headers.all? { |header| header.is_a? String }
|
296
|
+
end
|
297
|
+
|
298
|
+
true
|
299
|
+
end
|
300
|
+
|
301
|
+
|
302
|
+
|
275
303
|
def parse_algo(algorithm)
|
276
304
|
m = /^#{@algo_prefix}-HMAC-(?<algo>[A-Z0-9\,]+)$/.match(algorithm)
|
277
305
|
m && m['algo']
|
@@ -308,7 +336,7 @@ module Escher
|
|
308
336
|
|
309
337
|
def normalize_white_spaces(value)
|
310
338
|
value.strip.split('"', -1).map.with_index { |piece, index|
|
311
|
-
is_inside_of_quotes = (index % 2
|
339
|
+
is_inside_of_quotes = (index % 2 == 1)
|
312
340
|
is_inside_of_quotes ? piece : piece.gsub(/\s+/, ' ')
|
313
341
|
}.join '"'
|
314
342
|
end
|
@@ -10,7 +10,6 @@ module Escher
|
|
10
10
|
|
11
11
|
def initialize(request)
|
12
12
|
super request
|
13
|
-
@uri = parse_uri request[:uri]
|
14
13
|
end
|
15
14
|
|
16
15
|
|
@@ -41,27 +40,16 @@ module Escher
|
|
41
40
|
|
42
41
|
|
43
42
|
def path
|
44
|
-
|
43
|
+
request[:uri].match(URI_REGEXP)[1]
|
45
44
|
end
|
46
45
|
|
47
46
|
|
48
47
|
|
49
48
|
def query_values
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
private
|
56
|
-
|
57
|
-
def parse_uri(uri)
|
58
|
-
uri.match URI_REGEXP do |match_data|
|
59
|
-
Addressable::URI.new({:path => match_data[1],
|
60
|
-
:query => match_data[3]})
|
61
|
-
end
|
49
|
+
query = request[:uri].match(URI_REGEXP)[3]
|
50
|
+
(Addressable::URI.new query: query).query_values(Array) or []
|
62
51
|
end
|
63
52
|
|
64
53
|
end
|
65
|
-
|
66
54
|
end
|
67
55
|
end
|
data/lib/escher/version.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Escher
|
4
|
+
describe Auth, :emarsys_test_suite do
|
5
|
+
|
6
|
+
authentication_error_test_files.each do |test_case|
|
7
|
+
it "#{test_case[:title]}" do
|
8
|
+
expect { test_case.escher.authenticate(test_case[:request], test_case.key, test_case[:mandatory_signed_headers]) }
|
9
|
+
.to raise_error(EscherError, test_case[:expected][:error])
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
authentication_valid_test_files.each do |test_case|
|
15
|
+
it "#{test_case[:title]}" do
|
16
|
+
expect { test_case.escher.authenticate(test_case[:request], test_case.key) }.not_to raise_error
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
presign_url_test_files.each do |test_case|
|
22
|
+
it "#{test_case[:title]}" do
|
23
|
+
expect(test_case.escher.generate_signed_url(test_case[:request][:uri], test_case[:config], test_case[:request][:expires]))
|
24
|
+
.to eq(test_case[:expected][:url])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
sign_request_valid_test_files.each do |test_case|
|
30
|
+
it "#{test_case[:title]}" do
|
31
|
+
request = test_case.escher.sign! test_case[:request], test_case[:config], test_case[:headers_to_sign]
|
32
|
+
request[:url] = request.delete :uri
|
33
|
+
request.each { |_, v| v.sort! if v.class.method_defined? :sort! }
|
34
|
+
|
35
|
+
expect(request).to eq(test_case.expected_request)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
xspecify "every case in the test suite is being used" do
|
41
|
+
expect(::EmarsysTestSuiteHelpers::TestSuite.in_use_size).to eq ::EmarsysTestSuiteHelpers::TestSuite.size
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
data/spec/escher/auth_spec.rb
CHANGED
@@ -417,7 +417,7 @@ module Escher
|
|
417
417
|
['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
|
418
418
|
['Authorization', 'AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-ea st-1/host/aws4_request, SignedHeaders=date;host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470'],
|
419
419
|
]
|
420
|
-
expect { call_validate(headers) }.to raise_error(EscherError, '
|
420
|
+
expect { call_validate(headers) }.to raise_error(EscherError, 'Invalid Credential Scope')
|
421
421
|
end
|
422
422
|
|
423
423
|
|
@@ -431,17 +431,6 @@ module Escher
|
|
431
431
|
end
|
432
432
|
|
433
433
|
|
434
|
-
it 'should detect if dates are not on the same day' do
|
435
|
-
yesterday = '08'
|
436
|
-
headers = [
|
437
|
-
%w(Host host.foo.com),
|
438
|
-
['Date', "Mon, #{yesterday} Sep 2011 23:36:00 GMT"],
|
439
|
-
['Authorization', GOOD_AUTH_HEADER],
|
440
|
-
]
|
441
|
-
expect { call_validate(headers) }.to raise_error(EscherError, 'The Authorization header\'s shortDate does not match with the request date')
|
442
|
-
end
|
443
|
-
|
444
|
-
|
445
434
|
it 'should detect if date is not within the 15 minutes range' do
|
446
435
|
long_ago = '00'
|
447
436
|
headers = [
|
@@ -453,40 +442,13 @@ module Escher
|
|
453
442
|
end
|
454
443
|
|
455
444
|
|
456
|
-
it 'should detect missing host header' do
|
457
|
-
headers = [
|
458
|
-
['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
|
459
|
-
['Authorization', GOOD_AUTH_HEADER],
|
460
|
-
]
|
461
|
-
expect { call_validate(headers) }.to raise_error(EscherError, 'The Host header is missing')
|
462
|
-
end
|
463
|
-
|
464
|
-
|
465
|
-
it 'should detect missing date header' do
|
466
|
-
headers = [
|
467
|
-
%w(Host host.foo.com),
|
468
|
-
['Authorization', GOOD_AUTH_HEADER],
|
469
|
-
]
|
470
|
-
expect { call_validate(headers) }.to raise_error(EscherError, 'The Date header is missing')
|
471
|
-
end
|
472
|
-
|
473
|
-
|
474
|
-
it 'should detect missing auth header' do
|
475
|
-
headers = [
|
476
|
-
%w(Host host.foo.com),
|
477
|
-
['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
|
478
|
-
]
|
479
|
-
expect { call_validate(headers) }.to raise_error(EscherError, 'The Authorization header is missing')
|
480
|
-
end
|
481
|
-
|
482
|
-
|
483
445
|
it 'should detect malformed auth header' do
|
484
446
|
headers = [
|
485
447
|
%w(Host host.foo.com),
|
486
448
|
['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
|
487
449
|
['Authorization', 'AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=UNPARSABLE'],
|
488
450
|
]
|
489
|
-
expect { call_validate(headers) }.to raise_error(EscherError, '
|
451
|
+
expect { call_validate(headers) }.to raise_error(EscherError, 'Invalid auth header format')
|
490
452
|
end
|
491
453
|
|
492
454
|
|
@@ -496,7 +458,7 @@ module Escher
|
|
496
458
|
['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
|
497
459
|
['Authorization', 'AWS4-HMAC-SHA256 Credential=BAD-CREDENTIAL-SCOPE, SignedHeaders=date;host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470'],
|
498
460
|
]
|
499
|
-
expect { call_validate(headers) }.to raise_error(EscherError, '
|
461
|
+
expect { call_validate(headers) }.to raise_error(EscherError, 'Invalid auth header format')
|
500
462
|
end
|
501
463
|
|
502
464
|
|
@@ -520,26 +482,6 @@ module Escher
|
|
520
482
|
end
|
521
483
|
|
522
484
|
|
523
|
-
it 'should check algorithm' do
|
524
|
-
headers = [
|
525
|
-
%w(Host host.foo.com),
|
526
|
-
['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
|
527
|
-
['Authorization', 'AWS4-HMAC-INVALID Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470'],
|
528
|
-
]
|
529
|
-
expect { call_validate(headers) }.to raise_error(EscherError, 'Only SHA256 and SHA512 hash algorithms are allowed')
|
530
|
-
end
|
531
|
-
|
532
|
-
|
533
|
-
it 'should check credential scope' do
|
534
|
-
headers = [
|
535
|
-
%w(Host host.foo.com),
|
536
|
-
['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
|
537
|
-
['Authorization', 'AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/INVALID/aws4_request, SignedHeaders=date;host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470'],
|
538
|
-
]
|
539
|
-
expect { call_validate(headers) }.to raise_error(EscherError, 'The credential scope is invalid')
|
540
|
-
end
|
541
|
-
|
542
|
-
|
543
485
|
it 'should convert dates' do
|
544
486
|
date_str = 'Fri, 09 Sep 2011 23:36:00 GMT'
|
545
487
|
expect(described_class.new('irrelevant', date_header_name: 'date', current_time: Time.parse(date_str)).format_date_for_header).to eq date_str
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module EmarsysTestSuiteHelpers
|
2
|
+
class TestCase
|
3
|
+
|
4
|
+
def initialize(test_file)
|
5
|
+
@test_data = ::JSON.parse(File.read(test_file), symbolize_names: true).to_snake_keys
|
6
|
+
convert_naming
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
def [](arg)
|
12
|
+
@test_data[arg]
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
def key
|
18
|
+
{@test_data[:key_db].first[0] => @test_data[:key_db].first[1]}
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
def escher
|
24
|
+
@test_data[:config][:current_time] = Time.parse(@test_data[:config].delete :date)
|
25
|
+
@escher ||= ::Escher::Auth.new(@test_data[:config][:credential_scope], @test_data[:config])
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
def expected_request
|
31
|
+
@test_data[:expected][:request].each { |_, v| v.sort! if v.class.method_defined? :sort! }
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
private
|
37
|
+
def convert_naming
|
38
|
+
@test_data[:request][:uri] = @test_data[:request].delete :url
|
39
|
+
@test_data[:config][:api_key_id] = @test_data[:config].delete :access_key_id
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module EmarsysTestSuiteHelpers
|
2
|
+
class TestSuite
|
3
|
+
|
4
|
+
def self.size
|
5
|
+
Dir.glob('./spec/emarsys_test_suite/*').size
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
|
10
|
+
def self.in_use_size
|
11
|
+
size = Dir.glob('./spec/emarsys_test_suite/authenticate-error-*').size
|
12
|
+
size += Dir.glob('./spec/emarsys_test_suite/authenticate-valid-*').size
|
13
|
+
size += Dir.glob('./spec/emarsys_test_suite/presignurl-*').size
|
14
|
+
size + Dir.glob('./spec/emarsys_test_suite/signrequest-*').reject { |c| c.include? 'error' }.size
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'plissken'
|
3
|
+
require 'escher'
|
4
|
+
|
5
|
+
module EmarsysTestSuiteHelpers
|
6
|
+
|
7
|
+
autoload :TestCase, 'helpers/emarsys_test_suite/test_case'
|
8
|
+
autoload :TestSuite, 'helpers/emarsys_test_suite/test_suite'
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
def create_test_case
|
13
|
+
->(t) { TestCase.new t }
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
def authentication_error_test_files
|
19
|
+
Dir.glob('./spec/emarsys_test_suite/authenticate-error-*').map &create_test_case
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
def authentication_valid_test_files
|
25
|
+
Dir.glob('./spec/emarsys_test_suite/authenticate-valid-*').map &create_test_case
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
def presign_url_test_files
|
31
|
+
Dir.glob('./spec/emarsys_test_suite/presignurl-*').map &create_test_case
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
def sign_request_valid_test_files
|
37
|
+
files = Dir.glob('./spec/emarsys_test_suite/signrequest-*').reject { |c| c.include? 'error' }
|
38
|
+
files.map &create_test_case
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,10 @@
|
|
1
1
|
lib = File.expand_path('../../lib', __FILE__)
|
2
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require 'escher'
|
3
|
+
require 'escher'
|
4
|
+
|
5
|
+
|
6
|
+
autoload :EmarsysTestSuiteHelpers, 'helpers/emarsys_test_suite_helpers'
|
7
|
+
RSpec.configure do |c|
|
8
|
+
c.treat_symbols_as_metadata_keys_with_true_values = true
|
9
|
+
c.extend EmarsysTestSuiteHelpers, :emarsys_test_suite
|
10
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: escher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andras Barthazi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: plissken
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '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'
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: addressable
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +136,7 @@ files:
|
|
122
136
|
- lib/escher/request/legacy_request.rb
|
123
137
|
- lib/escher/request/rack_request.rb
|
124
138
|
- lib/escher/version.rb
|
139
|
+
- scripts/checkout_test_suite.sh
|
125
140
|
- spec/aws4_testsuite/get-header-key-duplicate.authz
|
126
141
|
- spec/aws4_testsuite/get-header-key-duplicate.creq
|
127
142
|
- spec/aws4_testsuite/get-header-key-duplicate.req
|
@@ -273,6 +288,7 @@ files:
|
|
273
288
|
- spec/aws4_testsuite/post-x-www-form-urlencoded.req
|
274
289
|
- spec/aws4_testsuite/post-x-www-form-urlencoded.sreq
|
275
290
|
- spec/aws4_testsuite/post-x-www-form-urlencoded.sts
|
291
|
+
- spec/emarsys_test_suite_spec.rb
|
276
292
|
- spec/emarsys_testsuite/get-header-key-duplicate.authz
|
277
293
|
- spec/emarsys_testsuite/get-header-key-duplicate.creq
|
278
294
|
- spec/emarsys_testsuite/get-header-key-duplicate.req
|
@@ -303,6 +319,9 @@ files:
|
|
303
319
|
- spec/escher/request/factory_spec.rb
|
304
320
|
- spec/escher/request/hash_request_spec.rb
|
305
321
|
- spec/escher/request/rack_request_spec.rb
|
322
|
+
- spec/helpers/emarsys_test_suite/test_case.rb
|
323
|
+
- spec/helpers/emarsys_test_suite/test_suite.rb
|
324
|
+
- spec/helpers/emarsys_test_suite_helpers.rb
|
306
325
|
- spec/spec_helper.rb
|
307
326
|
homepage: http://escherauth.io/
|
308
327
|
licenses:
|
@@ -324,7 +343,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
324
343
|
version: '0'
|
325
344
|
requirements: []
|
326
345
|
rubyforge_project:
|
327
|
-
rubygems_version: 2.4.5
|
346
|
+
rubygems_version: 2.4.5.1
|
328
347
|
signing_key:
|
329
348
|
specification_version: 4
|
330
349
|
summary: Library for HTTP request signing (Ruby implementation)
|
@@ -480,6 +499,7 @@ test_files:
|
|
480
499
|
- spec/aws4_testsuite/post-x-www-form-urlencoded.req
|
481
500
|
- spec/aws4_testsuite/post-x-www-form-urlencoded.sreq
|
482
501
|
- spec/aws4_testsuite/post-x-www-form-urlencoded.sts
|
502
|
+
- spec/emarsys_test_suite_spec.rb
|
483
503
|
- spec/emarsys_testsuite/get-header-key-duplicate.authz
|
484
504
|
- spec/emarsys_testsuite/get-header-key-duplicate.creq
|
485
505
|
- spec/emarsys_testsuite/get-header-key-duplicate.req
|
@@ -510,4 +530,7 @@ test_files:
|
|
510
530
|
- spec/escher/request/factory_spec.rb
|
511
531
|
- spec/escher/request/hash_request_spec.rb
|
512
532
|
- spec/escher/request/rack_request_spec.rb
|
533
|
+
- spec/helpers/emarsys_test_suite/test_case.rb
|
534
|
+
- spec/helpers/emarsys_test_suite/test_suite.rb
|
535
|
+
- spec/helpers/emarsys_test_suite_helpers.rb
|
513
536
|
- spec/spec_helper.rb
|