test_tokens.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import sys
  2. import unittest
  3. from datetime import date, timedelta
  4. from django.conf import settings
  5. from django.contrib.auth.models import User
  6. from django.contrib.auth.tokens import PasswordResetTokenGenerator
  7. from django.test import TestCase
  8. class TokenGeneratorTest(TestCase):
  9. def test_make_token(self):
  10. """
  11. Ensure that we can make a token and that it is valid
  12. """
  13. user = User.objects.create_user('tokentestuser', 'test2@example.com', 'testpw')
  14. p0 = PasswordResetTokenGenerator()
  15. tk1 = p0.make_token(user)
  16. self.assertTrue(p0.check_token(user, tk1))
  17. def test_10265(self):
  18. """
  19. Ensure that the token generated for a user created in the same request
  20. will work correctly.
  21. """
  22. # See ticket #10265
  23. user = User.objects.create_user('comebackkid', 'test3@example.com', 'testpw')
  24. p0 = PasswordResetTokenGenerator()
  25. tk1 = p0.make_token(user)
  26. reload = User.objects.get(username='comebackkid')
  27. tk2 = p0.make_token(reload)
  28. self.assertEqual(tk1, tk2)
  29. def test_timeout(self):
  30. """
  31. Ensure we can use the token after n days, but no greater.
  32. """
  33. # Uses a mocked version of PasswordResetTokenGenerator so we can change
  34. # the value of 'today'
  35. class Mocked(PasswordResetTokenGenerator):
  36. def __init__(self, today):
  37. self._today_val = today
  38. def _today(self):
  39. return self._today_val
  40. user = User.objects.create_user('tokentestuser', 'test2@example.com', 'testpw')
  41. p0 = PasswordResetTokenGenerator()
  42. tk1 = p0.make_token(user)
  43. p1 = Mocked(date.today() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS))
  44. self.assertTrue(p1.check_token(user, tk1))
  45. p2 = Mocked(date.today() + timedelta(settings.PASSWORD_RESET_TIMEOUT_DAYS + 1))
  46. self.assertFalse(p2.check_token(user, tk1))
  47. @unittest.skipIf(sys.version_info[:2] >= (3, 0), "Unnecessary test with Python 3")
  48. def test_date_length(self):
  49. """
  50. Make sure we don't allow overly long dates, causing a potential DoS.
  51. """
  52. user = User.objects.create_user('ima1337h4x0r', 'test4@example.com', 'p4ssw0rd')
  53. p0 = PasswordResetTokenGenerator()
  54. # This will put a 14-digit base36 timestamp into the token, which is too large.
  55. self.assertRaises(ValueError,
  56. p0._make_token_with_timestamp,
  57. user, 175455491841851871349)