aws-sdk-core 3.131.1 → 3.188.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 +4 -4
- data/CHANGELOG.md +459 -0
- data/VERSION +1 -1
- data/lib/aws-defaults/default_configuration.rb +4 -4
- data/lib/aws-sdk-core/arn.rb +13 -0
- data/lib/aws-sdk-core/binary/encode_handler.rb +12 -1
- data/lib/aws-sdk-core/credential_provider.rb +3 -0
- data/lib/aws-sdk-core/credential_provider_chain.rb +8 -5
- data/lib/aws-sdk-core/ecs_credentials.rb +177 -53
- data/lib/aws-sdk-core/endpoints/condition.rb +41 -0
- data/lib/aws-sdk-core/endpoints/endpoint.rb +17 -0
- data/lib/aws-sdk-core/endpoints/endpoint_rule.rb +75 -0
- data/lib/aws-sdk-core/endpoints/error_rule.rb +42 -0
- data/lib/aws-sdk-core/endpoints/function.rb +80 -0
- data/lib/aws-sdk-core/endpoints/matchers.rb +131 -0
- data/lib/aws-sdk-core/endpoints/reference.rb +31 -0
- data/lib/aws-sdk-core/endpoints/rule.rb +25 -0
- data/lib/aws-sdk-core/endpoints/rule_set.rb +52 -0
- data/lib/aws-sdk-core/endpoints/rules_provider.rb +37 -0
- data/lib/aws-sdk-core/endpoints/templater.rb +58 -0
- data/lib/aws-sdk-core/endpoints/tree_rule.rb +45 -0
- data/lib/aws-sdk-core/endpoints/url.rb +60 -0
- data/lib/aws-sdk-core/endpoints.rb +78 -0
- data/lib/aws-sdk-core/errors.rb +14 -1
- data/lib/aws-sdk-core/ini_parser.rb +7 -0
- data/lib/aws-sdk-core/instance_profile_credentials.rb +52 -30
- data/lib/aws-sdk-core/json/error_handler.rb +20 -1
- data/lib/aws-sdk-core/json/handler.rb +8 -1
- data/lib/aws-sdk-core/json/parser.rb +27 -2
- data/lib/aws-sdk-core/log/formatter.rb +6 -0
- data/lib/aws-sdk-core/pageable_response.rb +10 -1
- data/lib/aws-sdk-core/param_validator.rb +2 -2
- data/lib/aws-sdk-core/plugins/bearer_authorization.rb +67 -0
- data/lib/aws-sdk-core/plugins/checksum_algorithm.rb +1 -1
- data/lib/aws-sdk-core/plugins/credentials_configuration.rb +24 -0
- data/lib/aws-sdk-core/plugins/endpoint_discovery.rb +6 -2
- data/lib/aws-sdk-core/plugins/jsonvalue_converter.rb +34 -6
- data/lib/aws-sdk-core/plugins/recursion_detection.rb +14 -3
- data/lib/aws-sdk-core/plugins/regional_endpoint.rb +111 -30
- data/lib/aws-sdk-core/plugins/request_compression.rb +217 -0
- data/lib/aws-sdk-core/plugins/retries/error_inspector.rb +2 -1
- data/lib/aws-sdk-core/plugins/sign.rb +201 -0
- data/lib/aws-sdk-core/plugins/signature_v2.rb +1 -0
- data/lib/aws-sdk-core/plugins/signature_v4.rb +13 -7
- data/lib/aws-sdk-core/plugins/user_agent.rb +117 -14
- data/lib/aws-sdk-core/refreshing_credentials.rb +0 -6
- data/lib/aws-sdk-core/refreshing_token.rb +71 -0
- data/lib/aws-sdk-core/rest/handler.rb +1 -1
- data/lib/aws-sdk-core/rest/request/headers.rb +2 -6
- data/lib/aws-sdk-core/rest/request/querystring_builder.rb +43 -29
- data/lib/aws-sdk-core/shared_config.rb +106 -6
- data/lib/aws-sdk-core/sso_credentials.rb +80 -45
- data/lib/aws-sdk-core/sso_token_provider.rb +135 -0
- data/lib/aws-sdk-core/static_token_provider.rb +14 -0
- data/lib/aws-sdk-core/structure.rb +6 -4
- data/lib/aws-sdk-core/stubbing/stub_data.rb +11 -0
- data/lib/aws-sdk-core/token.rb +31 -0
- data/lib/aws-sdk-core/token_provider.rb +15 -0
- data/lib/aws-sdk-core/token_provider_chain.rb +51 -0
- data/lib/aws-sdk-core/waiters/poller.rb +3 -1
- data/lib/aws-sdk-core/xml/error_handler.rb +7 -0
- data/lib/aws-sdk-core/xml/parser/engines/oga.rb +2 -0
- data/lib/aws-sdk-core.rb +14 -0
- data/lib/aws-sdk-sso/client.rb +71 -11
- data/lib/aws-sdk-sso/endpoint_parameters.rb +66 -0
- data/lib/aws-sdk-sso/endpoint_provider.rb +57 -0
- data/lib/aws-sdk-sso/endpoints.rb +72 -0
- data/lib/aws-sdk-sso/plugins/endpoints.rb +76 -0
- data/lib/aws-sdk-sso/types.rb +8 -43
- data/lib/aws-sdk-sso.rb +5 -1
- data/lib/aws-sdk-ssooidc/client.rb +935 -0
- data/lib/aws-sdk-ssooidc/client_api.rb +271 -0
- data/lib/aws-sdk-ssooidc/customizations.rb +1 -0
- data/lib/aws-sdk-ssooidc/endpoint_parameters.rb +66 -0
- data/lib/aws-sdk-ssooidc/endpoint_provider.rb +57 -0
- data/lib/aws-sdk-ssooidc/endpoints.rb +72 -0
- data/lib/aws-sdk-ssooidc/errors.rb +321 -0
- data/lib/aws-sdk-ssooidc/plugins/endpoints.rb +76 -0
- data/lib/aws-sdk-ssooidc/resource.rb +26 -0
- data/lib/aws-sdk-ssooidc/types.rb +755 -0
- data/lib/aws-sdk-ssooidc.rb +59 -0
- data/lib/aws-sdk-sts/client.rb +298 -245
- data/lib/aws-sdk-sts/client_api.rb +12 -1
- data/lib/aws-sdk-sts/endpoint_parameters.rb +78 -0
- data/lib/aws-sdk-sts/endpoint_provider.rb +112 -0
- data/lib/aws-sdk-sts/endpoints.rb +136 -0
- data/lib/aws-sdk-sts/plugins/endpoints.rb +84 -0
- data/lib/aws-sdk-sts/presigner.rb +14 -16
- data/lib/aws-sdk-sts/types.rb +128 -197
- data/lib/aws-sdk-sts.rb +5 -1
- data/lib/seahorse/client/async_base.rb +0 -1
- data/lib/seahorse/client/configuration.rb +1 -5
- data/lib/seahorse/client/h2/connection.rb +12 -11
- data/lib/seahorse/client/net_http/patches.rb +1 -4
- data/lib/seahorse/client/plugins/h2.rb +3 -3
- data/lib/seahorse/client/plugins/request_callback.rb +40 -9
- data/lib/seahorse/client/response.rb +6 -0
- data/lib/seahorse/model/operation.rb +3 -0
- data/lib/seahorse/util.rb +4 -0
- metadata +49 -7
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Aws
         | 
