@@ -3,15 +3,16 @@ package main
3
3
import (
4
4
"flag"
5
5
"fmt"
6
- "github.com/atotto/clipboard"
7
- "github.com/hazcod/enpass-cli/pkg/enpass"
8
- "github.com/miquella/ask"
9
- "github.com/sirupsen/logrus"
10
6
"os"
11
7
"path/filepath"
12
8
"runtime"
13
9
s "sort"
14
10
"strings"
11
+
12
+ "github.com/atotto/clipboard"
13
+ "github.com/hazcod/enpass-cli/pkg/enpass"
14
+ "github.com/miquella/ask"
15
+ "github.com/sirupsen/logrus"
15
16
)
16
17
17
18
const (
@@ -21,8 +22,21 @@ const (
21
22
var (
22
23
// overwritten by go build
23
24
version = "dev"
25
+ // enables prompts
26
+ interactive = true
24
27
)
25
28
29
+ func prompt (logger * logrus.Logger , msg string ) string {
30
+ if interactive {
31
+ if response , err := ask .HiddenAsk ("Enter " + msg + ": " ); err != nil {
32
+ logger .WithError (err ).Fatal ("could not prompt for " + msg )
33
+ } else {
34
+ return response
35
+ }
36
+ }
37
+ return ""
38
+ }
39
+
26
40
func sortEntries (cards []enpass.Card ) {
27
41
// Sort by username preserving original order
28
42
s .SliceStable (cards , func (i , j int ) bool {
@@ -89,26 +103,31 @@ func showEntries(logger *logrus.Logger, vault *enpass.Vault, cardType string, so
89
103
}
90
104
91
105
func copyEntry (logger * logrus.Logger , vault * enpass.Vault , cardType string , filters []string ) {
92
- cards , err := vault .GetEntries (cardType , filters )
106
+ card , err := vault .GetUniqueEntry (cardType , filters )
93
107
if err != nil {
94
- logger .WithError (err ).Fatal ("could not retrieve cards " )
108
+ logger .WithError (err ).Fatal ("could not retrieve unique card " )
95
109
}
96
110
97
- if len (cards ) == 0 {
98
- logger .Fatal ("card not found" )
111
+ password , err := card .Decrypt ()
112
+ if err != nil {
113
+ logger .WithError (err ).Fatal ("could not decrypt card" )
99
114
}
100
115
101
- if len ( cards ) > 1 {
102
- logger .WithField ( "cards" , len ( cards )) .Fatal ("multiple cards match that title " )
116
+ if err := clipboard . WriteAll ( password ); err != nil {
117
+ logger .WithError ( err ) .Fatal ("could not copy password to clipboard " )
103
118
}
119
+ }
104
120
105
- password , err := cards [0 ].Decrypt ()
121
+ func entryPassword (logger * logrus.Logger , vault * enpass.Vault , cardType string , filters []string ) {
122
+ card , err := vault .GetUniqueEntry (cardType , filters )
106
123
if err != nil {
107
- logger .WithError (err ).Fatal ("could not decrypt card" )
124
+ logger .WithError (err ).Fatal ("could not retrieve unique card" )
108
125
}
109
126
110
- if err := clipboard .WriteAll (password ); err != nil {
111
- logger .WithError (err ).Fatal ("could not copy password to clipboard" )
127
+ if password , err := card .Decrypt (); err != nil {
128
+ logger .WithError (err ).Fatal ("could not decrypt card" )
129
+ } else {
130
+ fmt .Println (password )
112
131
}
113
132
}
114
133
@@ -117,14 +136,15 @@ func main() {
117
136
cardType := flag .String ("type" , "password" , "The type of your card. (password, ...)" )
118
137
keyFilePath := flag .String ("keyfile" , "" , "Path to your Enpass vault keyfile." )
119
138
logLevelStr := flag .String ("log" , defaultLogLevel .String (), "The log level from debug (5) to error (1)." )
120
- sort := flag .Bool ("sort" , false , "Sort the output by title and username." )
121
- trashed := flag .Bool ("trashed" , false , "Show trashed items in output." )
122
- clipboardPrimary := flag .Bool ("clipboardPrimary" , false , "Use primary X selection instead of clipboard." )
139
+ nonInteractive := flag .Bool ("nonInteractive" , false , "Disable prompts and fail instead." )
140
+ sort := flag .Bool ("sort" , false , "Sort the output by title and username of the 'list' and 'show' command." )
141
+ trashed := flag .Bool ("trashed" , false , "Show trashed items in the 'list' and 'show' command." )
142
+ clipboardPrimary := flag .Bool ("clipboardPrimary" , false , "Use primary X selection instead of clipboard for the 'copy' command." )
123
143
124
144
flag .Parse ()
125
145
126
146
if flag .NArg () == 0 {
127
- fmt .Println ("Specify a command: version, list, open , copy" )
147
+ fmt .Println ("Specify a command: version, list, show , copy, pass " )
128
148
flag .Usage ()
129
149
os .Exit (1 )
130
150
}
@@ -139,6 +159,8 @@ func main() {
139
159
command := strings .ToLower (flag .Arg (0 ))
140
160
filters := flag .Args ()[1 :]
141
161
162
+ interactive = ! * nonInteractive
163
+
142
164
if * clipboardPrimary {
143
165
clipboard .Primary = true
144
166
logger .Debug ("primary X selection enabled" )
@@ -154,9 +176,7 @@ func main() {
154
176
155
177
masterPassword := os .Getenv ("MASTERPW" )
156
178
if masterPassword == "" {
157
- if masterPassword , err = ask .HiddenAsk ("Enter master password: " ); err != nil {
158
- logger .WithError (err ).Fatal ("could not prompt for master password" )
159
- }
179
+ masterPassword = prompt (logger , "master password" )
160
180
}
161
181
162
182
if masterPassword == "" {
@@ -168,25 +188,22 @@ func main() {
168
188
169
189
if err := vault .Initialize (* vaultPath , * keyFilePath , masterPassword ); err != nil {
170
190
logger .WithError (err ).Error ("could not open vault" )
171
- os .Exit (2 )
191
+ logger .Exit (2 )
172
192
}
173
193
defer func () { _ = vault .Close () }()
174
- vault .Logger .SetLevel (logLevel )
175
194
176
195
logger .Debug ("initialized vault" )
177
196
178
- switch strings . ToLower ( command ) {
197
+ switch command {
179
198
case "list" :
180
199
listEntries (logger , & vault , * cardType , * sort , * trashed , filters )
181
- return
182
-
183
200
case "show" :
184
201
showEntries (logger , & vault , * cardType , * sort , * trashed , filters )
185
- return
186
-
187
202
case "copy" :
188
203
copyEntry (logger , & vault , * cardType , filters )
189
- return
204
+ case "pass" :
205
+ entryPassword (logger , & vault , * cardType , filters )
206
+ default :
207
+ logger .WithField ("command" , command ).Fatal ("unknown command" )
190
208
}
191
-
192
209
}
0 commit comments