1
1
package main
2
2
3
3
import (
4
+ "encoding/json"
4
5
"flag"
5
6
"fmt"
6
7
"os"
@@ -55,6 +56,7 @@ type Args struct {
55
56
cardType * string
56
57
keyFilePath * string
57
58
logLevelStr * string
59
+ jsonOutput * bool
58
60
nonInteractive * bool
59
61
pinEnable * bool
60
62
sort * bool
@@ -68,6 +70,7 @@ func (args *Args) parse() {
68
70
args .cardType = flag .String ("type" , "password" , "The type of your card. (password, ...)" )
69
71
args .keyFilePath = flag .String ("keyfile" , "" , "Path to your Enpass vault keyfile." )
70
72
args .logLevelStr = flag .String ("log" , defaultLogLevel .String (), "The log level from debug (5) to error (1)." )
73
+ args .jsonOutput = flag .Bool ("json" , false , "Output data in JSON format." )
71
74
args .nonInteractive = flag .Bool ("nonInteractive" , false , "Disable prompts and fail instead." )
72
75
args .pinEnable = flag .Bool ("pin" , false , "Enable PIN." )
73
76
args .and = flag .Bool ("and" , false , "Combines filters with AND instead of default OR." )
@@ -123,21 +126,13 @@ func listEntries(logger *logrus.Logger, vault *enpass.Vault, args *Args) {
123
126
if * args .sort {
124
127
sortEntries (cards )
125
128
}
126
- for _ , card := range cards {
127
- if card .IsTrashed () && ! * args .trashed {
128
- continue
129
- }
130
- logger .Printf (
131
- "> title: %s" +
132
- " login: %s" +
133
- " cat.: %s" +
134
- " label: %s" ,
135
- card .Title ,
136
- card .Subtitle ,
137
- card .Category ,
138
- card .Label ,
139
- )
129
+
130
+ data , err := prepareCardData (cards , false , args )
131
+ if err != nil {
132
+ logger .WithError (err ).Fatal (err .Error ())
140
133
}
134
+
135
+ outputDataOrLog (logger , data , args )
141
136
}
142
137
143
138
func showEntries (logger * logrus.Logger , vault * enpass.Vault , args * Args ) {
@@ -148,29 +143,60 @@ func showEntries(logger *logrus.Logger, vault *enpass.Vault, args *Args) {
148
143
if * args .sort {
149
144
sortEntries (cards )
150
145
}
146
+
147
+ data , err := prepareCardData (cards , true , args )
148
+ if err != nil {
149
+ logger .WithError (err ).Fatal (err .Error ())
150
+ }
151
+
152
+ outputDataOrLog (logger , data , args )
153
+ }
154
+
155
+ func prepareCardData (cards []enpass.Card , includeDecrypted bool , args * Args ) ([]map [string ]string , error ) {
156
+ data := make ([]map [string ]string , 0 )
151
157
for _ , card := range cards {
152
158
if card .IsTrashed () && ! * args .trashed {
153
159
continue
154
160
}
155
- decrypted , err := card .Decrypt ()
156
- if err != nil {
157
- logger .WithError (err ).Error ("could not decrypt " + card .Title )
158
- continue
161
+
162
+ cardMap := map [string ]string {
163
+ "title" : card .Title ,
164
+ "login" : card .Subtitle ,
165
+ "category" : card .Category ,
166
+ "label" : card .Label ,
167
+ "type" : card .Type ,
159
168
}
160
169
161
- logger .Printf (
162
- "> title: %s" +
163
- " login: %s" +
164
- " cat.: %s" +
165
- " label: %s" +
166
- " %s: %s" ,
167
- card .Title ,
168
- card .Subtitle ,
169
- card .Category ,
170
- card .Label ,
171
- card .Type ,
172
- decrypted ,
173
- )
170
+ if includeDecrypted {
171
+ decrypted , err := card .Decrypt ()
172
+ if err != nil {
173
+ return nil , fmt .Errorf ("could not decrypt %s: %w" , card .Title , err )
174
+ }
175
+ cardMap ["password" ] = decrypted
176
+ }
177
+
178
+ data = append (data , cardMap )
179
+ }
180
+ return data , nil
181
+ }
182
+
183
+ func outputDataOrLog (logger * logrus.Logger , data []map [string ]string , args * Args ) {
184
+ if * args .jsonOutput {
185
+ jsonData , jsonErr := json .Marshal (data )
186
+ if jsonErr != nil {
187
+ logger .WithError (jsonErr ).Fatal ("could not marshal JSON data" )
188
+ }
189
+ fmt .Println (string (jsonData ))
190
+ } else {
191
+ for _ , card := range data {
192
+ logger .Printf (
193
+ "> title: %s login: %s cat.: %s label: %s" ,
194
+ card ["title" ],
195
+ card ["login" ],
196
+ card ["category" ],
197
+ card ["label" ],
198
+ )
199
+ }
174
200
}
175
201
}
176
202
0 commit comments