forked from twpayne/chezmoi
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathonepasswordtemplatefuncs.go
More file actions
102 lines (92 loc) · 2.81 KB
/
onepasswordtemplatefuncs.go
File metadata and controls
102 lines (92 loc) · 2.81 KB
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
package cmd
import (
"bytes"
"encoding/json"
"fmt"
"os/exec"
"strings"
"github.com/twpayne/chezmoi/v2/internal/chezmoi"
)
type onepasswordConfig struct {
Command string
outputCache map[string][]byte
}
func (c *Config) onepasswordDetailsFieldsTemplateFunc(args ...string) map[string]interface{} {
key, vault := onepasswordGetKeyAndVault(args)
onepasswordArgs := []string{"get", "item", key}
if vault != "" {
onepasswordArgs = append(onepasswordArgs, "--vault", vault)
}
output := c.onepasswordOutput(onepasswordArgs)
var data struct {
Details struct {
Fields []map[string]interface{} `json:"fields"`
} `json:"details"`
}
if err := json.Unmarshal(output, &data); err != nil {
returnTemplateError(fmt.Errorf("%s %s: %w\n%s", c.Onepassword.Command, chezmoi.ShellQuoteArgs(onepasswordArgs), err, output))
return nil
}
result := make(map[string]interface{})
for _, field := range data.Details.Fields {
if designation, ok := field["designation"].(string); ok {
result[designation] = field
}
}
return result
}
func (c *Config) onepasswordDocumentTemplateFunc(args ...string) string {
key, vault := onepasswordGetKeyAndVault(args)
onepasswordArgs := []string{"get", "document", key}
if vault != "" {
onepasswordArgs = append(onepasswordArgs, "--vault", vault)
}
output := c.onepasswordOutput(onepasswordArgs)
return string(output)
}
func (c *Config) onepasswordOutput(args []string) []byte {
key := strings.Join(args, "\x00")
if output, ok := c.Onepassword.outputCache[key]; ok {
return output
}
name := c.Onepassword.Command
cmd := exec.Command(name, args...)
cmd.Stdin = c.stdin
stderr := &bytes.Buffer{}
cmd.Stderr = stderr
output, err := c.baseSystem.IdempotentCmdOutput(cmd)
if err != nil {
returnTemplateError(fmt.Errorf("%s %s: %w: %s", name, chezmoi.ShellQuoteArgs(args), err, bytes.TrimSpace(stderr.Bytes())))
return nil
}
if c.Onepassword.outputCache == nil {
c.Onepassword.outputCache = make(map[string][]byte)
}
c.Onepassword.outputCache[key] = output
return output
}
func (c *Config) onepasswordTemplateFunc(args ...string) map[string]interface{} {
key, vault := onepasswordGetKeyAndVault(args)
onepasswordArgs := []string{"get", "item", key}
if vault != "" {
onepasswordArgs = append(onepasswordArgs, "--vault", vault)
}
output := c.onepasswordOutput(onepasswordArgs)
var data map[string]interface{}
if err := json.Unmarshal(output, &data); err != nil {
returnTemplateError(fmt.Errorf("%s %s: %w\n%s", c.Onepassword.Command, chezmoi.ShellQuoteArgs(onepasswordArgs), err, output))
return nil
}
return data
}
func onepasswordGetKeyAndVault(args []string) (string, string) {
switch len(args) {
case 1:
return args[0], ""
case 2:
return args[0], args[1]
default:
returnTemplateError(fmt.Errorf("expected 1 or 2 arguments, got %d", len(args)))
return "", ""
}
}