Skip to content

Commit 5a3e1bb

Browse files
committed
pass: base64 encoded username with backward compatility
Signed-off-by: CrazyMax <[email protected]>
1 parent 7f4fa5e commit 5a3e1bb

File tree

2 files changed

+79
-28
lines changed

2 files changed

+79
-28
lines changed

pass/pass.go

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,9 @@ func (p Pass) Add(creds *credentials.Credentials) error {
8787
return errors.New("missing credentials")
8888
}
8989

90-
encoded := base64.URLEncoding.EncodeToString([]byte(creds.ServerURL))
91-
92-
username := creds.Username
93-
if strings.Contains(username, "/") {
94-
username = base64.URLEncoding.EncodeToString([]byte(creds.Username))
95-
}
96-
97-
_, err := p.runPass(creds.Secret, "insert", "-f", "-m", path.Join(PASS_FOLDER, encoded, username))
90+
encodedServerURL := base64.URLEncoding.EncodeToString([]byte(creds.ServerURL))
91+
encodedUsername := base64.URLEncoding.EncodeToString([]byte(creds.Username))
92+
_, err := p.runPass(creds.Secret, "insert", "-f", "-m", path.Join(PASS_FOLDER, encodedServerURL, encodedUsername))
9893
return err
9994
}
10095

@@ -104,8 +99,8 @@ func (p Pass) Delete(serverURL string) error {
10499
return errors.New("missing server url")
105100
}
106101

107-
encoded := base64.URLEncoding.EncodeToString([]byte(serverURL))
108-
_, err := p.runPass("", "rm", "-rf", path.Join(PASS_FOLDER, encoded))
102+
encodedServerURL := base64.URLEncoding.EncodeToString([]byte(serverURL))
103+
_, err := p.runPass("", "rm", "-rf", path.Join(PASS_FOLDER, encodedServerURL))
109104
return err
110105
}
111106

@@ -147,17 +142,16 @@ func (p Pass) Get(serverURL string) (string, string, error) {
147142
return "", "", errors.New("missing server url")
148143
}
149144

