from datetime import datetime from uuid import uuid1 from flask import render_template from flask_mail import Message from sqlalchemy.exc import ( DatabaseError, DataError, InterfaceError, InvalidRequestError, ) from app import db from application.forms.forgotpasswordform import ForgotPasswordForm from application.models.usermodel import User def ForgotPassword(): 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( "user/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)