views.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.auth.views
  4. ~~~~~~~~~~~~~~~~~~~~
  5. This view provides user authentication, registration and a view for
  6. resetting the password of a user if he has lost his password
  7. :copyright: (c) 2014 by the FlaskBB Team.
  8. :license: BSD, see LICENSE for more details.
  9. """
  10. from flask import Blueprint, flash, redirect, url_for, request, current_app
  11. from flask_login import (current_user, login_user, login_required,
  12. logout_user, confirm_login, login_fresh)
  13. from flask_babelex import gettext as _
  14. from flaskbb.utils.helpers import render_template
  15. from flaskbb.email import send_reset_token
  16. from flaskbb.auth.forms import (LoginForm, ReauthForm, ForgotPasswordForm,
  17. ResetPasswordForm)
  18. from flaskbb.user.models import User
  19. auth = Blueprint("auth", __name__)
  20. @auth.route("/login", methods=["GET", "POST"])
  21. def login():
  22. """
  23. Logs the user in
  24. """
  25. if current_user is not None and current_user.is_authenticated():
  26. return redirect(url_for("user.profile"))
  27. form = LoginForm(request.form)
  28. if form.validate_on_submit():
  29. user, authenticated = User.authenticate(form.login.data,
  30. form.password.data)
  31. if user and authenticated:
  32. login_user(user, remember=form.remember_me.data)
  33. return redirect(request.args.get("next") or
  34. url_for("forum.index"))
  35. flash(_("Wrong username or password"), "danger")
  36. return render_template("auth/login.html", form=form)
  37. @auth.route("/reauth", methods=["GET", "POST"])
  38. @login_required
  39. def reauth():
  40. """
  41. Reauthenticates a user
  42. """
  43. if not login_fresh():
  44. form = ReauthForm(request.form)
  45. if form.validate_on_submit():
  46. confirm_login()
  47. flash(_("Reauthenticated"), "success")
  48. return redirect(request.args.get("next") or
  49. url_for("user.profile"))
  50. return render_template("auth/reauth.html", form=form)
  51. return redirect(request.args.get("next") or
  52. url_for("user.profile", username=current_user.username))
  53. @auth.route("/logout")
  54. @login_required
  55. def logout():
  56. logout_user()
  57. flash(("Logged out"), "success")
  58. return redirect(url_for("forum.index"))
  59. @auth.route("/register", methods=["GET", "POST"])
  60. def register():
  61. """
  62. Register a new user
  63. """
  64. if current_user is not None and current_user.is_authenticated():
  65. return redirect(url_for("user.profile"))
  66. if current_app.config["RECAPTCHA_ENABLED"]:
  67. from flaskbb.auth.forms import RegisterRecaptchaForm
  68. form = RegisterRecaptchaForm(request.form)
  69. else:
  70. from flaskbb.auth.forms import RegisterForm
  71. form = RegisterForm(request.form)
  72. if form.validate_on_submit():
  73. user = form.save()
  74. login_user(user)
  75. flash(_("Thanks for registering"), "success")
  76. return redirect(url_for("user.profile", username=current_user.username))
  77. return render_template("auth/register.html", form=form)
  78. @auth.route('/resetpassword', methods=["GET", "POST"])
  79. def forgot_password():
  80. """
  81. Sends a reset password token to the user.
  82. """
  83. if not current_user.is_anonymous():
  84. return redirect(url_for("forum.index"))
  85. form = ForgotPasswordForm()
  86. if form.validate_on_submit():
  87. user = User.query.filter_by(email=form.email.data).first()
  88. if user:
  89. token = user.make_reset_token()
  90. send_reset_token(user, token=token)
  91. flash(_("E-Mail sent! Please check your inbox."), "info")
  92. return redirect(url_for("auth.forgot_password"))
  93. else:
  94. flash(_("You have entered an username or email that is not linked "
  95. "with your account"), "danger")
  96. return render_template("auth/forgot_password.html", form=form)
  97. @auth.route("/resetpassword/<token>", methods=["GET", "POST"])
  98. def reset_password(token):
  99. """
  100. Handles the reset password process.
  101. """
  102. if not current_user.is_anonymous():
  103. return redirect(url_for("forum.index"))
  104. form = ResetPasswordForm()
  105. if form.validate_on_submit():
  106. user = User.query.filter_by(email=form.email.data).first()
  107. expired, invalid, data = user.verify_reset_token(form.token.data)
  108. if invalid:
  109. flash(_("Your password token is invalid."), "danger")
  110. return redirect(url_for("auth.forgot_password"))
  111. if expired:
  112. flash(_("Your password is expired."), "danger")
  113. return redirect(url_for("auth.forgot_password"))
  114. if user and data:
  115. user.password = form.password.data
  116. user.save()
  117. flash(_("Your password has been updated."), "success")
  118. return redirect(url_for("auth.login"))
  119. form.token.data = token
  120. return render_template("auth/reset_password.html", form=form)