github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/backend/swift/auth.go (about)

     1  package swift
     2  
     3  import (
     4  	"context"
     5  	"net/http"
     6  	"time"
     7  
     8  	"github.com/ncw/swift/v2"
     9  )
    10  
    11  // auth is an authenticator for swift.  It overrides the StorageUrl
    12  // and AuthToken with fixed values.
    13  type auth struct {
    14  	parentAuth swift.Authenticator
    15  	storageURL string
    16  	authToken  string
    17  }
    18  
    19  // newAuth creates a swift authenticator wrapper to override the
    20  // StorageUrl and AuthToken values.
    21  //
    22  // Note that parentAuth can be nil
    23  func newAuth(parentAuth swift.Authenticator, storageURL string, authToken string) *auth {
    24  	return &auth{
    25  		parentAuth: parentAuth,
    26  		storageURL: storageURL,
    27  		authToken:  authToken,
    28  	}
    29  }
    30  
    31  // Request creates an http.Request for the auth - return nil if not needed
    32  func (a *auth) Request(ctx context.Context, c *swift.Connection) (*http.Request, error) {
    33  	if a.parentAuth == nil {
    34  		return nil, nil
    35  	}
    36  	return a.parentAuth.Request(ctx, c)
    37  }
    38  
    39  // Response parses the http.Response
    40  func (a *auth) Response(ctx context.Context, resp *http.Response) error {
    41  	if a.parentAuth == nil {
    42  		return nil
    43  	}
    44  	return a.parentAuth.Response(ctx, resp)
    45  }
    46  
    47  // The public storage URL - set Internal to true to read
    48  // internal/service net URL
    49  func (a *auth) StorageUrl(Internal bool) string { // nolint
    50  	if a.storageURL != "" {
    51  		return a.storageURL
    52  	}
    53  	if a.parentAuth == nil {
    54  		return ""
    55  	}
    56  	return a.parentAuth.StorageUrl(Internal)
    57  }
    58  
    59  // The access token
    60  func (a *auth) Token() string {
    61  	if a.authToken != "" {
    62  		return a.authToken
    63  	}
    64  	if a.parentAuth == nil {
    65  		return ""
    66  	}
    67  	return a.parentAuth.Token()
    68  }
    69  
    70  // Expires returns the time the token expires if known or Zero if not.
    71  func (a *auth) Expires() (t time.Time) {
    72  	if do, ok := a.parentAuth.(swift.Expireser); ok {
    73  		t = do.Expires()
    74  	}
    75  	return t
    76  }
    77  
    78  // The CDN url if available
    79  func (a *auth) CdnUrl() string { // nolint
    80  	if a.parentAuth == nil {
    81  		return ""
    82  	}
    83  	return a.parentAuth.CdnUrl()
    84  }
    85  
    86  // Check the interfaces are satisfied
    87  var (
    88  	_ swift.Authenticator = (*auth)(nil)
    89  	_ swift.Expireser     = (*auth)(nil)
    90  )