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 }