From 18c3ffd2b2c844be56239f33a9d1adefca5f6c29 Mon Sep 17 00:00:00 2001 From: avallete Date: Tue, 10 Sep 2024 22:58:57 +0200 Subject: [PATCH] fix: unix keyring deleteall Signed-off-by: avallete --- keyring_unix.go | 41 ++++++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/keyring_unix.go b/keyring_unix.go index 1ab9a0e..07e90c9 100644 --- a/keyring_unix.go +++ b/keyring_unix.go @@ -76,6 +76,31 @@ func (s secretServiceProvider) findItem(svc *ss.SecretService, service, user str return results[0], nil } +// findServiceItems looksup all items by service. +func (s secretServiceProvider) findServiceItems(svc *ss.SecretService, service string) ([]dbus.ObjectPath, error) { + collection := svc.GetLoginCollection() + + search := map[string]string{ + "service": service, + } + + err := svc.Unlock(collection.Path()) + if err != nil { + return []dbus.ObjectPath{}, err + } + + results, err := svc.SearchItems(collection, search) + if err != nil { + return []dbus.ObjectPath{}, err + } + + if len(results) == 0 { + return []dbus.ObjectPath{}, ErrNotFound + } + + return results, nil +} + // Get gets a secret from the keyring given a service name and a user. func (s secretServiceProvider) Get(service, user string) (string, error) { svc, err := ss.NewSecretService() @@ -130,19 +155,21 @@ func (s secretServiceProvider) DeleteAll(service string) error { if err != nil { return err } - for { - item, err := s.findItem(svc, service, "") - if err != nil { - if err == ErrNotFound { - return nil - } - return err + // find all items for the service + items, err := s.findServiceItems(svc, service) + if err != nil { + if err == ErrNotFound { + return nil } + return err + } + for _, item := range items { err = svc.Delete(item) if err != nil { return err } } + return nil } func init() {