| 4 | 
            +
              module Endpoints
         | 
| 5 | 
            +
                # This class is deprecated. It is used by the Runtime endpoint
         | 
| 6 | 
            +
                # resolution approach. It has been replaced by a code generated
         | 
| 7 | 
            +
                # approach in each service gem. It can be removed in a new
         | 
| 8 | 
            +
                # major version. It has to exist because
         | 
| 9 | 
            +
                # old service gems can use a new core version.
         | 
| 10 | 
            +
                # @api private
         | 
| 11 | 
            +
                class Reference
         | 
| 12 | 
            +
                  def initialize(ref:)
         | 
| 13 | 
            +
                    @ref = ref
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  attr_reader :ref
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def resolve(parameters, assigns)
         | 
| 19 | 
            +
                    if parameters.class.singleton_class::PARAM_MAP.key?(@ref)
         | 
| 20 | 
            +
                      member_name = parameters.class.singleton_class::PARAM_MAP[@ref]
         | 
| 21 | 
            +
                      parameters[member_name]
         | 
| 22 | 
            +
                    elsif assigns.key?(@ref)
         | 
| 23 | 
            +
                      assigns[@ref]
         | 
| 24 | 
            +
                    else
         | 
| 25 | 
            +
                      raise ArgumentError,
         | 
| 26 | 
            +
                            "Reference #{@ref} is not a param or an assigned value."
         | 
| 27 | 
            +
                    end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
            end
         | 
| @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Aws
         | 
| 4 | 
            +
              module Endpoints
         | 
| 5 | 
            +
                # This class is deprecated. It is used by the Runtime endpoint
         | 
| 6 | 
            +
                # resolution approach. It has been replaced by a code generated
         | 
| 7 | 
            +
                # approach in each service gem. It can be removed in a new
         | 
| 8 | 
            +
                # major version. It has to exist because
         | 
| 9 | 
            +
                # old service gems can use a new core version.
         | 
| 10 | 
            +
                # @api private
         | 
| 11 | 
            +
                class Rule
         | 
| 12 | 
            +
                  # Resolves a value that is a function, reference, or template string.
         | 
| 13 | 
            +
                  def resolve_value(value, parameters, assigns)
         | 
| 14 | 
            +
                    if value.is_a?(Hash) && value['fn']
         | 
| 15 | 
            +
                      Function.new(fn: value['fn'], argv: value['argv'])
         | 
| 16 | 
            +
                              .call(parameters, assigns)
         | 
| 17 | 
            +
                    elsif value.is_a?(Hash) && value['ref']
         | 
| 18 | 
            +
                      Reference.new(ref: value['ref']).resolve(parameters, assigns)
         | 
| 19 | 
            +
                    else
         | 
| 20 | 
            +
                      Templater.resolve(value, parameters, assigns)
         | 
| 21 | 
            +
                    end
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
            end
         | 
| @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Aws
         | 
| 4 | 
            +
              module Endpoints
         | 
| 5 | 
            +
                # This class is deprecated. It is used by the Runtime endpoint
         | 
| 6 | 
            +
                # resolution approach. It has been replaced by a code generated
         | 
