Skip to content

Commit 1a56a51

Browse files
refactor kwallet package
Signed-off-by: SoMuchForSubtlety <jakob@ahrer.dev>
1 parent 710d81c commit 1a56a51

File tree

5 files changed

+74
-45
lines changed

5 files changed

+74
-45
lines changed

errors/errors.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
package errors
1+
package errs
2+
3+
import "runtime"
24

35
const (
4-
ErrNotFound = KeyringError("secret not found in keyring")
6+
ErrNotFound = KeyringError("secret not found in keyring")
7+
ErrUnsupportedPlatform = KeyringError("Unsupported platform: " + runtime.GOOS)
58
)
69

710
type KeyringError string

keyring.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package keyring
22

3-
import "github.com/zalando/go-keyring/errors"
3+
import errs "github.com/zalando/go-keyring/errors"
44

55
// provider set in the init function by the relevant os file e.g.:
66
// keyring_linux.go
@@ -9,7 +9,7 @@ var provider Keyring = fallbackServiceProvider{}
99
const (
1010
// ErrNotFound is the expected error if the secret isn't found in the
1111
// keyring.
12-
ErrNotFound = errors.ErrNotFound
12+
ErrNotFound = errs.ErrNotFound
1313
)
1414

1515
// Keyring provides a simple set/get interface for a keyring service.

keyring_fallback.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package keyring
22

33
import (
4-
"runtime"
5-
6-
"github.com/zalando/go-keyring/errors"
4+
errs "github.com/zalando/go-keyring/errors"
75
)
86

97
// All of the following methods error out on unsupported platforms
108
const (
11-
ErrUnsupportedPlatform = errors.KeyringError("Unsupported platform: " + runtime.GOOS)
9+
ErrUnsupportedPlatform = errs.ErrUnsupportedPlatform
1210
)
1311

1412
type fallbackServiceProvider struct{}

kwallet/kwallet.go

Lines changed: 57 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ const (
1717
// KWallet is an interface for the KWallet dbus API.
1818
type KWallet struct {
1919
*dbus.Conn
20-
object dbus.BusObject
21-
handle int
20+
object dbus.BusObject
21+
walletName string
22+
handle int
2223
}
2324

2425
// NewKWallet inializes a new NewKwallet object.
@@ -33,37 +34,21 @@ func NewKWallet() (*KWallet, error) {
3334
object: conn.Object(serviceName, servicePath),
3435
}
3536

36-
var wallet string
37-
if err := kw.object.Call(methodInterface+".networkWallet", 0).Store(&wallet); err != nil {
38-
return nil, fmt.Errorf("Kwallet is not available: %w", err)
39-
}
40-
41-
return kw, nil
42-
}
43-
44-
// Open the wallet
45-
func (k *KWallet) Open(service string) error {
46-
var wallet string
47-
if err := k.object.Call(methodInterface+".networkWallet", 0).Store(&wallet); err != nil {
48-
return err
49-
}
50-
51-
if err := k.object.Call(methodInterface+".open", 0, wallet, int64(0), service).Store(&k.handle); err != nil {
52-
return err
53-
}
54-
return nil
37+
kw.walletName, err = kw.defaultWallet()
38+
return kw, err
5539
}
5640

