44 lines
1.1 KiB
Python
44 lines
1.1 KiB
Python
import argparse
|
|
import json
|
|
import select
|
|
import sys
|
|
import getpass
|
|
|
|
from . import zxcvbn
|
|
|
|
parser = argparse.ArgumentParser(
|
|
description="Python implementation of Dropbox's realistic password "
|
|
'strength estimator'
|
|
)
|
|
parser.add_argument(
|
|
'--user-input',
|
|
action='append',
|
|
help='user data to be added to the dictionaries that are tested against '
|
|
'(name, birthdate, etc)',
|
|
)
|
|
|
|
class JSONEncoder(json.JSONEncoder):
|
|
def default(self, o):
|
|
try:
|
|
return super(JSONEncoder, self).default(o)
|
|
except TypeError:
|
|
return str(o)
|
|
|
|
def cli():
|
|
args = parser.parse_args()
|
|
|
|
# check if stdin is ready for reading
|
|
rlist, _, _ = select.select([sys.stdin], [], [], 0.0)
|
|
if rlist:
|
|
password = rlist[0].read()
|
|
if password[-1] == '\n': # strip off the trailing newline
|
|
password = password[:-1]
|
|
else:
|
|
password = getpass.getpass()
|
|
|
|
res = zxcvbn(password, user_inputs=args.user_input)
|
|
json.dump(res, sys.stdout, indent=2, cls=JSONEncoder)
|
|
sys.stdout.write('\n')
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(cli())
|