/
bitwardentemplatefuncs.go
71 lines (62 loc) · 1.89 KB
/
bitwardentemplatefuncs.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
package cmd
import (
"encoding/json"
"fmt"
"os/exec"
"strings"
"github.com/twpayne/chezmoi/chezmoi2/internal/chezmoi"
)
type bitwardenConfig struct {
Command string
outputCache map[string][]byte
}
func (c *Config) bitwardenFieldsTemplateFunc(args ...string) map[string]interface{} {
output := c.bitwardenOutput(args)
var data struct {
Fields []map[string]interface{} `json:"fields"`
}
if err := json.Unmarshal(output, &data); err != nil {
returnTemplateError(fmt.Errorf("%s %s: %w\n%s", c.Bitwarden.Command, chezmoi.ShellQuoteArgs(args), err, output))
return nil
}
result := make(map[string]interface{})
for _, field := range data.Fields {
if name, ok := field["name"].(string); ok {
result[name] = field
}
}
return result
}
func (c *Config) bitwardenOutput(args []string) []byte {
key := strings.Join(args, "\x00")
if data, ok := c.Bitwarden.outputCache[key]; ok {
return data
}
name := c.Bitwarden.Command
args = append([]string{"get"}, args...)
cmd := exec.Command(name, args...)
cmd.Stdin = c.stdin
cmd.Stderr = c.stderr
output, err := c.baseSystem.IdempotentCmdOutput(cmd)
if err != nil {
returnTemplateError(fmt.Errorf("%s %s: %w\n%s", name, chezmoi.ShellQuoteArgs(args), err, output))
return nil
}
if c.Bitwarden.outputCache == nil {
c.Bitwarden.outputCache = make(map[string][]byte)
}
c.Bitwarden.outputCache[key] = output
return output
}
func (c *Config) bitwardenTemplateFunc(args ...string) map[string]interface{} {
output := c.bitwardenOutput(args)
var data map[string]interface{}
if err := json.Unmarshal(output, &data); err != nil {
returnTemplateError(fmt.Errorf("%s %s: %w\n%s", c.Bitwarden.Command, chezmoi.ShellQuoteArgs(args), err, output))
return nil
}
return data
}
func (c *Config) bitwardenAttachmentTemplateFunc(name, itemid string) string {
return string(c.bitwardenOutput([]string{"attachment", name, "--itemid", itemid, "--raw"}))
}