Fixed an issue that prevented the password reset tokens from working. Added email templates for password reset success and new account creation. Added more dynamic email template support.
85 lines
2.4 KiB
Python
85 lines
2.4 KiB
Python
import mysql.connector
|
|
import hashlib
|
|
import os
|
|
import json
|
|
from pathlib import Path
|
|
|
|
def sha1(data):
|
|
return hashlib.sha1(data).digest()
|
|
|
|
def generate_salt():
|
|
return os.urandom(32)
|
|
|
|
def calculate_verifier(username, password, salt):
|
|
g = 7
|
|
N = int("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7", 16)
|
|
|
|
username = username.upper()
|
|
password = password.upper()
|
|
|
|
h1 = sha1(f"{username}:{password}".encode())
|
|
h2 = sha1(salt + h1)
|
|
|
|
h2_int = int.from_bytes(h2, 'little')
|
|
verifier_int = pow(g, h2_int, N)
|
|
|
|
verifier = verifier_int.to_bytes((verifier_int.bit_length() + 7) // 8, 'little')
|
|
return verifier
|
|
|
|
def create_account(account_name, email, passwd1, passwd2, expansion):
|
|
if passwd1 != passwd2:
|
|
return "Passwords do not match."
|
|
|
|
script_dir = Path(__file__).resolve().parent
|
|
config_path = script_dir / "../config.json"
|
|
|
|
with open(config_path) as config_file:
|
|
config = json.load(config_file)
|
|
|
|
USERNAME = config["USERNAME"]
|
|
PASSWORD = config["PASSWORD"]
|
|
SERVER_IP = config["SERVER_IP"]
|
|
PORT = config["MYSQL_PORT"]
|
|
DATABASE = config["DATABASE"]
|
|
|
|
conn = None
|
|
cursor = None
|
|
|
|
try:
|
|
conn = mysql.connector.connect(
|
|
host=SERVER_IP,
|
|
user=USERNAME,
|
|
password=PASSWORD,
|
|
database=DATABASE,
|
|
port=PORT
|
|
)
|
|
cursor = conn.cursor()
|
|
|
|
# Check if the username already exists
|
|
cursor.execute("SELECT id FROM account WHERE username = %s", (account_name,))
|
|
if cursor.fetchone():
|
|
return "Username already taken."
|
|
|
|
cursor.execute("SELECT MAX(id) FROM account")
|
|
max_id = cursor.fetchone()[0]
|
|
new_id = max_id + 1 if max_id else 1
|
|
|
|
salt = generate_salt()
|
|
verifier = calculate_verifier(account_name, passwd1, salt)
|
|
|
|
cursor.execute(
|
|
"INSERT INTO account (id, username, salt, verifier, email) VALUES (%s, %s, %s, %s, %s)",
|
|
(new_id, account_name, salt, verifier, email)
|
|
)
|
|
conn.commit()
|
|
|
|
return "Account created successfully!"
|
|
|
|
except mysql.connector.Error as err:
|
|
return f"Error: {err}"
|
|
|
|
finally:
|
|
if cursor is not None:
|
|
cursor.close()
|
|
if conn is not None:
|
|
conn.close()
|