escher 0.3.6 → 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 681df740040b4efceff281b94ad161ca37be4819
4
- data.tar.gz: de47b720014006d07a4d84d9bc178032f76c03f8
3
+ metadata.gz: b1c99900670a9017bfe4565037cffade7ea2b9a1
4
+ data.tar.gz: e3e74a858ff3b42decd6367bfbf4e14ee92a80ee
5
5
  SHA512:
6
- metadata.gz: 0bcbd87cde7db30cc2aee5ed5f230890d08aefa8ad1274cd63fcf2bafe99130f3806ca71f939accb69b2a9b6677eda37790d4e50b6e56f9e6e3973da726d83ed
7
- data.tar.gz: e894f5ffb2c9611ec221e10d1347dae7aba8746266359aad18a98258786601f3aaeda9570fee1eb161fa107a84d2833329199c62a6d03199d9195fe707e9306d
6
+ metadata.gz: 759ac6e2e5e05b4db8c084e7dcd2a337d785193e0ee76d4abef20b5076cc3e6f382927cc53fc35b9ae4486f5fae69b6b07689c2f9ea9716a52d06c7fb4934179
7
+ data.tar.gz: d23ffaceb2d89564d48fad3f2e361c66d38c695d579b1c282dff0ba4470d4b30467e957b043a812867bf1f5dbdbaf26e319cffccec96c7c71512de3aa38816ba
data/lib/escher/auth.rb CHANGED
@@ -20,7 +20,7 @@ module Escher
20
20
  headers_to_sign |= [@date_header_name.downcase, 'host']
21
21
 
22
22
  request = wrap_request req
23
- raise EscherError, 'Missing header: Host' unless request.has_header? 'host'
23
+ raise EscherError, 'The host header is missing' unless request.has_header? 'host'
24
24
 
25
25
  request.set_header(@date_header_name, format_date_for_header) unless request.has_header? @date_header_name
26
26
 
@@ -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, 'Missing header: ' + header unless request.header header
57
+ raise EscherError, 'The ' + header + ' header is missing' unless request.header header
58
58
  end
59
59
 
60
60
  if method == 'GET' && signature_from_query
@@ -63,24 +63,26 @@ module Escher
63
63
 
64
64
  body = 'UNSIGNED-PAYLOAD'
65
65
  query_parts.delete [query_key_for('Signature'), signature]
66
- query_parts = query_parts.map { |k, v| [uri_decode(k), uri_decode(v)] }
66
+ query_parts = query_parts.map { |k, v| [k, v] }
67
67
  else
68
68
  raw_date = request.header @date_header_name
69
+ raise EscherError, 'The ' + @date_header_name + ' header is missing' unless raw_date
69
70
  auth_header = request.header @auth_header_name
71
+ raise EscherError, 'The ' + @auth_header_name + ' header is missing' unless raw_date
70
72
  algorithm, api_key_id, short_date, credential_scope, signed_headers, signature, expires = get_auth_parts_from_header(auth_header)
71
73
  end
72
74
 
73
75
  date = Time.parse(raw_date)
74
76
  api_secret = key_db[api_key_id]
75
77
 
76
- raise EscherError, 'Invalid API key' unless api_secret
78
+ raise EscherError, 'Invalid Escher key' unless api_secret
77
79
  raise EscherError, 'Only SHA256 and SHA512 hash algorithms are allowed' unless %w(SHA256 SHA512).include?(algorithm)
78
- raise EscherError, 'Invalid request date' unless short_date(date) == short_date
80
+ raise EscherError, 'The ' + @auth_header_name + ' header\'s shortDate does not match with the request date' unless short_date(date) == short_date
79
81
  raise EscherError, 'The request date is not within the accepted time range' unless is_date_within_range?(date, expires)
