69 lines
2.9 KiB
Python
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!")
|