|
5 | 5 | package pass
|
6 | 6 |
|
7 | 7 | import (
|
| 8 | + "bytes" |
8 | 9 | "encoding/base64"
|
9 | 10 | "errors"
|
10 | 11 | "fmt"
|
@@ -45,54 +46,19 @@ func init() {
|
45 | 46 | }
|
46 | 47 | }
|
47 | 48 |
|
48 |
| -func runPass(stdinContent string, args ...string) (string, error) { |
| 49 | +func runPass(stdin string, args ...string) (string, error) { |
| 50 | + var stdout, stderr bytes.Buffer |
49 | 51 | cmd := exec.Command("pass", args...)
|
| 52 | + cmd.Stdin = strings.NewReader(stdin) |
| 53 | + cmd.Stdout = &stdout |
| 54 | + cmd.Stderr = &stderr |
50 | 55 |
|
51 |
| - stdin, err := cmd.StdinPipe() |
| 56 | + err := cmd.Run() |
52 | 57 | if err != nil {
|
53 |
| - return "", err |
| 58 | + return "", fmt.Errorf("%s: %s", err, stderr.String()) |
54 | 59 | }
|
55 |
| - defer stdin.Close() |
56 | 60 |
|
57 |
| - stderr, err := cmd.StderrPipe() |
58 |
| - if err != nil { |
59 |
| - return "", err |
60 |
| - } |
61 |
| - defer stderr.Close() |
62 |
| - |
63 |
| - stdout, err := cmd.StdoutPipe() |
64 |
| - if err != nil { |
65 |
| - return "", err |
66 |
| - } |
67 |
| - defer stdout.Close() |
68 |
| - |
69 |
| - err = cmd.Start() |
70 |
| - if err != nil { |
71 |
| - return "", err |
72 |
| - } |
73 |
| - |
74 |
| - _, err = stdin.Write([]byte(stdinContent)) |
75 |
| - if err != nil { |
76 |
| - return "", err |
77 |
| - } |
78 |
| - stdin.Close() |
79 |
| - |
80 |
| - errContent, err := ioutil.ReadAll(stderr) |
81 |
| - if err != nil { |
82 |
| - return "", fmt.Errorf("error reading stderr: %s", err) |
83 |
| - } |
84 |
| - |
85 |
| - result, err := ioutil.ReadAll(stdout) |
86 |
| - if err != nil { |
87 |
| - return "", fmt.Errorf("Error reading stdout: %s", err) |
88 |
| - } |
89 |
| - |
90 |
| - cmdErr := cmd.Wait() |
91 |
| - if cmdErr != nil { |
92 |
| - return "", fmt.Errorf("%s: %s", cmdErr, errContent) |
93 |
| - } |
94 |
| - |
95 |
| - return string(result), nil |
| 61 | + return stdout.String(), nil |
96 | 62 | }
|
97 | 63 |
|
98 | 64 | // Pass handles secrets using Linux secret-service as a store.
|
@@ -130,22 +96,11 @@ func (h Pass) Delete(serverURL string) error {
|
130 | 96 | }
|
131 | 97 |
|
132 | 98 | func getPassDir() string {
|
133 |
| - passDir := os.ExpandEnv("$HOME/.password-store") |
134 |
| - for _, e := range os.Environ() { |
135 |
| - parts := strings.SplitN(e, "=", 2) |
136 |
| - if len(parts) < 2 { |
137 |
| - continue |
138 |
| - } |
139 |
| - |
140 |
| - if parts[0] != "PASSWORD_STORE_DIR" { |
141 |
| - continue |
142 |
| - } |
143 |
| - |
144 |
| - passDir = parts[1] |
145 |
| - break |
| 99 | + passDir := "$HOME/.password-store" |
| 100 | + if envDir := os.Getenv("PASSWORD_STORE_DIR"); envDir != "" { |
| 101 | + passDir = envDir |
146 | 102 | }
|
147 |
| - |
148 |
| - return passDir |
| 103 | + return os.ExpandEnv(passDir) |
149 | 104 | }
|
150 | 105 |
|
151 | 106 | // listPassDir lists all the contents of a directory in the password store.
|
@@ -180,7 +135,7 @@ func (h Pass) Get(serverURL string) (string, string, error) {
|
180 | 135 |
|
181 | 136 | if _, err := os.Stat(path.Join(getPassDir(), PASS_FOLDER, encoded)); err != nil {
|
182 | 137 | if os.IsNotExist(err) {
|
183 |
| - return "", "", nil; |
| 138 | + return "", "", nil |
184 | 139 | }
|
185 | 140 |
|
186 | 141 | return "", "", err
|
|
0 commit comments