|
#!/usr/bin/env python3 |
|
|
|
""" |
|
Script to convert Enpass JSON format to Firefox CSV format. |
|
--- |
|
|
|
Use script: |
|
./enpass-to-firefox.py enpass.json -o firefox.csv |
|
|
|
1. enpass.json you get from File > Export in Enpass. |
|
2. firefox.csv you import in Firefox. |
|
|
|
See: https://support.mozilla.org/en-US/kb/import-login-data-file |
|
|
|
""" |
|
# |
|
# Script to convert Enpass JSON format to Firefox CSV format |
|
# |
|
# ---- |
|
# |
|
# Use script |
|
# |
|
# This file is Public domain :-) |
|
# |
|
|
|
import json |
|
from urllib.parse import urlparse |
|
import argparse |
|
import sys |
|
|
|
|
|
def read_enpass(fh): |
|
"""Read Enpass JSON""" |
|
data = json.load(fh) |
|
return data['items'] |
|
|
|
|
|
def convert(items): |
|
"""Convert Enpass JSON to Firefox CSV""" |
|
|
|
def field_value(item, name): |
|
res = list([ x['value'] for x in item['fields'] if x['type'] == name ]) |
|
if len(res) == 0: |
|
return '' |
|
else: |
|
return res[0] |
|
|
|
def item_map(item): |
|
url = field_value(item, 'url') |
|
if url == '': |
|
return None |
|
url_parsed = urlparse(url) |
|
url_base = "%s://%s" % (url_parsed.scheme, url_parsed.netloc) |
|
updated_at = str(item['updated_at']) + "000" |
|
|
|
l = [ |
|
url, |
|
field_value(item, 'username'), |
|
field_value(item, 'password'), |
|
'', |
|
url_base, |
|
'{' + item['uuid'] + '}', |
|
updated_at, |
|
updated_at, |
|
updated_at |
|
] |
|
return l |
|
|
|
return [ y for y in [ item_map(x) for x in items ] if y is not None ] |
|
|
|
|
|
def write_firefox(data, fh): |
|
"""Write rows in Firefox format""" |
|
import csv |
|
spamwriter = csv.writer(fh, quoting=csv.QUOTE_MINIMAL) |
|
spamwriter.writerow(["url","username","password","httpRealm","formActionOrigin","guid","timeCreated","timeLastUsed","timePasswordChanged"]) |
|
for d in data: |
|
spamwriter.writerow(d) |
|
|
|
|
|
def open_or_stream(fn, p, s): |
|
"""Helper for dealing with - as input/output""" |
|
if fn == '-': |
|
return s |
|
else: |
|
return open(fn, p) |
|
|
|
|
|
if __name__ == "__main__": |
|
import argparse |
|
|
|
parser = argparse.ArgumentParser(description='Convert Enpass JSON database to Firefox CSV') |
|
parser.add_argument('input_file', metavar='INPUT', nargs=1, help="Input file, export.json from Enpass") |
|
parser.add_argument('-o', '--output', action='store', help='Output file, or - for stdout') |
|
|
|
args = parser.parse_args() |
|
|
|
with open_or_stream(args.input_file[0], 'r', sys.stdin) as fin: |
|
data = read_enpass(fin) |
|
converted_data = convert(data) |
|
|
|
with open_or_stream(args.output, 'w', sys.stdout) as fout: |
|
write_firefox(converted_data, fout) |
|
|