@@ -11,10 +11,11 @@ const defaultFileYaml = "keyring.yaml"
1111
1212// Keyring errors.
1313var (
14- ErrNotFound = errors .New ("item not found" ) // ErrNotFound if an item was not found
15- ErrEmptyFields = errors .New ("item can't be empty" ) // ErrEmptyFields if fields are empty
16- ErrEmptyPass = errors .New ("passphrase can't be empty" ) // ErrEmptyPass if a passphrase is empty
17- ErrKeyringMalformed = errors .New ("the keyring is malformed" ) // ErrKeyringMalformed when keyring can't be read.
14+ ErrNotFound = errors .New ("item not found" ) // ErrNotFound if an item was not found
15+ ErrEmptyFields = errors .New ("item can't be empty" ) // ErrEmptyFields if fields are empty
16+ ErrEmptyPass = errors .New ("passphrase can't be empty" ) // ErrEmptyPass if a passphrase is empty
17+ ErrKeyringMalformed = errors .New ("the keyring is malformed" ) // ErrKeyringMalformed when keyring can't be read.
18+ ErrIncorrectPass = errors .New ("the given passphrase is incorrect" ) // ErrIncorrectPass if a passphrase is incorrect
1819)
1920
2021// SecretItem is an interface that represents an item saved in a storage.
@@ -102,19 +103,22 @@ type DataStore interface {
102103 Destroy () error
103104}
104105
106+ // dataStore is a type alias to embed it as a private property.
107+ type dataStore = DataStore
108+
105109// Keyring is a [launchr.Service] providing password store functionality.
106110type Keyring = * keyringService
107111
108112type keyringService struct {
109- store DataStore
110- mask * launchr.SensitiveMask
113+ dataStore
114+ mask * launchr.SensitiveMask
111115}
112116
113117// NewService creates a new Keyring service.
114118func NewService (store DataStore , mask * launchr.SensitiveMask ) Keyring {
115119 return & keyringService {
116- store : store ,
117- mask : mask ,
120+ dataStore : store ,
121+ mask : mask ,
118122 }
119123}
120124
@@ -142,7 +146,7 @@ func (k *keyringService) ServiceCreate(svc *launchr.ServiceManager) launchr.Serv
142146 // TODO: do not encrypt if the passphrase is not provided.
143147 store := NewFileStore (
144148 NewAgeFile (
145- cfg .Path (defaultFileYaml ),
149+ cfg .Path (defaultFileYaml + ".age" ),
146150 AskPassFirstAvailable {
147151 AskPassConst (passphrase .get ),
148152 AskPassWithTerminal {},
@@ -153,42 +157,9 @@ func (k *keyringService) ServiceCreate(svc *launchr.ServiceManager) launchr.Serv
153157 return NewService (store , mask )
154158}
155159
156- // ResetStorage cleans store for subsequent reload.
157- func (k * keyringService ) ResetStorage () {
158- k .store = nil
159- }
160-
161- func (k * keyringService ) defaultStore () (DataStore , error ) {
162- return k .store , nil
163- }
164-
165- // GetUrls implements DataStore interface. Uses service default store.
166- func (k * keyringService ) GetUrls () ([]string , error ) {
167- s , err := k .defaultStore ()
168- if err != nil {
169- return []string {}, err
170- }
171-
172- return s .GetUrls ()
173- }
174-
175- // GetKeys implements DataStore interface. Uses service default store.
176- func (k * keyringService ) GetKeys () ([]string , error ) {
177- s , err := k .defaultStore ()
178- if err != nil {
179- return []string {}, err
180- }
181-
182- return s .GetKeys ()
183- }
184-
185160// GetForURL implements DataStore interface. Uses service default store.
186161func (k * keyringService ) GetForURL (url string ) (CredentialsItem , error ) {
187- s , err := k .defaultStore ()
188- if err != nil {
189- return CredentialsItem {}, err
190- }
191- item , err := s .GetForURL (url )
162+ item , err := k .dataStore .GetForURL (url )
192163 if err == nil {
193164 k .maskItem (item )
194165 }
@@ -197,11 +168,7 @@ func (k *keyringService) GetForURL(url string) (CredentialsItem, error) {
197168
198169// GetForKey implements DataStore interface. Uses service default store.
199170func (k * keyringService ) GetForKey (key string ) (KeyValueItem , error ) {
200- s , err := k .defaultStore ()
201- if err != nil {
202- return KeyValueItem {}, err
203- }
204- item , err := s .GetForKey (key )
171+ item , err := k .dataStore .GetForKey (key )
205172 if err == nil {
206173 k .maskItem (item )
207174 }
@@ -210,18 +177,15 @@ func (k *keyringService) GetForKey(key string) (KeyValueItem, error) {
210177
211178// AddItem implements DataStore interface. Uses service default store.
212179func (k * keyringService ) AddItem (item SecretItem ) error {
213- s , err := k .defaultStore ()
214- if err != nil {
215- return err
216- }
217-
218180 k .maskItem (item )
219- return s .AddItem (item )
181+ return k . dataStore .AddItem (item )
220182}
221183
222184// MaskItem masks the item values
223185func (k * keyringService ) maskItem (item SecretItem ) {
224186 if k .mask == nil {
187+ // Mask may be nil in unit tests for simplicity.
188+ // Mask is checked in e2e tests.
225189 return
226190 }
227191 switch dataItem := item .(type ) {
@@ -234,57 +198,3 @@ func (k *keyringService) maskItem(item SecretItem) {
234198 default :
235199 }
236200}
237-
238- // RemoveByURL implements DataStore interface. Uses service default store.
239- func (k * keyringService ) RemoveByURL (url string ) error {
240- s , err := k .defaultStore ()
241- if err != nil {
242- return err
243- }
244- return s .RemoveByURL (url )
245- }
246-
247- // RemoveByKey implements DataStore interface. Uses service default store.
248- func (k * keyringService ) RemoveByKey (key string ) error {
249- s , err := k .defaultStore ()
250- if err != nil {
251- return err
252- }
253- return s .RemoveByKey (key )
254- }
255-
256- // CleanStorage implements DataStore interface. Uses service default store.
257- func (k * keyringService ) CleanStorage (item SecretItem ) error {
258- s , err := k .defaultStore ()
259- if err != nil {
260- return err
261- }
262- return s .CleanStorage (item )
263- }
264-
265- // Exists implements DataStore, checks if keyring exists in persistent storage.
266- func (k * keyringService ) Exists () bool {
267- s , err := k .defaultStore ()
268- if err != nil {
269- return false
270- }
271- return s .Exists ()
272- }
273-
274- // Save implements DataStore interface. Uses service default store.
275- func (k * keyringService ) Save () error {
276- s , err := k .defaultStore ()
277- if err != nil {
278- return err
279- }
280- return s .Save ()
281- }
282-
283- // Destroy implements DataStore interface. Uses service default store.
284- func (k * keyringService ) Destroy () error {
285- s , err := k .defaultStore ()
286- if err != nil {
287- return err
288- }
289- return s .Destroy ()
290- }
0 commit comments