@@ -18,13 +18,21 @@ import (
1818
1919const (
2020 defaultLogLevel = logrus .InfoLevel
21+ cmdVersion = "version"
22+ cmdHelp = "help"
23+ cmdInit = "init"
24+ cmdList = "list"
25+ cmdShow = "show"
26+ cmdCopy = "copy"
27+ cmdPass = "pass"
2128)
2229
2330var (
2431 // overwritten by go build
2532 version = "dev"
2633 // enables prompts
2734 interactive = true
35+ commands = map [string ]struct {}{cmdVersion : {}, cmdHelp : {}, cmdInit : {}, cmdList : {}, cmdShow : {}, cmdCopy : {}, cmdPass : {}}
2836)
2937
3038func prompt (logger * logrus.Logger , msg string ) string {
@@ -38,6 +46,16 @@ func prompt(logger *logrus.Logger, msg string) string {
3846 return ""
3947}
4048
49+ func printHelp () {
50+ fmt .Print ("Valid commands: " )
51+ for cmd := range commands {
52+ fmt .Printf ("%s, " , cmd )
53+ }
54+ fmt .Println ()
55+ flag .Usage ()
56+ os .Exit (1 )
57+ }
58+
4159func sortEntries (cards []enpass.Card ) {
4260 // Sort by username preserving original order
4361 s .SliceStable (cards , func (i , j int ) bool {
@@ -132,6 +150,42 @@ func entryPassword(logger *logrus.Logger, vault *enpass.Vault, cardType string,
132150 }
133151}
134152
153+ func getVaultAccessData (logger * logrus.Logger , vaultPath string , enablePin bool ) (* enpass.VaultAccessData , * pin.SecureStore ) {
154+ accessData := & enpass.VaultAccessData {
155+ Password : os .Getenv ("MASTERPW" ),
156+ }
157+
158+ var store * pin.SecureStore
159+ if ! enablePin {
160+ logger .Debug ("PIN disabled" )
161+ } else if ! accessData .IsComplete () {
162+ logger .Debug ("PIN enabled, using store" )
163+
164+ storePin := os .Getenv ("PIN" )
165+ if storePin == "" {
166+ storePin = prompt (logger , "PIN" )
167+ }
168+
169+ var err error
170+ store , err = pin .NewSecureStore (filepath .Base (vaultPath ), storePin , logger .Level )
171+ if err != nil {
172+ logger .WithError (err ).Fatal ("could not initialize store" )
173+ }
174+ logger .Debug ("initialized store" )
175+
176+ if accessData .DBKey , err = store .Read (); err != nil {
177+ logger .WithError (err ).Fatal ("could not read access data from store" )
178+ }
179+ logger .Debug ("read access data from store" )
180+ }
181+
182+ if ! accessData .IsComplete () {
183+ accessData .Password = prompt (logger , "master password" )
184+ }
185+
186+ return accessData , store
187+ }
188+
135189func main () {
136190 vaultPath := flag .String ("vault" , "" , "Path to your Enpass vault." )
137191 cardType := flag .String ("type" , "password" , "The type of your card. (password, ...)" )
@@ -145,83 +199,71 @@ func main() {
145199
146200 flag .Parse ()
147201
148- if flag .NArg () == 0 {
149- fmt .Println ("Specify a command: version, list, show, copy, pass" )
150- flag .Usage ()
151- os .Exit (1 )
152- }
153-
154202 logLevel , err := logrus .ParseLevel (* logLevelStr )
155203 if err != nil {
156204 logrus .WithError (err ).Fatal ("invalid log level specified" )
157205 }
158206 logger := logrus .New ()
159207 logger .SetLevel (logLevel )
160208
161- command := strings .ToLower (flag .Arg (0 ))
209+ cmd := strings .ToLower (flag .Arg (0 ))
162210 filters := flag .Args ()[1 :]
163211
164- interactive = ! * nonInteractive
165-
166- if * clipboardPrimary {
167- clipboard .Primary = true
168- logger .Debug ("primary X selection enabled" )
212+ if _ , contains := commands [cmd ]; ! contains {
213+ printHelp ()
214+ logger .Exit (1 )
169215 }
170216
171- if command == "version" {
217+ switch cmd {
218+ case cmdHelp :
219+ printHelp ()
220+ return
221+ case cmdVersion :
172222 logger .Printf (
173223 "%s arch=%s os=%s version=%s" ,
174224 filepath .Base (os .Args [0 ]), runtime .GOARCH , runtime .GOOS , version ,
175225 )
176226 return
177227 }
178228
179- accessData := & enpass.VaultAccessData {
180- VaultPath : * vaultPath ,
181- KeyfilePath : * keyFilePath ,
182- Password : os .Getenv ("MASTERPW" ),
183- }
229+ interactive = ! * nonInteractive
184230
185- var store * pin.SecureStore
186- if ! * enablePin {
187- logger .Debug ("PIN disabled" )
188- } else if ! accessData .IsComplete () {
189- logger .Debug ("PIN enabled, using store" )
190- store = initSecureStore (logger , accessData .VaultPath )
191- if accessData .DBKey , err = store .Read (); err != nil {
192- logger .WithError (err ).Fatal ("could not read access data from store" )
193- }
194- logger .Debug ("read access data from store" )
231+ if * clipboardPrimary {
232+ clipboard .Primary = true
233+ logger .Debug ("primary X selection enabled" )
195234 }
196235
197- if ! accessData .IsComplete () {
198- accessData .Password = prompt (logger , "master password" )
236+ vault , err := enpass .NewVault (* vaultPath , logger .Level )
237+ if err != nil {
238+ logger .WithError (err ).Fatal ("could not create vault" )
199239 }
200240
201- vault := enpass. Vault { Logger : * logrus . New ()}
202- vault . Logger . SetLevel ( logger . Level )
241+ accessData , store := getVaultAccessData ( logger , * vaultPath , * enablePin )
242+ accessData . KeyfilePath = * keyFilePath
203243
204- if err := vault .Initialize (accessData ); err != nil {
244+ if err := vault .Open (accessData ); err != nil {
205245 logger .WithError (err ).Error ("could not open vault" )
206246 logger .Exit (2 )
207247 }
208- defer func () { _ = vault .Close () }()
209-
210- logger .Debug ("initialized vault" )
211-
212- switch command {
213- case "init" :
214- // just init vault without doing anything
215- case "list" :
216- listEntries (logger , & vault , * cardType , * sort , * trashed , filters )
217- case "show" :
218- showEntries (logger , & vault , * cardType , * sort , * trashed , filters )
219- case "copy" :
220- copyEntry (logger , & vault , * cardType , filters )
221- case "pass" :
222- entryPassword (logger , & vault , * cardType , filters )
248+ logger .Debug ("opened vault" )
249+ defer func () {
250+ vault .Close ()
251+ logger .Debug ("closed vault" )
252+ }()
253+
254+ switch cmd {
255+ case cmdInit :
256+ // just init vault and store without doing anything
257+ case cmdList :
258+ listEntries (logger , vault , * cardType , * sort , * trashed , filters )
259+ case cmdShow :
260+ showEntries (logger , vault , * cardType , * sort , * trashed , filters )
261+ case cmdCopy :
262+ copyEntry (logger , vault , * cardType , filters )
263+ case cmdPass :
264+ entryPassword (logger , vault , * cardType , filters )
223265 default :
224- logger .WithField ("command" , command ).Fatal ("unknown command" )
266+ logger .WithField ("command" , cmd ).Fatal ("unknown command" )
225267 }
226268
227269 if store != nil {
@@ -230,17 +272,3 @@ func main() {
230272 }
231273 }
232274}
233-
234- func initSecureStore (logger * logrus.Logger , vaultPath string ) * pin.SecureStore {
235- store := pin.SecureStore {Logger : * logrus .New ()}
236- store .Logger .SetLevel (logger .Level )
237- storePin := os .Getenv ("PIN" )
238- if storePin == "" {
239- storePin = prompt (logger , "PIN" )
240- }
241- if err := store .Initialize (storePin , vaultPath ); err != nil {
242- logger .WithError (err ).Fatal ("could not initialize store" )
243- }
244- logger .Debug ("initialized store" )
245- return & store
246- }
0 commit comments