from getpass import getpass from helpers import SignatureHelper as Signature from helpers import UtilityHelper class User: def __init__(self, db, private_ser=None, public_ser=None, username=None, password=None): self.db = db self.private_ser = private_ser self.public_ser = public_ser self.username = username self.password = password def login(self): input_username = input("Username: ") input_password = getpass("Password: ") hashed_password = UtilityHelper.computeHash(input_password) user = self.db.loginUser(input_username, hashed_password) # check if user exists if user: self.private_ser = user[0] self.public_ser = user[1] self.username = user[2] return True return False def register(self): input_username = input("Username: ") input_password = getpass("Password: ") if len(input_username) < 4 or len(input_password) < 4: print(f"{UtilityHelper.errorMessage('Username or password is too short, inputs should be atleast 4 characters long')}") return False hashed_password = UtilityHelper.computeHash(input_password) # check if username is already taken if self.db.fetchUserByUsername(input_username): print(f"{UtilityHelper.errorMessage('Username already taken')}") return False # create sig for user private_key, public_key = Signature.generateKeys() private_ser, public_ser = Signature.keysToBytes(private_key, public_key) # register user if self.db.createUser( private_ser, public_ser, input_username, hashed_password): self.private_ser = private_ser self.public_ser = public_ser self.username = input_username return True return False def logout(self): self.private_ser = None self.public_ser = None self.username = None return True def updatePassword(self): # Get new password new_password = getpass("Enter your new password: ") check_new_password = getpass("Enter your new password again: ") while new_password != check_new_password and len(new_password) < 4: if len(new_password) < 4: print(f"{UtilityHelper.warningMessage('Password should be atleast 4 characters long')}") if new_password != check_new_password: print(f"{UtilityHelper.warningMessage('Passwords do not match')}") new_password = getpass("Enter your new password: ") check_new_password = getpass("Enter your new password again: ") old_password = getpass("Enter your old password: ") hashed_new_password = UtilityHelper.computeHash(new_password) hashed_old_password = UtilityHelper.computeHash(old_password) if self.db.changePassword(self.private_ser, hashed_old_password, hashed_new_password) == True: print(f"{UtilityHelper.successMessage('Password updated')}") else: print(f"{UtilityHelper.errorMessage('Something went wrong while trying to update password..')}") def updateAccount(self): # Get new username new_username = input("Enter your new username: ") if len(new_username) < 4: print(f"{UtilityHelper.errorMessage('Username should be atleast 4 characters long')}") return False # check if username is already taken if self.db.fetchUserByUsername(new_username): print(f"{UtilityHelper.errorMessage('Username already taken')}") return False if self.db.changeUsername(self.private_ser, new_username) == True: self.username = new_username print(f"{UtilityHelper.successMessage('Username updated')}") else: print(f"{UtilityHelper.errorMessage('Something went wrong while trying to update username..')}") def deleteAccount(self): while True: print(f"Are you sure you want to delete this account?\n{UtilityHelper.warningMessage('(this will burn all coins available in this account)')} (y/n)") confirm = input(">>: ") if confirm == "y" or confirm == "Y": print(f"{UtilityHelper.warningMessage('Deleting account..')}") break elif confirm == "n" or confirm == "N": return False else: print(f"{UtilityHelper.warningMessage('Invalid input')}") if self.db.deleteUser(self.private_ser) == True: print(f"{UtilityHelper.successMessage('Account deleted')}") self.logout() return True else: print(f"{UtilityHelper.errorMessage('Something went wrong while trying to delete account..')}") return False def printAccountInfo(self): print("Username: " + self.username) print(self.public_ser) print(self.private_ser)