mirror of
https://github.com/ceph/ceph-csi.git
synced 2025-06-13 10:33:35 +00:00
rebase: bump github.com/aws/aws-sdk-go-v2/service/sts
Bumps [github.com/aws/aws-sdk-go-v2/service/sts](https://github.com/aws/aws-sdk-go-v2) from 1.16.13 to 1.16.17. - [Release notes](https://github.com/aws/aws-sdk-go-v2/releases) - [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.16.13...service/ram/v1.16.17) --- updated-dependencies: - dependency-name: github.com/aws/aws-sdk-go-v2/service/sts dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com>
This commit is contained in:
committed by
mergify[bot]
parent
9ddb4a784a
commit
e5c5646963
3
vendor/github.com/aws/smithy-go/auth/bearer/docs.go
generated
vendored
Normal file
3
vendor/github.com/aws/smithy-go/auth/bearer/docs.go
generated
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
// Package bearer provides middleware and utilities for authenticating API
|
||||
// operation calls with a Bearer Token.
|
||||
package bearer
|
104
vendor/github.com/aws/smithy-go/auth/bearer/middleware.go
generated
vendored
Normal file
104
vendor/github.com/aws/smithy-go/auth/bearer/middleware.go
generated
vendored
Normal file
@ -0,0 +1,104 @@
|
||||
package bearer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/aws/smithy-go/middleware"
|
||||
smithyhttp "github.com/aws/smithy-go/transport/http"
|
||||
)
|
||||
|
||||
// Message is the middleware stack's request transport message value.
|
||||
type Message interface{}
|
||||
|
||||
// Signer provides an interface for implementations to decorate a request
|
||||
// message with a bearer token. The signer is responsible for validating the
|
||||
// message type is compatible with the signer.
|
||||
type Signer interface {
|
||||
SignWithBearerToken(context.Context, Token, Message) (Message, error)
|
||||
}
|
||||
|
||||
// AuthenticationMiddleware provides the Finalize middleware step for signing
|
||||
// an request message with a bearer token.
|
||||
type AuthenticationMiddleware struct {
|
||||
signer Signer
|
||||
tokenProvider TokenProvider
|
||||
}
|
||||
|
||||
// AddAuthenticationMiddleware helper adds the AuthenticationMiddleware to the
|
||||
// middleware Stack in the Finalize step with the options provided.
|
||||
func AddAuthenticationMiddleware(s *middleware.Stack, signer Signer, tokenProvider TokenProvider) error {
|
||||
return s.Finalize.Add(
|
||||
NewAuthenticationMiddleware(signer, tokenProvider),
|
||||
middleware.After,
|
||||
)
|
||||
}
|
||||
|
||||
// NewAuthenticationMiddleware returns an initialized AuthenticationMiddleware.
|
||||
func NewAuthenticationMiddleware(signer Signer, tokenProvider TokenProvider) *AuthenticationMiddleware {
|
||||
return &AuthenticationMiddleware{
|
||||
signer: signer,
|
||||
tokenProvider: tokenProvider,
|
||||
}
|
||||
}
|
||||
|
||||
const authenticationMiddlewareID = "BearerTokenAuthentication"
|
||||
|
||||
// ID returns the resolver identifier
|
||||
func (m *AuthenticationMiddleware) ID() string {
|
||||
return authenticationMiddlewareID
|
||||
}
|
||||
|
||||
// HandleFinalize implements the FinalizeMiddleware interface in order to
|
||||
// update the request with bearer token authentication.
|
||||
func (m *AuthenticationMiddleware) HandleFinalize(
|
||||
ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
|
||||
) (
|
||||
out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
|
||||
) {
|
||||
token, err := m.tokenProvider.RetrieveBearerToken(ctx)
|
||||
if err != nil {
|
||||
return out, metadata, fmt.Errorf("failed AuthenticationMiddleware wrap message, %w", err)
|
||||
}
|
||||
|
||||
signedMessage, err := m.signer.SignWithBearerToken(ctx, token, in.Request)
|
||||
if err != nil {
|
||||
return out, metadata, fmt.Errorf("failed AuthenticationMiddleware sign message, %w", err)
|
||||
}
|
||||
|
||||
in.Request = signedMessage
|
||||
return next.HandleFinalize(ctx, in)
|
||||
}
|
||||
|
||||
// SignHTTPSMessage provides a bearer token authentication implementation that
|
||||
// will sign the message with the provided bearer token.
|
||||
//
|
||||
// Will fail if the message is not a smithy-go HTTP request or the request is
|
||||
// not HTTPS.
|
||||
type SignHTTPSMessage struct{}
|
||||
|
||||
// NewSignHTTPSMessage returns an initialized signer for HTTP messages.
|
||||
func NewSignHTTPSMessage() *SignHTTPSMessage {
|
||||
return &SignHTTPSMessage{}
|
||||
}
|
||||
|
||||
// SignWithBearerToken returns a copy of the HTTP request with the bearer token
|
||||
// added via the "Authorization" header, per RFC 6750, https://datatracker.ietf.org/doc/html/rfc6750.
|
||||
//
|
||||
// Returns an error if the request's URL scheme is not HTTPS, or the request
|
||||
// message is not an smithy-go HTTP Request pointer type.
|
||||
func (SignHTTPSMessage) SignWithBearerToken(ctx context.Context, token Token, message Message) (Message, error) {
|
||||
req, ok := message.(*smithyhttp.Request)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("expect smithy-go HTTP Request, got %T", message)
|
||||
}
|
||||
|
||||
if !req.IsHTTPS() {
|
||||
return nil, fmt.Errorf("bearer token with HTTP request requires HTTPS")
|
||||
}
|
||||
|
||||
reqClone := req.Clone()
|
||||
reqClone.Header.Set("Authorization", "Bearer "+token.Value)
|
||||
|
||||
return reqClone, nil
|
||||
}
|
50
vendor/github.com/aws/smithy-go/auth/bearer/token.go
generated
vendored
Normal file
50
vendor/github.com/aws/smithy-go/auth/bearer/token.go
generated
vendored
Normal file
@ -0,0 +1,50 @@
|
||||
package bearer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
)
|
||||
|
||||
// Token provides a type wrapping a bearer token and expiration metadata.
|
||||
type Token struct {
|
||||
Value string
|
||||
|
||||
CanExpire bool
|
||||
Expires time.Time
|
||||
}
|
||||
|
||||
// Expired returns if the token's Expires time is before or equal to the time
|
||||
// provided. If CanExpires is false, Expired will always return false.
|
||||
func (t Token) Expired(now time.Time) bool {
|
||||
if !t.CanExpire {
|
||||
return false
|
||||
}
|
||||
now = now.Round(0)
|
||||
return now.Equal(t.Expires) || now.After(t.Expires)
|
||||
}
|
||||
|
||||
// TokenProvider provides interface for retrieving bearer tokens.
|
||||
type TokenProvider interface {
|
||||
RetrieveBearerToken(context.Context) (Token, error)
|
||||
}
|
||||
|
||||
// TokenProviderFunc provides a helper utility to wrap a function as a type
|
||||
// that implements the TokenProvider interface.
|
||||
type TokenProviderFunc func(context.Context) (Token, error)
|
||||
|
||||
// RetrieveBearerToken calls the wrapped function, returning the Token or
|
||||
// error.
|
||||
func (fn TokenProviderFunc) RetrieveBearerToken(ctx context.Context) (Token, error) {
|
||||
return fn(ctx)
|
||||
}
|
||||
|
||||
// StaticTokenProvider provides a utility for wrapping a static bearer token
|
||||
// value within an implementation of a token provider.
|
||||
type StaticTokenProvider struct {
|
||||
Token Token
|
||||
}
|
||||
|
||||
// RetrieveBearerToken returns the static token specified.
|
||||
func (s StaticTokenProvider) RetrieveBearerToken(context.Context) (Token, error) {
|
||||
return s.Token, nil
|
||||
}
|
208
vendor/github.com/aws/smithy-go/auth/bearer/token_cache.go
generated
vendored
Normal file
208
vendor/github.com/aws/smithy-go/auth/bearer/token_cache.go
generated
vendored
Normal file
@ -0,0 +1,208 @@
|
||||
package bearer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
smithycontext "github.com/aws/smithy-go/context"
|
||||
"github.com/aws/smithy-go/internal/sync/singleflight"
|
||||
)
|
||||
|
||||
// package variable that can be override in unit tests.
|
||||
var timeNow = time.Now
|
||||
|
||||
// TokenCacheOptions provides a set of optional configuration options for the
|
||||
// TokenCache TokenProvider.
|
||||
type TokenCacheOptions struct {
|
||||
// The duration before the token will expire when the credentials will be
|
||||
// refreshed. If DisableAsyncRefresh is true, the RetrieveBearerToken calls
|
||||
// will be blocking.
|
||||
//
|
||||
// Asynchronous refreshes are deduplicated, and only one will be in-flight
|
||||
// at a time. If the token expires while an asynchronous refresh is in
|
||||
// flight, the next call to RetrieveBearerToken will block on that refresh
|
||||
// to return.
|
||||
RefreshBeforeExpires time.Duration
|
||||
|
||||
// The timeout the underlying TokenProvider's RetrieveBearerToken call must
|
||||
// return within, or will be canceled. Defaults to 0, no timeout.
|
||||
//
|
||||
// If 0 timeout, its possible for the underlying tokenProvider's
|
||||
// RetrieveBearerToken call to block forever. Preventing subsequent
|
||||
// TokenCache attempts to refresh the token.
|
||||
//
|
||||
// If this timeout is reached all pending deduplicated calls to
|
||||
// TokenCache RetrieveBearerToken will fail with an error.
|
||||
RetrieveBearerTokenTimeout time.Duration
|
||||
|
||||
// The minimum duration between asynchronous refresh attempts. If the next
|
||||
// asynchronous recent refresh attempt was within the minimum delay
|
||||
// duration, the call to retrieve will return the current cached token, if
|
||||
// not expired.
|
||||
//
|
||||
// The asynchronous retrieve is deduplicated across multiple calls when
|
||||
// RetrieveBearerToken is called. The asynchronous retrieve is not a
|
||||
// periodic task. It is only performed when the token has not yet expired,
|
||||
// and the current item is within the RefreshBeforeExpires window, and the
|
||||
// TokenCache's RetrieveBearerToken method is called.
|
||||
//
|
||||
// If 0, (default) there will be no minimum delay between asynchronous
|
||||
// refresh attempts.
|
||||
//
|
||||
// If DisableAsyncRefresh is true, this option is ignored.
|
||||
AsyncRefreshMinimumDelay time.Duration
|
||||
|
||||
// Sets if the TokenCache will attempt to refresh the token in the
|
||||
// background asynchronously instead of blocking for credentials to be
|
||||
// refreshed. If disabled token refresh will be blocking.
|
||||
//
|
||||
// The first call to RetrieveBearerToken will always be blocking, because
|
||||
// there is no cached token.
|
||||
DisableAsyncRefresh bool
|
||||
}
|
||||
|
||||
// TokenCache provides an utility to cache Bearer Authentication tokens from a
|
||||
// wrapped TokenProvider. The TokenCache can be has options to configure the
|
||||
// cache's early and asynchronous refresh of the token.
|
||||
type TokenCache struct {
|
||||
options TokenCacheOptions
|
||||
provider TokenProvider
|
||||
|
||||
cachedToken atomic.Value
|
||||
lastRefreshAttemptTime atomic.Value
|
||||
sfGroup singleflight.Group
|
||||
}
|
||||
|
||||
// NewTokenCache returns a initialized TokenCache that implements the
|
||||
// TokenProvider interface. Wrapping the provider passed in. Also taking a set
|
||||
// of optional functional option parameters to configure the token cache.
|
||||
func NewTokenCache(provider TokenProvider, optFns ...func(*TokenCacheOptions)) *TokenCache {
|
||||
var options TokenCacheOptions
|
||||
for _, fn := range optFns {
|
||||
fn(&options)
|
||||
}
|
||||
|
||||
return &TokenCache{
|
||||
options: options,
|
||||
provider: provider,
|
||||
}
|
||||
}
|
||||
|
||||
// RetrieveBearerToken returns the token if it could be obtained, or error if a
|
||||
// valid token could not be retrieved.
|
||||
//
|
||||
// The passed in Context's cancel/deadline/timeout will impacting only this
|
||||
// individual retrieve call and not any other already queued up calls. This
|
||||
// means underlying provider's RetrieveBearerToken calls could block for ever,
|
||||
// and not be canceled with the Context. Set RetrieveBearerTokenTimeout to
|
||||
// provide a timeout, preventing the underlying TokenProvider blocking forever.
|
||||
//
|
||||
// By default, if the passed in Context is canceled, all of its values will be
|
||||
// considered expired. The wrapped TokenProvider will not be able to lookup the
|
||||
// values from the Context once it is expired. This is done to protect against
|
||||
// expired values no longer being valid. To disable this behavior, use
|
||||
// smithy-go's context.WithPreserveExpiredValues to add a value to the Context
|
||||
// before calling RetrieveBearerToken to enable support for expired values.
|
||||
//
|
||||
// Without RetrieveBearerTokenTimeout there is the potential for a underlying
|
||||
// Provider's RetrieveBearerToken call to sit forever. Blocking in subsequent
|
||||
// attempts at refreshing the token.
|
||||
func (p *TokenCache) RetrieveBearerToken(ctx context.Context) (Token, error) {
|
||||
cachedToken, ok := p.getCachedToken()
|
||||
if !ok || cachedToken.Expired(timeNow()) {
|
||||
return p.refreshBearerToken(ctx)
|
||||
}
|
||||
|
||||
// Check if the token should be refreshed before it expires.
|
||||
refreshToken := cachedToken.Expired(timeNow().Add(p.options.RefreshBeforeExpires))
|
||||
if !refreshToken {
|
||||
return cachedToken, nil
|
||||
}
|
||||
|
||||
if p.options.DisableAsyncRefresh {
|
||||
return p.refreshBearerToken(ctx)
|
||||
}
|
||||
|
||||
p.tryAsyncRefresh(ctx)
|
||||
|
||||
return cachedToken, nil
|
||||
}
|
||||
|
||||
// tryAsyncRefresh attempts to asynchronously refresh the token returning the
|
||||
// already cached token. If it AsyncRefreshMinimumDelay option is not zero, and
|
||||
// the duration since the last refresh is less than that value, nothing will be
|
||||
// done.
|
||||
func (p *TokenCache) tryAsyncRefresh(ctx context.Context) {
|
||||
if p.options.AsyncRefreshMinimumDelay != 0 {
|
||||
var lastRefreshAttempt time.Time
|
||||
if v := p.lastRefreshAttemptTime.Load(); v != nil {
|
||||
lastRefreshAttempt = v.(time.Time)
|
||||
}
|
||||
|
||||
if timeNow().Before(lastRefreshAttempt.Add(p.options.AsyncRefreshMinimumDelay)) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// Ignore the returned channel so this won't be blocking, and limit the
|
||||
// number of additional goroutines created.
|
||||
p.sfGroup.DoChan("async-refresh", func() (interface{}, error) {
|
||||
res, err := p.refreshBearerToken(ctx)
|
||||
if p.options.AsyncRefreshMinimumDelay != 0 {
|
||||
var refreshAttempt time.Time
|
||||
if err != nil {
|
||||
refreshAttempt = timeNow()
|
||||
}
|
||||
p.lastRefreshAttemptTime.Store(refreshAttempt)
|
||||
}
|
||||
|
||||
return res, err
|
||||
})
|
||||
}
|
||||
|
||||
func (p *TokenCache) refreshBearerToken(ctx context.Context) (Token, error) {
|
||||
resCh := p.sfGroup.DoChan("refresh-token", func() (interface{}, error) {
|
||||
ctx := smithycontext.WithSuppressCancel(ctx)
|
||||
if v := p.options.RetrieveBearerTokenTimeout; v != 0 {
|
||||
var cancel func()
|
||||
ctx, cancel = context.WithTimeout(ctx, v)
|
||||
defer cancel()
|
||||
}
|
||||
return p.singleRetrieve(ctx)
|
||||
})
|
||||
|
||||
select {
|
||||
case res := <-resCh:
|
||||
return res.Val.(Token), res.Err
|
||||
case <-ctx.Done():
|
||||
return Token{}, fmt.Errorf("retrieve bearer token canceled, %w", ctx.Err())
|
||||
}
|
||||
}
|
||||
|
||||
func (p *TokenCache) singleRetrieve(ctx context.Context) (interface{}, error) {
|
||||
token, err := p.provider.RetrieveBearerToken(ctx)
|
||||
if err != nil {
|
||||
return Token{}, fmt.Errorf("failed to retrieve bearer token, %w", err)
|
||||
}
|
||||
|
||||
p.cachedToken.Store(&token)
|
||||
return token, nil
|
||||
}
|
||||
|
||||
// getCachedToken returns the currently cached token and true if found. Returns
|
||||
// false if no token is cached.
|
||||
func (p *TokenCache) getCachedToken() (Token, bool) {
|
||||
v := p.cachedToken.Load()
|
||||
if v == nil {
|
||||
return Token{}, false
|
||||
}
|
||||
|
||||
t := v.(*Token)
|
||||
if t == nil || t.Value == "" {
|
||||
return Token{}, false
|
||||
}
|
||||
|
||||
return *t, true
|
||||
}
|
Reference in New Issue
Block a user