from uuid import uuid1 from datetime import datetime from sqlalchemy.exc import ( DataError, DatabaseError, InterfaceError, InvalidRequestError, ) from flask import render_template from flask_mail import Message from usermodel import User from forms.forgotpasswordform import ForgotPasswordForm from app import db def ForgotPassword(mail): forgotpasswordform = ForgotPasswordForm() if forgotpasswordform.validate_on_submit(): user = User.query.filter_by( email=forgotpasswordform.email.data ).first() if user is not None: resethash = AddResetPasswordHash(user, forgotpasswordform) ResetPassWordMessage(user, resethash, mail) forgotpasswordform.email.errors.append( f"""If {forgotpasswordform.email.data} exists, an email is send with a password reset link. (If your inbox doesn't contain any new mail, please check your spam folder.)""" ) return render_template( "forgotpassword.html", forgotpasswordform=forgotpasswordform ) def AddResetPasswordHash(user, forgotpasswordform): resethash = uuid1().hex try: user.resettime = datetime.now() user.resethash = resethash db.session.commit() except (InvalidRequestError, DataError, InterfaceError, DatabaseError): forgotpasswordform.email.errors.append("Something went wrong!") db.session.rollback() return resethash def ResetPassWordMessage(user, resethash, mail): msg = Message( "Forgotten Password ", sender=("mailer", "test@this.com"), recipients=[user.email], ) msg.html = f"""{user.username} has requested a password reset for libary website.

Click here to reset your password.""" mail.send(msg)