aws-sigv4 1.5.0 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/VERSION +1 -1
  4. data/lib/aws-sigv4/signer.rb +65 -24
  5. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 709cebb0799ad1e75e1f1e69413798d4da1d523332abc0ac59899e9686aa2e07
4
- data.tar.gz: a4751a6a7c2356bf76b2ac550f8320e3f8b24951415eaddf1328271c1835f2d3
3
+ metadata.gz: 482b4ffa8bd9e9e2d7dab0d61ab15553f0e8d05e1be2923b388157664a47a9fa
4
+ data.tar.gz: c5caa84527ca213826f8c802195430caacb25750530609f1b8d7267810808574
5
5
  SHA512:
6
- metadata.gz: 07ebb364959ed8bf62c39192707a30caef1127fcf0ab078dab30ecaf695b2a9e22caa017a773987dac297615dfc824eeb8cc04a60a604837024ee850f6812dd2
7
- data.tar.gz: f9e93932e59b1d43b92aa2c74d33d7553490ecf84ff61b491321c0b031896f30b5375c8a5f2c81d8514691917096e7c3dd5cc298c3a3fa5e6876cabb1f458c8e
6
+ metadata.gz: c16c5df7f8c6ca10cf073c25984506ce938f26823f99d82813b5bde3fb283d23a3c480adec2945b98975946a7b32efe57a0058cd65bb383606c5ee5228711381
7
+ data.tar.gz: b72ea1894eb1c419179325f8e715fb454ab02ae2d1ac243b90ed2f4032c0fd966ba157287a12009587908d0a6a2f62261c78e319a230196792b6ec4206a20718
data/CHANGELOG.md CHANGED
@@ -1,6 +1,36 @@
1
1
  Unreleased Changes
2
2
  ------------------
3
3
 