5741
// Set stores user and pass in the keyring under the defined service
5842
// name.
5943
func (k *KWallet) Set(service, user, pass string) error {
60-
if err := k.Open(service); err != nil {
44+
if err := k.open(service); err != nil {
6145
return err
6246
}
6347

6448
var i int
49+
// org.kde.KWallet.writePassword(handle int, folder string, key string, value string, appId string) int
6550
if err := k.object.Call(methodInterface+".writePassword", 0, k.handle, service, user, pass, service).Store(&i); err != nil {
66-
return err
51+
return fmt.Errorf("failed to write password: %w", err)
6752
}
6853
if i < 0 {
6954
return errors.New("Could not write password")
@@ -73,46 +58,83 @@ func (k *KWallet) Set(service, user, pass string) error {
7358

7459
// Get gets a secret from the keyring given a service name and a user.
7560
func (k *KWallet) Get(service, user string) (string, error) {
76-
if err := k.Open(service); err != nil {
61+
if err := k.open(service); err != nil {
7762
return "", err
7863
}
79-
if b, err := k.Has(service, user); err != nil {
64+
if b, err := k.hasEntry(service, user); err != nil {
8065
return "", err
8166
} else if !b {
8267
return "", errs.ErrNotFound
8368
}
69+
8470
var password string
85-
err := k.object.Call(methodInterface+".readPassword", 0, k.handle, service, user, service).Store(&password)
86-
return password, err
71+
// org.kde.KWallet.readPassword(handle int, folder string, key string, appId string) string
72+
if err := k.object.Call(methodInterface+".readPassword", 0, k.handle, service, user, service).Store(&password); err != nil {
73+
return "", fmt.Errorf("failed to read password: %w", err)
74+
}
75+
return password, nil
8776
}
8877

8978
// Delete deletes a secret, identified by service & user, from the keyring.
9079
func (k *KWallet) Delete(service, user string) error {
91-
if err := k.Open(service); err != nil {
80+
if err := k.open(service); err != nil {
9281
return err
9382
}
94-
if b, err := k.Has(service, user); err != nil {
83+
84+
if b, err := k.hasEntry(service, user); err != nil {
9585
return err
9686
} else if !b {
9787
return errs.ErrNotFound
9888
}
9989

100-
var i int
101-
if err := k.object.Call(methodInterface+".removeEntry", 0, k.handle, service, user, service).Store(&i); err != nil {
102-
return err
90+
return k.removeEntry(service, user)
91+
}
92+
93+
func (k *KWallet) open(service string) error {
94+
var alreadyOpen bool
95+
// org.kde.KWallet.isOpen(wallet string) bool
96+
if err := k.object.Call(methodInterface+".isOpen", 0, k.handle).Store(&alreadyOpen); err != nil {
97+
return fmt.Errorf("failed to check if wallet is open: %w", err)
98+
}
99+
if alreadyOpen {
100+
return nil
103101
}
104102

103+
// org.kde.KWallet.open(wallet string, wId string, appId string) int
104+
if err := k.object.Call(methodInterface+".open", 0, k.walletName, int64(0), service).Store(&k.handle); err != nil {
105+
return fmt.Errorf("failed to open wallet: %w", err)
106+
}
107+
return nil
108+
}
109+
110+
func (k *KWallet) defaultWallet() (string, error) {
111+
var wallet string
112+
// org.kde.KWallet.networkWallet() string
113+
if err := k.object.Call(methodInterface+".networkWallet", 0).Store(&wallet); err != nil {
114+
return "", fmt.Errorf("KWallet is not available: %w", err)
115+
}
116+
117+
return wallet, nil
118+
}
119+
120+
func (k *KWallet) removeEntry(service, key string) error {
121+
var i int
122+
// org.kde.KWallet.removeEntry(handle int, folder string, key string, appId string) int
123+
if err := k.object.Call(methodInterface+".removeEntry", 0, k.handle, service, key, service).Store(&i); err != nil {
124+
return fmt.Errorf("failed to delete entry: %w", err)
125+
}
105126
if i < 0 {
106127
return errors.New("Could not delete password")
107128
}
129+
108130
return nil
109131
}
110132

111-
// Has a key
112-
func (k *KWallet) Has(service, key string) (bool, error) {
133+
func (k *KWallet) hasEntry(service, key string) (bool, error) {
113134
var b bool
135+
// org.kde.KWallet.hasEntry(handle int, folder string, key string, appId string) bool
114136
if err := k.object.Call(methodInterface+".hasEntry", 0, k.handle, service, key, service).Store(&b); err != nil {
115-
return b, err
137+
return b, fmt.Errorf("failed to check if entry exists: %w", err)
116138
}
117139
return b, nil
118140
}

secret_service/secret_service.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,18 @@ func NewSecretService() (*SecretService, error) {
5858
conn.Object(serviceName, servicePath),
5959
}
6060

61-
// check that the secret service backend is available
6261
session, err := s.OpenSession()
6362
if err != nil {
6463
return nil, fmt.Errorf("failed to open secret service session: %w", err)
6564
}
66-
s.Close(session)
65+
defer s.Close(session)
66+
67+
// check that the secret service backend is available
68+
collection := s.GetLoginCollection()
69+
err = s.Unlock(collection.Path())
70+
if err != nil {
71+
return nil, fmt.Errorf("failed to open secret service session: %w", err)
72+
}
6773

6874
return s, nil
6975
}

0 commit comments

Comments
 (0)