| 7 | 
            +
                # approach in each service gem. It can be removed in a new
         | 
| 8 | 
            +
                # major version. It has to exist because
         | 
| 9 | 
            +
                # old service gems can use a new core version.
         | 
| 10 | 
            +
                # @api private
         | 
| 11 | 
            +
                class RuleSet
         | 
| 12 | 
            +
                  def initialize(version:, service_id:, parameters:, rules:)
         | 
| 13 | 
            +
                    @version = version
         | 
| 14 | 
            +
                    @service_id = service_id
         | 
| 15 | 
            +
                    @parameters = parameters
         | 
| 16 | 
            +
                    @rules = RuleSet.rules_from_json(rules || [])
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  attr_reader :version
         | 
| 20 | 
            +
                  attr_reader :service_id
         | 
| 21 | 
            +
                  attr_reader :parameters
         | 
| 22 | 
            +
                  attr_reader :rules
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def self.rules_from_json(rules_json)
         | 
| 25 | 
            +
                    rules_json.each.with_object([]) do |rule, rules|
         | 
| 26 | 
            +
                      if rule['type'] == 'endpoint'
         | 
| 27 | 
            +
                        rules << EndpointRule.new(
         | 
| 28 | 
            +
                          conditions: rule['conditions'],
         | 
| 29 | 
            +
                          endpoint: rule['endpoint'],
         | 
| 30 | 
            +
                          documentation: rule['documentation']
         | 
| 31 | 
            +
                        )
         | 
| 32 | 
            +
                      elsif rule['type'] == 'error'
         | 
| 33 | 
            +
                        rules << ErrorRule.new(
         | 
| 34 | 
            +
                          conditions: rule['conditions'],
         | 
| 35 | 
            +
                          error: rule['error'],
         | 
| 36 | 
            +
                          documentation: rule['documentation']
         | 
| 37 | 
            +
                        )
         | 
| 38 | 
            +
                      elsif rule['type'] == 'tree'
         | 
| 39 | 
            +
                        rules << TreeRule.new(
         | 
| 40 | 
            +
                          conditions: rule['conditions'],
         | 
| 41 | 
            +
                          rules: rule['rules'],
         | 
| 42 | 
            +
                          documentation: rule['documentation']
         | 
| 43 | 
            +
                        )
         | 
| 44 | 
            +
                      else
         | 
| 45 | 
            +
                        # should not happen
         | 
| 46 | 
            +
                        raise "Unknown endpoint rule type: #{rule}"
         | 
| 47 | 
            +
                      end
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
            end
         | 
| @@ -0,0 +1,37 @@ | |
| 1 | 
            +
            module Aws
         | 
| 2 | 
            +
              module Endpoints
         | 
| 3 | 
            +
                # This class is deprecated. It is used by the Runtime endpoint
         | 
| 4 | 
            +
                # resolution approach. It has been replaced by a code generated
         | 
| 5 | 
            +
                # approach in each service gem. It can be removed in a new
         | 
| 6 | 
            +
                # major version. It has to exist because
         | 
| 7 | 
            +
                # old service gems can use a new core version.
         | 
| 8 | 
            +
                # @api private
         | 
| 9 | 
            +
                class RulesProvider
         | 
| 10 | 
            +
                  def initialize(rule_set)
         | 
| 11 | 
            +
                    @rule_set = rule_set
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def resolve_endpoint(parameters)
         | 
| 15 | 
            +
                    obj = resolve_rules(parameters)
         | 
| 16 | 
            +
                    case obj
         | 
| 17 | 
            +
                    when Endpoint
         | 
| 18 | 
            +
                      obj
         | 
| 19 | 
            +
                    when ArgumentError
         | 
| 20 | 
            +
                      raise obj
         | 
| 21 | 
            +
                    else
         | 
| 22 | 
            +
                      raise ArgumentError, 'No endpoint could be resolved'
         | 
| 23 | 
            +
                    end
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  private
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                  def resolve_rules(parameters)
         | 
| 29 | 
            +
                    @rule_set.rules.each do |rule|
         | 
| 30 | 
            +
                      output = rule.match(parameters)
         | 
| 31 | 
            +
                      return output if output
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
                    nil
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
            end
         | 
| @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Aws
         | 
| 4 | 
            +
              module Endpoints
         | 
| 5 | 
            +
                # Does substitutions for templated endpoint strings
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                # This class is deprecated. It is used by the Runtime endpoint
         | 
| 8 | 
            +
                # resolution approach. It has been replaced by a code generated
         | 
| 9 | 
            +
                # approach in each service gem. It can be removed in a new
         | 
| 10 | 
            +
                # major version. It has to exist because
         | 
| 11 | 
            +
                # old service gems can use a new core version.
         | 
| 12 | 
            +
                # @api private
         | 
| 13 | 
            +
                module Templater
         | 
| 14 | 
            +
                  class << self
         | 
| 15 | 
            +
                    def resolve(string, parameters, assigns)
         | 
| 16 | 
            +
                      # scans for strings in curly brackets {}
         | 
| 17 | 
            +
                      string.scan(/\{.+?\}/).each do |capture|
         | 
| 18 | 
            +
                        value = capture[1..-2] # strips curly brackets
         | 
| 19 | 
            +
                        string = string.gsub(capture, replace(value, parameters, assigns))
         | 
| 20 | 
            +
                      end
         | 
