github.com/versent/saml2aws@v2.17.0+incompatible/helper/linuxkeyring/linuxkeyring.go (about)

     1  package linuxkeyring
     2  
     3  import (
     4  	"encoding/json"
     5  
     6  	"github.com/99designs/keyring"
     7  	"github.com/sirupsen/logrus"
     8  	"github.com/versent/saml2aws/helper/credentials"
     9  )
    10  
    11  var logger = logrus.WithField("helper", "linuxkeyring")
    12  
    13  type KeyringHelper struct {
    14  	keyring keyring.Keyring
    15  }
    16  
    17  func NewKeyringHelper() (*KeyringHelper, error) {
    18  	kr, err := keyring.Open(keyring.Config{
    19  		AllowedBackends: []keyring.BackendType{
    20  			keyring.KWalletBackend,
    21  			keyring.SecretServiceBackend,
    22  			keyring.PassBackend,
    23  		},
    24  		LibSecretCollectionName: "login",
    25  		PassPrefix:              "saml2aws",
    26  	})
    27  
    28  	if err != nil {
    29  		return nil, err
    30  	}
    31  
    32  	return &KeyringHelper{
    33  		keyring: kr,
    34  	}, nil
    35  }
    36  
    37  func (kr *KeyringHelper) Add(creds *credentials.Credentials) error {
    38  	encoded, err := json.Marshal(creds)
    39  	if err != nil {
    40  		return err
    41  	}
    42  
    43  	return kr.keyring.Set(keyring.Item{
    44  		Key:                         creds.ServerURL,
    45  		Label:                       credentials.CredsLabel,
    46  		Data:                        encoded,
    47  		KeychainNotTrustApplication: false,
    48  	})
    49  }
    50  
    51  func (kr *KeyringHelper) Delete(serverURL string) error {
    52  	return kr.keyring.Remove(serverURL)
    53  }
    54  
    55  func (kr *KeyringHelper) Get(serverURL string) (string, string, error) {
    56  	item, err := kr.keyring.Get(serverURL)
    57  	if err != nil {
    58  		logger.WithField("err", err).Error("keychain Get returned error")
    59  		return "", "", credentials.ErrCredentialsNotFound
    60  	}
    61  	var creds credentials.Credentials
    62  	if err = json.Unmarshal(item.Data, &creds); err != nil {
    63  		logger.WithField("err", err).Error("stored credential malformed")
    64  		return "", "", credentials.ErrCredentialsNotFound
    65  	}
    66  
    67  	return creds.Username, creds.Secret, nil
    68  }
    69  
    70  func (KeyringHelper) SupportsCredentialStorage() bool {
    71  	return true
    72  }