|
@@ -9,16 +9,13 @@
|
|
|
:copyright: (c) 2013 by the FlaskBB Team.
|
|
|
:license: BSD, see LICENSE for more details.
|
|
|
"""
|
|
|
-from werkzeug import generate_password_hash
|
|
|
from flask import (Blueprint, flash, redirect, render_template,
|
|
|
url_for, request)
|
|
|
from flask.ext.login import (current_user, login_user, login_required,
|
|
|
logout_user, confirm_login, login_fresh)
|
|
|
-from flaskbb.extensions import db
|
|
|
-from flaskbb.utils import generate_random_pass
|
|
|
-from flaskbb.email import send_new_password
|
|
|
+from flaskbb.email import send_reset_token
|
|
|
from flaskbb.auth.forms import (LoginForm, ReauthForm, RegisterForm,
|
|
|
- ResetPasswordForm)
|
|
|
+ ForgotPasswordForm, ResetPasswordForm)
|
|
|
from flaskbb.user.models import User
|
|
|
|
|
|
auth = Blueprint("auth", __name__)
|
|
@@ -93,28 +90,58 @@ def register():
|
|
|
return render_template("auth/register.html", form=form)
|
|
|
|
|
|
|
|
|
-@auth.route("/resetpassword", methods=["GET", "POST"])
|
|
|
-def reset_password():
|
|
|
+@auth.route('/resetpassword', methods=["GET", "POST"])
|
|
|
+def forgot_password():
|
|
|
"""
|
|
|
- Resets the password from a user
|
|
|
+ Sends a reset password token to the user.
|
|
|
"""
|
|
|
|
|
|
- form = ResetPasswordForm(request.form)
|
|
|
- if form.validate_on_submit():
|
|
|
- user1 = User.query.filter_by(email=form.email.data).first()
|
|
|
- user2 = User.query.filter_by(username=form.username.data).first()
|
|
|
+ if not current_user.is_anonymous():
|
|
|
+ return redirect(url_for("forum.index"))
|
|
|
|
|
|
- if user1.email == user2.email:
|
|
|
- password = generate_random_pass()
|
|
|
- user1.password = generate_password_hash(password)
|
|
|
- db.session.commit()
|
|
|
+ form = ForgotPasswordForm()
|
|
|
+ if form.validate_on_submit():
|
|
|
+ user = User.query.filter_by(email=form.email.data).first()
|
|
|
|
|
|
- send_new_password(user1, password)
|
|
|
+ if user:
|
|
|
+ token = user.make_reset_token()
|
|
|
+ send_reset_token(user, token=token)
|
|
|
|
|
|
flash(("E-Mail sent! Please check your inbox."), "info")
|
|
|
- return redirect(url_for("auth.login"))
|
|
|
+ return redirect(url_for("auth.forgot_password"))
|
|
|
else:
|
|
|
flash(("You have entered an username or email that is not linked \
|
|
|
- with your account"), "danger")
|
|
|
+ with your account"), "error")
|
|
|
+ return render_template("auth/forgot_password.html", form=form)
|
|
|
+
|
|
|
+
|
|
|
+@auth.route("/resetpassword/<token>", methods=["GET", "POST"])
|
|
|
+def reset_password(token):
|
|
|
+ """
|
|
|
+ Handles the reset password process.
|
|
|
+ """
|
|
|
+
|
|
|
+ if not current_user.is_anonymous():
|
|
|
+ return redirect(url_for("forum.index"))
|
|
|
+
|
|
|
+ form = ResetPasswordForm()
|
|
|
+ if form.validate_on_submit():
|
|
|
+ user = User.query.filter_by(email=form.email.data).first()
|
|
|
+ expired, invalid, data = user.verify_reset_token(form.token.data)
|
|
|
+
|
|
|
+ if invalid:
|
|
|
+ flash(("Your password token is invalid."), "error")
|
|
|
+ return redirect(url_for("auth.forgot_password"))
|
|
|
+
|
|
|
+ if expired:
|
|
|
+ flash(("Your password is expired."), "error")
|
|
|
+ return redirect(url_for("auth.forgot_password"))
|
|
|
+
|
|
|
+ if user and data:
|
|
|
+ user.password = form.password.data
|
|
|
+ user.save()
|
|
|
+ flash(("Your password has been updated."), "success")
|
|
|
+ return redirect(url_for("auth.login"))
|
|
|
|
|
|
+ form.token.data = token
|
|
|
return render_template("auth/reset_password.html", form=form)
|