Skip to content

Commit 509ea19

Browse files
committed
feat: add Unlock() method for proactive keyring unlock
- Add Load() to DataStore interface for explicit data loading - Rename private load() to public Load() in dataStoreYaml - Add Unlock() to keyringService that calls Load() This allows callers to trigger the passphrase prompt before performing operations, enabling better UX control.
1 parent a8498cc commit 509ea19

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

keyring.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ func (i KeyValueItem) isEmpty() bool {
6868

6969
// DataStore provides password storage functionality.
7070
type DataStore interface {
71+
// Load loads the keyring data from storage.
72+
// This triggers decryption and passphrase prompt if the keyring is encrypted.
73+
// It is idempotent - subsequent calls return immediately if already loaded.
74+
Load() error
7175
// GetUrls retrieves a list of stored URLs.
7276
GetUrls() ([]string, error)
7377
// GetKeys retrieves a list of stored keys.
@@ -181,6 +185,13 @@ func (k *keyringService) AddItem(item SecretItem) error {
181185
return k.dataStore.AddItem(item)
182186
}
183187

188+
// Unlock proactively unlocks the keyring.
189+
// This triggers the passphrase prompt if the keyring is encrypted.
190+
// Returns error if the keyring could not be unlocked.
191+
func (k *keyringService) Unlock() error {
192+
return k.dataStore.Load()
193+
}
194+
184195
// MaskItem masks the item values
185196
func (k *keyringService) maskItem(item SecretItem) {
186197
if k.mask == nil {

yaml.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ type dataStoreYaml struct {
2727
loaded bool
2828
}
2929

30-
func (s *dataStoreYaml) load() error {
30+
// Load implements DataStore interface.
31+
func (s *dataStoreYaml) Load() error {
3132
if s.loaded {
3233
return nil
3334
}
@@ -72,7 +73,7 @@ func (s *dataStoreYaml) load() error {
7273
// GetUrls implements DataStore interface.
7374
func (s *dataStoreYaml) GetUrls() ([]string, error) {
7475
var result []string
75-
if err := s.load(); err != nil {
76+
if err := s.Load(); err != nil {
7677
return result, err
7778
}
7879

@@ -86,7 +87,7 @@ func (s *dataStoreYaml) GetUrls() ([]string, error) {
8687
// GetKeys implements DataStore interface.
8788
func (s *dataStoreYaml) GetKeys() ([]string, error) {
8889
var result []string
89-
if err := s.load(); err != nil {
90+
if err := s.Load(); err != nil {
9091
return result, err
9192
}
9293

@@ -99,7 +100,7 @@ func (s *dataStoreYaml) GetKeys() ([]string, error) {
99100

100101
// GetForURL implements DataStore interface.
101102
func (s *dataStoreYaml) GetForURL(url string) (CredentialsItem, error) {
102-
if err := s.load(); err != nil {
103+
if err := s.Load(); err != nil {
103104
return CredentialsItem{}, err
104105
}
105106
for i := 0; i < len(s.data.CredentialStorage); i++ {
@@ -112,7 +113,7 @@ func (s *dataStoreYaml) GetForURL(url string) (CredentialsItem, error) {
112113

113114
// GetForKey implements DataStore interface.
114115
func (s *dataStoreYaml) GetForKey(key string) (KeyValueItem, error) {
115-
if err := s.load(); err != nil {
116+
if err := s.Load(); err != nil {
116117
return KeyValueItem{}, err
117118
}
118119
for i := 0; i < len(s.data.KeyValueStorage); i++ {
@@ -130,7 +131,7 @@ func (s *dataStoreYaml) AddItem(item SecretItem) error {
130131
return ErrEmptyFields
131132
}
132133

133-
if err := s.load(); err != nil {
134+
if err := s.Load(); err != nil {
134135
return err
135136
}
136137

@@ -170,7 +171,7 @@ func (s *dataStoreYaml) AddItem(item SecretItem) error {
170171

171172
// RemoveByURL implements DataStore interface.
172173
func (s *dataStoreYaml) RemoveByURL(url string) error {
173-
if err := s.load(); err != nil {
174+
if err := s.Load(); err != nil {
174175
return err
175176
}
176177
for i := 0; i < len(s.data.CredentialStorage); i++ {
@@ -184,7 +185,7 @@ func (s *dataStoreYaml) RemoveByURL(url string) error {
184185

185186
// RemoveByKey implements DataStore interface.
186187
func (s *dataStoreYaml) RemoveByKey(key string) error {
187-
if err := s.load(); err != nil {
188+
if err := s.Load(); err != nil {
188189
return err
189190
}
190191
for i := 0; i < len(s.data.KeyValueStorage); i++ {
@@ -198,7 +199,7 @@ func (s *dataStoreYaml) RemoveByKey(key string) error {
198199

199200
// CleanStorage implements DataStore interface.
200201
func (s *dataStoreYaml) CleanStorage(item SecretItem) error {
201-
if err := s.load(); err != nil {
202+
if err := s.Load(); err != nil {
202203
return err
203204
}
204205

0 commit comments

Comments
 (0)