aws-sdk-core 3.186.0 → 3.190.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b996ac6ca7e1d4d61926d24af262a70a2d2da40b09a8999165721b58c8995a1
4
- data.tar.gz: a931f4b08ac8b2fd6342abbd4b799b649ee057c9e1bb9dc8cb9581ef30030f30
3
+ metadata.gz: 2da64972b1ed2710a16962a58908df05a60490439c44bf21e4c9482fef4856c8
4
+ data.tar.gz: 54aa4de531c85e2d44549a9f984b4074c4728be61b807b57ba3633a69e17fd1c
5
5
  SHA512:
6
- metadata.gz: b9655a1c8c71af67476d77e3248f8fd95e994aee2ac1a1c8960d9f12c4c7823ef624029661683b346653cd671c048ee00f01938fcfcade24b2a60ea344c886ec
7
- data.tar.gz: 97cec2c4e76b50f1224f92111d47240ab8f9d318489ec30607a206b4c83623033972d4ed72a466d90eef2957eb9ae1cf2c416cc276f9a8d4bb2c057fe7f1e968
6
+ metadata.gz: 546c523ec0f9324ee3c3ea4fbe4d1a060204b159ce91bda217f4b390c2ca4255a06b8e4580b84f2459d5b5ad1d6cdb75317da96efbcfa119d4ff6308645ace7f
7
+ data.tar.gz: f663e1491935bc5376af8246b33281a278fd07f40c5309b0c4731e93dbd456156ac4359a24768b3fa87530dc4fa94d8b03b4e7c56fd4ccb6337b76e3aff83678
data/CHANGELOG.md CHANGED
@@ -1,6 +1,41 @@
1
1
  Unreleased Changes
2
2
  ------------------
3
3
 
4
+ 3.190.0 (2023-11-29)
5
+ ------------------
6
+
7
+ * Feature - Updated Aws::STS::Client with the latest API changes.
8
+
9
+ 3.189.0 (2023-11-28)
10
+ ------------------
11
+
12
+ * Feature - Updated Aws::STS::Client with the latest API changes.
13
+
14
+ * Feature - Updated Aws::SSOOIDC::Client with the latest API changes.
15
+
16
+ * Feature - Updated Aws::SSO::Client with the latest API changes.
17
+
18
+ * Feature - Support S3 Express authentication.
19
+
20
+ 3.188.0 (2023-11-22)
21
+ ------------------
22
+
23
+ * Feature - AWS SDK for Ruby no longer supports Ruby runtime versions 2.3 and 2.4.
24
+
25
+ * Feature - Support `AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE` in `ECSCredentials` and also allow for ECS and EKS link-local http addresses.
26
+
27
+ 3.187.1 (2023-11-20)
28
+ ------------------
29
+
30
+ * Issue - For `awsQueryCompatible` services, default an empty list or map for shapes that were previously flattened in the query protocol.
31
+
32
+ 3.187.0 (2023-11-17)
33
+ ------------------
34
+
35
+ * Feature - Updated Aws::STS::Client with the latest API changes.
36
+
37
+ * Feature - Updated Aws::SSOOIDC::Client with the latest API changes.
38
+
4
39
  3.186.0 (2023-11-02)
5
40
  ------------------
6
41
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 3.186.0
1
+ 3.190.0
@@ -6,7 +6,7 @@ require 'resolv'
6
6
 
7
7
  module Aws
8
8
  # An auto-refreshing credential provider that loads credentials from
9
- # instances running in ECS.
9
+ # instances running in containers.
10
10
  #
11
11
  # ecs_credentials = Aws::ECSCredentials.new(retries: 3)
12
12
  # ec2 = Aws::EC2::Client.new(credentials: ecs_credentials)
@@ -17,6 +17,12 @@ module Aws
17
17
  # @api private
18
18
  class Non200Response < RuntimeError; end
19
19
 
20
+ # Raised when the token file cannot be read.
21
+ class TokenFileReadError < RuntimeError; end
22
+
23
+ # Raised when the token file is invalid.
24
+ class InvalidTokenError < RuntimeError; end
25
+
20
26
  # These are the errors we trap when attempting to talk to the
21
27
  # instance metadata service. Any of these imply the service
22
28
  # is not present, no responding or some other non-recoverable
@@ -41,7 +47,7 @@ module Aws
41
47
  # is set and `credential_path` is not set.
42
48
  # @option options [String] :credential_path By default, the value of the
43
49
  # AWS_CONTAINER_CREDENTIALS_RELATIVE_URI environment variable.
