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):
|
|
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()
|