80
- raise EscherError, 'Invalid credentials' unless credential_scope == @credential_scope
81
- raise EscherError, 'Host header is not signed' unless signed_headers.include? 'host'
82
+ raise EscherError, 'The credential scope is invalid' unless credential_scope == @credential_scope
83
+ raise EscherError, 'The host header is not signed' unless signed_headers.include? 'host'
82
84
  raise EscherError, 'Only the host header should be signed' if signature_from_query && signed_headers != ['host']
83
- raise EscherError, 'Date header is not signed' if !signature_from_query && !signed_headers.include?(@date_header_name.downcase)
85
+ raise EscherError, 'The date header is not signed' if !signature_from_query && !signed_headers.include?(@date_header_name.downcase)
84
86
 
85
87
  escher = reconfig(algorithm, credential_scope, date)
86
88
  expected_signature = escher.generate_signature(api_secret, body, headers, method, signed_headers, path, query_parts)
@@ -107,7 +109,7 @@ module Escher
107
109
  def generate_signed_url(url_to_sign, client, expires = 86400)
108
110
  uri = Addressable::URI.parse(url_to_sign)
109
111
 
110
- if (uri.port.present?) && (uri.port != uri.default_port)
112
+ if (not uri.port.nil?) && (uri.port != uri.default_port)
111
113
  host = "#{uri.host}:#{uri.port}"
112
114
  else
113
115
  host = uri.host
@@ -134,7 +136,6 @@ module Escher
134
136
 
135
137
  signature = generate_signature(client[:api_secret], body, headers, 'GET', headers_to_sign, path, query_parts)
136
138
  query_parts_with_signature = (query_parts.map { |k, v| [uri_encode(k), uri_encode(v)] } << query_pair('Signature', signature))
137
-
138
139
  "#{uri.scheme}://#{host}#{path}?#{query_parts_with_signature.map { |k, v| k + '=' + v }.join('&')}#{(fragment === nil ? '' : '#' + fragment)}"
139
140
  end
140
141
 
@@ -160,9 +161,9 @@ module Escher
160
161
 
161
162
 
162
163
  def get_auth_parts_from_header(auth_header)
163
- 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]+)$/
164
+ 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]+)$/
164
165
  .match auth_header
165
- raise EscherError, 'Malformed authorization header' unless m && m['credentials']
166
+ raise EscherError, 'Could not parse auth header' unless m && m['credentials']
166
167
  return m['algo'], m['api_key_id'], m['short_date'], m['credentials'], m['signed_headers'].split(';'), m['signature'], 0
167
168
  end
168
169
 
@@ -1,3 +1,3 @@
1
1
  module Escher
2
- VERSION = '0.3.6'
2
+ VERSION = '0.3.7'
3
3
  end
@@ -127,12 +127,13 @@ module Escher
127
127
  end
128
128
 
129
129
 
130
- it 'should sign request' do
130
+ it 'should sign perfect request' do
131
131
  escher = described_class.new('us-east-1/iam/aws4_request', ESCHER_EMARSYS_OPTIONS.merge(current_time: Time.parse('20110909T233600Z')))
132
132
  client = {:api_key_id => 'AKIDEXAMPLE', :api_secret => 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'}
133
133
 
134
134
  input_headers = [
135
135
  ['host', 'iam.amazonaws.com'],
136
+ ['x-ems-date', '20110909T233600Z'],
136
137
  ['content-type', 'application/x-www-form-urlencoded; charset=utf-8'],
137
138
  ]
138
139
 
@@ -140,9 +141,8 @@ module Escher
140
141
  'content-type' => 'application/x-www-form-urlencoded; charset=utf-8',
141
142
  'host' => 'iam.amazonaws.com',
142
143
  'x-ems-date' => '20110909T233600Z',
143
- 'x-ems-auth' => 'EMS-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/iam/aws4_request, SignedHeaders=content-type;host;x-ems-date, Signature=f36c21c6e16a71a6e8dc56673ad6354aeef49c577a22fd58a190b5fcf8891dbd',
144
+ 'x-ems-auth' => 'EMS-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/iam/aws4_request, SignedHeaders=host;x-ems-date, Signature=26855e3e6d3585277965865934f04dcc4c836648873fd2c33f5bbf4f83ebf2a4',
144
145
  }
