/
path_list.go
66 lines (53 loc) · 1.33 KB
/
path_list.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
package vaku
import (
"errors"
vault "github.com/hashicorp/vault/api"
)
var (
// ErrPathList when PathList fails.
ErrPathList = errors.New("path list")
// ErrVaultList when the underlying Vault API list fails.
ErrVaultList = errors.New("vault list")
)
// PathList lists paths at a path.
func (c *Client) PathList(p string) ([]string, error) {
vaultPath, _, err := c.rewritePath(p, vaultList)
if err != nil {
return nil, newWrapErr(p, ErrPathList, err)
}
secret, err := c.vl.List(vaultPath)
if err != nil {
return nil, newWrapErr(p, ErrPathList, newWrapErr(err.Error(), ErrVaultList, nil))
}
list, err := decodeSecret(secret)
if err != nil {
return nil, newWrapErr(p, ErrPathList, err)
}
c.outputPaths(list, p)
return list, nil
}
func decodeSecret(secret *vault.Secret) ([]string, error) {
if secret == nil || secret.Data == nil {
return nil, nil
}
data, ok := secret.Data["keys"]
if !ok || data == nil {
return nil, newWrapErr("", ErrDecodeSecret, nil)
}
keys, ok := data.([]any)
if !ok {
return nil, newWrapErr("", ErrDecodeSecret, nil)
}
return decodeKeys(keys)
}
func decodeKeys(keys []any) ([]string, error) {
output := make([]string, len(keys))
for i, k := range keys {
key, ok := k.(string)
if !ok {
return nil, newWrapErr("", ErrDecodeSecret, nil)
}
output[i] = key
}
return output, nil
}