Skip to content

Commit a0a871d

Browse files
authored
Merge pull request #142 from egze/json_mode
Add JSON Output Option and Refactor Data Preparation
2 parents c3543c4 + 83534f6 commit a0a871d

File tree

2 files changed

+59
-32
lines changed

2 files changed

+59
-32
lines changed

README.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ $ enp show enpass.com
2222
$ # copy password of 'reddit.com' entry to clipboard
2323
$ enp copy reddit.com
2424

25-
$ # print password of 'github.com' to stdout, useful for scripting
25+
$ # print password of 'github.com' to stdout, useful for scripting
2626
$ password=$(enp pass github.com)
2727
```
2828

@@ -47,6 +47,7 @@ Flags
4747
| `-type=TYPE` | The type of your card (password, ...) |
4848
| `-log=LEVEL` | The log level from debug (5) to error (1) |
4949
| `-nonInteractive` | Disable prompts and fail instead |
50+
| `-json` | Output as JSON to stdout |
5051
| `-pin` | Enable Quick Unlock using a PIN |
5152
| `-and` | Combines filters with AND instead of default OR |
5253
| `-sort` | Sort the output by title and username of the `list` and `show` command |

cmd/enpasscli/main.go

+57-31
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"encoding/json"
45
"flag"
56
"fmt"
67
"os"
@@ -55,6 +56,7 @@ type Args struct {
5556
cardType *string
5657
keyFilePath *string
5758
logLevelStr *string
59+
jsonOutput *bool
5860
nonInteractive *bool
5961
pinEnable *bool
6062
sort *bool
@@ -68,6 +70,7 @@ func (args *Args) parse() {
6870
args.cardType = flag.String("type", "password", "The type of your card. (password, ...)")
6971
args.keyFilePath = flag.String("keyfile", "", "Path to your Enpass vault keyfile.")
7072
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.")
7174
args.nonInteractive = flag.Bool("nonInteractive", false, "Disable prompts and fail instead.")
7275
args.pinEnable = flag.Bool("pin", false, "Enable PIN.")
7376
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) {
123126
if *args.sort {
124127
sortEntries(cards)
125128
}
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())
140133
}
134+
135+
outputDataOrLog(logger, data, args)
141136
}
142137

143138
func showEntries(logger *logrus.Logger, vault *enpass.Vault, args *Args) {
@@ -148,29 +143,60 @@ func showEntries(logger *logrus.Logger, vault *enpass.Vault, args *Args) {
148143
if *args.sort {
149144
sortEntries(cards)
150145
}
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)
151157
for _, card := range cards {
152158
if card.IsTrashed() && !*args.trashed {
153159
continue
154160
}
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,
159168
}
160169

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+
}
174200
}
175201
}
176202

0 commit comments

Comments
 (0)