testregistration.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. from datetime import timedelta
  2. from django.test import RequestFactory
  3. from django.utils import timezone
  4. from django.core import mail
  5. from rest_framework.reverse import reverse
  6. from rest_framework.versioning import NamespaceVersioning
  7. from desecapi.tests.base import DesecTestCase
  8. from desecapi import models
  9. from desecapi.emails import send_account_lock_email
  10. from api import settings
  11. class RegistrationTestCase(DesecTestCase):
  12. def assertRegistration(self, REMOTE_ADDR='', status=201, **kwargs):
  13. url = reverse('v1:register')
  14. post_kwargs = {}
  15. if REMOTE_ADDR:
  16. post_kwargs['REMOTE_ADDR'] = REMOTE_ADDR
  17. response = self.client.post(url, kwargs, **post_kwargs)
  18. self.assertEqual(response.status_code, status, kwargs)
  19. return response
  20. class SingleRegistrationTestCase(RegistrationTestCase):
  21. def setUp(self):
  22. super().setUp()
  23. email = self.random_username()
  24. self.assertRegistration(
  25. email=email,
  26. password=self.random_password(),
  27. REMOTE_ADDR="1.3.3.7",
  28. )
  29. self.user = models.User.objects.get(email=email)
  30. def test_registration_successful(self):
  31. self.assertEqual(self.user.registration_remote_ip, "1.3.3.7")
  32. self.assertIsNone(self.user.locked)
  33. def test_token_email(self):
  34. self.assertEqual(len(mail.outbox), 1)
  35. self.assertTrue(self.user.get_or_create_first_token() in mail.outbox[-1].body)
  36. def test_send_captcha_email_manually(self):
  37. # TODO see if this can be replaced by a method of self.client
  38. r = RequestFactory().request(HTTP_HOST=settings.ALLOWED_HOSTS[0])
  39. r.version = 'v1'
  40. r.versioning_scheme = NamespaceVersioning()
  41. # end TODO
  42. mail.outbox = []
  43. send_account_lock_email(r, self.user)
  44. self.assertEqual(len(mail.outbox), 1)
  45. class MultipleRegistrationTestCase(RegistrationTestCase):
  46. def _registrations(self):
  47. pass
  48. def setUp(self):
  49. super().setUp()
  50. self.users = []
  51. for (ip, hours_ago, email_host) in self._registrations():
  52. email = self.random_username(email_host)
  53. ip = ip or self.random_ip()
  54. self.assertRegistration(
  55. email=email,
  56. password=self.random_password(),
  57. dyn=True,
  58. REMOTE_ADDR=ip,
  59. )
  60. user = models.User.objects.get(email=email)
  61. self.assertEqual(user.registration_remote_ip, ip)
  62. user.created = timezone.now() - timedelta(hours=hours_ago)
  63. user.save()
  64. self.users.append(user)
  65. class MultipleRegistrationSameIPShortTime(MultipleRegistrationTestCase):
  66. NUM_REGISTRATIONS = 3
  67. def _registrations(self):
  68. return [('1.3.3.7', 0, None) for _ in range(self.NUM_REGISTRATIONS)]
  69. def test_is_locked(self):
  70. self.assertIsNone(self.users[0].locked)
  71. for i in range(1, self.NUM_REGISTRATIONS):
  72. self.assertIsNotNone(self.users[i].locked)
  73. class MultipleRegistrationDifferentIPShortTime(MultipleRegistrationTestCase):
  74. NUM_REGISTRATIONS = 10
  75. def _registrations(self):
  76. return [('1.3.3.%s' % i, 0, None) for i in range(self.NUM_REGISTRATIONS)]
  77. def test_is_not_locked(self):
  78. for user in self.users:
  79. self.assertIsNone(user.locked)
  80. class MultipleRegistrationSameIPLongTime(MultipleRegistrationTestCase):
  81. NUM_REGISTRATIONS = 10
  82. def _registrations(self):
  83. return [
  84. ('1.3.3.7', settings.ABUSE_BY_REMOTE_IP_PERIOD_HRS, None)
  85. for _ in range(self.NUM_REGISTRATIONS)
  86. ]
  87. def test_is_not_locked(self):
  88. for user in self.users:
  89. self.assertIsNone(user.locked)
  90. class MultipleRegistrationSameEmailHostShortTime(MultipleRegistrationTestCase):
  91. NUM_REGISTRATIONS = settings.ABUSE_BY_EMAIL_HOSTNAME_LIMIT + 3
  92. def _registrations(self):
  93. host = self.random_domain_name()
  94. return [
  95. (None, 0, host)
  96. for _ in range(self.NUM_REGISTRATIONS)
  97. ]
  98. def test_is_locked(self):
  99. self.assertIsNone(self.users[0].locked)
  100. for i in range(self.NUM_REGISTRATIONS):
  101. if i < settings.ABUSE_BY_EMAIL_HOSTNAME_LIMIT:
  102. self.assertIsNone(self.users[i].locked)
  103. else:
  104. self.assertIsNotNone(self.users[i].locked)
  105. class MultipleRegistrationsSameEmailHostLongTime(MultipleRegistrationTestCase):
  106. NUM_REGISTRATIONS = settings.ABUSE_BY_EMAIL_HOSTNAME_LIMIT + 3
  107. def _registrations(self):
  108. host = self.random_domain_name()
  109. return [
  110. (self.random_ip(), settings.ABUSE_BY_EMAIL_HOSTNAME_PERIOD_HRS + 1, host)
  111. for _ in range(self.NUM_REGISTRATIONS)
  112. ]
  113. def test_is_not_locked(self):
  114. for user in self.users:
  115. self.assertIsNone(user.locked)