45 lines
1 KiB
Go
45 lines
1 KiB
Go
|
|
package credential
|
||
|
|
|
||
|
|
import "sync/atomic"
|
||
|
|
|
||
|
|
// SecureStore holds a passphrase in memory.
|
||
|
|
//
|
||
|
|
// Uses atomic.Pointer so reads and writes are lock-free.
|
||
|
|
// The passphrase is never written to disk; callers decide how to
|
||
|
|
// transport it outside this store (e.g., via cmd.Env or os.Environ).
|
||
|
|
type SecureStore struct {
|
||
|
|
val atomic.Pointer[string]
|
||
|
|
}
|
||
|
|
|
||
|
|
// NewSecureStore creates an empty SecureStore.
|
||
|
|
func NewSecureStore() *SecureStore {
|
||
|
|
return &SecureStore{}
|
||
|
|
}
|
||
|
|
|
||
|
|
// SetString stores the passphrase. An empty string clears the store.
|
||
|
|
func (s *SecureStore) SetString(passphrase string) {
|
||
|
|
if passphrase == "" {
|
||
|
|
s.val.Store(nil)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
s.val.Store(&passphrase)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get returns the stored passphrase, or "" if not set.
|
||
|
|
func (s *SecureStore) Get() string {
|
||
|
|
if p := s.val.Load(); p != nil {
|
||
|
|
return *p
|
||
|
|
}
|
||
|
|
return ""
|
||
|
|
}
|
||
|
|
|
||
|
|
// IsSet reports whether a passphrase is currently stored.
|
||
|
|
func (s *SecureStore) IsSet() bool {
|
||
|
|
return s.val.Load() != nil
|
||
|
|
}
|
||
|
|
|
||
|
|
// Clear removes the stored passphrase.
|
||
|
|
func (s *SecureStore) Clear() {
|
||
|
|
s.val.Store(nil)
|
||
|
|
}
|