44
- # @option options [String] :endpoint The ECS credential endpoint.
50
+ # @option options [String] :endpoint The container credential endpoint.
45
51
  # By default, this is the value of the AWS_CONTAINER_CREDENTIALS_FULL_URI
46
52
  # environment variable. This value is ignored if `credential_path` or
47
53
  # ENV['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'] is set.
@@ -64,7 +70,6 @@ module Aws
64
70
  endpoint = options[:endpoint] ||
65
71
  ENV['AWS_CONTAINER_CREDENTIALS_FULL_URI']
66
72
  initialize_uri(options, credential_path, endpoint)
67
- @authorization_token = ENV['AWS_CONTAINER_AUTHORIZATION_TOKEN']
68
73
 
69
74
  @retries = options[:retries] || 5
70
75
  @http_open_timeout = options[:http_open_timeout] || 5
@@ -103,11 +108,18 @@ module Aws
103
108
 
104
109
  def initialize_full_uri(endpoint)
105
110
  uri = URI.parse(endpoint)
111
+ validate_full_uri_scheme!(uri)
106
112
  validate_full_uri!(uri)
107
- @host = uri.host
113
+ @host = uri.hostname
108
114
  @port = uri.port
109
115
  @scheme = uri.scheme
110
- @credential_path = uri.path
116
+ @credential_path = uri.request_uri
117
+ end
118
+
119
+ def validate_full_uri_scheme!(full_uri)
120
+ return if full_uri.is_a?(URI::HTTP) || full_uri.is_a?(URI::HTTPS)
121
+
122
+ raise ArgumentError, "'#{full_uri}' must be a valid HTTP or HTTPS URI"
111
123
  end
112
124
 
113
125
  # Validate that the full URI is using a loopback address if scheme is http.
@@ -115,19 +127,24 @@ module Aws
115
127
  return unless full_uri.scheme == 'http'
116
128
 
117
129
  begin
118
- return if ip_loopback?(IPAddr.new(full_uri.host))
130
+ return if valid_ip_address?(IPAddr.new(full_uri.host))
119
131
  rescue IPAddr::InvalidAddressError
120
132
  addresses = Resolv.getaddresses(full_uri.host)
121
- return if addresses.all? { |addr| ip_loopback?(IPAddr.new(addr)) }
133
+ return if addresses.all? { |addr| valid_ip_address?(IPAddr.new(addr)) }
122
134
  end
123
135
 
124
136
  raise ArgumentError,
125
- 'AWS_CONTAINER_CREDENTIALS_FULL_URI must use a loopback '\
126
- 'address when using the http scheme.'
137
+ 'AWS_CONTAINER_CREDENTIALS_FULL_URI must use a local loopback '\
138
+ 'or an ECS or EKS link-local address when using the http scheme.'
139
+ end
140
+
141
+ def valid_ip_address?(ip_address)
142
+ ip_loopback?(ip_address) || ecs_or_eks_ip?(ip_address)
127
143
  end
128
144
 
129
145
  # loopback? method is available in Ruby 2.5+
130
146
  # Replicate the logic here.
147
+ # loopback (IPv4 127.0.0.0/8, IPv6 ::1/128)
131
148
  def ip_loopback?(ip_address)
132
149
  case ip_address.family
133
150
  when Socket::AF_INET
@@ -139,6 +156,20 @@ module Aws
139
156
  end
140
157
  end
141
158
 
159
+ # Verify that the IP address is a link-local address from ECS or EKS.
160
+ # ECS container host (IPv4 `169.254.170.2`)
161
+ # EKS container host (IPv4 `169.254.170.23`, IPv6 `fd00:ec2::23`)
162
+ def ecs_or_eks_ip?(ip_address)
163
+ case ip_address.family
164
+ when Socket::AF_INET
165
+ [0xa9feaa02, 0xa9feaa17].include?(ip_address)
166
+ when Socket::AF_INET6
167
+ ip_address == 0xfd00_0ec2_0000_0000_0000_0000_0000_0023
168
+ else
169
+ false
170
+ end
171
+ end
172
+
142
173
  def backoff(backoff)
143
174
  case backoff
144
175
  when Proc then backoff
@@ -174,10 +205,36 @@ module Aws
174
205
  http_get(conn, @credential_path)
175
206
  end
176
207
  end
208
+ rescue TokenFileReadError, InvalidTokenError
209
+ raise
177
210
  rescue StandardError
178
211
  '{}'
179
212
  end
180
213
 