150-
encoded := base64.URLEncoding.EncodeToString([]byte(serverURL))
151-
152-
if _, err := os.Stat(path.Join(getPassDir(), PASS_FOLDER, encoded)); err != nil {
145+
encodedServerURL := base64.URLEncoding.EncodeToString([]byte(serverURL))
146+
if _, err := os.Stat(path.Join(getPassDir(), PASS_FOLDER, encodedServerURL)); err != nil {
153147
if os.IsNotExist(err) {
154148
return "", "", credentials.NewErrCredentialsNotFound()
155149
}
156150

157151
return "", "", err
158152
}
159153

160-
usernames, err := listPassDir(encoded)
154+
usernames, err := listPassDir(encodedServerURL)
161155
if err != nil {
162156
return "", "", err
163157
}
@@ -168,11 +162,10 @@ func (p Pass) Get(serverURL string) (string, string, error) {
168162

169163
actual := strings.TrimSuffix(usernames[0].Name(), ".gpg")
170164
username := actual
171-
decodedUsername, err := base64.URLEncoding.DecodeString(actual)
172-
if err == nil {
165+
if decodedUsername, err := base64.URLEncoding.DecodeString(actual); err == nil {
173166
username = string(decodedUsername)
174167
}
175-
secret, err := p.runPass("", "show", path.Join(PASS_FOLDER, encoded, actual))
168+
secret, err := p.runPass("", "show", path.Join(PASS_FOLDER, encodedServerURL, actual))
176169
return username, secret, err
177170
}
178171

@@ -204,9 +197,9 @@ func (p Pass) List() (map[string]string, error) {
204197
return nil, fmt.Errorf("no usernames for %s", serverURL)
205198
}
206199

207-
resp[string(serverURL)] = strings.TrimSuffix(usernames[0].Name(), ".gpg")
208-
decodedUsername, err := base64.URLEncoding.DecodeString(strings.TrimSuffix(usernames[0].Name(), ".gpg"))
209-
if err == nil {
200+
username := strings.TrimSuffix(usernames[0].Name(), ".gpg")
201+
resp[string(serverURL)] = username
202+
if decodedUsername, err := base64.URLEncoding.DecodeString(username); err == nil {
210203
resp[string(serverURL)] = string(decodedUsername)
211204
}
212205
}

pass/pass_test.go

Lines changed: 66 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,76 @@
33
package pass
44

55
import (
6+
"encoding/base64"
7+
"path"
68
"strings"
79
"testing"
810

911
"github.com/docker/docker-credential-helpers/credentials"
1012
)
1113

14+
func TestPassHelperCheckInit(t *testing.T) {
15+
helper := Pass{}
16+
if v := helper.CheckInitialized(); !v {
17+
t.Errorf("expected true, actual: %v", v)
18+
}
19+
}
20+
1221
func TestPassHelper(t *testing.T) {
22+
tests := []struct {
23+
name string
24+
creds *credentials.Credentials
25+
}{
26+
{
27+
name: "create nothing",
28+
creds: &credentials.Credentials{
29+
ServerURL: "https://foobar.docker.io:2376/v1",
30+
Username: "nothing",
31+
Secret: "isthebestmeshuggahalbum",
32+
},
33+
},
34+
{
35+
name: "create foo/bar",
36+
creds: &credentials.Credentials{
37+
ServerURL: "https://foobar.docker.io:2376/v1",
38+
Username: "foo/bar",
39+
Secret: "foobarbaz",
40+
},
41+
},
42+
}
43+
44+
helper := Pass{}
45+
if err := helper.checkInitialized(); err != nil {
46+
t.Error(err)
47+
}
48+
49+
for _, tc := range tests {
50+
tc := tc
51+
t.Run(tc.name, func(t *testing.T) {
52+
if err := helper.Add(tc.creds); err != nil {
53+
t.Error(err)
54+
}
55+
u, s, err := helper.Get(tc.creds.ServerURL)
56+
if err != nil {
57+
t.Error(err)
58+
}
59+
if u != tc.creds.Username {
60+
t.Errorf("invalid username %s", u)
61+
}
62+
if s != tc.creds.Secret {
63+
t.Errorf("invalid secret: %s", s)
64+
}
65+
if err := helper.Delete(tc.creds.ServerURL); err != nil {
66+
t.Error(err)
67+
}
68+
if _, _, err := helper.Get(tc.creds.ServerURL); !credentials.IsErrCredentialsNotFound(err) {
69+
t.Errorf("expected credentials not found, actual: %v", err)
70+
}
71+
})
72+
}
73+
}
74+
75+
func TestPassHelperBackwardCompat(t *testing.T) {
1376
creds := &credentials.Credentials{
1477
ServerURL: "https://foobar.docker.io:2376/v1",
1578
Username: "nothing",
@@ -21,7 +84,9 @@ func TestPassHelper(t *testing.T) {
2184
t.Error(err)
2285
}
2386

24-
if err := helper.Add(creds); err != nil {
87+
// add a credential with the old format
88+
encodedServerURL := base64.URLEncoding.EncodeToString([]byte(creds.ServerURL))
89+
if _, err := helper.runPass(creds.Secret, "insert", "-f", "-m", path.Join(PASS_FOLDER, encodedServerURL, creds.Username)); err != nil {
2590
t.Error(err)
2691
}
2792

@@ -44,13 +109,6 @@ func TestPassHelper(t *testing.T) {
44109
}
45110
}
46111

47-
func TestPassHelperCheckInit(t *testing.T) {
48-
helper := Pass{}
49-
if v := helper.CheckInitialized(); !v {
50-
t.Errorf("expected true, actual: %v", v)
51-
}
52-
}
53-
54112
func TestPassHelperList(t *testing.T) {
55113
creds := []*credentials.Credentials{
56114
{

0 commit comments

Comments
 (0)