address comments and add some tests
License: MIT Signed-off-by: Jeromy <why@ipfs.io>
Jeromy committed
Dec 6, 2016 at 11:20 UTC
e8b20b9283e6d0846a7fb89d0d398318ccc2e8fc
2 files changed
+179
keystore/keystore.go
+2
@@ -69,6 +69,8 @@ func (ks *FSKeystore) Put(name string, k ci.PrivKey) error {
69
_, err = os.Stat(kp)
70
if err == nil {
71
return ErrKeyExists
72
+ } else if !os.IsNotExist(err) {
73
+ return err
74
}
75
76
fi, err := os.Create(kp)
keystore/keystore_test.go
new
+177
@@ -0,0 +1,177 @@
1
+package keystore
2
+
3
+import (
4
+ "fmt"
5
+ "io/ioutil"
6
+ "math/rand"
7
+ "sort"
8
+ "testing"
9
+
10
+ ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto"
11
+)
12
+
13
+type rr struct{}
14
+
15
+func (rr rr) Read(b []byte) (int, error) {
16
+ return rand.Read(b)
17
+}
18
+
19
+func privKeyOrFatal(t *testing.T) ci.PrivKey {
20
+ priv, _, err := ci.GenerateEd25519Key(rr{})
21
+ if err != nil {
22
+ t.Fatal(err)
23
+ }
24
+ return priv
25
+}
26
+
27
+func TestKeystoreBasics(t *testing.T) {
28
+ tdir, err := ioutil.TempDir("", "keystore-test")
29
+ if err != nil {
30
+ t.Fatal(err)
31
+ }
32
+
33
+ ks, err := NewFSKeystore(tdir)
34
+ if err != nil {
35
+ t.Fatal(err)
36
+ }
37
+
38
+ l, err := ks.List()
39
+ if err != nil {
40
+ t.Fatal(err)
41
+ }
42
+
43
+ if len(l) != 0 {
44
+ t.Fatal("expected no keys")
45
+ }
46
+
47
+ k1 := privKeyOrFatal(t)
48
+ k2 := privKeyOrFatal(t)
49
+ k3 := privKeyOrFatal(t)
50
+ k4 := privKeyOrFatal(t)
51
+
52
+ err = ks.Put("foo", k1)
53
+ if err != nil {
54
+ t.Fatal(err)
55
+ }
56
+
57
+ err = ks.Put("bar", k2)
58
+ if err != nil {
59
+ t.Fatal(err)
60
+ }
61
+
62
+ l, err = ks.List()
63
+ if err != nil {
64
+ t.Fatal(err)
65
+ }
66
+
67
+ sort.Strings(l)
68
+ if l[0] != "bar" || l[1] != "foo" {
69
+ t.Fatal("wrong entries listed")
70
+ }
71
+
72
+ if err := assertDirContents(tdir, []string{"foo", "bar"}); err != nil {
73
+ t.Fatal(err)
74
+ }
75
+
76
+ err = ks.Put("foo", k3)
77
+ if err == nil {
78
+ t.Fatal("should not be able to overwrite key")
79
+ }
80
+
81
+ if err := assertDirContents(tdir, []string{"foo", "bar"}); err != nil {
82
+ t.Fatal(err)
83
+ }
84
+
85
+ if err := ks.Delete("bar"); err != nil {
86
+ t.Fatal(err)
87
+ }
88
+
89
+ if err := assertDirContents(tdir, []string{"foo"}); err != nil {
90
+ t.Fatal(err)
91
+ }
92
+
93
+ if err := ks.Put("beep", k3); err != nil {
94
+ t.Fatal(err)
95
+ }
96
+
97
+ if err := ks.Put("boop", k4); err != nil {
98
+ t.Fatal(err)
99
+ }
100
+
101
+ if err := assertDirContents(tdir, []string{"foo", "beep", "boop"}); err != nil {
102
+ t.Fatal(err)
103
+ }
104
+
105
+ if err := assertGetKey(ks, "foo", k1); err != nil {
106
+ t.Fatal(err)
107
+ }
108
+
109
+ if err := assertGetKey(ks, "beep", k3); err != nil {
110
+ t.Fatal(err)
111
+ }
112
+
113
+ if err := assertGetKey(ks, "boop", k4); err != nil {
114
+ t.Fatal(err)
115
+ }
116
+
117
+ if err := ks.Put("..///foo/", k1); err == nil {
118
+ t.Fatal("shouldnt be able to put a poorly named key")
119
+ }
120
+
121
+ if err := ks.Put("", k1); err == nil {
122
+ t.Fatal("shouldnt be able to put a key with no name")
123
+ }
124
+
125
+ if err := ks.Put(".foo", k1); err == nil {
126
+ t.Fatal("shouldnt be able to put a key with a 'hidden' name")
127
+ }
128
+}
129
+
130
+func TestMakeKeystoreNoDir(t *testing.T) {
131
+ _, err := NewFSKeystore("/this/is/not/a/real/dir")
132
+ if err == nil {
133
+ t.Fatal("shouldnt be able to make a keystore in a nonexistant directory")
134
+ }
135
+}
136
+
137
+func assertGetKey(ks Keystore, name string, exp ci.PrivKey) error {
138
+ out_k, err := ks.Get(name)
139
+ if err != nil {
140
+ return err
141
+ }
142
+
143
+ if !out_k.Equals(exp) {
144
+ return fmt.Errorf("key we got out didnt match expectation")
145
+ }
146
+
147
+ return nil
148
+}
149
+
150
+func assertDirContents(dir string, exp []string) error {
151
+ finfos, err := ioutil.ReadDir(dir)
152
+ if err != nil {
153
+ return err
154
+ }
155
+
156
+ if len(finfos) != len(exp) {
157
+ return fmt.Errorf("Expected %d directory entries", len(exp))
158
+ }
159
+
160
+ var names []string
161
+ for _, fi := range finfos {
162
+ names = append(names, fi.Name())
163
+ }
164
+
165
+ sort.Strings(names)
166
+ sort.Strings(exp)
167
+ if len(names) != len(exp) {
168
+ return fmt.Errorf("directory had wrong number of entries in it")
169
+ }
170
+
171
+ for i, v := range names {
172
+ if v != exp[i] {
173
+ return fmt.Errorf("had wrong entry in directory")
174
+ }
175
+ }
176
+ return nil
177
+}