| 21 | 
            +
                      string
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    private
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    # Replaces the captured value with values from parameters or assign
         | 
| 27 | 
            +
                    def replace(capture, parameters, assigns)
         | 
| 28 | 
            +
                      # Pound sigil is used for getAttr calls
         | 
| 29 | 
            +
                      indexes = capture.split('#')
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                      # no sigil found, just do substitution
         | 
| 32 | 
            +
                      if indexes.size == 1
         | 
| 33 | 
            +
                        extract_value(capture, parameters, assigns)
         | 
| 34 | 
            +
                      # sigil was found, need to call getAttr
         | 
| 35 | 
            +
                      elsif indexes.size == 2
         | 
| 36 | 
            +
                        ref, property = indexes
         | 
| 37 | 
            +
                        param = extract_value(ref, parameters, assigns)
         | 
| 38 | 
            +
                        Matchers.attr(param, property)
         | 
| 39 | 
            +
                      else
         | 
| 40 | 
            +
                        raise "Invalid templatable value: #{capture}"
         | 
| 41 | 
            +
                      end
         | 
| 42 | 
            +
                    end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    # Checks both parameters and assigns hash for the referenced value
         | 
| 45 | 
            +
                    def extract_value(key, parameters, assigns)
         | 
| 46 | 
            +
                      if assigns.key?(key)
         | 
| 47 | 
            +
                        assigns[key]
         | 
| 48 | 
            +
                      elsif parameters.class.singleton_class::PARAM_MAP.key?(key)
         | 
| 49 | 
            +
                        member_name = parameters.class.singleton_class::PARAM_MAP[key]
         | 
| 50 | 
            +
                        parameters[member_name]
         | 
| 51 | 
            +
                      else
         | 
| 52 | 
            +
                        raise "Templatable value not found: #{key}"
         | 
| 53 | 
            +
                      end
         | 
| 54 | 
            +
                    end
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
            end
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Aws
         | 
| 4 | 
            +
              module Endpoints
         | 
| 5 | 
            +
                # This class is deprecated. It is used by the Runtime endpoint
         | 
| 6 | 
            +
                # resolution approach. It has been replaced by a code generated
         | 
| 7 | 
            +
                # approach in each service gem. It can be removed in a new
         | 
| 8 | 
            +
                # major version. It has to exist because
         | 
| 9 | 
            +
                # old service gems can use a new core version.
         | 
| 10 | 
            +
                # @api private
         | 
| 11 | 
            +
                class TreeRule
         | 
| 12 | 
            +
                  def initialize(type: 'tree', conditions:, rules:, documentation: nil)
         | 
| 13 | 
            +
                    @type = type
         | 
| 14 | 
            +
                    @conditions = Condition.from_json(conditions)
         | 
| 15 | 
            +
                    @rules = RuleSet.rules_from_json(rules)
         | 
| 16 | 
            +
                    @documentation = documentation
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  attr_reader :type
         | 
| 20 | 
            +
                  attr_reader :conditions
         | 
| 21 | 
            +
                  attr_reader :error
         | 
| 22 | 
            +
                  attr_reader :documentation
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def match(parameters, assigned = {})
         | 
| 25 | 
            +
                    assigns = assigned.dup
         | 
| 26 | 
            +
                    matched = conditions.all? do |condition|
         | 
| 27 | 
            +
                      output = condition.match?(parameters, assigns)
         | 
| 28 | 
            +
                      assigns = assigns.merge(condition.assigned) if condition.assign
         | 
| 29 | 
            +
                      output
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                    resolve_rules(parameters, assigns) if matched
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  private
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  def resolve_rules(parameters, assigns)
         | 
| 37 | 
            +
                    @rules.each do |rule|
         | 
| 38 | 
            +
                      output = rule.match(parameters, assigns)
         | 
| 39 | 
            +
                      return output if output
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                    nil
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
            end
         | 
| @@ -0,0 +1,60 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'ipaddr'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module Aws
         | 
| 6 | 
            +
              module Endpoints
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                # @api private
         | 
| 9 | 
            +
                class URL
         | 
| 10 | 
            +
                  def initialize(url)
         | 
| 11 | 
            +
                    uri = URI(url)
         | 
| 12 | 
            +
                    @scheme = uri.scheme
         | 
| 13 | 
            +
                    # only support http and https schemes
         | 
| 14 | 
            +
                    raise ArgumentError unless %w[https http].include?(@scheme)
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                    # do not support query
         | 
| 17 | 
            +
                    raise ArgumentError if uri.query
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    @authority = _authority(url, uri)
         | 
| 20 | 
            +
                    @path = uri.path
         | 
| 21 | 
            +
                    @normalized_path = uri.path + (uri.path[-1] == '/' ? '' : '/')
         | 
| 22 | 
            +
                    @is_ip = _is_ip(uri.host)
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  attr_reader :scheme
         | 
| 26 | 
            +
                  attr_reader :authority
         | 
| 27 | 
            +
                  attr_reader :path
         | 
| 28 | 
            +
                  attr_reader :normalized_path
         | 
| 29 | 
            +
                  attr_reader :is_ip
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  def as_json(_options = {})
         | 
