Skip to content

Instantly share code, notes, and snippets.

@sorend
Last active February 27, 2021 16:32
Show Gist options
  • Save sorend/e64bc1da9fa9cd870e96e4e2caf5fdcf to your computer and use it in GitHub Desktop.
Save sorend/e64bc1da9fa9cd870e96e4e2caf5fdcf to your computer and use it in GitHub Desktop.
Enpass JSON to Firefox CSV password import converter

Enpass JSON to Firefox CSV password importer

This script allows you to convert the Enpass JSON export format into a format that Firefox can read.

Usage

  1. Get enpass.json by using File > Export in Enpass
  2. Run script
  3. Import converted csv in Firefox.
./enpass-to-firefox.py enpass.json -o firefox.csv

See: https://support.mozilla.org/en-US/kb/import-login-data-file

#!/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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment