38 lines
1.1 KiB
Python
38 lines
1.1 KiB
Python
from datetime import datetime
|
|
|
|
from . import matching, scoring, time_estimates, feedback
|
|
|
|
def zxcvbn(password, user_inputs=None):
|
|
try:
|
|
# Python 2 string types
|
|
basestring = (str, unicode)
|
|
except NameError:
|
|
# Python 3 string types
|
|
basestring = (str, bytes)
|
|
|
|
if user_inputs is None:
|
|
user_inputs = []
|
|
|
|
start = datetime.now()
|
|
|
|
sanitized_inputs = []
|
|
for arg in user_inputs:
|
|
if not isinstance(arg, basestring):
|
|
arg = str(arg)
|
|
sanitized_inputs.append(arg.lower())
|
|
|
|
ranked_dictionaries = matching.RANKED_DICTIONARIES
|
|
ranked_dictionaries['user_inputs'] = matching.build_ranked_dict(sanitized_inputs)
|
|
|
|
matches = matching.omnimatch(password, ranked_dictionaries)
|
|
result = scoring.most_guessable_match_sequence(password, matches)
|
|
result['calc_time'] = datetime.now() - start
|
|
|
|
attack_times = time_estimates.estimate_attack_times(result['guesses'])
|
|
for prop, val in attack_times.items():
|
|
result[prop] = val
|
|
|
|
result['feedback'] = feedback.get_feedback(result['score'],
|
|
result['sequence'])
|
|
|
|
return result
|