escher 0.3.7 → 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/.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
|