2016-03-16 03:45:37 -06:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
import argparse
|
2018-10-19 18:16:55 -06:00
|
|
|
import getpass
|
2016-07-05 21:17:54 -06:00
|
|
|
import sys
|
|
|
|
|
2016-03-16 03:45:37 -06:00
|
|
|
import bcrypt
|
2016-07-05 21:17:54 -06:00
|
|
|
import yaml
|
|
|
|
|
2016-03-16 03:45:37 -06:00
|
|
|
bcrypt_rounds=12
|
2016-07-05 21:17:54 -06:00
|
|
|
password_pepper = ""
|
2016-03-16 03:45:37 -06:00
|
|
|
|
|
|
|
def prompt_for_pass():
|
|
|
|
password = getpass.getpass("Password: ")
|
|
|
|
|
|
|
|
if not password:
|
|
|
|
raise Exception("Password cannot be blank.")
|
|
|
|
|
|
|
|
confirm_password = getpass.getpass("Confirm password: ")
|
|
|
|
|
|
|
|
if password != confirm_password:
|
|
|
|
raise Exception("Passwords do not match.")
|
|
|
|
|
|
|
|
return password
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
parser = argparse.ArgumentParser(
|
|
|
|
description="Calculate the hash of a new password, so that passwords"
|
|
|
|
" can be reset")
|
|
|
|
parser.add_argument(
|
|
|
|
"-p", "--password",
|
|
|
|
default=None,
|
|
|
|
help="New password for user. Will prompt if omitted.",
|
|
|
|
)
|
2016-07-05 21:17:54 -06:00
|
|
|
parser.add_argument(
|
|
|
|
"-c", "--config",
|
|
|
|
type=argparse.FileType('r'),
|
|
|
|
help="Path to server config file. Used to read in bcrypt_rounds and password_pepper.",
|
|
|
|
)
|
2016-03-16 03:45:37 -06:00
|
|
|
|
|
|
|
args = parser.parse_args()
|
2016-07-05 21:17:54 -06:00
|
|
|
if "config" in args and args.config:
|
|
|
|
config = yaml.safe_load(args.config)
|
|
|
|
bcrypt_rounds = config.get("bcrypt_rounds", bcrypt_rounds)
|
|
|
|
password_config = config.get("password_config", {})
|
|
|
|
password_pepper = password_config.get("pepper", password_pepper)
|
2016-03-16 03:45:37 -06:00
|
|
|
password = args.password
|
|
|
|
|
|
|
|
if not password:
|
|
|
|
password = prompt_for_pass()
|
|
|
|
|
2016-07-05 21:17:54 -06:00
|
|
|
print bcrypt.hashpw(password + password_pepper, bcrypt.gensalt(bcrypt_rounds))
|