github.com/aavshr/aws-sdk-go@v1.41.3/example/aws/credentials/plugincreds/plugin/plugin.go (about)

     1  //go:build example && go18
     2  // +build example,go18
     3  
     4  package main
     5  
     6  import (
     7  	"encoding/json"
     8  	"os"
     9  
    10  	"github.com/pkg/errors"
    11  )
    12  
    13  // Example plugin that will retrieve credentials from a JSON file that the
    14  // "PLUGIN_CREDS_FILE" environment variable points to
    15  //
    16  // Build with:
    17  //   go build -tags example -o plugin.so -buildmode=plugin plugin.go
    18  func main() {}
    19  
    20  var myCredProvider provider
    21  
    22  func init() {
    23  	// Initialize a mock credential provider with stubs
    24  	myCredProvider = provider{Filename: os.Getenv("PLUGIN_CREDS_FILE")}
    25  }
    26  
    27  // GetAWSSDKCredentialProvider is the symbol SDK will lookup and use to
    28  // get the credential provider's retrieve and isExpired functions.
    29  func GetAWSSDKCredentialProvider() (func() (key, secret, token string, err error), func() bool) {
    30  	return myCredProvider.Retrieve, myCredProvider.IsExpired
    31  }
    32  
    33  // mock implementation of a type that returns retrieves credentials and
    34  // returns if they have expired.
    35  type provider struct {
    36  	Filename string
    37  
    38  	loaded bool
    39  }
    40  
    41  func (p *provider) Retrieve() (key, secret, token string, err error) {
    42  	f, err := os.Open(p.Filename)
    43  	if err != nil {
    44  		return "", "", "", errors.Wrapf(err, "failed to open credentials file, %q", p.Filename)
    45  	}
    46  	decoder := json.NewDecoder(f)
    47  
    48  	creds := struct {
    49  		Key, Secret, Token string
    50  	}{}
    51  
    52  	if err := decoder.Decode(&creds); err != nil {
    53  		return "", "", "", errors.Wrap(err, "failed to decode credentials file")
    54  	}
    55  
    56  	p.loaded = true
    57  	return creds.Key, creds.Secret, creds.Token, nil
    58  }
    59  
    60  func (p *provider) IsExpired() bool {
    61  	return !p.loaded
    62  }