auth.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. // Code generated by smithy-go-codegen DO NOT EDIT.
  2. package organizations
  3. import (
  4. "context"
  5. "fmt"
  6. awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
  7. smithy "github.com/aws/smithy-go"
  8. smithyauth "github.com/aws/smithy-go/auth"
  9. "github.com/aws/smithy-go/metrics"
  10. "github.com/aws/smithy-go/middleware"
  11. "github.com/aws/smithy-go/tracing"
  12. smithyhttp "github.com/aws/smithy-go/transport/http"
  13. "slices"
  14. "strings"
  15. )
  16. func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) error {
  17. params.Region = options.Region
  18. return nil
  19. }
  20. type setLegacyContextSigningOptionsMiddleware struct {
  21. }
  22. func (*setLegacyContextSigningOptionsMiddleware) ID() string {
  23. return "setLegacyContextSigningOptions"
  24. }
  25. func (m *setLegacyContextSigningOptionsMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
  26. out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
  27. ) {
  28. rscheme := getResolvedAuthScheme(ctx)
  29. schemeID := rscheme.Scheme.SchemeID()
  30. if sn := awsmiddleware.GetSigningName(ctx); sn != "" {
  31. if schemeID == "aws.auth#sigv4" {
  32. smithyhttp.SetSigV4SigningName(&rscheme.SignerProperties, sn)
  33. } else if schemeID == "aws.auth#sigv4a" {
  34. smithyhttp.SetSigV4ASigningName(&rscheme.SignerProperties, sn)
  35. }
  36. }
  37. if sr := awsmiddleware.GetSigningRegion(ctx); sr != "" {
  38. if schemeID == "aws.auth#sigv4" {
  39. smithyhttp.SetSigV4SigningRegion(&rscheme.SignerProperties, sr)
  40. } else if schemeID == "aws.auth#sigv4a" {
  41. smithyhttp.SetSigV4ASigningRegions(&rscheme.SignerProperties, []string{sr})
  42. }
  43. }
  44. return next.HandleFinalize(ctx, in)
  45. }
  46. func addSetLegacyContextSigningOptionsMiddleware(stack *middleware.Stack) error {
  47. return stack.Finalize.Insert(&setLegacyContextSigningOptionsMiddleware{}, "Signing", middleware.Before)
  48. }
  49. type withAnonymous struct {
  50. resolver AuthSchemeResolver
  51. }
  52. var _ AuthSchemeResolver = (*withAnonymous)(nil)
  53. func (v *withAnonymous) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) {
  54. opts, err := v.resolver.ResolveAuthSchemes(ctx, params)
  55. if err != nil {
  56. return nil, err
  57. }
  58. opts = append(opts, &smithyauth.Option{
  59. SchemeID: smithyauth.SchemeIDAnonymous,
  60. })
  61. return opts, nil
  62. }
  63. func wrapWithAnonymousAuth(options *Options) {
  64. if _, ok := options.AuthSchemeResolver.(*defaultAuthSchemeResolver); !ok {
  65. return
  66. }
  67. options.AuthSchemeResolver = &withAnonymous{
  68. resolver: options.AuthSchemeResolver,
  69. }
  70. }
  71. // AuthResolverParameters contains the set of inputs necessary for auth scheme
  72. // resolution.
  73. type AuthResolverParameters struct {
  74. // The name of the operation being invoked.
  75. Operation string
  76. // The region in which the operation is being invoked.
  77. Region string
  78. }
  79. func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) (*AuthResolverParameters, error) {
  80. params := &AuthResolverParameters{
  81. Operation: operation,
  82. }
  83. if err := bindAuthParamsRegion(ctx, params, input, options); err != nil {
  84. return nil, err
  85. }
  86. return params, nil
  87. }
  88. // AuthSchemeResolver returns a set of possible authentication options for an
  89. // operation.
  90. type AuthSchemeResolver interface {
  91. ResolveAuthSchemes(context.Context, *AuthResolverParameters) ([]*smithyauth.Option, error)
  92. }
  93. type defaultAuthSchemeResolver struct{}
  94. var _ AuthSchemeResolver = (*defaultAuthSchemeResolver)(nil)
  95. func (*defaultAuthSchemeResolver) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) {
  96. if overrides, ok := operationAuthOptions[params.Operation]; ok {
  97. return overrides(params), nil
  98. }
  99. return serviceAuthOptions(params), nil
  100. }
  101. var operationAuthOptions = map[string]func(*AuthResolverParameters) []*smithyauth.Option{}
  102. func serviceAuthOptions(params *AuthResolverParameters) []*smithyauth.Option {
  103. return []*smithyauth.Option{
  104. {
  105. SchemeID: smithyauth.SchemeIDSigV4,
  106. SignerProperties: func() smithy.Properties {
  107. var props smithy.Properties
  108. smithyhttp.SetSigV4SigningName(&props, "organizations")
  109. smithyhttp.SetSigV4SigningRegion(&props, params.Region)
  110. return props
  111. }(),
  112. },
  113. }
  114. }
  115. type resolveAuthSchemeMiddleware struct {
  116. operation string
  117. options Options
  118. }
  119. func (*resolveAuthSchemeMiddleware) ID() string {
  120. return "ResolveAuthScheme"
  121. }
  122. func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
  123. out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
  124. ) {
  125. _, span := tracing.StartSpan(ctx, "ResolveAuthScheme")
  126. defer span.End()
  127. params, err := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options)
  128. if err != nil {
  129. return out, metadata, fmt.Errorf("bind auth scheme params: %w", err)
  130. }
  131. options, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params)
  132. if err != nil {
  133. return out, metadata, fmt.Errorf("resolve auth scheme: %w", err)
  134. }
  135. scheme, ok := m.selectScheme(options)
  136. if !ok {
  137. return out, metadata, fmt.Errorf("could not select an auth scheme")
  138. }
  139. ctx = setResolvedAuthScheme(ctx, scheme)
  140. span.SetProperty("auth.scheme_id", scheme.Scheme.SchemeID())
  141. span.End()
  142. return next.HandleFinalize(ctx, in)
  143. }
  144. func (m *resolveAuthSchemeMiddleware) selectScheme(options []*smithyauth.Option) (*resolvedAuthScheme, bool) {
  145. sorted := sortAuthOptions(options, m.options.AuthSchemePreference)
  146. for _, option := range sorted {
  147. if option.SchemeID == smithyauth.SchemeIDAnonymous {
  148. return newResolvedAuthScheme(smithyhttp.NewAnonymousScheme(), option), true
  149. }
  150. for _, scheme := range m.options.AuthSchemes {
  151. if scheme.SchemeID() != option.SchemeID {
  152. continue
  153. }
  154. if scheme.IdentityResolver(m.options) != nil {
  155. return newResolvedAuthScheme(scheme, option), true
  156. }
  157. }
  158. }
  159. return nil, false
  160. }
  161. func sortAuthOptions(options []*smithyauth.Option, preferred []string) []*smithyauth.Option {
  162. byPriority := make([]*smithyauth.Option, 0, len(options))
  163. for _, prefName := range preferred {
  164. for _, option := range options {
  165. optName := option.SchemeID
  166. if parts := strings.Split(option.SchemeID, "#"); len(parts) == 2 {
  167. optName = parts[1]
  168. }
  169. if prefName == optName {
  170. byPriority = append(byPriority, option)
  171. }
  172. }
  173. }
  174. for _, option := range options {
  175. if !slices.ContainsFunc(byPriority, func(o *smithyauth.Option) bool {
  176. return o.SchemeID == option.SchemeID
  177. }) {
  178. byPriority = append(byPriority, option)
  179. }
  180. }
  181. return byPriority
  182. }
  183. type resolvedAuthSchemeKey struct{}
  184. type resolvedAuthScheme struct {
  185. Scheme smithyhttp.AuthScheme
  186. IdentityProperties smithy.Properties
  187. SignerProperties smithy.Properties
  188. }
  189. func newResolvedAuthScheme(scheme smithyhttp.AuthScheme, option *smithyauth.Option) *resolvedAuthScheme {
  190. return &resolvedAuthScheme{
  191. Scheme: scheme,
  192. IdentityProperties: option.IdentityProperties,
  193. SignerProperties: option.SignerProperties,
  194. }
  195. }
  196. func setResolvedAuthScheme(ctx context.Context, scheme *resolvedAuthScheme) context.Context {
  197. return middleware.WithStackValue(ctx, resolvedAuthSchemeKey{}, scheme)
  198. }
  199. func getResolvedAuthScheme(ctx context.Context) *resolvedAuthScheme {
  200. v, _ := middleware.GetStackValue(ctx, resolvedAuthSchemeKey{}).(*resolvedAuthScheme)
  201. return v
  202. }
  203. type getIdentityMiddleware struct {
  204. options Options
  205. }
  206. func (*getIdentityMiddleware) ID() string {
  207. return "GetIdentity"
  208. }
  209. func (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
  210. out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
  211. ) {
  212. innerCtx, span := tracing.StartSpan(ctx, "GetIdentity")
  213. defer span.End()
  214. rscheme := getResolvedAuthScheme(innerCtx)
  215. if rscheme == nil {
  216. return out, metadata, fmt.Errorf("no resolved auth scheme")
  217. }
  218. resolver := rscheme.Scheme.IdentityResolver(m.options)
  219. if resolver == nil {
  220. return out, metadata, fmt.Errorf("no identity resolver")
  221. }
  222. identity, err := timeOperationMetric(ctx, "client.call.resolve_identity_duration",
  223. func() (smithyauth.Identity, error) {
  224. return resolver.GetIdentity(innerCtx, rscheme.IdentityProperties)
  225. },
  226. func(o *metrics.RecordMetricOptions) {
  227. o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID())
  228. })
  229. if err != nil {
  230. return out, metadata, fmt.Errorf("get identity: %w", err)
  231. }
  232. ctx = setIdentity(ctx, identity)
  233. span.End()
  234. return next.HandleFinalize(ctx, in)
  235. }
  236. type identityKey struct{}
  237. func setIdentity(ctx context.Context, identity smithyauth.Identity) context.Context {
  238. return middleware.WithStackValue(ctx, identityKey{}, identity)
  239. }
  240. func getIdentity(ctx context.Context) smithyauth.Identity {
  241. v, _ := middleware.GetStackValue(ctx, identityKey{}).(smithyauth.Identity)
  242. return v
  243. }
  244. type signRequestMiddleware struct {
  245. options Options
  246. }
  247. func (*signRequestMiddleware) ID() string {
  248. return "Signing"
  249. }
  250. func (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
  251. out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
  252. ) {
  253. _, span := tracing.StartSpan(ctx, "SignRequest")
  254. defer span.End()
  255. req, ok := in.Request.(*smithyhttp.Request)
  256. if !ok {
  257. return out, metadata, fmt.Errorf("unexpected transport type %T", in.Request)
  258. }
  259. rscheme := getResolvedAuthScheme(ctx)
  260. if rscheme == nil {
  261. return out, metadata, fmt.Errorf("no resolved auth scheme")
  262. }
  263. identity := getIdentity(ctx)
  264. if identity == nil {
  265. return out, metadata, fmt.Errorf("no identity")
  266. }
  267. signer := rscheme.Scheme.Signer()
  268. if signer == nil {
  269. return out, metadata, fmt.Errorf("no signer")
  270. }
  271. _, err = timeOperationMetric(ctx, "client.call.signing_duration", func() (any, error) {
  272. return nil, signer.SignRequest(ctx, req, identity, rscheme.SignerProperties)
  273. }, func(o *metrics.RecordMetricOptions) {
  274. o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID())
  275. })
  276. if err != nil {
  277. return out, metadata, fmt.Errorf("sign request: %w", err)
  278. }
  279. span.End()
  280. return next.HandleFinalize(ctx, in)
  281. }