| 32 | 
            +
                    {
         | 
| 33 | 
            +
                      'scheme' => scheme,
         | 
| 34 | 
            +
                      'authority' => authority,
         | 
| 35 | 
            +
                      'path' => path,
         | 
| 36 | 
            +
                      'normalizedPath' => normalized_path,
         | 
| 37 | 
            +
                      'isIp' => is_ip
         | 
| 38 | 
            +
                    }
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  private
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  def _authority(url, uri)
         | 
| 44 | 
            +
                    # don't include port if it's default and not parsed originally
         | 
| 45 | 
            +
                    if uri.default_port == uri.port && !url.include?(":#{uri.port}")
         | 
| 46 | 
            +
                      uri.host
         | 
| 47 | 
            +
                    else
         | 
| 48 | 
            +
                      "#{uri.host}:#{uri.port}"
         | 
| 49 | 
            +
                    end
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  def _is_ip(authority)
         | 
| 53 | 
            +
                    IPAddr.new(authority)
         | 
| 54 | 
            +
                    true
         | 
| 55 | 
            +
                  rescue IPAddr::InvalidAddressError
         | 
| 56 | 
            +
                    false
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
            end
         | 
| @@ -0,0 +1,78 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require_relative 'endpoints/rule'
         | 
| 4 | 
            +
            require_relative 'endpoints/condition'
         | 
| 5 | 
            +
            require_relative 'endpoints/endpoint_rule'
         | 
| 6 | 
            +
            require_relative 'endpoints/endpoint'
         | 
| 7 | 
            +
            require_relative 'endpoints/error_rule'
         | 
| 8 | 
            +
            require_relative 'endpoints/function'
         | 
| 9 | 
            +
            require_relative 'endpoints/matchers'
         | 
| 10 | 
            +
            require_relative 'endpoints/reference'
         | 
| 11 | 
            +
            require_relative 'endpoints/rules_provider'
         | 
| 12 | 
            +
            require_relative 'endpoints/rule_set'
         | 
| 13 | 
            +
            require_relative 'endpoints/templater'
         | 
| 14 | 
            +
            require_relative 'endpoints/tree_rule'
         | 
| 15 | 
            +
            require_relative 'endpoints/url'
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            module Aws
         | 
| 18 | 
            +
              # @api private
         | 
| 19 | 
            +
              module Endpoints
         | 
| 20 | 
            +
                class << self
         | 
| 21 | 
            +
                  def resolve_auth_scheme(context, endpoint)
         | 
| 22 | 
            +
                    if endpoint && (auth_schemes = endpoint.properties['authSchemes'])
         | 
| 23 | 
            +
                      auth_scheme = auth_schemes.find do |scheme|
         | 
| 24 | 
            +
                        Aws::Plugins::Sign::SUPPORTED_AUTH_TYPES.include?(scheme['name'])
         | 
| 25 | 
            +
                      end
         | 
| 26 | 
            +
                      raise 'No supported auth scheme for this endpoint.' unless auth_scheme
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                      merge_signing_defaults(auth_scheme, context.config)
         | 
| 29 | 
            +
                    else
         | 
| 30 | 
            +
                      default_auth_scheme(context)
         | 
| 31 | 
            +
                    end
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  private
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  def default_auth_scheme(context)
         | 
| 37 | 
            +
                    case default_api_authtype(context)
         | 
| 38 | 
            +
                    when 'v4', 'v4-unsigned-body'
         | 
| 39 | 
            +
                      auth_scheme = { 'name' => 'sigv4' }
         | 
| 40 | 
            +
                      merge_signing_defaults(auth_scheme, context.config)
         | 
| 41 | 
            +
                    when 's3', 's3v4'
         | 
| 42 | 
            +
                      auth_scheme = {
         | 
| 43 | 
            +
                        'name' => 'sigv4',
         | 
| 44 | 
            +
                        'disableDoubleEncoding' => true,
         | 
| 45 | 
            +
                        'disableNormalizePath' => true
         | 
| 46 | 
            +
                      }
         | 
| 47 | 
            +
                      merge_signing_defaults(auth_scheme, context.config)
         | 
| 48 | 
            +
                    when 'bearer'
         | 
| 49 | 
            +
                      { 'name' => 'bearer' }
         | 
| 50 | 
            +
                    when 'none', nil
         | 
| 51 | 
            +
                      { 'name' => 'none' }
         | 
| 52 | 
            +
                    end
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  def merge_signing_defaults(auth_scheme, config)
         | 
| 56 | 
            +
                    if %w[sigv4 sigv4a].include?(auth_scheme['name'])
         | 
| 57 | 
            +
                      auth_scheme['signingName'] ||= sigv4_name(config)
         | 
| 58 | 
            +
                      if auth_scheme['name'] == 'sigv4a'
         | 
| 59 | 
            +
                        auth_scheme['signingRegionSet'] ||= ['*']
         | 
| 60 | 
            +
                      else
         | 
| 61 | 
            +
                        auth_scheme['signingRegion'] ||= config.region
         | 
| 62 | 
            +
                      end
         | 
| 63 | 
            +
                    end
         | 
| 64 | 
            +
                    auth_scheme
         | 
| 65 | 
            +
                  end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                  def default_api_authtype(context)
         | 
| 68 | 
            +
                    context.config.api.operation(context.operation_name)['authtype'] ||
         | 
| 69 | 
            +
                      context.config.api.metadata['signatureVersion']
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  def sigv4_name(config)
         | 