4
+ 1.8.0 (2023-11-28)
5
+ ------------------
6
+
7
+ * Feature - Support `sigv4-s3express` signing algorithm.
8
+
9
+ 1.7.0 (2023-11-22)
10
+ ------------------
11
+
12
+ * Feature - AWS SDK for Ruby no longer supports Ruby runtime versions 2.3 and 2.4.
13
+
14
+ 1.6.1 (2023-10-25)
15
+ ------------------
16
+
17
+ * Issue - (Static Stability) use provided `expires_in` in presigned url when credentials are expired.
18
+
19
+ 1.6.0 (2023-06-28)
20
+ ------------------
21
+
22
+ * Feature - Select the minimum expiration time for presigned urls between the expiration time option and the credential expiration time.
23
+
24
+ 1.5.2 (2022-09-30)
25
+ ------------------
26
+
27
+ * Issue - Fix an issue where quoted strings with multiple spaces are not trimmed. (#2758)
28
+
29
+ 1.5.1 (2022-07-19)
30
+ ------------------
31
+
32
+ * Issue - Fix performance regression when checking if `aws-crt` is available. (#2729)
33
+
4
34
  1.5.0 (2022-04-20)
5
35
  ------------------
6
36
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.5.0
1
+ 1.8.0
@@ -74,6 +74,14 @@ module Aws
74
74
  #
75
75
  class Signer
76
76
 
77
+ @@use_crt =
78
+ begin
79
+ require 'aws-crt'
80
+ true
81
+ rescue LoadError
82
+ false
83
+ end
84
+
77
85
  # @overload initialize(service:, region:, access_key_id:, secret_access_key:, session_token:nil, **options)
78
86
  # @param [String] :service The service signing name, e.g. 's3'.
79
87
  # @param [String] :region The region name, e.g. 'us-east-1'.
@@ -149,6 +157,13 @@ module Aws
149
157
  ' request with sigv4a which requires the `aws-crt` gem.'\
150
158
  ' Please install the gem or add it to your gemfile.'
151
159
  end
160
+
161
+ if @signing_algorithm == 'sigv4-s3express'.to_sym &&
162
+ Signer.use_crt? && Aws::Crt::GEM_VERSION <= '0.1.9'
163
+ raise ArgumentError,
164
+ 'This version of aws-crt does not support S3 Express. Please
165
+ update this gem to at least version 0.2.0.'
166
+ end
152
167
  end
153
168
 
154
169
  # @return [String]
@@ -227,7 +242,7 @@ module Aws
227
242
 
228
243
  return crt_sign_request(request) if Signer.use_crt?
229
244
 
230
- creds = fetch_credentials
245
+ creds, _ = fetch_credentials
231
246
 
232
247
  http_method = extract_http_method(request)
233
248
  url = extract_url(request)
@@ -243,7 +258,14 @@ module Aws
243
258
  sigv4_headers = {}
244
259
  sigv4_headers['host'] = headers['host'] || host(url)
245
260
  sigv4_headers['x-amz-date'] = datetime
246
- sigv4_headers['x-amz-security-token'] = creds.session_token if creds.session_token
261
+ if creds.session_token
262
+ if @signing_algorithm == 'sigv4-s3express'.to_sym
263
+ sigv4_headers['x-amz-s3session-token'] = creds.session_token
264
+ else
265
+ sigv4_headers['x-amz-security-token'] = creds.session_token
266
+ end
267
+ end
268
+
247
269
  sigv4_headers['x-amz-content-sha256'] ||= content_sha256 if @apply_checksum_header
248
270
 
249
271
  headers = headers.merge(sigv4_headers) # merge so we do not modify given headers hash
@@ -306,7 +328,7 @@ module Aws
306
328
  # hex-encoded string using #unpack
307
329
  def sign_event(prior_signature, payload, encoder)
308
330
  # Note: CRT does not currently provide event stream signing, so we always use the ruby implementation.
309
- creds = fetch_credentials
331
+ creds, _ = fetch_credentials
310
332
  time = Time.now
311
333
  headers = {}
312
334
 
@@ -395,7 +417,7 @@ module Aws
395
417
 
396
418
  return crt_presign_url(options) if Signer.use_crt?
397
419
 
398
- creds = fetch_credentials
420
+ creds, expiration = fetch_credentials
399
421
 
400
422
  http_method = extract_http_method(options)
401
423
  url = extract_url(options)
@@ -415,8 +437,14 @@ module Aws
415
437
  params['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256'
416
438
  params['X-Amz-Credential'] = credential(creds, date)
417
439
  params['X-Amz-Date'] = datetime
418
- params['X-Amz-Expires'] = extract_expires_in(options)
419
- params['X-Amz-Security-Token'] = creds.session_token if creds.session_token
440
+ params['X-Amz-Expires'] = presigned_url_expiration(options, expiration, Time.strptime(datetime, "%Y%m%dT%H%M%S%Z")).to_s
441
+ if creds.session_token
442
+ if @signing_algorithm == 'sigv4-s3express'.to_sym
443
+ params['X-Amz-S3session-Token'] = creds.session_token
444
+ else
445
+ params['X-Amz-Security-Token'] = creds.session_token
446
+ end
447
+ end
420
448
  params['X-Amz-SignedHeaders'] = signed_headers(headers)
421
449
 
422
450
  params = params.map do |key, value|
@@ -518,7 +546,6 @@ module Aws
518
546
  hmac(k_credentials, string_to_sign)
519
547
  end
520
548
 
521
-
522
549
  def path(url)
523
550
  path = url.path
524
551
  path = '/' if path == ''
@@ -581,7 +608,7 @@ module Aws
581
608
  end
582
609
 
583
610
  def canonical_header_value(value)
584
- value.match(/^".*"$/) ? value : value.gsub(/\s+/, ' ').strip
611
+ value.gsub(/\s+/, ' ').strip
585
612
  end
586
613
 
587
614
  def host(uri)
@@ -674,8 +701,8 @@ module Aws
674
701
 
675
702
  def extract_expires_in(options)
676
703
  case options[:expires_in]
677
- when nil then 900.to_s
678
- when Integer then options[:expires_in].to_s
704
+ when nil then 900
705
+ when Integer then options[:expires_in]
679
706
  else
680
707
  msg = "expected :expires_in to be a number of seconds"
681
708
  raise ArgumentError, msg
@@ -690,11 +717,14 @@ module Aws
690
717
  self.class.uri_escape_path(string)
691
718
  end
692
719
 
693
-
694
720
  def fetch_credentials
695
721
  credentials = @credentials_provider.credentials
696
722
  if credentials_set?(credentials)
697
- credentials
723
+ expiration = nil
724
+ if @credentials_provider.respond_to?(:expiration)
725
+ expiration = @credentials_provider.expiration
726
+ end
727
+ [credentials, expiration]
698
728
  else
699
729
  raise Errors::MissingCredentialsError,
700
730
  'unable to sign request without credentials set'
@@ -712,21 +742,37 @@ module Aws
712
742
  !credentials.secret_access_key.empty?
713
743
  end
714
744
 
745
+ def presigned_url_expiration(options, expiration, datetime)
746
+ expires_in = extract_expires_in(options)
747
+ return expires_in unless expiration
748
+
749
+ expiration_seconds = (expiration - datetime).to_i
750
+ # In the static stability case, credentials may expire in the past
751
+ # but still be valid. For those cases, use the user configured
752
+ # expires_in and ingore expiration.
753
+ if expiration_seconds <= 0
754
+ expires_in
755
+ else
756
+ [expires_in, expiration_seconds].min
757
+ end
758
+ end
759
+
715
760
  ### CRT Code
716
761
 
717
762
  # the credentials used by CRT must be a
718
763
  # CRT StaticCredentialsProvider object
719
764
  def crt_fetch_credentials
720
- creds = fetch_credentials
721
- Aws::Crt::Auth::StaticCredentialsProvider.new(
765
+ creds, expiration = fetch_credentials
766
+ crt_creds = Aws::Crt::Auth::StaticCredentialsProvider.new(
722
767
  creds.access_key_id,
723
768
  creds.secret_access_key,
724
769
  creds.session_token
725
770
  )
771
+ [crt_creds, expiration]
726
772
  end
727
773
 
728
774
  def crt_sign_request(request)
729
- creds = crt_fetch_credentials
775
+ creds, _ = crt_fetch_credentials
730
776
  http_method = extract_http_method(request)
731
777
  url = extract_url(request)
732
778
  headers = downcase_headers(request[:headers])
@@ -785,14 +831,14 @@ module Aws
785
831
  end
786
832
 
787
833
  def crt_presign_url(options)
788
- creds = crt_fetch_credentials
834
+ creds, expiration = crt_fetch_credentials
789
835
 
790
836
  http_method = extract_http_method(options)
791
837
  url = extract_url(options)
792
838
  headers = downcase_headers(options[:headers])
793
839
  headers['host'] ||= host(url)
794
840
 
795
- datetime = headers.delete('x-amz-date')
841
+ datetime = Time.strptime(headers.delete('x-amz-date'), "%Y%m%dT%H%M%S%Z") if headers['x-amz-date']
796
842
  datetime ||= (options[:time] || Time.now)
797
843
 
798
844
  content_sha256 = headers.delete('x-amz-content-sha256')
@@ -813,7 +859,7 @@ module Aws
813
859
  use_double_uri_encode: @uri_escape_path,
814
860
  should_normalize_uri_path: @normalize_path,
815
861
  omit_session_token: @omit_session_token,
816
- expiration_in_seconds: options.fetch(:expires_in, 900)
862
+ expiration_in_seconds: presigned_url_expiration(options, expiration, datetime)
817
863
  )
818
864
  http_request = Aws::Crt::Http::Message.new(
819
865
  http_method, url.to_s, headers
@@ -833,12 +879,7 @@ module Aws
833
879
  class << self
834
880
 
835
881
  def use_crt?
836
- begin
837
- require 'aws-crt'
838
- return true
839
- rescue LoadError
840
- return false
841
- end
882
+ @@use_crt
842
883
  end
843
884
 
844
885
  # @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.5.0
4
+ version: 1.8.0
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: 2022-04-20 00:00:00.000000000 Z
11
+ date: 2023-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-eventstream
@@ -60,7 +60,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
60
60
  requirements:
61
61
  - - ">="
62
62
  - !ruby/object:Gem::Version
63
- version: '2.3'
63
+ version: '2.5'
64
64
  required_rubygems_version: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - ">="