214
+ def fetch_authorization_token
215
+ if (path = ENV['AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE'])
216
+ fetch_authorization_token_file(path)
217
+ elsif (token = ENV['AWS_CONTAINER_AUTHORIZATION_TOKEN'])
218
+ token
219
+ end
220
+ end
221
+
222
+ def fetch_authorization_token_file(path)
223
+ File.read(path).strip
224
+ rescue Errno::ENOENT
225
+ raise TokenFileReadError,
226
+ 'AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE is set '\
227
+ "but the file doesn't exist: #{path}"
228
+ end
229
+
230
+ def validate_authorization_token!(token)
231
+ return unless token.include?("\r\n")
232
+
233
+ raise InvalidTokenError,
234
+ 'Invalid Authorization token: token contains '\
235
+ 'a newline and carriage return character.'
236
+ end
237
+
181
238
  def open_connection
182
239
  http = Net::HTTP.new(@host, @port, nil)
183
240
  http.open_timeout = @http_open_timeout
@@ -190,18 +247,27 @@ module Aws
190
247
 
191
248
  def http_get(connection, path)
192
249
  request = Net::HTTP::Get.new(path)
193
- request['Authorization'] = @authorization_token if @authorization_token
250
+ set_authorization_token(request)
194
251
  response = connection.request(request)
195
252
  raise Non200Response unless response.code.to_i == 200
196
253
 
197
254
  response.body
198
255
  end
199
256
 
257
+ def set_authorization_token(request)
258
+ if (authorization_token = fetch_authorization_token)
259
+ validate_authorization_token!(authorization_token)
260
+ request['Authorization'] = authorization_token
261
+ end
262
+ end
263
+
200
264
  def retry_errors(error_classes, options = {})
201
265
  max_retries = options[:max_retries]
202
266
  retries = 0
203
267
  begin
204
268
  yield
269
+ rescue TokenFileReadError, InvalidTokenError
270
+ raise
205
271
  rescue *error_classes => _e
206
272
  raise unless retries < max_retries
207
273
 
@@ -53,7 +53,7 @@ module Aws
53
53
  end
54
54
 
55
55
  def merge_signing_defaults(auth_scheme, config)
56
- if %w[sigv4 sigv4a].include?(auth_scheme['name'])
56
+ if %w[sigv4 sigv4a sigv4-s3express].include?(auth_scheme['name'])
57
57
  auth_scheme['signingName'] ||= sigv4_name(config)
58
58
  if auth_scheme['name'] == 'sigv4a'
59
59
  auth_scheme['signingRegionSet'] ||= ['*']
@@ -59,7 +59,10 @@ module Aws
59
59
  end
60
60
  resp_struct
61
61
  else
62
- Parser.new(rules).parse(json == '' ? '{}' : json)
62
+ Parser.new(
63
+ rules,
64
+ query_compatible: query_compatible?(context)
65
+ ).parse(json == '' ? '{}' : json)
63
66
  end
64
67
  else
65
68
  EmptyStructure.new
@@ -83,6 +86,10 @@ module Aws
83
86
  context.config.simple_json
84
87
  end
85
88
 
89
+ def query_compatible?(context)
90
+ context.config.api.metadata.key?('awsQueryCompatible')
91
+ end
92
+
86
93
  end
87
94
  end
88
95
  end
@@ -10,8 +10,9 @@ module Aws
10
10
  include Seahorse::Model::Shapes
11
11
 
12
12
  # @param [Seahorse::Model::ShapeRef] rules
13
- def initialize(rules)
13
+ def initialize(rules, query_compatible: false)
14
14
  @rules = rules
15
+ @query_compatible = query_compatible
15
16
  end
16
17
 
17
18
  # @param [String<JSON>] json
@@ -32,6 +33,22 @@ module Aws
32
33
  target[:unknown] = { 'name' => key, 'value' => value }
33
34
  end
34
35
  end
36
+ # In services that were previously Query/XML, members that were
37
+ # "flattened" defaulted to empty lists. In JSON, these values are nil,
38
+ # which is backwards incompatible. To preserve backwards compatibility,
39
+ # we set a default value of [] for these members.
40
+ if @query_compatible
41
+ ref.shape.members.each do |member_name, member_target|
42
+ next unless target[member_name].nil?
43
+
44
+ if flattened_list?(member_target.shape)
45
+ target[member_name] = []
46
+ elsif flattened_map?(member_target.shape)
47
+ target[member_name] = {}
48
+ end
49
+ end
50
+ end
51
+
35
52
  if shape.union
36
53
  # convert to subclass
37
54
  member_subclass = shape.member_subclass(target.member).new
@@ -79,6 +96,14 @@ module Aws
79
96
  value.is_a?(Numeric) ? Time.at(value) : Time.parse(value)
