src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

smithy.go (2564B)


      1 package v4a
      2 
      3 import (
      4 	"context"
      5 	"fmt"
      6 	"time"
      7 
      8 	internalcontext "github.com/aws/aws-sdk-go-v2/internal/context"
      9 
     10 	v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
     11 	"github.com/aws/aws-sdk-go-v2/internal/sdk"
     12 	"github.com/aws/smithy-go"
     13 	"github.com/aws/smithy-go/auth"
     14 	"github.com/aws/smithy-go/logging"
     15 	smithyhttp "github.com/aws/smithy-go/transport/http"
     16 )
     17 
     18 // CredentialsAdapter adapts v4a.Credentials to smithy auth.Identity.
     19 type CredentialsAdapter struct {
     20 	Credentials Credentials
     21 }
     22 
     23 var _ auth.Identity = (*CredentialsAdapter)(nil)
     24 
     25 // Expiration returns the time of expiration for the credentials.
     26 func (v *CredentialsAdapter) Expiration() time.Time {
     27 	return v.Credentials.Expires
     28 }
     29 
     30 // CredentialsProviderAdapter adapts v4a.CredentialsProvider to
     31 // auth.IdentityResolver.
     32 type CredentialsProviderAdapter struct {
     33 	Provider CredentialsProvider
     34 }
     35 
     36 var _ (auth.IdentityResolver) = (*CredentialsProviderAdapter)(nil)
     37 
     38 // GetIdentity retrieves v4a credentials using the underlying provider.
     39 func (v *CredentialsProviderAdapter) GetIdentity(ctx context.Context, _ smithy.Properties) (
     40 	auth.Identity, error,
     41 ) {
     42 	creds, err := v.Provider.RetrievePrivateKey(ctx)
     43 	if err != nil {
     44 		return nil, fmt.Errorf("get credentials: %w", err)
     45 	}
     46 
     47 	return &CredentialsAdapter{Credentials: creds}, nil
     48 }
     49 
     50 // SignerAdapter adapts v4a.HTTPSigner to smithy http.Signer.
     51 type SignerAdapter struct {
     52 	Signer     HTTPSigner
     53 	Logger     logging.Logger
     54 	LogSigning bool
     55 }
     56 
     57 var _ (smithyhttp.Signer) = (*SignerAdapter)(nil)
     58 
     59 // SignRequest signs the request with the provided identity.
     60 func (v *SignerAdapter) SignRequest(ctx context.Context, r *smithyhttp.Request, identity auth.Identity, props smithy.Properties) error {
     61 	ca, ok := identity.(*CredentialsAdapter)
     62 	if !ok {
     63 		return fmt.Errorf("unexpected identity type: %T", identity)
     64 	}
     65 
     66 	name, ok := smithyhttp.GetSigV4ASigningName(&props)
     67 	if !ok {
     68 		return fmt.Errorf("sigv4a signing name is required")
     69 	}
     70 
     71 	regions, ok := smithyhttp.GetSigV4ASigningRegions(&props)
     72 	if !ok {
     73 		return fmt.Errorf("sigv4a signing region is required")
     74 	}
     75 
     76 	hash := v4.GetPayloadHash(ctx)
     77 	signingTime := sdk.NowTime()
     78 	if skew := internalcontext.GetAttemptSkewContext(ctx); skew != 0 {
     79 		signingTime.Add(skew)
     80 	}
     81 	err := v.Signer.SignHTTP(ctx, ca.Credentials, r.Request, hash, name, regions, signingTime, func(o *SignerOptions) {
     82 		o.DisableURIPathEscaping, _ = smithyhttp.GetDisableDoubleEncoding(&props)
     83 
     84 		o.Logger = v.Logger
     85 		o.LogSigning = v.LogSigning
     86 	})
     87 	if err != nil {
     88 		return fmt.Errorf("sign http: %w", err)
     89 	}
     90 
     91 	return nil
     92 }