Skip to content

Commit dd79abb

Browse files
authored
secretservice: replace pkg/errors for Go stdlib errors, and fix unhandled error (#111)
* secretservice: fix SecretService.PromptAndWait discarding error This code was always returning a nil error instead of the error produced by the org.freedesktop.Secret.Prompt.Prompt call. Signed-off-by: Sebastiaan van Stijn <[email protected]> * secretservice: SecretService.openSessionRaw explicitly handle error pkg/errors' errors.Wrap function implicitly discards nil-errors. While this is convenient, it also can be err-prone, as this behavior differs from go stdlib, making it easy to miss conditions where the reader assumes an error is returned (but in reality no error). This patch updates the code to explicitly handle non-nil errors to prevent accidental regressions if this code would be rewritten using go stdlib. Signed-off-by: Sebastiaan van Stijn <[email protected]> * secretservice: rename var that shadowed type Signed-off-by: Sebastiaan van Stijn <[email protected]> * secretservice: fix GoDoc comment Signed-off-by: Sebastiaan van Stijn <[email protected]> * secretservice: replace pkg/errors for Go stdlib errors The pkg/errors dependency was introduced with the secretservice implementation in 7f2ef9f in March 2019. go1.13 (September 2019) introduced native support for unwrapping errors, no longer requiring this dependency to be used, and the pkg/errors module has been archived (as feature complete). While pkg/errors does have some advantages (for example, it can provide a stack trace), this functionality doesn't appear to be used in this module, and the pkg/errors package is not used in other implementations (for macOS). This patch removes the dependency, replacing its use for the equivalent in Go stdlib. Signed-off-by: Sebastiaan van Stijn <[email protected]> --------- Signed-off-by: Sebastiaan van Stijn <[email protected]>
1 parent 7f41edf commit dd79abb

File tree

4 files changed

+31
-30
lines changed

4 files changed

+31
-30
lines changed

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ go 1.21
44

55
require (
66
github.com/keybase/dbus v0.0.0-20220506165403-5aa21ea2c23a
7-
github.com/pkg/errors v0.9.1
87
github.com/stretchr/testify v1.10.0
98
golang.org/x/crypto v0.32.0
109
)

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
22
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
33
github.com/keybase/dbus v0.0.0-20220506165403-5aa21ea2c23a h1:K0EAzgzEQHW4Y5lxrmvPMltmlRDzlhLfGmots9EHUTI=
44
github.com/keybase/dbus v0.0.0-20220506165403-5aa21ea2c23a/go.mod h1:YPNKjjE7Ubp9dTbnWvsP3HT+hYnY6TfXzubYTBeUxc8=
5-
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
6-
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
75
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
86
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
97
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=

secretservice/dh_ietf1024_sha256_aes128_cbc_pkcs7.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ import (
1717
"crypto/cipher"
1818
cryptorand "crypto/rand"
1919
"crypto/sha256"
20+
"errors"
2021
"fmt"
2122
"io"
2223
"math/big"
2324

24-
errors "github.com/pkg/errors"
2525
"golang.org/x/crypto/hkdf"
2626
)
2727

secretservice/secretservice.go

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package secretservice
22

33
import (
4+
"errors"
5+
"fmt"
46
"math/big"
57
"time"
68

79
dbus "github.com/keybase/dbus"
8-
errors "github.com/pkg/errors"
910
)
1011

1112
// SecretServiceInterface
@@ -69,7 +70,7 @@ const DefaultSessionOpenTimeout = 10 * time.Second
6970
func NewService() (*SecretService, error) {
7071
conn, err := dbus.ConnectSessionBus()
7172
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)
7374
}
7475
signalCh := make(chan *dbus.Signal, 16)
7576
conn.Signal(signalCh)
@@ -101,7 +102,10 @@ func (s *SecretService) openSessionRaw(mode AuthenticationMode, sessionAlgorithm
101102
err = s.ServiceObj().
102103
Call("org.freedesktop.Secret.Service.OpenSession", NilFlags, mode, sessionAlgorithmInput).
103104
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
105109
}
106110

