A simple web application that allows invitation based registration to a matrix instance
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.6 KiB

5 years ago
5 years ago
5 years ago
5 years ago
  1. import safe
  2. from flask_wtf import FlaskForm
  3. from wtforms import StringField, PasswordField, IntegerField, SubmitField
  4. from wtforms.fields.html5 import DateField
  5. from wtforms.validators import DataRequired, Length, EqualTo, InputRequired, \
  6. ValidationError, NumberRange, Optional
  7. from datetime import date
  8. from db import get_registration_code, get_registered_user
  9. def safe_password_validator(form: FlaskForm, field):
  10. strength = safe.check(field.data, level=safe.MEDIUM)
  11. if not strength.valid:
  12. raise ValidationError("Password is not secure enough: %s" % strength.message)
  13. def registration_code_validator(form: FlaskForm, field):
  14. registration_code = get_registration_code(field.data)
  15. if registration_code is None:
  16. raise ValidationError("Registration code invalid!")
  17. if registration_code.is_expired():
  18. raise ValidationError("Registration code expired!")
  19. if not registration_code.has_available_uses():
  20. raise ValidationError("Registration code out of uses!")
  21. def username_availability_validator(form: FlaskForm, field):
  22. registered_user = get_registered_user(field.data)
  23. if registered_user is not None:
  24. raise ValidationError("Username already registered!")
  25. def registration_code_expiration_date_validator(form: FlaskForm, field):
  26. if field.data <= date.today():
  27. raise ValidationError("Expiration Date must be in the future!")
  28. class RegistrationForm(FlaskForm):
  29. username = StringField(
  30. 'Username',
  31. validators=[
  32. DataRequired(),
  33. Length(min=3, max=30),
  34. username_availability_validator
  35. ])
  36. password = PasswordField(
  37. 'Password',
  38. validators=[
  39. InputRequired(),
  40. EqualTo('confirm', message='Passwords must match'),
  41. safe_password_validator
  42. ])
  43. confirm = PasswordField('Repeat Password')
  44. registration_code = StringField(
  45. 'Registration Code', validators=[DataRequired(), registration_code_validator])
  46. class LoginForm(FlaskForm):
  47. username = StringField('Username', validators=[DataRequired()])
  48. token = PasswordField('Token', validators=[DataRequired()])
  49. class RegistrationCodeForm(FlaskForm):
  50. expiration_time = DateField('Expiration Time',
  51. format='%Y-%m-%d',
  52. validators=[Optional(), registration_code_expiration_date_validator])
  53. max_usages = IntegerField('Max Usages', validators=[NumberRange(min=1)])
  54. class ExpireRegistrationCodeForm(FlaskForm):
  55. registration_code = StringField('Registration Code')
  56. expire = SubmitField(label='Expire')
  57. delete = SubmitField(label='Delete')