| 73 | 
            +
                    config.api.metadata['signingName'] ||
         | 
| 74 | 
            +
                      config.api.metadata['endpointPrefix']
         | 
| 75 | 
            +
                  end
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
              end
         | 
| 78 | 
            +
            end
         | 
    
        data/lib/aws-sdk-core/errors.rb
    CHANGED
    
    | @@ -30,7 +30,7 @@ module Aws | |
| 30 30 | 
             
                  attr_reader :context
         | 
| 31 31 |  | 
| 32 32 | 
             
                  # @return [Aws::Structure]
         | 
| 33 | 
            -
                   | 
| 33 | 
            +
                  attr_accessor :data
         | 
| 34 34 |  | 
| 35 35 | 
             
                  class << self
         | 
| 36 36 |  | 
| @@ -210,6 +210,19 @@ module Aws | |
| 210 210 | 
             
                # Raised when SSO Credentials are invalid
         | 
| 211 211 | 
             
                class InvalidSSOCredentials < RuntimeError; end
         | 
| 212 212 |  | 
| 213 | 
            +
                # Raised when SSO Token is invalid
         | 
| 214 | 
            +
                class InvalidSSOToken < RuntimeError; end
         | 
| 215 | 
            +
             | 
| 216 | 
            +
                # Raised when a client is unable to sign a request because
         | 
| 217 | 
            +
                # the bearer token is not configured or available
         | 
| 218 | 
            +
                class MissingBearerTokenError < RuntimeError
         | 
| 219 | 
            +
                  def initialize(*args)
         | 
| 220 | 
            +
                    msg = 'unable to sign request without token set'
         | 
| 221 | 
            +
                    super(msg)
         | 
| 222 | 
            +
                  end
         | 
| 223 | 
            +
                end
         | 
| 224 | 
            +
             | 
| 225 | 
            +
             | 
| 213 226 | 
             
                # Raised when there is a circular reference in chained
         | 
| 214 227 | 
             
                # source_profiles
         | 
| 215 228 | 
             
                class SourceProfileCircularReferenceError < RuntimeError; end
         | 
| @@ -8,6 +8,8 @@ module Aws | |
| 8 8 | 
             
                  def ini_parse(raw)
         | 
| 9 9 | 
             
                    current_profile = nil
         | 
| 10 10 | 
             
                    current_prefix = nil
         | 
| 11 | 
            +
                    item = nil
         | 
| 12 | 
            +
                    previous_item = nil
         | 
| 11 13 | 
             
                    raw.lines.inject({}) do |acc, line|
         | 
| 12 14 | 
             
                      line = line.split(/^|\s;/).first # remove comments
         | 
