@@ -17,8 +17,9 @@ const (
1717// KWallet is an interface for the KWallet dbus API.
1818type 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.
5943func (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.
7560func (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.
9079func (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}
0 commit comments