-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfakevault.go
83 lines (68 loc) · 1.53 KB
/
fakevault.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package keyfob
import (
"errors"
"sync"
"github.com/google/uuid"
)
var errUserNotFound = errors.New("User not found")
var errKeyNotFound = errors.New("Key not found")
func newFakeVault() KeyVault {
return &fakeKeyVault{
Keys: make(map[uuid.UUID]map[string][]byte),
}
}
type fakeKeyVault struct {
Keys map[uuid.UUID]map[string][]byte
lock sync.RWMutex
}
func (v *fakeKeyVault) ListKeys(userid uuid.UUID) ([]*StoredKey, error) {
userKeys := v.Keys[userid]
if userKeys == nil {
return nil, errUserNotFound
}
keys := make([]*StoredKey, len(userKeys))
i := 0
for category, key := range userKeys {
keys[i] = &StoredKey{
Key: key,
User: userid,
Category: category,
}
i++
}
return keys, nil
}
func (v *fakeKeyVault) GetKey(userid uuid.UUID, category string) (*StoredKey, error) {
userKeys := v.Keys[userid]
if userKeys == nil {
return nil, errUserNotFound
}
key := userKeys[category]
if key == nil {
return nil, errKeyNotFound
}
return &StoredKey{
Key: key,
User: userid,
Category: category,
}, nil
}
func (v *fakeKeyVault) InsertKey(userid uuid.UUID, category string, key []byte) error {
v.lock.Lock()
if _, found := v.Keys[userid]; !found {
v.Keys[userid] = make(map[string][]byte)
}
if _, found := v.Keys[userid][category]; !found {
v.Keys[userid][category] = key
}
v.lock.Unlock()
return nil
}
func (v *fakeKeyVault) DeleteKey(userid uuid.UUID, category string) error {
userKeys := v.Keys[userid]
if userKeys == nil {
return nil
}
userKeys[category] = nil
return nil
}