views.py 5.2 KB

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