views.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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_babelplus import gettext as _
  14. from flaskbb.utils.helpers import render_template, redirect_or_next
  15. from flaskbb.email import send_reset_token
  16. from flaskbb.exceptions import AuthenticationError
  17. from flaskbb.auth.forms import (LoginForm, LoginRecaptchaForm, ReauthForm,
  18. ForgotPasswordForm, ResetPasswordForm,
  19. RegisterRecaptchaForm, RegisterForm)
  20. from flaskbb.user.models import User
  21. from flaskbb.fixtures.settings import available_languages
  22. from flaskbb.utils.settings import flaskbb_config
  23. auth = Blueprint("auth", __name__)
  24. @auth.route("/login", methods=["GET", "POST"])
  25. def login():
  26. """Logs the user in."""
  27. if current_user is not None and current_user.is_authenticated:
  28. return redirect(current_user.url)
  29. form = LoginForm(request.form)
  30. if form.validate_on_submit():
  31. try:
  32. user = User.authenticate(form.login.data, form.password.data)
  33. login_user(user, remember=form.remember_me.data)
  34. return redirect_or_next(url_for("forum.index"))
  35. except AuthenticationError:
  36. flash(_("Wrong Username or Password."), "danger")
  37. return render_template("auth/login.html", form=form)
  38. @auth.route("/reauth", methods=["GET", "POST"])
  39. @login_required
  40. def reauth():
  41. """
  42. Reauthenticates a user.
  43. """
  44. if not login_fresh():
  45. form = ReauthForm(request.form)
  46. if form.validate_on_submit():
  47. if current_user.check_password(form.password.data):
  48. confirm_login()
  49. flash(_("Reauthenticated."), "success")
  50. return redirect_or_next(current_user.url)
  51. flash(_("Wrong password."), "danger")
  52. return render_template("auth/reauth.html", form=form)
  53. return redirect(request.args.get("next") or current_user.url)
  54. @auth.route("/logout")
  55. @login_required
  56. def logout():
  57. logout_user()
  58. flash(("Logged out"), "success")
  59. return redirect(url_for("forum.index"))
  60. @auth.route("/register", methods=["GET", "POST"])
  61. def register():
  62. """
  63. Register a new user.
  64. """
  65. if current_user is not None and current_user.is_authenticated:
  66. return redirect(url_for("user.profile",
  67. username=current_user.username))
  68. if not flaskbb_config["REGISTRATION_ENABLED"]:
  69. flash(_("The registration has been disabled."), "info")
  70. if current_app.config["RECAPTCHA_ENABLED"]:
  71. form = RegisterRecaptchaForm(request.form)
  72. else:
  73. form = RegisterForm(request.form)
  74. form.language.choices = available_languages()
  75. form.language.default = flaskbb_config['DEFAULT_LANGUAGE']
  76. form.process(request.form) # needed because a default is overriden
  77. if form.validate_on_submit():
  78. user = form.save()
  79. login_user(user)
  80. flash(_("Thanks for registering."), "success")
  81. return redirect(url_for("user.profile",
  82. username=current_user.username))
  83. return render_template("auth/register.html", form=form)
  84. @auth.route('/resetpassword', methods=["GET", "POST"])
  85. def forgot_password():
  86. """
  87. Sends a reset password token to the user.
  88. """
  89. if not current_user.is_anonymous:
  90. return redirect(url_for("forum.index"))
  91. form = ForgotPasswordForm()
  92. if form.validate_on_submit():
  93. user = User.query.filter_by(email=form.email.data).first()
  94. if user:
  95. token = user.make_reset_token()
  96. send_reset_token(user, token=token)
  97. flash(_("E-Mail sent! Please check your inbox."), "info")
  98. return redirect(url_for("auth.forgot_password"))
  99. else:
  100. flash(_("You have entered a Username or E-Mail Address that is "
  101. "not linked with your account."), "danger")
  102. return render_template("auth/forgot_password.html", form=form)
  103. @auth.route("/resetpassword/<token>", methods=["GET", "POST"])
  104. def reset_password(token):
  105. """
  106. Handles the reset password process.
  107. """
  108. if not current_user.is_anonymous:
  109. return redirect(url_for("forum.index"))
  110. form = ResetPasswordForm()
  111. if form.validate_on_submit():
  112. user = User.query.filter_by(email=form.email.data).first()
  113. expired, invalid, data = user.verify_reset_token(form.token.data)
  114. if invalid:
  115. flash(_("Your Password Token is invalid."), "danger")
  116. return redirect(url_for("auth.forgot_password"))
  117. if expired:
  118. flash(_("Your Password Token is expired."), "danger")
  119. return redirect(url_for("auth.forgot_password"))
  120. if user and data:
  121. user.password = form.password.data
  122. user.save()
  123. flash(_("Your Password has been updated."), "success")
  124. return redirect(url_for("auth.login"))
  125. form.token.data = token
  126. return render_template("auth/reset_password.html", form=form)