test_tokens.py 2.6 KB

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