views.py 4.8 KB

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