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 }