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.

65 lines
2.3 KiB

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