forms.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.auth.forms
  4. ~~~~~~~~~~~~~~~~~~
  5. It provides the forms that are needed for the auth views.
  6. :copyright: (c) 2014 by the FlaskBB Team.
  7. :license: BSD, see LICENSE for more details.
  8. """
  9. import logging
  10. from flask_wtf import FlaskForm
  11. from wtforms import (StringField, PasswordField, BooleanField, HiddenField,
  12. SubmitField, SelectField)
  13. from wtforms.validators import (DataRequired, InputRequired, Email, EqualTo,
  14. regexp, ValidationError)
  15. from flask_babelplus import lazy_gettext as _
  16. from flaskbb.user.models import User
  17. from flaskbb.utils.settings import flaskbb_config
  18. from flaskbb.utils.helpers import time_utcnow
  19. from flaskbb.utils.fields import RecaptchaField
  20. logger = logging.getLogger(__name__)
  21. USERNAME_RE = r'^[\w.+-]+$'
  22. is_valid_username = regexp(
  23. USERNAME_RE, message=_("You can only use letters, numbers or dashes.")
  24. )
  25. class LoginForm(FlaskForm):
  26. login = StringField(_("Username or Email address"), validators=[
  27. DataRequired(message=_("Please enter your username or email address."))
  28. ])
  29. password = PasswordField(_("Password"), validators=[
  30. DataRequired(message=_("Please enter your password."))])
  31. remember_me = BooleanField(_("Remember me"), default=False)
  32. submit = SubmitField(_("Login"))
  33. recaptcha = HiddenField(_("Captcha"))
  34. class LoginRecaptchaForm(LoginForm):
  35. recaptcha = RecaptchaField(_("Captcha"))
  36. class RegisterForm(FlaskForm):
  37. username = StringField(_("Username"), validators=[
  38. DataRequired(message=_("A valid username is required")),
  39. is_valid_username])
  40. email = StringField(_("Email address"), validators=[
  41. DataRequired(message=_("A valid email address is required.")),
  42. Email(message=_("Invalid email address."))])
  43. password = PasswordField(_('Password'), validators=[
  44. InputRequired(),
  45. EqualTo('confirm_password', message=_('Passwords must match.'))])
  46. confirm_password = PasswordField(_('Confirm password'))
  47. recaptcha = RecaptchaField(_("Captcha"))
  48. language = SelectField(_('Language'))
  49. accept_tos = BooleanField(_("I accept the Terms of Service"), validators=[
  50. DataRequired(message=_("Please accept the TOS."))], default=True)
  51. submit = SubmitField(_("Register"))
  52. def validate_username(self, field):
  53. # would through an out of context error if used with validators.Length
  54. min_length = flaskbb_config["AUTH_USERNAME_MIN_LENGTH"]
  55. max_length = flaskbb_config["AUTH_USERNAME_MAX_LENGTH"]
  56. blacklist = [w.strip() for w in
  57. flaskbb_config["AUTH_USERNAME_BLACKLIST"].split(",")]
  58. if len(field.data) < min_length or len(field.data) > max_length:
  59. raise ValidationError(_(
  60. "Username must be between %(min)s and %(max)s "
  61. "characters long.",
  62. min=min_length, max=max_length)
  63. )
  64. if field.data.lower() in blacklist:
  65. raise ValidationError(_(
  66. "This is a system reserved name. Choose a different one.")
  67. )
  68. user = User.query.filter_by(username=field.data.lower()).first()
  69. if user:
  70. raise ValidationError(_("This username is already taken."))
  71. def validate_email(self, field):
  72. email = User.query.filter_by(email=field.data.lower()).first()
  73. if email:
  74. raise ValidationError(_("This email address is already taken."))
  75. def save(self):
  76. user = User(username=self.username.data,
  77. email=self.email.data,
  78. password=self.password.data,
  79. date_joined=time_utcnow(),
  80. primary_group_id=4,
  81. language=self.language.data)
  82. return user.save()
  83. class ReauthForm(FlaskForm):
  84. password = PasswordField(_('Password'), validators=[
  85. DataRequired(message=_("Please enter your password."))])
  86. submit = SubmitField(_("Refresh Login"))
  87. class ForgotPasswordForm(FlaskForm):
  88. email = StringField(_('Email address'), validators=[
  89. DataRequired(message=_("A valid email address is required.")),
  90. Email()])
  91. recaptcha = RecaptchaField(_("Captcha"))
  92. submit = SubmitField(_("Request Password"))
  93. class ResetPasswordForm(FlaskForm):
  94. token = HiddenField('Token')
  95. email = StringField(_('Email address'), validators=[
  96. DataRequired(message=_("A valid email address is required.")),
  97. Email()])
  98. password = PasswordField(_('Password'), validators=[
  99. InputRequired(),
  100. EqualTo('confirm_password', message=_('Passwords must match.'))])
  101. confirm_password = PasswordField(_('Confirm password'))
  102. submit = SubmitField(_("Reset password"))
  103. def validate_email(self, field):
  104. email = User.query.filter_by(email=field.data).first()
  105. if not email:
  106. raise ValidationError(_("Wrong email address."))
  107. class RequestActivationForm(FlaskForm):
  108. username = StringField(_("Username"), validators=[
  109. DataRequired(message=_("A valid username is required.")),
  110. is_valid_username])
  111. email = StringField(_("Email address"), validators=[
  112. DataRequired(message=_("A valid email address is required.")),
  113. Email(message=_("Invalid email address."))])
  114. submit = SubmitField(_("Send Confirmation Mail"))
  115. def validate_email(self, field):
  116. self.user = User.query.filter_by(email=field.data).first()
  117. # check if the username matches the one found in the database
  118. if not self.user.username == self.username.data:
  119. raise ValidationError(_("User does not exist."))
  120. if self.user.activated is True:
  121. raise ValidationError(_("User is already active."))
  122. class AccountActivationForm(FlaskForm):
  123. token = StringField(_("Email confirmation token"), validators=[
  124. DataRequired(message=_("Please enter the token that we have sent to "
  125. "you."))
  126. ])
  127. submit = SubmitField(_("Confirm Email"))