80
97
  end
81
98
 
99
+ def flattened_list?(shape)
100
+ shape.is_a?(ListShape) && shape.flattened
101
+ end
102
+
103
+ def flattened_map?(shape)
104
+ shape.is_a?(MapShape) && shape.flattened
105
+ end
106
+
82
107
  end
83
108
  end
84
109
  end
@@ -117,7 +117,8 @@ module Aws
117
117
 
118
118
  def call(context)
119
119
  if should_calculate_request_checksum?(context)
120
- request_algorithm_input = ChecksumAlgorithm.request_algorithm_selection(context)
120
+ request_algorithm_input = ChecksumAlgorithm.request_algorithm_selection(context) ||
121
+ context[:default_request_checksum_algorithm]
121
122
  context[:checksum_algorithms] = request_algorithm_input
122
123
 
123
124
  request_checksum_property = {
@@ -140,7 +141,8 @@ module Aws
140
141
 
141
142
  def should_calculate_request_checksum?(context)
142
143
  context.operation.http_checksum &&
143
- ChecksumAlgorithm.request_algorithm_selection(context)
144
+ (ChecksumAlgorithm.request_algorithm_selection(context) ||
145
+ context[:default_request_checksum_algorithm])
144
146
  end
145
147
 
146
148
  def should_verify_response_checksum?(context)
@@ -12,7 +12,8 @@ module Aws
12
12
 
13
13
  def call(context)
14
14
  if checksum_required?(context) &&
15
- !context[:checksum_algorithms] # skip in favor of flexible checksum
15
+ !context[:checksum_algorithms] && # skip in favor of flexible checksum
16
+ !context[:s3_express_endpoint] # s3 express endpoints do not support md5
16
17
  body = context.http_request.body
17
18
  context.http_request.headers['Content-Md5'] ||= md5(body)
18
19
  end
@@ -13,7 +13,7 @@ module Aws
13
13
  option(:sigv4_region)
14
14
  option(:unsigned_operations, default: [])
15
15
 
16
- supported_auth_types = %w[sigv4 bearer none]
16
+ supported_auth_types = %w[sigv4 bearer sigv4-s3express none]
17
17
  supported_auth_types += ['sigv4a'] if Aws::Sigv4::Signer.use_crt?
18
18
  SUPPORTED_AUTH_TYPES = supported_auth_types.freeze
19
19
 
@@ -24,10 +24,14 @@ module Aws
24
24
 
25
25
  # @api private
26
26
  # Return a signer with the `sign(context)` method
27
- def self.signer_for(auth_scheme, config, region_override = nil)
27
+ def self.signer_for(auth_scheme, config, sigv4_region_override = nil, sigv4_credentials_override = nil)
28
28
  case auth_scheme['name']
29
- when 'sigv4', 'sigv4a'
30
- SignatureV4.new(auth_scheme, config, region_override)
29
+ when 'sigv4', 'sigv4a', 'sigv4-s3express'
30
+ sigv4_overrides = {
31
+ region: sigv4_region_override,
32
+ credentials: sigv4_credentials_override
33
+ }
34
+ SignatureV4.new(auth_scheme, config, sigv4_overrides)
31
35
  when 'bearer'
32
36
  Bearer.new
33
37
  else
@@ -42,7 +46,8 @@ module Aws
42
46
  signer = Sign.signer_for(
43
47
  context[:auth_scheme],
44
48
  context.config,
45
- context[:sigv4_region]
49
+ context[:sigv4_region],
50
+ context[:sigv4_credentials]
46
51
  )
47
52
  signer.sign(context)
48
53
  end
@@ -88,12 +93,12 @@ module Aws
88
93
 
89
94
  # @api private
90
95
  class SignatureV4
91
- def initialize(auth_scheme, config, region_override = nil)
96
+ def initialize(auth_scheme, config, sigv4_overrides = {})
92
97
  scheme_name = auth_scheme['name']
93
98
 
94
- unless %w[sigv4 sigv4a].include?(scheme_name)
99
+ unless %w[sigv4 sigv4a sigv4-s3express].include?(scheme_name)
95
100
  raise ArgumentError,
96
- "Expected sigv4 or sigv4a auth scheme, got #{scheme_name}"
101
+ "Expected sigv4, sigv4a, or sigv4-s3express auth scheme, got #{scheme_name}"
97
102
  end
98
103
 
99
104
  region = if scheme_name == 'sigv4a'
@@ -104,8 +109,8 @@ module Aws
104
109
  begin
105
110
  @signer = Aws::Sigv4::Signer.new(
106
111
  service: config.sigv4_name || auth_scheme['signingName'],
107
- region: region_override || config.sigv4_region || region,
108
- credentials_provider: config.credentials,
112
+ region: sigv4_overrides[:region] || config.sigv4_region || region,
113
+ credentials_provider: sigv4_overrides[:credentials] || config.credentials,
109
114
  signing_algorithm: scheme_name.to_sym,
110
115
  uri_escape_path: !!!auth_scheme['disableDoubleEncoding'],
111
116
  normalize_path: !!!auth_scheme['disableNormalizePath'],
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'thread'
4
-
5
3
  module Aws
6
4
 
7
5
  # Base class used credential classes that can be refreshed. This
@@ -48,6 +46,14 @@ module Aws
48
46
 
49
47
  private
50
48
 
49
+ def sync_expiration_length
50
+ self.class::SYNC_EXPIRATION_LENGTH
51
+ end
52
+
53
+ def async_expiration_length
54
+ self.class::ASYNC_EXPIRATION_LENGTH
55
+ end
56
+
51
57
  # Refreshes credentials asynchronously and synchronously.
52
58
  # If we are near to expiration, block while getting new credentials.
53
59
  # Otherwise, if we're approaching expiration, use the existing credentials
@@ -56,18 +62,18 @@ module Aws
56
62
  # Note: This check is an optimization. Rather than acquire the mutex on every #refresh_if_near_expiration
57
63
  # call, we check before doing so, and then we check within the mutex to avoid a race condition.
58
64
  # See issue: https://github.com/aws/aws-sdk-ruby/issues/2641 for more info.
59
- if near_expiration?(SYNC_EXPIRATION_LENGTH)
65
+ if near_expiration?(sync_expiration_length)
60
66
  @mutex.synchronize do
61
- if near_expiration?(SYNC_EXPIRATION_LENGTH)
67
+ if near_expiration?(sync_expiration_length)
62
68
  @before_refresh.call(self) if @before_refresh
63
69
  refresh
64
70
  end
65
71
  end
66
- elsif @async_refresh && near_expiration?(ASYNC_EXPIRATION_LENGTH)
72
+ elsif @async_refresh && near_expiration?(async_expiration_length)
67
73
  unless @mutex.locked?
68
74
  Thread.new do
69
75
  @mutex.synchronize do
70
- if near_expiration?(ASYNC_EXPIRATION_LENGTH)
76
+ if near_expiration?(async_expiration_length)
71
77
  @before_refresh.call(self) if @before_refresh
72
78
  refresh
73
79
  end
@@ -218,6 +218,7 @@ module Aws
218
218
  :s3_use_arn_region,
219
219
  :s3_us_east_1_regional_endpoint,
220
220
  :s3_disable_multiregion_access_points,
221
+ :s3_disable_express_session_auth,
221
222
  :defaults_mode,
222
223
  :sdk_ua_app_id,
223
224
  :disable_request_compression,
@@ -605,7 +605,7 @@ module Aws::SSO
605
605
  params: params,
606
606
  config: config)
607
607
  context[:gem_name] = 'aws-sdk-core'
608
- context[:gem_version] = '3.186.0'
608
+ context[:gem_version] = '3.190.0'
609
609
  Seahorse::Client::Request.new(handlers, context)
610
610
  end
611
611
 
@@ -25,16 +25,17 @@ module Aws::SSO
25
25
  # @api private
26
26
  class Handler < Seahorse::Client::Handler
27
27
  def call(context)
28
- # If endpoint was discovered, do not resolve or apply the endpoint.
29
28
  unless context[:discovered_endpoint]
30
29
  params = parameters_for_operation(context)
31
30
  endpoint = context.config.endpoint_provider.resolve_endpoint(params)
32
31
 
33
32
  context.http_request.endpoint = endpoint.url
34
33
  apply_endpoint_headers(context, endpoint.headers)
34
+
35
+ context[:endpoint_params] = params
36
+ context[:endpoint_properties] = endpoint.properties
35
37
  end
36
38
 
37
- context[:endpoint_params] = params
38
39
  context[:auth_scheme] =
39
40
  Aws::Endpoints.resolve_auth_scheme(context, endpoint)
40
41
 
data/lib/aws-sdk-sso.rb CHANGED
@@ -54,6 +54,6 @@ require_relative 'aws-sdk-sso/customizations'
54
54
  # @!group service
55
55
  module Aws::SSO
56
56
 
57
- GEM_VERSION = '3.186.0'
57
+ GEM_VERSION = '3.190.0'
58
58
 
59
59
  end