107111
// OpenSession
@@ -125,17 +129,17 @@ func (s *SecretService) OpenSession(mode AuthenticationMode) (session *Session,
125129
session.Public = public
126130
sessionAlgorithmInput = dbus.MakeVariant(public.Bytes()) // math/big.Int.Bytes is big endian
127131
default:
128-
return nil, errors.Errorf("unknown authentication mode %v", mode)
132+
return nil, fmt.Errorf("unknown authentication mode %v", mode)
129133
}
130134

131135
sessionOpenCh := make(chan sessionOpenResponse)
132136
errCh := make(chan error)
133137
go func() {
134-
sessionOpenResponse, err := s.openSessionRaw(mode, sessionAlgorithmInput)
138+
resp, err := s.openSessionRaw(mode, sessionAlgorithmInput)
135139
if err != nil {
136140
errCh <- err
137141
} else {
138-
sessionOpenCh <- sessionOpenResponse
142+
sessionOpenCh <- resp
139143
}
140144
}()
141145

@@ -152,15 +156,15 @@ func (s *SecretService) OpenSession(mode AuthenticationMode) (session *Session,
152156
case err := <-errCh:
153157
return nil, err
154158
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)
156160
}
157161

158162
switch mode {
159163
case AuthenticationInsecurePlain:
160164
case AuthenticationDHAES:
161165
theirPublicBigEndian, ok := sessionAlgorithmOutput.Value().([]byte)
162166
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")
164168
}
165169
group := rfc2409SecondOakleyGroup()
166170
theirPublic := new(big.Int)
@@ -171,7 +175,7 @@ func (s *SecretService) OpenSession(mode AuthenticationMode) (session *Session,
171175
}
172176
session.AESKey = aesKey
173177
default:
174-
return nil, errors.Errorf("unknown authentication mode %v", mode)
178+
return nil, fmt.Errorf("unknown authentication mode %v", mode)
175179
}
176180

177181
return session, nil
@@ -182,13 +186,13 @@ func (s *SecretService) CloseSession(session *Session) {
182186
s.Obj(session.Path).Call("org.freedesktop.Secret.Session.Close", NilFlags)
183187
}
184188

