registration.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. # -*- coding: utf-8 -*-
  2. """
  3. flaskbb.auth.services
  4. ~~~~~~~~~~~~~~~~~~~~~
  5. Implementation of services found in flaskbb.core.auth.services
  6. :copyright: (c) 2014-2018 the FlaskBB Team.
  7. :license: BSD, see LICENSE for more details
  8. """
  9. from collections import namedtuple
  10. from sqlalchemy import func
  11. from ...core.auth.registration import UserRegistrationError, UserValidator
  12. __all__ = (
  13. "UsernameRequirements", "UsernameValidator", "EmailUniquenessValidator",
  14. "UsernameUniquenessValidator"
  15. )
  16. UsernameRequirements = namedtuple(
  17. 'UsernameRequirements', ['min', 'max', 'blacklist']
  18. )
  19. class UsernameValidator(UserValidator):
  20. def __init__(self, requirements):
  21. self._requirements = requirements
  22. def validate(self, user_info):
  23. if not (self._requirements.min <= len(user_info.username) <=
  24. self._requirements.max):
  25. raise UserRegistrationError(
  26. 'username',
  27. 'Username must be between {} and {} characters long'.format(
  28. self._requirements.min, self._requirements.max
  29. )
  30. )
  31. is_blacklisted = user_info.username in self._requirements.blacklist
  32. if is_blacklisted: # pragma: no branch
  33. raise UserRegistrationError(
  34. 'username',
  35. '{} is a forbidden username'.format(user_info.username)
  36. )
  37. class UsernameUniquenessValidator(UserValidator):
  38. def __init__(self, users):
  39. self.users = users
  40. def validate(self, user_info):
  41. count = self.users.query.filter(
  42. func.lower(self.users.username) == user_info.username
  43. ).count()
  44. if count != 0: # pragma: no branch
  45. raise UserRegistrationError(
  46. 'username',
  47. '{} is already registered'.format(user_info.username)
  48. )
  49. class EmailUniquenessValidator(UserValidator):
  50. def __init__(self, users):
  51. self.users = users
  52. def validate(self, user_info):
  53. count = self.users.query.filter(
  54. func.lower(self.users.email) == user_info.email
  55. ).count()
  56. if count != 0: # pragma: no branch
  57. raise UserRegistrationError(
  58. 'email', '{} is already registered'.format(user_info.email)
  59. )