Skip to content

Commit 7220cea

Browse files
authored
Merge pull request #437 from docker/store/factory
feat: factory function provides more context
2 parents e4471d6 + ad9ccda commit 7220cea

10 files changed

Lines changed: 46 additions & 43 deletions

File tree

plugins/pass/store/store.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package store
22

33
import (
4+
"context"
5+
46
"github.com/docker/secrets-engine/store"
57
"github.com/docker/secrets-engine/store/keychain"
68
)
@@ -32,7 +34,7 @@ func PassStore(serviceGroup string, opts ...keychain.Option) (store.Store, error
3234
kc, err := keychain.New(
3335
serviceGroup,
3436
"docker-pass-cli",
35-
func() *PassValue {
37+
func(_ context.Context, _ store.ID) *PassValue {
3638
return &PassValue{}
3739
},
3840
opts...,

store/keychain/cmd/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ func newCommand() (*cobra.Command, error) {
2020
kc, err := keychain.New(
2121
"io.docker.Secrets",
2222
"docker-example-cli",
23-
func() *mocks.MockCredential {
23+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
2424
return &mocks.MockCredential{}
2525
},
2626
)

store/keychain/keychain_darwin.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ var (
1919
type keychainStore[T store.Secret] struct {
2020
serviceGroup string
2121
serviceName string
22-
factory func() T
22+
factory store.Factory[T]
2323
useDataProtectionKeychain bool
2424
}
2525

@@ -102,7 +102,7 @@ func (k *keychainStore[T]) Delete(_ context.Context, id store.ID) error {
102102
return nil
103103
}
104104

105-
func (k *keychainStore[T]) Get(_ context.Context, id store.ID) (store.Secret, error) {
105+
func (k *keychainStore[T]) Get(ctx context.Context, id store.ID) (store.Secret, error) {
106106
result, err := getItemWithData(id.String(), k)
107107
if err != nil {
108108
return nil, err
@@ -114,7 +114,7 @@ func (k *keychainStore[T]) Get(_ context.Context, id store.ID) (store.Secret, er
114114
}
115115
safelyCleanMetadata(attributes)
116116

117-
secret := k.factory()
117+
secret := k.factory(ctx, id)
118118
if err := secret.SetMetadata(attributes); err != nil {
119119
return nil, err
120120
}
@@ -124,7 +124,7 @@ func (k *keychainStore[T]) Get(_ context.Context, id store.ID) (store.Secret, er
124124
return secret, nil
125125
}
126126

127-
func (k *keychainStore[T]) GetAllMetadata(context.Context) (map[store.ID]store.Secret, error) {
127+
func (k *keychainStore[T]) GetAllMetadata(ctx context.Context) (map[store.ID]store.Secret, error) {
128128
item := newKeychainItem("", k)
129129

130130
// We use the MatchLimitAll attribute to query for multiple items from the
@@ -149,7 +149,7 @@ func (k *keychainStore[T]) GetAllMetadata(context.Context) (map[store.ID]store.S
149149
}
150150
safelyCleanMetadata(attributes)
151151

152-
secret := k.factory()
152+
secret := k.factory(ctx, id)
153153
if err := secret.SetMetadata(attributes); err != nil {
154154
return nil, err
155155
}
@@ -184,7 +184,7 @@ func (k *keychainStore[T]) Save(_ context.Context, id store.ID, secret store.Sec
184184
return mapKeychainError(kc.AddItem(item))
185185
}
186186

187-
func (k *keychainStore[T]) Filter(_ context.Context, pattern store.Pattern) (map[store.ID]store.Secret, error) {
187+
func (k *keychainStore[T]) Filter(ctx context.Context, pattern store.Pattern) (map[store.ID]store.Secret, error) {
188188
// Note: Filter on macOS cannot filter by generic attributes and thus we
189189
// cannot split the ID and store it in the keychain as parts for later
190190
// pattern matching.
@@ -242,7 +242,7 @@ func (k *keychainStore[T]) Filter(_ context.Context, pattern store.Pattern) (map
242242
return nil, err
243243
}
244244

245-
secret := k.factory()
245+
secret := k.factory(ctx, id)
246246
if err := secret.SetMetadata(attr); err != nil {
247247
return nil, err
248248
}

store/keychain/keychain_darwin_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package keychain
44

55
import (
66
"bytes"
7+
"context"
78
"testing"
89

910
"github.com/google/uuid"
@@ -22,7 +23,7 @@ func TestMacosKeychain(t *testing.T) {
2223
keychainStore := keychainStore[*mocks.MockCredential]{
2324
serviceGroup: serviceGroup,
2425
serviceName: serviceName,
25-
factory: func() *mocks.MockCredential {
26+
factory: func(_ context.Context, _ store.ID) *mocks.MockCredential {
2627
return &mocks.MockCredential{}
2728
},
2829
}

store/keychain/keychain_linux.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func isCollectionUnlocked(collectionPath dbus.ObjectPath, service *kc.SecretServ
9797
type keychainStore[T store.Secret] struct {
9898
serviceGroup string
9999
serviceName string
100-
factory func() T
100+
factory store.Factory[T]
101101
}
102102

103103
func (k *keychainStore[T]) Delete(_ context.Context, id store.ID) error {
@@ -143,7 +143,7 @@ func (k *keychainStore[T]) Delete(_ context.Context, id store.ID) error {
143143
return service.DeleteItem(items[0])
144144
}
145145

146-
func (k *keychainStore[T]) Get(_ context.Context, id store.ID) (store.Secret, error) {
146+
func (k *keychainStore[T]) Get(ctx context.Context, id store.ID) (store.Secret, error) {
147147
service, err := kc.NewService()
148148
if err != nil {
149149
return nil, err
@@ -193,7 +193,7 @@ func (k *keychainStore[T]) Get(_ context.Context, id store.ID) (store.Secret, er
193193
if err != nil {
194194
return nil, err
195195
}
196-
secret := k.factory()
196+
secret := k.factory(ctx, id)
197197
if err := secret.SetMetadata(attributes); err != nil {
198198
return nil, err
199199
}
@@ -204,7 +204,7 @@ func (k *keychainStore[T]) Get(_ context.Context, id store.ID) (store.Secret, er
204204
return secret, nil
205205
}
206206

207-
func (k *keychainStore[T]) GetAllMetadata(context.Context) (map[store.ID]store.Secret, error) {
207+
func (k *keychainStore[T]) GetAllMetadata(ctx context.Context) (map[store.ID]store.Secret, error) {
208208
service, err := kc.NewService()
209209
if err != nil {
210210
return nil, err
@@ -261,7 +261,7 @@ func (k *keychainStore[T]) GetAllMetadata(context.Context) (map[store.ID]store.S
261261
}
262262
safelyCleanMetadata(attributes)
263263

264-
secret := k.factory()
264+
secret := k.factory(ctx, secretID)
265265
if err := secret.SetMetadata(attributes); err != nil {
266266
return nil, err
267267
}
@@ -326,7 +326,7 @@ func (k *keychainStore[T]) Save(_ context.Context, id store.ID, secret store.Sec
326326
}
327327

328328
//gocyclo:ignore
329-
func (k *keychainStore[T]) Filter(_ context.Context, pattern store.Pattern) (map[store.ID]store.Secret, error) {
329+
func (k *keychainStore[T]) Filter(ctx context.Context, pattern store.Pattern) (map[store.ID]store.Secret, error) {
330330
service, err := kc.NewService()
331331
if err != nil {
332332
return nil, err
@@ -402,7 +402,7 @@ func (k *keychainStore[T]) Filter(_ context.Context, pattern store.Pattern) (map
402402
}
403403
safelyCleanMetadata(attributes)
404404

405-
secret := k.factory()
405+
secret := k.factory(ctx, secretID)
406406
if err := secret.SetMetadata(attributes); err != nil {
407407
return nil, err
408408
}

store/keychain/keychain_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ func (m *mustUnmarshalError) Unmarshal([]byte) error {
5050
return errors.New("i am failing on purpose")
5151
}
5252

53-
func setupKeychain(t *testing.T, secretFactory func() store.Secret) store.Store {
53+
func setupKeychain(t *testing.T, secretFactory func(context.Context, store.ID) store.Secret) store.Store {
5454
t.Helper()
5555
if secretFactory == nil {
56-
secretFactory = func() store.Secret {
56+
secretFactory = func(_ context.Context, _ store.ID) store.Secret {
5757
return &mocks.MockCredential{}
5858
}
5959
}
@@ -266,7 +266,7 @@ func TestKeychain(t *testing.T) {
266266
})
267267

268268
t.Run("unmarshal error on get", func(t *testing.T) {
269-
kc := setupKeychain(t, func() store.Secret {
269+
kc := setupKeychain(t, func(_ context.Context, _ store.ID) store.Secret {
270270
return &mustUnmarshalError{}
271271
})
272272
id, err := store.ParseID("something/will/fail")
@@ -280,7 +280,7 @@ func TestKeychain(t *testing.T) {
280280
})
281281

282282
t.Run("set metadata error on getAllMetadata", func(t *testing.T) {
283-
kc := setupKeychain(t, func() store.Secret {
283+
kc := setupKeychain(t, func(_ context.Context, _ store.ID) store.Secret {
284284
return &mustUnmarshalError{}
285285
})
286286
id, err := store.ParseID("something/will/fail")

store/keychain/keychain_windows.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func decodeSecret(blob []byte, secret store.Secret) error {
5454
type keychainStore[T store.Secret] struct {
5555
serviceGroup string
5656
serviceName string
57-
factory func() T
57+
factory store.Factory[T]
5858
}
5959

6060
func (k *keychainStore[T]) Delete(_ context.Context, id store.ID) error {
@@ -66,7 +66,7 @@ func (k *keychainStore[T]) Delete(_ context.Context, id store.ID) error {
6666
return nil
6767
}
6868

69-
func (k *keychainStore[T]) Get(_ context.Context, id store.ID) (store.Secret, error) {
69+
func (k *keychainStore[T]) Get(ctx context.Context, id store.ID) (store.Secret, error) {
7070
gc, err := wincred.GetGenericCredential(k.itemLabel(id.String()))
7171
if err != nil {
7272
return nil, mapWindowsCredentialError(err)
@@ -75,7 +75,7 @@ func (k *keychainStore[T]) Get(_ context.Context, id store.ID) (store.Secret, er
7575
attributes := mapFromWindowsAttributes(gc.Attributes)
7676
safelyCleanMetadata(attributes)
7777

78-
secret := k.factory()
78+
secret := k.factory(ctx, id)
7979
if err := secret.SetMetadata(attributes); err != nil {
8080
return nil, err
8181
}
@@ -148,7 +148,7 @@ func mapFromWindowsAttributes(winAttrs []wincred.CredentialAttribute) map[string
148148
return attributes
149149
}
150150

151-
func (k *keychainStore[T]) GetAllMetadata(context.Context) (map[store.ID]store.Secret, error) {
151+
func (k *keychainStore[T]) GetAllMetadata(ctx context.Context) (map[store.ID]store.Secret, error) {
152152
credentials, err := wincred.List()
153153
if err != nil {
154154
return nil, mapWindowsCredentialError(err)
@@ -169,7 +169,7 @@ func (k *keychainStore[T]) GetAllMetadata(context.Context) (map[store.ID]store.S
169169
attributes := mapFromWindowsAttributes(cred.Attributes)
170170
safelyCleanMetadata(attributes)
171171

172-
secret := k.factory()
172+
secret := k.factory(ctx, id)
173173
if err := secret.SetMetadata(attributes); err != nil {
174174
return nil, err
175175
}
@@ -198,7 +198,7 @@ func (k *keychainStore[T]) Save(_ context.Context, id store.ID, secret store.Sec
198198
return mapWindowsCredentialError(g.Write())
199199
}
200200

201-
func (k *keychainStore[T]) Filter(_ context.Context, pattern store.Pattern) (map[store.ID]store.Secret, error) {
201+
func (k *keychainStore[T]) Filter(ctx context.Context, pattern store.Pattern) (map[store.ID]store.Secret, error) {
202202
// Note: there is no notion of a filter on Windows inside the wincred API.
203203
// It has no way to even filter on known attributes.
204204
// This means we need to retrieve the entire list of ALL secrets, that
@@ -241,7 +241,7 @@ func (k *keychainStore[T]) Filter(_ context.Context, pattern store.Pattern) (map
241241
gcAttributes := mapFromWindowsAttributes(gc.Attributes)
242242
safelyCleanMetadata(gcAttributes)
243243

244-
secret := k.factory()
244+
secret := k.factory(ctx, id)
245245
if err := secret.SetMetadata(gcAttributes); err != nil {
246246
return nil, err
247247
}

store/posixage/store.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ func (f *fileStore[T]) Filter(ctx context.Context, pattern store.Pattern) (map[s
201201
return err
202202
}
203203

204-
secret := f.factory()
204+
secret := f.factory(ctx, id)
205205
if err := secret.SetMetadata(metadata); err != nil {
206206
return err
207207
}
@@ -241,7 +241,7 @@ func (f *fileStore[T]) Get(ctx context.Context, id store.ID) (store.Secret, erro
241241
return nil, err
242242
}
243243

244-
secret := f.factory()
244+
secret := f.factory(ctx, id)
245245
if err := secret.SetMetadata(metadata); err != nil {
246246
return nil, err
247247
}
@@ -286,7 +286,7 @@ func (f *fileStore[T]) GetAllMetadata(ctx context.Context) (map[store.ID]store.S
286286
return err
287287
}
288288

289-
secret := f.factory()
289+
secret := f.factory(ctx, id)
290290
if err := secret.SetMetadata(metadata); err != nil {
291291
return err
292292
}

store/posixage/store_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func TestPOSIXAge(t *testing.T) {
7070

7171
masterKey := uuid.NewString()
7272
s, err := New(root,
73-
func() *mocks.MockCredential {
73+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
7474
return &mocks.MockCredential{}
7575
},
7676
WithLogger(&testLogger{t}),
@@ -143,7 +143,7 @@ func TestPOSIXAge(t *testing.T) {
143143

144144
masterKey := uuid.NewString()
145145
s, err := New(root,
146-
func() *mocks.MockCredential {
146+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
147147
return &mocks.MockCredential{}
148148
},
149149
WithLogger(&testLogger{t}),
@@ -182,7 +182,7 @@ func TestPOSIXAge(t *testing.T) {
182182

183183
masterKey := uuid.NewString()
184184
s, err := New(root,
185-
func() *mocks.MockCredential {
185+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
186186
return &mocks.MockCredential{}
187187
},
188188
WithLogger(&testLogger{t}),
@@ -240,7 +240,7 @@ func TestPOSIXAge(t *testing.T) {
240240

241241
masterKey := uuid.NewString()
242242
s, err := New(root,
243-
func() *mocks.MockCredential {
243+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
244244
return &mocks.MockCredential{}
245245
},
246246
WithLogger(&testLogger{t}),
@@ -301,7 +301,7 @@ func TestPOSIXAge(t *testing.T) {
301301
require.NoError(t, err)
302302

303303
s, err := New(root,
304-
func() *mocks.MockCredential {
304+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
305305
return &mocks.MockCredential{}
306306
},
307307
WithLogger(&testLogger{t}),
@@ -384,7 +384,7 @@ func TestPOSIXAge(t *testing.T) {
384384
require.NoError(t, err)
385385

386386
s, err := New(root,
387-
func() *mocks.MockCredential {
387+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
388388
return &mocks.MockCredential{}
389389
},
390390
WithLogger(&testLogger{t}),
@@ -463,7 +463,7 @@ func TestPOSIXAge(t *testing.T) {
463463
})
464464

465465
s, err := New(root,
466-
func() *mocks.MockCredential {
466+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
467467
return &mocks.MockCredential{}
468468
},
469469
WithLogger(&testLogger{t}),
@@ -530,7 +530,7 @@ func TestPOSIXAge(t *testing.T) {
530530
require.NoError(t, err)
531531

532532
s, err := New(root,
533-
func() *mocks.MockCredential {
533+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
534534
return &mocks.MockCredential{}
535535
},
536536
WithLogger(&testLogger{t}),
@@ -602,7 +602,7 @@ func TestPOSIXAge(t *testing.T) {
602602
})
603603

604604
s, err := New(root,
605-
func() *mocks.MockCredential {
605+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
606606
return &mocks.MockCredential{}
607607
},
608608
WithLogger(&testLogger{t}),
@@ -651,7 +651,7 @@ func TestPOSIXAge(t *testing.T) {
651651

652652
encryptError := errors.New("something went wrong inside the encryption callbackFunc")
653653
s, err := New(root,
654-
func() *mocks.MockCredential {
654+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
655655
return &mocks.MockCredential{}
656656
},
657657
WithLogger(&testLogger{t}),
@@ -684,7 +684,7 @@ func TestPOSIXAge(t *testing.T) {
684684

685685
decryptError := errors.New("something went wrong inside the decryption callbackFunc")
686686
s, err := New(root,
687-
func() *mocks.MockCredential {
687+
func(_ context.Context, _ store.ID) *mocks.MockCredential {
688688
return &mocks.MockCredential{}
689689
},
690690
WithLogger(&testLogger{t}),

store/store.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,4 @@ type Store interface {
7878
Filter(ctx context.Context, pattern Pattern) (map[ID]Secret, error)
7979
}
8080

81-
type Factory[T Secret] func() T
81+
type Factory[T Secret] func(context.Context, ID) T

0 commit comments

Comments
 (0)