diff --git a/wincred/wincred_windows.go b/wincred/wincred_windows.go index 294c939..584440b 100644 --- a/wincred/wincred_windows.go +++ b/wincred/wincred_windows.go @@ -3,6 +3,8 @@ package wincred import ( winc "github.com/danieljoos/wincred" "github.com/docker/docker-credential-helpers/credentials" + "bytes" + "strings" ) // Wincred handles secrets using the Windows credential service. @@ -14,6 +16,8 @@ func (h Wincred) Add(creds *credentials.Credentials) error { g.UserName = creds.Username g.CredentialBlob = []byte(creds.Secret) g.Persist = winc.PersistLocalMachine + g.Attributes = []winc.CredentialAttribute{winc.CredentialAttribute{"label", []byte(creds.Label)}} + return g.Write() } @@ -38,8 +42,8 @@ func (h Wincred) Get(serverURL string) (string, string, error) { return g.UserName, string(g.CredentialBlob), nil } -// List returns the stored URLs and corresponding usernames. -func (h Wincred) List() (map[string]string, error) { +// List returns the stored URLs and corresponding usernames for a given credentials label. +func (h Wincred) List(credsLabel string) (map[string]string, error) { creds, err := winc.List() if err != nil { return nil, err @@ -47,7 +51,16 @@ func (h Wincred) List() (map[string]string, error) { resp := make(map[string]string) for i := range creds { - resp[creds[i].TargetName] = creds[i].UserName + attrs = creds[i].Attributes + for _, attr := range attrs { + if !strings.Compare(attr.Keyword, "label") && + !bytes.Compare(attr.Value, []byte(credentials.CredsLabel)) { + + resp[creds[i].TargetName] = creds[i].UserName + } + } + } + return resp, nil } diff --git a/wincred/wincred_windows_test.go b/wincred/wincred_windows_test.go index 01f6e59..17eb243 100644 --- a/wincred/wincred_windows_test.go +++ b/wincred/wincred_windows_test.go @@ -8,11 +8,13 @@ import ( func TestWinCredHelper(t *testing.T) { creds := &credentials.Credentials{ + Label: credentials.CredsLabel, ServerURL: "https://foobar.docker.io:2376/v1", Username: "foobar", Secret: "foobarbaz", } creds1 := &credentials.Credentials{ + Label: credentials.CredsLabel, ServerURL: "https://foobar.docker.io:2376/v2", Username: "foobarbaz", Secret: "foobar", @@ -36,14 +38,14 @@ func TestWinCredHelper(t *testing.T) { t.Fatalf("expected %s, got %s\n", "foobarbaz", secret) } - auths, err := helper.List() + auths, err := helper.List(credentials.CredsLabel) if err != nil || len(auths) == 0 { t.Fatal(err) } helper.Add(creds1) defer helper.Delete(creds1.ServerURL) - newauths, err := helper.List() + newauths, err := helper.List(credentials.CredsLabel) if err != nil { t.Fatal(err) }