145
- headers_to_sign = %w(content-type)
146
146
 
147
147
  request = {
148
148
  method: 'POST',
@@ -151,6 +151,65 @@ module Escher
151
151
  headers: input_headers,
152
152
  }
153
153
 
154
+ downcase = escher.sign!(request, client)[:headers].map { |k, v| {k.downcase => v} }.reduce({}, &:merge)
155
+ expect(downcase).to eq expected_headers
156
+ end
157
+
158
+
159
+ it 'should sign request and add date header' do
160
+ escher = described_class.new('us-east-1/iam/aws4_request', ESCHER_EMARSYS_OPTIONS.merge(current_time: Time.parse('20110909T233600Z')))
161
+ client = {:api_key_id => 'AKIDEXAMPLE', :api_secret => 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'}
162
+
163
+ input_headers = [
164
+ ['host', 'iam.amazonaws.com'],
165
+ ['content-type', 'application/x-www-form-urlencoded; charset=utf-8'],
166
+ ]
167
+
168
+ expected_headers = {
169
+ 'content-type' => 'application/x-www-form-urlencoded; charset=utf-8',
170
+ 'host' => 'iam.amazonaws.com',
171
+ 'x-ems-date' => '20110909T233600Z',
172
+ 'x-ems-auth' => 'EMS-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/iam/aws4_request, SignedHeaders=host;x-ems-date, Signature=26855e3e6d3585277965865934f04dcc4c836648873fd2c33f5bbf4f83ebf2a4',
173
+ }
174
+
175
+ request = {
176
+ method: 'POST',
177
+ uri: '/',
178
+ body: 'Action=ListUsers&Version=2010-05-08',
179
+ headers: input_headers,
180
+ }
181
+
182
+ downcase = escher.sign!(request, client)[:headers].map { |k, v| {k.downcase => v} }.reduce({}, &:merge)
183
+ expect(downcase).to eq expected_headers
184
+ end
185
+
186
+
187
+ it 'should sign request with headers_to_sign parameter' do
188
+ escher = described_class.new('us-east-1/iam/aws4_request', ESCHER_EMARSYS_OPTIONS.merge(current_time: Time.parse('20110909T233600Z')))
189
+ client = {:api_key_id => 'AKIDEXAMPLE', :api_secret => 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'}
190
+
191
+ input_headers = [
192
+ ['host', 'iam.amazonaws.com'],
193
+ ['x-ems-date', '20110909T233600Z'],
194
+ ['content-type', 'application/x-www-form-urlencoded; charset=utf-8'],
195
+ ]
196
+
197
+ expected_headers = {
198
+ 'content-type' => 'application/x-www-form-urlencoded; charset=utf-8',
199
+ 'host' => 'iam.amazonaws.com',
200
+ 'x-ems-date' => '20110909T233600Z',
201
+ 'x-ems-auth' => 'EMS-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/iam/aws4_request, SignedHeaders=content-type;host;x-ems-date, Signature=f36c21c6e16a71a6e8dc56673ad6354aeef49c577a22fd58a190b5fcf8891dbd',
202
+ }
203
+
204
+ headers_to_sign = %w(content-type)
205
+
206
+ request = {
207
+ method: 'POST',
208
+ uri: '/',
209
+ body: 'Action=ListUsers&Version=2010-05-08',
210
+ headers: input_headers,
211
+ }
212
+
154
213
  downcase = escher.sign!(request, client, headers_to_sign)[:headers].map { |k, v| {k.downcase => v} }.reduce({}, &:merge)
155
214
  expect(downcase).to eq expected_headers
156
215
  end
@@ -204,6 +263,75 @@ module Escher
204
263
  expect(escher.generate_signed_url('http://example.com/something?arr%5B%5C=apple&arr%5B%5C=pear', client, 123456)).to eq expected_url
205
264
  end
206
265
 
266
+ it 'should generate presigned url with URL encoded' do
267
+ escher = described_class.new('us-east-1/host/aws4_request', ESCHER_MIXED_OPTIONS.merge(current_time: Time.parse('2011/05/11 12:00:00 UTC')))
268
+ expected_url =
269
+ 'http://example.com/something?tz=Europe%2FVienna&' +
270
+ 'X-EMS-Algorithm=EMS-HMAC-SHA256&' +
271
+ 'X-EMS-Credentials=th3K3y%2F20110511%2Fus-east-1%2Fhost%2Faws4_request&' +
272
+ 'X-EMS-Date=20110511T120000Z&' +
273
+ 'X-EMS-Expires=123456&' +
274
+ 'X-EMS-SignedHeaders=host&' +
275
+ 'X-EMS-Signature=b73d097c8c8ea1a954ffebafec84884ce2a487b001d62ccd71787964d01df39b'
276
+
277
+ client = {:api_key_id => 'th3K3y', :api_secret => 'very_secure'}
278
+ expect(escher.generate_signed_url('http://example.com/something?tz=Europe%2FVienna', client, 123456)).to eq expected_url
279
+ end
280
+
281
+ it 'should validate double encoded presigned url' do
282
+ escher = described_class.new('us-east-1/host/aws4_request', ESCHER_MIXED_OPTIONS.merge(current_time: Time.parse('2011/05/12 21:59:00 UTC')))
283
+ presigned_uri =
284
+ '/something?tz=Europe%2FVienna&' +
285
+ 'X-EMS-Algorithm=EMS-HMAC-SHA256&' +
286
+ 'X-EMS-Credentials=th3K3y%2F20110511%2Fus-east-1%2Fhost%2Faws4_request&' +
287
+ 'X-EMS-Date=20110511T120000Z&' +
288
+ 'X-EMS-Expires=123456&' +
289
+ 'X-EMS-SignedHeaders=host&' +
290
+ 'X-EMS-Signature=b73d097c8c8ea1a954ffebafec84884ce2a487b001d62ccd71787964d01df39b'
291
+
292
+ client = {:api_key_id => 'th3K3y', :api_secret => 'very_secure'}
293
+ expect { escher.authenticate({
294
+ :method => 'GET',
295
+ :headers => [%w(host example.com)],
296
+ :uri => presigned_uri,
297
+ :body => 'IRRELEVANT'
298
+ }, key_db) }.not_to raise_error
299
+ end
300
+
301
+ it 'should generate presigned url with double URL encoded' do
302
+ escher = described_class.new('us-east-1/host/aws4_request', ESCHER_MIXED_OPTIONS.merge(current_time: Time.parse('2011/05/11 12:00:00 UTC')))
303
+ expected_url =
304
+ 'http://example.com/something?tz=Europe%252FVienna&' +
305
+ 'X-EMS-Algorithm=EMS-HMAC-SHA256&' +
306
+ 'X-EMS-Credentials=th3K3y%2F20110511%2Fus-east-1%2Fhost%2Faws4_request&' +
307
+ 'X-EMS-Date=20110511T120000Z&' +
308
+ 'X-EMS-Expires=123456&' +
309
+ 'X-EMS-SignedHeaders=host&' +
310
+ 'X-EMS-Signature=8eeb0171cf2acc4efcb6b3ff13a53d49ab3ee98d631898608d0ebf9de7281066'
311
+
312
+ client = {:api_key_id => 'th3K3y', :api_secret => 'very_secure'}
313
+ expect(escher.generate_signed_url('http://example.com/something?tz=Europe%252FVienna', client, 123456)).to eq expected_url
314
+ end
315
+
316
+ it 'should validate double encoded presigned url' do
317
+ escher = described_class.new('us-east-1/host/aws4_request', ESCHER_MIXED_OPTIONS.merge(current_time: Time.parse('2011/05/12 21:59:00 UTC')))
318
+ presigned_uri =
319
+ '/something?tz=Europe%252FVienna&' +
320
+ 'X-EMS-Algorithm=EMS-HMAC-SHA256&' +
321
+ 'X-EMS-Credentials=th3K3y%2F20110511%2Fus-east-1%2Fhost%2Faws4_request&' +
322
+ 'X-EMS-Date=20110511T120000Z&' +
323
+ 'X-EMS-Expires=123456&' +
324
+ 'X-EMS-SignedHeaders=host&' +
325
+ 'X-EMS-Signature=8eeb0171cf2acc4efcb6b3ff13a53d49ab3ee98d631898608d0ebf9de7281066'
326
+
327
+ client = {:api_key_id => 'th3K3y', :api_secret => 'very_secure'}
328
+ expect { escher.authenticate({
329
+ :method => 'GET',
330
+ :headers => [%w(host example.com)],
331
+ :uri => presigned_uri,
332
+ :body => 'IRRELEVANT'
333
+ }, key_db) }.not_to raise_error
334
+ end
207
335
 
208
336
  [
209
337
  ['http://iam.amazonaws.com:5000/', 'iam.amazonaws.com:5000'],
@@ -283,6 +411,16 @@ module Escher
283
411
  end
284
412
 
285
413
 
414
+ it 'should not throw parse error if credential scope contains whitespaces' do
415
+ headers = [
416
+ %w(Host host.foo.com),
417
+ ['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
418
+ ['Authorization', 'AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-ea st-1/host/aws4_request, SignedHeaders=date;host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470'],
419
+ ]
420
+ expect { call_validate(headers) }.to raise_error(EscherError, 'The credential scope is invalid')
421
+ end
422
+
423
+
286
424
  it 'should detect if signatures do not match' do
287
425
  headers = [
288
426
  %w(Host host.foo.com),
@@ -300,7 +438,7 @@ module Escher
300
438
  ['Date', "Mon, #{yesterday} Sep 2011 23:36:00 GMT"],
301
439
  ['Authorization', GOOD_AUTH_HEADER],
302
440
  ]
303
- expect { call_validate(headers) }.to raise_error(EscherError, 'Invalid request date')
441
+ expect { call_validate(headers) }.to raise_error(EscherError, 'The Authorization header\'s shortDate does not match with the request date')
304
442
  end
305
443
 
306
444
 
@@ -320,7 +458,7 @@ module Escher
320
458
  ['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
321
459
  ['Authorization', GOOD_AUTH_HEADER],
322
460
  ]
323
- expect { call_validate(headers) }.to raise_error(EscherError, 'Missing header: Host')
461
+ expect { call_validate(headers) }.to raise_error(EscherError, 'The Host header is missing')
324
462
  end
325
463
 
326
464
 
@@ -329,7 +467,7 @@ module Escher
329
467
  %w(Host host.foo.com),
330
468
  ['Authorization', GOOD_AUTH_HEADER],
331
469
  ]
332
- expect { call_validate(headers) }.to raise_error(EscherError, 'Missing header: Date')
470
+ expect { call_validate(headers) }.to raise_error(EscherError, 'The Date header is missing')
333
471
  end
334
472
 
335
473
 
@@ -338,7 +476,7 @@ module Escher
338
476
  %w(Host host.foo.com),
339
477
  ['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
340
478
  ]
341
- expect { call_validate(headers) }.to raise_error(EscherError, 'Missing header: Authorization')
479
+ expect { call_validate(headers) }.to raise_error(EscherError, 'The Authorization header is missing')
342
480
  end
343
481
 
344
482
 
@@ -348,7 +486,7 @@ module Escher
348
486
  ['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
349
487
  ['Authorization', 'AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date;host, Signature=UNPARSABLE'],
350
488
  ]
351
- expect { call_validate(headers) }.to raise_error(EscherError, 'Malformed authorization header')
489
+ expect { call_validate(headers) }.to raise_error(EscherError, 'Could not parse auth header')
352
490
  end
353
491
 
354
492
 
@@ -358,7 +496,7 @@ module Escher
358
496
  ['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
359
497
  ['Authorization', 'AWS4-HMAC-SHA256 Credential=BAD-CREDENTIAL-SCOPE, SignedHeaders=date;host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470'],
360
498
  ]
361
- expect { call_validate(headers) }.to raise_error(EscherError, 'Malformed authorization header')
499
+ expect { call_validate(headers) }.to raise_error(EscherError, 'Could not parse auth header')
362
500
  end
363
501
 
364
502
 
@@ -368,7 +506,7 @@ module Escher
368
506
  ['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
369
507
  ['Authorization', 'AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=date, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470'],
370
508
  ]
371
- expect { call_validate(headers) }.to raise_error(EscherError, 'Host header is not signed')
509
+ expect { call_validate(headers) }.to raise_error(EscherError, 'The host header is not signed')
372
510
  end
373
511
 
374
512
 
@@ -378,7 +516,7 @@ module Escher
378
516
  ['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
379
517
  ['Authorization', 'AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/host/aws4_request, SignedHeaders=host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470'],
380
518
  ]
381
- expect { call_validate(headers) }.to raise_error(EscherError, 'Date header is not signed')
519
+ expect { call_validate(headers) }.to raise_error(EscherError, 'The date header is not signed')
382
520
  end
383
521
 
384
522
 
@@ -398,7 +536,7 @@ module Escher
398
536
  ['Date', 'Mon, 09 Sep 2011 23:36:00 GMT'],
399
537
  ['Authorization', 'AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20110909/us-east-1/INVALID/aws4_request, SignedHeaders=date;host, Signature=b27ccfbfa7df52a200ff74193ca6e32d4b48b8856fab7ebf1c595d0670a7e470'],
400
538
  ]
401
- expect { call_validate(headers) }.to raise_error(EscherError, 'Invalid credentials')
539
+ expect { call_validate(headers) }.to raise_error(EscherError, 'The credential scope is invalid')
402
540
  end
403
541
 
404
542
 
metadata CHANGED
@@ -1,97 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: escher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andras Barthazi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-23 00:00:00.000000000 Z
11
+ date: 2015-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.6'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.6'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rails
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '10'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '10'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ~>
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '2'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ~>
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rack
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: addressable
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '2.3'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '2.3'
97
97
  description: Escher helps you creating secure HTTP requests (for APIs) by signing
@@ -102,8 +102,8 @@ executables: []
102
102
  extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
- - .gitignore
106
- - .travis.yml
105
+ - ".gitignore"
106
+ - ".travis.yml"
107
107
  - Gemfile
108
108
  - LICENSE
109
109
  - README.md
@@ -314,17 +314,17 @@ require_paths:
314
314
  - lib
315
315
  required_ruby_version: !ruby/object:Gem::Requirement
316
316
  requirements:
317
- - - '>='
317
+ - - ">="
318
318
  - !ruby/object:Gem::Version
319
319
  version: '1.9'
320
320
  required_rubygems_version: !ruby/object:Gem::Requirement
321
321
  requirements:
322
- - - '>='
322
+ - - ">="
323
323
  - !ruby/object:Gem::Version
324
324
  version: '0'
325
325
  requirements: []
326
326
  rubyforge_project:
327
- rubygems_version: 2.0.14
327
+ rubygems_version: 2.4.5
328
328
  signing_key:
329
329
  specification_version: 4
330
330
  summary: Library for HTTP request signing (Ruby implementation)