aws-sigv4 1.1.2 → 1.2.2
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/lib/aws-sigv4.rb +2 -0
- data/lib/aws-sigv4/credentials.rb +12 -3
- data/lib/aws-sigv4/errors.rb +2 -0
- data/lib/aws-sigv4/request.rb +2 -0
- data/lib/aws-sigv4/signature.rb +2 -0
- data/lib/aws-sigv4/signer.rb +37 -12
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f598a45b85be9ca9687eef1ee700397b1a6f273f8633d3c6f5dcc0d5bf6c649
|
4
|
+
data.tar.gz: 15d37434086264b0d6f87b0b77d32cff6a70e13eb5746b1aafa89d2c85d91335
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9bbfd21088c2ee7821fff70b4d25d21173cecfdeab77e37ea36ce7664ae21aeb2122615ccee12de783116f53d2fc360d82d136d74c98589d595e0522c7d170d
|
7
|
+
data.tar.gz: 94d8676dde1b46f5fb760a29cbac9e16f63ac30e6a08310a91230054e69dfb10f92b1d4470964c427f59c5843b8a6a5abf331df3e86428c757dc386ae9b3b347
|
data/lib/aws-sigv4.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Aws
|
2
4
|
module Sigv4
|
3
5
|
# Users that wish to configure static credentials can use the
|
@@ -28,11 +30,14 @@ module Aws
|
|
28
30
|
# @return [String, nil]
|
29
31
|
attr_reader :session_token
|
30
32
|
|
31
|
-
# @return [Boolean]
|
33
|
+
# @return [Boolean] Returns `true` if the access key id and secret
|
34
|
+
# access key are both set.
|
32
35
|
def set?
|
33
|
-
|
36
|
+
!access_key_id.nil? &&
|
37
|
+
!access_key_id.empty? &&
|
38
|
+
!secret_access_key.nil? &&
|
39
|
+
!secret_access_key.empty?
|
34
40
|
end
|
35
|
-
|
36
41
|
end
|
37
42
|
|
38
43
|
# Users that wish to configure static credentials can use the
|
@@ -53,6 +58,10 @@ module Aws
|
|
53
58
|
# @return [Credentials]
|
54
59
|
attr_reader :credentials
|
55
60
|
|
61
|
+
# @return [Boolean]
|
62
|
+
def set?
|
63
|
+
!!credentials && credentials.set?
|
64
|
+
end
|
56
65
|
end
|
57
66
|
|
58
67
|
end
|
data/lib/aws-sigv4/errors.rb
CHANGED
data/lib/aws-sigv4/request.rb
CHANGED
data/lib/aws-sigv4/signature.rb
CHANGED
data/lib/aws-sigv4/signer.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'openssl'
|
2
4
|
require 'tempfile'
|
3
5
|
require 'time'
|
@@ -123,6 +125,7 @@ module Aws
|
|
123
125
|
@unsigned_headers = Set.new((options.fetch(:unsigned_headers, [])).map(&:downcase))
|
124
126
|
@unsigned_headers << 'authorization'
|
125
127
|
@unsigned_headers << 'x-amzn-trace-id'
|
128
|
+
@unsigned_headers << 'expect'
|
126
129
|
[:uri_escape_path, :apply_checksum_header].each do |opt|
|
127
130
|
instance_variable_set("@#{opt}", options.key?(opt) ? !!options[:opt] : true)
|
128
131
|
end
|
@@ -216,7 +219,7 @@ module Aws
|
|
216
219
|
content_sha256 ||= sha256_hexdigest(request[:body] || '')
|
217
220
|
|
218
221
|
sigv4_headers = {}
|
219
|
-
sigv4_headers['host'] = host(url)
|
222
|
+
sigv4_headers['host'] = headers['host'] || host(url)
|
220
223
|
sigv4_headers['x-amz-date'] = datetime
|
221
224
|
sigv4_headers['x-amz-security-token'] = creds.session_token if creds.session_token
|
222
225
|
sigv4_headers['x-amz-content-sha256'] ||= content_sha256 if @apply_checksum_header
|
@@ -373,7 +376,7 @@ module Aws
|
|
373
376
|
url = extract_url(options)
|
374
377
|
|
375
378
|
headers = downcase_headers(options[:headers])
|
376
|
-
headers['host']
|
379
|
+
headers['host'] ||= host(url)
|
377
380
|
|
378
381
|
datetime = headers['x-amz-date']
|
379
382
|
datetime ||= (options[:time] || Time.now).utc.strftime("%Y%m%dT%H%M%SZ")
|
@@ -504,18 +507,26 @@ module Aws
|
|
504
507
|
def normalized_querystring(querystring)
|
505
508
|
params = querystring.split('&')
|
506
509
|
params = params.map { |p| p.match(/=/) ? p : p + '=' }
|
507
|
-
#
|
508
|
-
#
|
510
|
+
# From: https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html
|
511
|
+
# Sort the parameter names by character code point in ascending order.
|
512
|
+
# Parameters with duplicate names should be sorted by value.
|
513
|
+
#
|
514
|
+
# Default sort <=> in JRuby will swap members
|
509
515
|
# occasionally when <=> is 0 (considered still sorted), but this
|
510
516
|
# causes our normalized query string to not match the sent querystring.
|
511
|
-
# When names match, we then sort by their
|
512
|
-
|
517
|
+
# When names match, we then sort by their values. When values also
|
518
|
+
# match then we sort by their original order
|
519
|
+
params.each.with_index.sort do |a, b|
|
513
520
|
a, a_offset = a
|
514
|
-
a_name = a.split('=')[0]
|
515
521
|
b, b_offset = b
|
516
|
-
|
522
|
+
a_name, a_value = a.split('=')
|
523
|
+
b_name, b_value = b.split('=')
|
517
524
|
if a_name == b_name
|
518
|
-
|
525
|
+
if a_value == b_value
|
526
|
+
a_offset <=> b_offset
|
527
|
+
else
|
528
|
+
a_value <=> b_value
|
529
|
+
end
|
519
530
|
else
|
520
531
|
a_name <=> b_name
|
521
532
|
end
|
@@ -564,7 +575,9 @@ module Aws
|
|
564
575
|
OpenSSL::Digest::SHA256.file(value).hexdigest
|
565
576
|
elsif value.respond_to?(:read)
|
566
577
|
sha256 = OpenSSL::Digest::SHA256.new
|
567
|
-
|
578
|
+
loop do
|
579
|
+
chunk = value.read(1024 * 1024) # 1MB
|
580
|
+
break unless chunk
|
568
581
|
sha256.update(chunk)
|
569
582
|
end
|
570
583
|
value.rewind
|
@@ -652,16 +665,28 @@ module Aws
|
|
652
665
|
self.class.uri_escape_path(string)
|
653
666
|
end
|
654
667
|
|
668
|
+
|
655
669
|
def fetch_credentials
|
656
670
|
credentials = @credentials_provider.credentials
|
657
|
-
if credentials
|
671
|
+
if credentials_set?(credentials)
|
658
672
|
credentials
|
659
673
|
else
|
660
674
|
raise Errors::MissingCredentialsError,
|
661
|
-
|
675
|
+
'unable to sign request without credentials set'
|
662
676
|
end
|
663
677
|
end
|
664
678
|
|
679
|
+
# Returns true if credentials are set (not nil or empty)
|
680
|
+
# Credentials may not implement the Credentials interface
|
681
|
+
# and may just be credential like Client response objects
|
682
|
+
# (eg those returned by sts#assume_role)
|
683
|
+
def credentials_set?(credentials)
|
684
|
+
!credentials.access_key_id.nil? &&
|
685
|
+
!credentials.access_key_id.empty? &&
|
686
|
+
!credentials.secret_access_key.nil? &&
|
687
|
+
!credentials.secret_access_key.empty?
|
688
|
+
end
|
689
|
+
|
665
690
|
class << self
|
666
691
|
|
667
692
|
# @api private
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-sigv4
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Amazon Web Services
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-eventstream
|
@@ -16,7 +16,7 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1
|
19
|
+
version: '1'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
22
|
version: 1.0.2
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '1
|
29
|
+
version: '1'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 1.0.2
|