| 13 15 | 
             
                      profile = line.match(/^\[([^\[\]]+)\]\s*(#.+)?$/) unless line.nil?
         | 
| @@ -17,11 +19,16 @@ module Aws | |
| 17 19 | 
             
                        current_profile = named_profile[1] if named_profile
         | 
| 18 20 | 
             
                      elsif current_profile
         | 
| 19 21 | 
             
                        unless line.nil?
         | 
| 22 | 
            +
                          previous_item = item
         | 
| 20 23 | 
             
                          item = line.match(/^(.+?)\s*=\s*(.+?)\s*$/)
         | 
| 21 24 | 
             
                          prefix = line.match(/^(.+?)\s*=\s*$/)
         | 
| 22 25 | 
             
                        end
         | 
| 23 26 | 
             
                        if item && item[1].match(/^\s+/)
         | 
| 24 27 | 
             
                          # Need to add lines to a nested configuration.
         | 
| 28 | 
            +
                          if current_prefix.nil? && previous_item[2].strip.empty?
         | 
| 29 | 
            +
                            current_prefix = previous_item[1]
         | 
| 30 | 
            +
                            acc[current_profile][current_prefix] = {}
         | 
| 31 | 
            +
                          end
         | 
| 25 32 | 
             
                          inner_item = line.match(/^\s*(.+?)\s*=\s*(.+?)\s*$/)
         | 
| 26 33 | 
             
                          acc[current_profile] ||= {}
         | 
| 27 34 | 
             
                          acc[current_profile][current_prefix] ||= {}
         | 
| @@ -53,6 +53,8 @@ module Aws | |
| 53 53 | 
             
                # @option options [String] :endpoint_mode ('IPv4') The endpoint mode for
         | 
| 54 54 | 
             
                #   the instance metadata service. This is either 'IPv4' ('169.254.169.254')
         | 
| 55 55 | 
             
                #   or 'IPv6' ('[fd00:ec2::254]').
         | 
| 56 | 
            +
                # @option options [Boolean] :disable_imds_v1 (false) Disable the use of the
         | 
| 57 | 
            +
                #  legacy EC2 Metadata Service v1.
         | 
| 56 58 | 
             
                # @option options [String] :ip_address ('169.254.169.254') Deprecated. Use
         | 
| 57 59 | 
             
                #   :endpoint instead. The IP address for the endpoint.
         | 
| 58 60 | 
             
                # @option options [Integer] :port (80)
         | 
| @@ -77,6 +79,9 @@ module Aws | |
| 77 79 | 
             
                  endpoint_mode = resolve_endpoint_mode(options)
         | 
| 78 80 | 
             
                  @endpoint = resolve_endpoint(options, endpoint_mode)
         | 
| 79 81 | 
             
                  @port = options[:port] || 80
         | 
| 82 | 
            +
                  @disable_imds_v1 = resolve_disable_v1(options)
         | 
| 83 | 
            +
                  # Flag for if v2 flow fails, skip future attempts
         | 
| 84 | 
            +
                  @imds_v1_fallback = false
         | 
| 80 85 | 
             
                  @http_open_timeout = options[:http_open_timeout] || 1
         | 
| 81 86 | 
             
                  @http_read_timeout = options[:http_read_timeout] || 1
         | 
| 82 87 | 
             
                  @http_debug_output = options[:http_debug_output]
         | 
| @@ -123,6 +128,16 @@ module Aws | |
| 123 128 | 
             
                  end
         | 
| 124 129 | 
             
                end
         | 
| 125 130 |  | 
| 131 | 
            +
                def resolve_disable_v1(options)
         | 
| 132 | 
            +
                  value = options[:disable_imds_v1]
         | 
| 133 | 
            +
                  value ||= ENV['AWS_EC2_METADATA_V1_DISABLED']
         | 
| 134 | 
            +
                  value ||= Aws.shared_config.ec2_metadata_v1_disabled(
         | 
| 135 | 
            +
                    profile: options[:profile]
         | 
| 136 | 
            +
                  )
         | 
| 137 | 
            +
                  value = value.to_s.downcase if value
         | 
| 138 | 
            +
                  Aws::Util.str_2_bool(value) || false
         | 
| 139 | 
            +
                end
         | 
| 140 | 
            +
             | 
| 126 141 | 
             
                def backoff(backoff)
         | 
| 127 142 | 
             
                  case backoff
         | 
| 128 143 | 
             
                  when Proc then backoff
         | 
| @@ -141,7 +156,7 @@ module Aws | |
| 141 156 | 
             
                  # service is responding but is returning invalid JSON documents
         | 
| 142 157 | 
             
                  # in response to the GET profile credentials call.
         | 
| 143 158 | 
             
                  begin
         | 
| 144 | 
            -
                    retry_errors([Aws::Json::ParseError | 
| 159 | 
            +
                    retry_errors([Aws::Json::ParseError], max_retries: 3) do
         | 
| 145 160 | 
             
                      c = Aws::Json.load(get_credentials.to_s)
         | 
| 146 161 | 
             
                      if empty_credentials?(@credentials)
         | 
| 147 162 | 
             
                        @credentials = Credentials.new(
         | 
| @@ -173,7 +188,6 @@ module Aws | |
| 173 188 | 
             
                          end
         | 
| 174 189 | 
             
                        end
         | 
| 175 190 | 
             
                      end
         | 
| 176 | 
            -
             | 
| 177 191 | 
             
                    end
         | 
| 178 192 | 
             
                  rescue Aws::Json::ParseError
         | 
| 179 193 | 
             
                    raise Aws::Errors::MetadataParserError
         | 
| @@ -191,34 +205,14 @@ module Aws | |
| 191 205 | 
             
                        open_connection do |conn|
         | 
| 192 206 | 
             
                          # attempt to fetch token to start secure flow first
         | 
| 193 207 | 
             
                          # and rescue to failover
         | 
| 194 | 
            -
                           | 
| 195 | 
            -
                            retry_errors(NETWORK_ERRORS, max_retries: @retries) do
         | 
| 196 | 
            -
                              unless token_set?
         | 
| 197 | 
            -
                                created_time = Time.now
         | 
| 198 | 
            -
                                token_value, ttl = http_put(
         | 
| 199 | 
            -
                                  conn, METADATA_TOKEN_PATH, @token_ttl
         | 
| 200 | 
            -
                                )
         | 
| 201 | 
            -
                                @token = Token.new(token_value, ttl, created_time) if token_value && ttl
         | 
| 202 | 
            -
                              end
         | 
| 203 | 
            -
                            end
         | 
| 204 | 
            -
                          rescue *NETWORK_ERRORS
         | 
| 205 | 
            -
                            # token attempt failed, reset token
         | 
| 206 | 
            -
                            # fallback to non-token mode
         | 
| 207 | 
            -
                            @token = nil
         | 
| 208 | 
            -
                          end
         | 
| 209 | 
            -
             | 
| 208 | 
            +
                          fetch_token(conn) unless @imds_v1_fallback
         | 
| 210 209 | 
             
                          token = @token.value if token_set?
         | 
| 211 210 |  | 
| 212 | 
            -
                           | 
| 213 | 
            -
             | 
| 214 | 
            -
             | 
| 215 | 
            -
             | 
| 216 | 
            -
                           | 
| 217 | 
            -
                            # Token has expired, reset it
         | 
| 218 | 
            -
                            # The next retry should fetch it
         | 
| 219 | 
            -
                            @token = nil
         | 
| 220 | 
            -
                            raise Non200Response
         | 
| 221 | 
            -
                          end
         | 
| 211 | 
            +
                          # disable insecure flow if we couldn't get token
         | 
| 212 | 
            +
                          # and imds v1 is disabled
         | 
| 213 | 
            +
                          raise TokenRetrivalError if token.nil? && @disable_imds_v1
         | 
| 214 | 
            +
             | 
| 215 | 
            +
                          _get_credentials(conn, token)
         | 
| 222 216 | 
             
                        end
         | 
| 223 217 | 
             
                      end
         | 
| 224 218 | 
             
                    rescue
         | 
| @@ -227,6 +221,36 @@ module Aws | |
| 227 221 | 
             
                  end
         | 
| 228 222 | 
             
                end
         | 
| 229 223 |  | 
| 224 | 
            +
                def fetch_token(conn)
         | 
| 225 | 
            +
                  retry_errors(NETWORK_ERRORS, max_retries: @retries) do
         | 
| 226 | 
            +
                    unless token_set?
         | 
| 227 | 
            +
                      created_time = Time.now
         | 
| 228 | 
            +
                      token_value, ttl = http_put(
         | 
| 229 | 
            +
                        conn, METADATA_TOKEN_PATH, @token_ttl
         | 
| 230 | 
            +
                      )
         | 
| 231 | 
            +
                      @token = Token.new(token_value, ttl, created_time) if token_value && ttl
         | 
| 232 | 
            +
                    end
         | 
| 233 | 
            +
                  end
         | 
| 234 | 
            +
                rescue *NETWORK_ERRORS
         | 
| 235 | 
            +
                  # token attempt failed, reset token
         | 
| 236 | 
            +
                  # fallback to non-token mode
         | 
| 237 | 
            +
                  @token = nil
         | 
| 238 | 
            +
                  @imds_v1_fallback = true
         | 
| 239 | 
            +
                end
         | 
| 240 | 
            +
             | 
| 241 | 
            +
                # token is optional - if nil, uses v1 (insecure) flow
         | 
| 242 | 
            +
                def _get_credentials(conn, token)
         | 
| 243 | 
            +
                  metadata = http_get(conn, METADATA_PATH_BASE, token)
         | 
| 244 | 
            +
                  profile_name = metadata.lines.first.strip
         | 
| 245 | 
            +
                  http_get(conn, METADATA_PATH_BASE + profile_name, token)
         | 
| 246 | 
            +
                rescue TokenExpiredError
         | 
| 247 | 
            +
                  # Token has expired, reset it
         | 
| 248 | 
            +
                  # The next retry should fetch it
         | 
| 249 | 
            +
                  @token = nil
         | 
| 250 | 
            +
                  @imds_v1_fallback = false
         | 
| 251 | 
            +
                  raise Non200Response
         | 
| 252 | 
            +
                end
         | 
| 253 | 
            +
             | 
| 230 254 | 
             
                def token_set?
         | 
| 231 255 | 
             
                  @token && !@token.expired?
         | 
| 232 256 | 
             
                end
         | 
| @@ -276,8 +300,6 @@ module Aws | |
| 276 300 | 
             
                    ]
         | 
| 277 301 | 
             
                  when 400
         | 
| 278 302 | 
             
                    raise TokenRetrivalError
         | 
| 279 | 
            -
                  when 401
         | 
| 280 | 
            -
                    raise TokenExpiredError
         | 
| 281 303 | 
             
                  else
         | 
| 282 304 | 
             
                    raise Non200Response
         | 
| 283 305 | 
             
                  end
         | 
| @@ -26,7 +26,13 @@ module Aws | |
| 26 26 | 
             
                  end
         | 
| 27 27 |  | 
| 28 28 | 
             
                  def error_code(json, context)
         | 
| 29 | 
            -
                    code = | 
| 29 | 
            +
                    code =
         | 
| 30 | 
            +
                      if aws_query_error?(context)
         | 
| 31 | 
            +
                        error = context.http_response.headers['x-amzn-query-error'].split(';')[0]
         | 
| 32 | 
            +
                        remove_prefix(error, context)
         | 
| 33 | 
            +
                      else
         | 
| 34 | 
            +
                        json['__type']
         | 
| 35 | 
            +
                      end
         | 
| 30 36 | 
             
                    code ||= json['code']
         | 
| 31 37 | 
             
                    code ||= context.http_response.headers['x-amzn-errortype']
         | 
| 32 38 | 
             
                    if code
         | 
| @@ -36,6 +42,19 @@ module Aws | |
| 36 42 | 
             
                    end
         | 
| 37 43 | 
             
                  end
         | 
| 38 44 |  | 
| 45 | 
            +
                  def aws_query_error?(context)
         | 
| 46 | 
            +
                    context.config.api.metadata['awsQueryCompatible'] &&
         | 
| 47 | 
            +
                      context.http_response.headers['x-amzn-query-error']
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  def remove_prefix(error_code, context)
         | 
| 51 | 
            +
                    if prefix = context.config.api.metadata['errorPrefix']
         | 
| 52 | 
            +
                      error_code.sub(/^#{prefix}/, '')
         | 
| 53 | 
            +
                    else
         | 
| 54 | 
            +
                      error_code
         | 
| 55 | 
            +
                    end
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
             | 
| 39 58 | 
             
                  def error_message(code, json)
         | 
| 40 59 | 
             
                    if code == 'RequestEntityTooLarge'
         | 
| 41 60 | 
             
                      'Request body must be less than 1 MB'
         | 
| @@ -59,7 +59,10 @@ module Aws | |
| 59 59 | 
             
                        end
         | 
| 60 60 | 
             
                        resp_struct
         | 
| 61 61 | 
             
                      else
         | 
| 62 | 
            -
                        Parser.new( | 
| 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
         |