| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 |
- // Code generated by smithy-go-codegen DO NOT EDIT.
- package s3
- import (
- "context"
- "fmt"
- awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
- smithy "github.com/aws/smithy-go"
- smithyauth "github.com/aws/smithy-go/auth"
- "github.com/aws/smithy-go/metrics"
- "github.com/aws/smithy-go/middleware"
- "github.com/aws/smithy-go/tracing"
- smithyhttp "github.com/aws/smithy-go/transport/http"
- "slices"
- "strings"
- )
- func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) {
- params.Region = options.Region
- }
- func bindAuthEndpointParams(ctx context.Context, params *AuthResolverParameters, input interface{}, options Options) {
- params.endpointParams = bindEndpointParams(ctx, input, options)
- }
- type setLegacyContextSigningOptionsMiddleware struct {
- }
- func (*setLegacyContextSigningOptionsMiddleware) ID() string {
- return "setLegacyContextSigningOptions"
- }
- func (m *setLegacyContextSigningOptionsMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
- out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
- ) {
- rscheme := getResolvedAuthScheme(ctx)
- schemeID := rscheme.Scheme.SchemeID()
- if sn := awsmiddleware.GetSigningName(ctx); sn != "" {
- if schemeID == "aws.auth#sigv4" {
- smithyhttp.SetSigV4SigningName(&rscheme.SignerProperties, sn)
- } else if schemeID == "aws.auth#sigv4a" {
- smithyhttp.SetSigV4ASigningName(&rscheme.SignerProperties, sn)
- }
- }
- if sr := awsmiddleware.GetSigningRegion(ctx); sr != "" {
- if schemeID == "aws.auth#sigv4" {
- smithyhttp.SetSigV4SigningRegion(&rscheme.SignerProperties, sr)
- } else if schemeID == "aws.auth#sigv4a" {
- smithyhttp.SetSigV4ASigningRegions(&rscheme.SignerProperties, []string{sr})
- }
- }
- return next.HandleFinalize(ctx, in)
- }
- func addSetLegacyContextSigningOptionsMiddleware(stack *middleware.Stack) error {
- return stack.Finalize.Insert(&setLegacyContextSigningOptionsMiddleware{}, "Signing", middleware.Before)
- }
- type withAnonymous struct {
- resolver AuthSchemeResolver
- }
- var _ AuthSchemeResolver = (*withAnonymous)(nil)
- func (v *withAnonymous) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) {
- opts, err := v.resolver.ResolveAuthSchemes(ctx, params)
- if err != nil {
- return nil, err
- }
- opts = append(opts, &smithyauth.Option{
- SchemeID: smithyauth.SchemeIDAnonymous,
- })
- return opts, nil
- }
- func wrapWithAnonymousAuth(options *Options) {
- if _, ok := options.AuthSchemeResolver.(*defaultAuthSchemeResolver); !ok {
- return
- }
- options.AuthSchemeResolver = &withAnonymous{
- resolver: options.AuthSchemeResolver,
- }
- }
- // AuthResolverParameters contains the set of inputs necessary for auth scheme
- // resolution.
- type AuthResolverParameters struct {
- // The name of the operation being invoked.
- Operation string
- // The endpoint resolver parameters for this operation. This service's default
- // resolver delegates to endpoint rules.
- endpointParams *EndpointParameters
- // The region in which the operation is being invoked.
- Region string
- }
- func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) *AuthResolverParameters {
- params := &AuthResolverParameters{
- Operation: operation,
- }
- bindAuthEndpointParams(ctx, params, input, options)
- bindAuthParamsRegion(ctx, params, input, options)
- return params
- }
- // AuthSchemeResolver returns a set of possible authentication options for an
- // operation.
- type AuthSchemeResolver interface {
- ResolveAuthSchemes(context.Context, *AuthResolverParameters) ([]*smithyauth.Option, error)
- }
- type defaultAuthSchemeResolver struct{}
- var _ AuthSchemeResolver = (*defaultAuthSchemeResolver)(nil)
- func (*defaultAuthSchemeResolver) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) {
- if overrides, ok := operationAuthOptions[params.Operation]; ok {
- return overrides(params), nil
- }
- return serviceAuthOptions(params), nil
- }
- var operationAuthOptions = map[string]func(*AuthResolverParameters) []*smithyauth.Option{
- "WriteGetObjectResponse": func(params *AuthResolverParameters) []*smithyauth.Option {
- return []*smithyauth.Option{
- {
- SchemeID: smithyauth.SchemeIDSigV4,
- SignerProperties: func() smithy.Properties {
- var props smithy.Properties
- smithyhttp.SetSigV4SigningName(&props, "s3")
- smithyhttp.SetSigV4SigningRegion(&props, params.Region)
- smithyhttp.SetIsUnsignedPayload(&props, true)
- return props
- }(),
- },
- }
- },
- }
- func serviceAuthOptions(params *AuthResolverParameters) []*smithyauth.Option {
- return []*smithyauth.Option{
- {
- SchemeID: smithyauth.SchemeIDSigV4,
- SignerProperties: func() smithy.Properties {
- var props smithy.Properties
- smithyhttp.SetSigV4SigningName(&props, "s3")
- smithyhttp.SetSigV4SigningRegion(&props, params.Region)
- return props
- }(),
- },
- {
- SchemeID: smithyauth.SchemeIDSigV4A,
- SignerProperties: func() smithy.Properties {
- var props smithy.Properties
- smithyhttp.SetSigV4ASigningName(&props, "s3")
- smithyhttp.SetSigV4ASigningRegions(&props, []string{params.Region})
- return props
- }(),
- },
- }
- }
- type resolveAuthSchemeMiddleware struct {
- operation string
- options Options
- }
- func (*resolveAuthSchemeMiddleware) ID() string {
- return "ResolveAuthScheme"
- }
- func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
- out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
- ) {
- _, span := tracing.StartSpan(ctx, "ResolveAuthScheme")
- defer span.End()
- params := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options)
- options, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params)
- if err != nil {
- return out, metadata, fmt.Errorf("resolve auth scheme: %w", err)
- }
- scheme, ok := m.selectScheme(options)
- if !ok {
- return out, metadata, fmt.Errorf("could not select an auth scheme")
- }
- ctx = setResolvedAuthScheme(ctx, scheme)
- span.SetProperty("auth.scheme_id", scheme.Scheme.SchemeID())
- span.End()
- return next.HandleFinalize(ctx, in)
- }
- func (m *resolveAuthSchemeMiddleware) selectScheme(options []*smithyauth.Option) (*resolvedAuthScheme, bool) {
- sorted := sortAuthOptions(options, m.options.AuthSchemePreference)
- for _, option := range sorted {
- if option.SchemeID == smithyauth.SchemeIDAnonymous {
- return newResolvedAuthScheme(smithyhttp.NewAnonymousScheme(), option), true
- }
- for _, scheme := range m.options.AuthSchemes {
- if scheme.SchemeID() != option.SchemeID {
- continue
- }
- if scheme.IdentityResolver(m.options) != nil {
- return newResolvedAuthScheme(scheme, option), true
- }
- }
- }
- return nil, false
- }
- func sortAuthOptions(options []*smithyauth.Option, preferred []string) []*smithyauth.Option {
- byPriority := make([]*smithyauth.Option, 0, len(options))
- for _, prefName := range preferred {
- for _, option := range options {
- optName := option.SchemeID
- if parts := strings.Split(option.SchemeID, "#"); len(parts) == 2 {
- optName = parts[1]
- }
- if prefName == optName {
- byPriority = append(byPriority, option)
- }
- }
- }
- for _, option := range options {
- if !slices.ContainsFunc(byPriority, func(o *smithyauth.Option) bool {
- return o.SchemeID == option.SchemeID
- }) {
- byPriority = append(byPriority, option)
- }
- }
- return byPriority
- }
- type resolvedAuthSchemeKey struct{}
- type resolvedAuthScheme struct {
- Scheme smithyhttp.AuthScheme
- IdentityProperties smithy.Properties
- SignerProperties smithy.Properties
- }
- func newResolvedAuthScheme(scheme smithyhttp.AuthScheme, option *smithyauth.Option) *resolvedAuthScheme {
- return &resolvedAuthScheme{
- Scheme: scheme,
- IdentityProperties: option.IdentityProperties,
- SignerProperties: option.SignerProperties,
- }
- }
- func setResolvedAuthScheme(ctx context.Context, scheme *resolvedAuthScheme) context.Context {
- return middleware.WithStackValue(ctx, resolvedAuthSchemeKey{}, scheme)
- }
- func getResolvedAuthScheme(ctx context.Context) *resolvedAuthScheme {
- v, _ := middleware.GetStackValue(ctx, resolvedAuthSchemeKey{}).(*resolvedAuthScheme)
- return v
- }
- type getIdentityMiddleware struct {
- options Options
- }
- func (*getIdentityMiddleware) ID() string {
- return "GetIdentity"
- }
- func (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
- out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
- ) {
- innerCtx, span := tracing.StartSpan(ctx, "GetIdentity")
- defer span.End()
- rscheme := getResolvedAuthScheme(innerCtx)
- if rscheme == nil {
- return out, metadata, fmt.Errorf("no resolved auth scheme")
- }
- resolver := rscheme.Scheme.IdentityResolver(m.options)
- if resolver == nil {
- return out, metadata, fmt.Errorf("no identity resolver")
- }
- identity, err := timeOperationMetric(ctx, "client.call.resolve_identity_duration",
- func() (smithyauth.Identity, error) {
- return resolver.GetIdentity(innerCtx, rscheme.IdentityProperties)
- },
- func(o *metrics.RecordMetricOptions) {
- o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID())
- })
- if err != nil {
- return out, metadata, fmt.Errorf("get identity: %w", err)
- }
- ctx = setIdentity(ctx, identity)
- span.End()
- return next.HandleFinalize(ctx, in)
- }
- type identityKey struct{}
- func setIdentity(ctx context.Context, identity smithyauth.Identity) context.Context {
- return middleware.WithStackValue(ctx, identityKey{}, identity)
- }
- func getIdentity(ctx context.Context) smithyauth.Identity {
- v, _ := middleware.GetStackValue(ctx, identityKey{}).(smithyauth.Identity)
- return v
- }
- type signRequestMiddleware struct {
- options Options
- }
- func (*signRequestMiddleware) ID() string {
- return "Signing"
- }
- func (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
- out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
- ) {
- _, span := tracing.StartSpan(ctx, "SignRequest")
- defer span.End()
- req, ok := in.Request.(*smithyhttp.Request)
- if !ok {
- return out, metadata, fmt.Errorf("unexpected transport type %T", in.Request)
- }
- rscheme := getResolvedAuthScheme(ctx)
- if rscheme == nil {
- return out, metadata, fmt.Errorf("no resolved auth scheme")
- }
- identity := getIdentity(ctx)
- if identity == nil {
- return out, metadata, fmt.Errorf("no identity")
- }
- signer := rscheme.Scheme.Signer()
- if signer == nil {
- return out, metadata, fmt.Errorf("no signer")
- }
- _, err = timeOperationMetric(ctx, "client.call.signing_duration", func() (any, error) {
- return nil, signer.SignRequest(ctx, req, identity, rscheme.SignerProperties)
- }, func(o *metrics.RecordMetricOptions) {
- o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID())
- })
- if err != nil {
- return out, metadata, fmt.Errorf("sign request: %w", err)
- }
- span.End()
- return next.HandleFinalize(ctx, in)
- }
|