from functools import partial from tfwconnector import MessageSender from crypto import PasswordHasher from model import User from errors import InvalidCredentialsError, UserExistsError class UserOps: def __init__(self, username, password, db_session): self.username = username self.password = password self.db_session = db_session self.message_sender = MessageSender() self.log = partial(self.message_sender.send, 'Authenticator') def authenticate(self): """ Attempts to authenticate the user. Raises an exception on failure, does nothing on success. :raises InvalidCredentialsError: User does not exist or password provided is invalid """ user = self.db_session.query(User).filter( User.username == self.username ).first() passw_is_correct = PasswordHasher.verify( self.password, user.passwordhash ) if not user or not passw_is_correct: self.log(f'Invalid credentials for user "{self.username}"!') raise InvalidCredentialsError self.log(f'User "{self.username}" logged in!') def register(self): """ Attempts to register a user. Raises an exception of failure, does nothing on success. :raises UserExistsError: A user with the provided username already exists """ existing_users = self.db_session.query(User).filter( User.username == self.username ).all() if existing_users: raise UserExistsError user = User( username=self.username, passwordhash=PasswordHasher.hash(self.password) ) self.db_session.add(user) self.db_session.commit() self.log(f'User "{self.username}" registered!')