changedcredentials.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. """
  2. Changed credentials service
  3. Stores new e-mail and password in cache
  4. """
  5. from hashlib import sha256
  6. from misago.conf import settings
  7. from misago.core.cache import cache
  8. from misago.users import tokens
  9. __all__ = ['cache_new_credentials', 'get_new_credentials']
  10. TOKEN_NAME = 'new_credentials'
  11. CACHE_PATTERN = 'new_credentials_%s'
  12. CACHE_TIMEOUT = 3600 * 48
  13. def cache_new_credentials(user, new_email, new_password):
  14. new_credentials = {
  15. 'user_pk': user.pk,
  16. 'email': new_email,
  17. 'email_checksum': _make_checksum(user, new_email),
  18. 'password': new_password,
  19. 'password_checksum': _make_checksum(user, new_password),
  20. }
  21. cache.set(_make_cache_name(user), new_credentials, CACHE_TIMEOUT)
  22. return _make_token(user)
  23. def get_new_credentials(user, token):
  24. if token != _make_token(user):
  25. return None
  26. new_credentials = cache.get(_make_cache_name(user), 'nada')
  27. if new_credentials == 'nada':
  28. raise Exception('CACHE NOT FOUND')
  29. return None
  30. if new_credentials['user_pk'] != user.pk:
  31. return None
  32. email_checksum = _make_checksum(user, new_credentials['email'])
  33. if new_credentials['email_checksum'] != email_checksum:
  34. raise Exception('MAIL CHECKSUM FAIL')
  35. return None
  36. password_checksum = _make_checksum(user, new_credentials['password'])
  37. if new_credentials['password_checksum'] != password_checksum:
  38. raise Exception('PASS CHECKSUM FAIL')
  39. return None
  40. return new_credentials
  41. def _make_token(user):
  42. return tokens.make(user, TOKEN_NAME)
  43. def _make_cache_name(user):
  44. return CACHE_PATTERN % _make_token(user)
  45. def _make_checksum(user, value):
  46. seeds = (
  47. user.pk,
  48. user.email,
  49. user.password,
  50. user.last_login.replace(microsecond=0, tzinfo=None),
  51. settings.SECRET_KEY,
  52. unicode(value)
  53. )
  54. return sha256('+'.join([unicode(s) for s in seeds])).hexdigest()