1
1
package secretservice
2
2
3
3
import (
4
+ "errors"
5
+ "fmt"
4
6
"math/big"
5
7
"time"
6
8
7
9
dbus "github.com/keybase/dbus"
8
- errors "github.com/pkg/errors"
9
10
)
10
11
11
12
// SecretServiceInterface
@@ -69,7 +70,7 @@ const DefaultSessionOpenTimeout = 10 * time.Second
69
70
func NewService () (* SecretService , error ) {
70
71
conn , err := dbus .ConnectSessionBus ()
71
72
if err != nil {
72
- return nil , errors . Wrap ( err , "failed to open dbus connection" )
73
+ return nil , fmt . Errorf ( "failed to open dbus connection: %w" , err )
73
74
}
74
75
signalCh := make (chan * dbus.Signal , 16 )
75
76
conn .Signal (signalCh )
@@ -101,7 +102,10 @@ func (s *SecretService) openSessionRaw(mode AuthenticationMode, sessionAlgorithm
101
102
err = s .ServiceObj ().
102
103
Call ("org.freedesktop.Secret.Service.OpenSession" , NilFlags , mode , sessionAlgorithmInput ).
103
104
Store (& resp .algorithmOutput , & resp .path )
104
- return resp , errors .Wrap (err , "failed to open secretservice session" )
105
+ if err != nil {
106
+ return sessionOpenResponse {}, fmt .Errorf ("failed to open secretservice session: %w" , err )
107
+ }
108
+ return resp , nil
105
109
}
106
110
107
111
// OpenSession
@@ -125,17 +129,17 @@ func (s *SecretService) OpenSession(mode AuthenticationMode) (session *Session,
125
129
session .Public = public
126
130
sessionAlgorithmInput = dbus .MakeVariant (public .Bytes ()) // math/big.Int.Bytes is big endian
127
131
default :
128
- return nil , errors .Errorf ("unknown authentication mode %v" , mode )
132
+ return nil , fmt .Errorf ("unknown authentication mode %v" , mode )
129
133
}
130
134
131
135
sessionOpenCh := make (chan sessionOpenResponse )
132
136
errCh := make (chan error )
133
137
go func () {
134
- sessionOpenResponse , err := s .openSessionRaw (mode , sessionAlgorithmInput )
138
+ resp , err := s .openSessionRaw (mode , sessionAlgorithmInput )
135
139
if err != nil {
136
140
errCh <- err
137
141
} else {
138
- sessionOpenCh <- sessionOpenResponse
142
+ sessionOpenCh <- resp
139
143
}
140
144
}()
141
145
@@ -152,15 +156,15 @@ func (s *SecretService) OpenSession(mode AuthenticationMode) (session *Session,
152
156
case err := <- errCh :
153
157
return nil , err
154
158
case <- time .After (s .sessionOpenTimeout ):
155
- return nil , errors .Errorf ("timed out after %s" , s .sessionOpenTimeout )
159
+ return nil , fmt .Errorf ("timed out after %s" , s .sessionOpenTimeout )
156
160
}
157
161
158
162
switch mode {
159
163
case AuthenticationInsecurePlain :
160
164
case AuthenticationDHAES :
161
165
theirPublicBigEndian , ok := sessionAlgorithmOutput .Value ().([]byte )
162
166
if ! ok {
163
- return nil , errors .Errorf ("failed to coerce algorithm output value to byteslice" )
167
+ return nil , errors .New ("failed to coerce algorithm output value to byteslice" )
164
168
}
165
169
group := rfc2409SecondOakleyGroup ()
166
170
theirPublic := new (big.Int )
@@ -171,7 +175,7 @@ func (s *SecretService) OpenSession(mode AuthenticationMode) (session *Session,
171
175
}
172
176
session .AESKey = aesKey
173
177
default :
174
- return nil , errors .Errorf ("unknown authentication mode %v" , mode )
178
+ return nil , fmt .Errorf ("unknown authentication mode %v" , mode )
175
179
}
176
180
177
181
return session , nil
@@ -182,13 +186,13 @@ func (s *SecretService) CloseSession(session *Session) {
182
186
s .Obj (session .Path ).Call ("org.freedesktop.Secret.Session.Close" , NilFlags )
183
187
}
184
188
185
- // SearchColleciton
189
+ // SearchCollection
186
190
func (s * SecretService ) SearchCollection (collection dbus.ObjectPath , attributes Attributes ) (items []dbus.ObjectPath , err error ) {
187
191
err = s .Obj (collection ).
188
192
Call ("org.freedesktop.Secret.Collection.SearchItems" , NilFlags , attributes ).
189
193
Store (& items )
190
194
if err != nil {
191
- return nil , errors . Wrap ( err , "failed to search collection" )
195
+ return nil , fmt . Errorf ( "failed to search collection: %w" , err )
192
196
}
193
197
return items , nil
194
198
}
@@ -211,15 +215,15 @@ func (s *SecretService) CreateItem(collection dbus.ObjectPath, properties map[st
211
215
case ReplaceBehaviorReplace :
212
216
replace = true
213
217
default :
214
- return "" , errors .Errorf ("unknown replace behavior %v " , replaceBehavior )
218
+ return "" , fmt .Errorf ("unknown replace behavior %d " , replaceBehavior )
215
219
}
216
220
217
221
var prompt dbus.ObjectPath
218
222
err = s .Obj (collection ).
219
223
Call ("org.freedesktop.Secret.Collection.CreateItem" , NilFlags , properties , secret , replace ).
220
224
Store (& item , & prompt )
221
225
if err != nil {
222
- return "" , errors . Wrap ( err , "failed to create item" )
226
+ return "" , fmt . Errorf ( "failed to create item: %w" , err )
223
227
}
224
228
_ , err = s .PromptAndWait (prompt )
225
229
if err != nil {
@@ -235,7 +239,7 @@ func (s *SecretService) DeleteItem(item dbus.ObjectPath) (err error) {
235
239
Call ("org.freedesktop.Secret.Item.Delete" , NilFlags ).
236
240
Store (& prompt )
237
241
if err != nil {
238
- return errors . Wrap ( err , "failed to delete item" )
242
+ return fmt . Errorf ( "failed to delete item: %w" , err )
239
243
}
240
244
_ , err = s .PromptAndWait (prompt )
241
245
if err != nil {
@@ -248,11 +252,11 @@ func (s *SecretService) DeleteItem(item dbus.ObjectPath) (err error) {
248
252
func (s * SecretService ) GetAttributes (item dbus.ObjectPath ) (attributes Attributes , err error ) {
249
253
attributesV , err := s .Obj (item ).GetProperty ("org.freedesktop.Secret.Item.Attributes" )
250
254
if err != nil {
251
- return nil , errors . Wrap ( err , "failed to get attributes" )
255
+ return nil , fmt . Errorf ( "failed to get attributes: %w" , err )
252
256
}
253
257
attributesMap , ok := attributesV .Value ().(map [string ]string )
254
258
if ! ok {
255
- return nil , errors .Errorf ("failed to coerce item attributes" )
259
+ return nil , errors .New ("failed to coerce item attributes" )
256
260
}
257
261
return Attributes (attributesMap ), nil
258
262
}
@@ -264,12 +268,12 @@ func (s *SecretService) GetSecret(item dbus.ObjectPath, session Session) (secret
264
268
Call ("org.freedesktop.Secret.Item.GetSecret" , NilFlags , session .Path ).
265
269
Store (& secretI )
266
270
if err != nil {
267
- return nil , errors . Wrap ( err , "failed to get secret" )
271
+ return nil , fmt . Errorf ( "failed to get secret: %w" , err )
268
272
}
269
273
secret := new (Secret )
270
274
err = dbus .Store (secretI , & secret .Session , & secret .Parameters , & secret .Value , & secret .ContentType )
271
275
if err != nil {
272
- return nil , errors . Wrap ( err , "failed to unmarshal get secret result" )
276
+ return nil , fmt . Errorf ( "failed to unmarshal get secret result: %w" , err )
273
277
}
274
278
275
279
switch session .Mode {
@@ -282,7 +286,7 @@ func (s *SecretService) GetSecret(item dbus.ObjectPath, session Session) (secret
282
286
}
283
287
secretPlaintext = plaintext
284
288
default :
285
- return nil , errors .Errorf ("cannot make secret for authentication mode %v" , session .Mode )
289
+ return nil , fmt .Errorf ("cannot make secret for authentication mode %v" , session .Mode )
286
290
}
287
291
288
292
return secretPlaintext , nil
@@ -299,11 +303,11 @@ func (s *SecretService) Unlock(items []dbus.ObjectPath) (err error) {
299
303
Call ("org.freedesktop.Secret.Service.Unlock" , NilFlags , items ).
300
304
Store (& dummy , & prompt )
301
305
if err != nil {
302
- return errors . Wrap ( err , "failed to unlock items" )
306
+ return fmt . Errorf ( "failed to unlock items: %w" , err )
303
307
}
304
308
_ , err = s .PromptAndWait (prompt )
305
309
if err != nil {
306
- return errors . Wrap ( err , "failed to prompt" )
310
+ return fmt . Errorf ( "failed to prompt: %w" , err )
307
311
}
308
312
return nil
309
313
}
@@ -316,11 +320,11 @@ func (s *SecretService) LockItems(items []dbus.ObjectPath) (err error) {
316
320
Call ("org.freedesktop.Secret.Service.Lock" , NilFlags , items ).
317
321
Store (& dummy , & prompt )
318
322
if err != nil {
319
- return errors . Wrap ( err , "failed to lock items" )
323
+ return fmt . Errorf ( "failed to lock items: %w" , err )
320
324
}
321
325
_ , err = s .PromptAndWait (prompt )
322
326
if err != nil {
323
- return errors . Wrap ( err , "failed to prompt" )
327
+ return fmt . Errorf ( "failed to prompt: %w" , err )
324
328
}
325
329
return nil
326
330
}
@@ -342,7 +346,7 @@ func (s *SecretService) PromptAndWait(prompt dbus.ObjectPath) (paths *dbus.Varia
342
346
}
343
347
call := s .Obj (prompt ).Call ("org.freedesktop.Secret.Prompt.Prompt" , NilFlags , "Keyring Prompt" )
344
348
if call .Err != nil {
345
- return nil , errors . Wrap ( err , "failed to prompt" )
349
+ return nil , fmt . Errorf ( "failed to prompt: %w" , call . Err )
346
350
}
347
351
for {
348
352
var result PromptCompletedResult
@@ -359,7 +363,7 @@ func (s *SecretService) PromptAndWait(prompt dbus.ObjectPath) (paths *dbus.Varia
359
363
}
360
364
err = dbus .Store (signal .Body , & result .Dismissed , & result .Paths )
361
365
if err != nil {
362
- return nil , errors . Wrap ( err , "failed to unmarshal prompt result" )
366
+ return nil , fmt . Errorf ( "failed to unmarshal prompt result: %w" , err )
363
367
}
364
368
if result .Dismissed {
365
369
return nil , PromptDismissedError {errors .New ("prompt dismissed" )}
@@ -401,6 +405,6 @@ func (session *Session) NewSecret(secretBytes []byte) (Secret, error) {
401
405
ContentType : "application/octet-stream" ,
402
406
}, nil
403
407
default :
404
- return Secret {}, errors .Errorf ("cannot make secret for authentication mode %v" , session .Mode )
408
+ return Secret {}, fmt .Errorf ("cannot make secret for authentication mode %v" , session .Mode )
405
409
}
406
410
}
0 commit comments