Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Port hash_password to Python 3 (#4161)
Browse files Browse the repository at this point in the history
* port hash_password

* changelog
  • Loading branch information
hawkowl authored Nov 7, 2018
1 parent b370883 commit 264cb14
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 8 deletions.
1 change: 1 addition & 0 deletions changelog.d/4161.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The hash_password script now works on Python 3.
41 changes: 34 additions & 7 deletions scripts/hash_password
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import argparse
import getpass
import sys
import unicodedata

import bcrypt
import yaml

bcrypt_rounds=12
bcrypt_rounds = 12
password_pepper = ""


def prompt_for_pass():
password = getpass.getpass("Password: ")

Expand All @@ -23,19 +25,27 @@ def prompt_for_pass():

return password


if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Calculate the hash of a new password, so that passwords"
" can be reset")
description=(
"Calculate the hash of a new password, so that passwords can be reset"
)
)
parser.add_argument(
"-p", "--password",
"-p",
"--password",
default=None,
help="New password for user. Will prompt if omitted.",
)
parser.add_argument(
"-c", "--config",
"-c",
"--config",
type=argparse.FileType('r'),
help="Path to server config file. Used to read in bcrypt_rounds and password_pepper.",
help=(
"Path to server config file. "
"Used to read in bcrypt_rounds and password_pepper."
),
)

args = parser.parse_args()
Expand All @@ -49,4 +59,21 @@ if __name__ == "__main__":
if not password:
password = prompt_for_pass()

print bcrypt.hashpw(password + password_pepper, bcrypt.gensalt(bcrypt_rounds))
# On Python 2, make sure we decode it to Unicode before we normalise it
if isinstance(password, bytes):
try:
password = password.decode(sys.stdin.encoding)
except UnicodeDecodeError:
print(
"ERROR! Your password is not decodable using your terminal encoding (%s)."
% (sys.stdin.encoding,)
)

pw = unicodedata.normalize("NFKC", password)

hashed = bcrypt.hashpw(
pw.encode('utf8') + password_pepper.encode("utf8"),
bcrypt.gensalt(bcrypt_rounds),
).decode('ascii')

print(hashed)
2 changes: 1 addition & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ skip_install = True
basepython = python3.6
deps =
flake8
commands = /bin/sh -c "flake8 synapse tests scripts scripts-dev scripts/register_new_matrix_user scripts/synapse_port_db synctl {env:PEP8SUFFIX:}"
commands = /bin/sh -c "flake8 synapse tests scripts scripts-dev scripts/hash_password scripts/register_new_matrix_user scripts/synapse_port_db synctl {env:PEP8SUFFIX:}"

[testenv:check_isort]
skip_install = True
Expand Down

0 comments on commit 264cb14

Please sign in to comment.