Pyscii-BBS/auth.py
2025-07-19 17:33:10 -06:00

69 lines
2.9 KiB
Python

'''
auth.py - an authentication library for adding users and checking them against a flat-file database
part of Py-BBS.
'''
import sys, json, configparser, comms, hashlib, random, string, menus
config = configparser.ConfigParser()
config.read(sys.argv[1])
dbFile = config.get("Auth","userDb")
def login(conn, username, password, node):
with open(dbFile) as userdb:
users = json.loads(userdb.read())
for user in users['users']:
if user['name'] == username.replace('\x00',''):
if user['id'] == 0:
comms.sendString(conn, "\r\nThis account is not usable. This event has been logged.\r\n")
conn.close()
return
password = hashlib.sha256(''.join(password.replace('\x00','')).join(user['salt']).encode('utf-8')).hexdigest()
if user['password'] == password:
menus.printMenu(conn, 0, node, user['id'])
else:
comms.sendString(conn, "\r\nInvalid Username or Password!\r\n")
def setProfile(conn):
comms.sendString(conn,"\r\nDo you want to set a Description?(Y/N) ")
if comms.getString(conn,2).replace("\x00",'')== "Y":
comms.sendString(conn,"\r\nWhat do you want to set as your Description?(max 150 char) ")
description = comms.getString(conn, 150)
else:
description = "You Exist!"
return description
def setPassword(conn, salt):
comms.sendString(conn, "\r\nWhat do you want your password to be?(max 32 char) ")
comms.sendString(conn, "\r\nThis will be stored salted and hashed")
password = comms.getString(conn, 32).replace('\x00','')
password = hashlib.sha256(''.join(password).join(salt).encode('utf-8')).hexdigest()
return password
def create(conn):
salt = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(16))
comms.sendString(conn, "\r\nWelcome to SB17's BBS!\r\nPowered by Pyscii-BBS!")
comms.sendString(conn, "\r\nWhat is your name? (max 16 char) ")
name = comms.getString(conn, 16)
comms.sendString(conn, "\r\nYou want your name to be " + name + "?(Y/N) ")
if comms.getChar(conn) == "N":
comms.sendString(conn, "\r\nRestarting... Press Enter to continue...")
comms.getChar(conn)
password = setPassword(conn, salt)
description = setProfile(conn)
with open(dbFile) as userdb:
users = json.load(userdb)
user = {}
user["id"] = users["users"][-1]["id"] + 1
user["name"] = name.replace('\x00','').replace('\u0000','')
user["password"] = password
user["salt"] = salt
user["description"] = description
users["users"].append(user)
with open(dbFile,'w') as output:
json.dump(users, output, indent=4)
comms.sendString(conn,"\r\nYour profile has been created" + name + "! Reconnect to login!")