185-
// SearchColleciton
189+
// SearchCollection
186190
func (s *SecretService) SearchCollection(collection dbus.ObjectPath, attributes Attributes) (items []dbus.ObjectPath, err error) {
187191
err = s.Obj(collection).
188192
Call("org.freedesktop.Secret.Collection.SearchItems", NilFlags, attributes).
189193
Store(&items)
190194
if err != nil {
191-
return nil, errors.Wrap(err, "failed to search collection")
195+
return nil, fmt.Errorf("failed to search collection: %w", err)
192196
}
193197
return items, nil
194198
}
@@ -211,15 +215,15 @@ func (s *SecretService) CreateItem(collection dbus.ObjectPath, properties map[st
211215
case ReplaceBehaviorReplace:
212216
replace = true
213217
default:
214-
return "", errors.Errorf("unknown replace behavior %v", replaceBehavior)
218+
return "", fmt.Errorf("unknown replace behavior %d", replaceBehavior)
215219
}
216220

217221
var prompt dbus.ObjectPath
218222
err = s.Obj(collection).
219223
Call("org.freedesktop.Secret.Collection.CreateItem", NilFlags, properties, secret, replace).
220224
Store(&item, &prompt)
221225
if err != nil {
222-
return "", errors.Wrap(err, "failed to create item")
226+
return "", fmt.Errorf("failed to create item: %w", err)
223227
}
224228
_, err = s.PromptAndWait(prompt)
225229
if err != nil {
@@ -235,7 +239,7 @@ func (s *SecretService) DeleteItem(item dbus.ObjectPath) (err error) {
235239
Call("org.freedesktop.Secret.Item.Delete", NilFlags).
236240
Store(&prompt)
237241
if err != nil {
238-
return errors.Wrap(err, "failed to delete item")
242+
return fmt.Errorf("failed to delete item: %w", err)
239243
}
240244
_, err = s.PromptAndWait(prompt)
241245
if err != nil {
@@ -248,11 +252,11 @@ func (s *SecretService) DeleteItem(item dbus.ObjectPath) (err error) {
248252
func (s *SecretService) GetAttributes(item dbus.ObjectPath) (attributes Attributes, err error) {
249253
attributesV, err := s.Obj(item).GetProperty("org.freedesktop.Secret.Item.Attributes")
250254
if err != nil {
251-
return nil, errors.Wrap(err, "failed to get attributes")
255+
return nil, fmt.Errorf("failed to get attributes: %w", err)
252256
}
253257
attributesMap, ok := attributesV.Value().(map[string]string)
254258
if !ok {
255-
return nil, errors.Errorf("failed to coerce item attributes")
259+
return nil, errors.New("failed to coerce item attributes")
256260
}
257261
return Attributes(attributesMap), nil
258262
}
@@ -264,12 +268,12 @@ func (s *SecretService) GetSecret(item dbus.ObjectPath, session Session) (secret
264268
Call("org.freedesktop.Secret.Item.GetSecret", NilFlags, session.Path).
265269
Store(&secretI)
266270
if err != nil {
267-
return nil, errors.Wrap(err, "failed to get secret")
271+
return nil, fmt.Errorf("failed to get secret: %w", err)
268272
}
269273
secret := new(Secret)
270274
err = dbus.Store(secretI, &secret.Session, &secret.Parameters, &secret.Value, &secret.ContentType)
271275
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)
273277
}
274278

275279
switch session.Mode {
@@ -282,7 +286,7 @@ func (s *SecretService) GetSecret(item dbus.ObjectPath, session Session) (secret
282286
}
283287
secretPlaintext = plaintext
284288
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)
286290
}
287291

288292
return secretPlaintext, nil
@@ -299,11 +303,11 @@ func (s *SecretService) Unlock(items []dbus.ObjectPath) (err error) {
299303
Call("org.freedesktop.Secret.Service.Unlock", NilFlags, items).
300304
Store(&dummy, &prompt)
301305
if err != nil {
302-
return errors.Wrap(err, "failed to unlock items")
306+
return fmt.Errorf("failed to unlock items: %w", err)
303307
}
304308
_, err = s.PromptAndWait(prompt)
305309
if err != nil {
306-
return errors.Wrap(err, "failed to prompt")
310+
return fmt.Errorf("failed to prompt: %w", err)
307311
}
308312
return nil
309313
}
@@ -316,11 +320,11 @@ func (s *SecretService) LockItems(items []dbus.ObjectPath) (err error) {
316320
Call("org.freedesktop.Secret.Service.Lock", NilFlags, items).
317321
Store(&dummy, &prompt)
318322
if err != nil {
319-
return errors.Wrap(err, "failed to lock items")
323+
return fmt.Errorf("failed to lock items: %w", err)
320324
}
321325
_, err = s.PromptAndWait(prompt)
322326
if err != nil {
323-
return errors.Wrap(err, "failed to prompt")
327+
return fmt.Errorf("failed to prompt: %w", err)
324328
}
325329
return nil
326330
}
@@ -342,7 +346,7 @@ func (s *SecretService) PromptAndWait(prompt dbus.ObjectPath) (paths *dbus.Varia
342346
}
343347
call := s.Obj(prompt).Call("org.freedesktop.Secret.Prompt.Prompt", NilFlags, "Keyring Prompt")
344348
if call.Err != nil {
345-
return nil, errors.Wrap(err, "failed to prompt")
349+
return nil, fmt.Errorf("failed to prompt: %w", call.Err)
346350
}
347351
for {
348352
var result PromptCompletedResult
@@ -359,7 +363,7 @@ func (s *SecretService) PromptAndWait(prompt dbus.ObjectPath) (paths *dbus.Varia
359363
}
360364
err = dbus.Store(signal.Body, &result.Dismissed, &result.Paths)
361365
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)
363367
}
364368
if result.Dismissed {
365369
return nil, PromptDismissedError{errors.New("prompt dismissed")}
@@ -401,6 +405,6 @@ func (session *Session) NewSecret(secretBytes []byte) (Secret, error) {
401405
ContentType: "application/octet-stream",
402406
}, nil
403407
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)
405409
}
406410
}

0 commit comments

Comments
 (0)