forked from gopasspw/gopass
/
secret.go
143 lines (128 loc) · 2.66 KB
/
secret.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package vault
import (
"bytes"
"errors"
"sort"
"strings"
"github.com/gopasspw/gopass/pkg/store"
)
// Secret is a vault secret
type Secret struct {
d map[string]interface{}
}
// Body always returns the empty string
func (s *Secret) Body() string {
return ""
}
// Bytes returns a list serialized copy of this secret
func (s *Secret) Bytes() ([]byte, error) {
if s.d == nil {
return []byte{}, nil
}
buf := &bytes.Buffer{}
if pw, found := s.d[passwordKey]; found {
if sv, ok := pw.(string); ok {
_, _ = buf.WriteString(sv)
}
}
_, _ = buf.WriteString("\n")
keys := make([]string, 0, len(s.d))
for k := range s.d {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
v := s.d[k]
if k == passwordKey {
continue
}
_, _ = buf.WriteString(k)
_, _ = buf.WriteString(": ")
if sv, ok := v.(string); ok {
_, _ = buf.WriteString(sv)
}
_, _ = buf.WriteString("\n")
}
return buf.Bytes(), nil
}
// Data returns the data map. Will never be nil
func (s *Secret) Data() map[string]interface{} {
if s.d == nil {
s.d = make(map[string]interface{})
}
return s.d
}
// DeleteKey removes a single key
func (s *Secret) DeleteKey(key string) error {
if s.d == nil {
return nil
}
delete(s.d, key)
return nil
}
// Equal returns true if two secrets match
func (s *Secret) Equal(other store.Secret) bool {
b1, err := s.Bytes()
if err != nil {
return false
}
b2, err := other.Bytes()
if err != nil {
return false
}
return string(b1) == string(b2)
}
// Password returns the password
func (s *Secret) Password() string {
v := s.d[passwordKey]
if sv, ok := v.(string); ok {
return sv
}
return ""
}
// SetBody is not supported
func (s *Secret) SetBody(string) error {
return errors.New("not supported")
}
// SetPassword sets the password
func (s *Secret) SetPassword(pw string) {
s.d[passwordKey] = pw
}
// SetValue sets a single key
func (s *Secret) SetValue(key string, value string) error {
s.d[key] = value
return nil
}
// String implement fmt.Stringer
func (s *Secret) String() string {
var buf strings.Builder
if sv, ok := s.d[passwordKey].(string); ok {
_, _ = buf.WriteString(sv)
}
keys := make([]string, 0, len(s.d))
for k := range s.d {
keys = append(keys, k)
}
sort.Strings(keys)
for _, key := range keys {
value := s.d[key]
if key == passwordKey {
continue
}
_, _ = buf.WriteString(key)
_, _ = buf.WriteString(": ")
if sv, ok := value.(string); ok {
_, _ = buf.WriteString(sv)
}
_, _ = buf.WriteString("\n")
}
return buf.String()
}
// Value returns a single value
func (s *Secret) Value(key string) (string, error) {
v := s.d[key]
if sv, ok := v.(string); ok {
return sv, nil
}
return "", nil
}