testregistration.py 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. from django.test import RequestFactory
  2. from rest_framework.reverse import reverse
  3. from rest_framework import status
  4. from rest_framework.test import APITestCase
  5. from rest_framework.versioning import NamespaceVersioning
  6. from desecapi.tests.utils import utils
  7. from desecapi import models
  8. from datetime import timedelta
  9. from django.utils import timezone
  10. from django.core import mail
  11. from desecapi.emails import send_account_lock_email
  12. from api import settings
  13. class RegistrationTest(APITestCase):
  14. def test_registration_successful(self):
  15. url = reverse('v1:register')
  16. data = {'email': utils.generateUsername(), 'password': utils.generateRandomString(size=12)}
  17. response = self.client.post(url, data, REMOTE_ADDR="1.3.3.7")
  18. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  19. user = models.User.objects.get(email=data['email'])
  20. self.assertEqual(user.email, data['email'])
  21. self.assertEqual(user.registration_remote_ip, "1.3.3.7")
  22. def test_multiple_registration_locked_same_ip_short_time(self):
  23. outboxlen = len(mail.outbox)
  24. url = reverse('v1:register')
  25. data = {'email': utils.generateUsername(),
  26. 'password': utils.generateRandomString(size=12), 'dyn': True}
  27. response = self.client.post(url, data, REMOTE_ADDR="1.3.3.7")
  28. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  29. user = models.User.objects.get(email=data['email'])
  30. self.assertEqual(user.email, data['email'])
  31. self.assertEqual(user.registration_remote_ip, "1.3.3.7")
  32. self.assertIsNone(user.locked)
  33. self.assertEqual(len(mail.outbox), outboxlen)
  34. url = reverse('v1:register')
  35. data = {'email': utils.generateUsername(),
  36. 'password': utils.generateRandomString(size=12), 'dyn': True}
  37. response = self.client.post(url, data, REMOTE_ADDR="1.3.3.7")
  38. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  39. user = models.User.objects.get(email=data['email'])
  40. self.assertEqual(user.email, data['email'])
  41. self.assertEqual(user.registration_remote_ip, "1.3.3.7")
  42. self.assertIsNotNone(user.locked)
  43. self.assertEqual(len(mail.outbox), outboxlen + 1)
  44. url = reverse('v1:register')
  45. data = {'email': utils.generateUsername(),
  46. 'password': utils.generateRandomString(size=12), 'dyn': True}
  47. response = self.client.post(url, data, REMOTE_ADDR="1.3.3.7")
  48. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  49. user = models.User.objects.get(email=data['email'])
  50. self.assertEqual(user.email, data['email'])
  51. self.assertEqual(user.registration_remote_ip, "1.3.3.7")
  52. self.assertIsNotNone(user.locked)
  53. self.assertEqual(len(mail.outbox), outboxlen + 2)
  54. def test_multiple_registration_not_locked_different_ip(self):
  55. url = reverse('v1:register')
  56. data = {'email': utils.generateUsername(), 'password': utils.generateRandomString(size=12)}
  57. response = self.client.post(url, data, REMOTE_ADDR="1.3.3.8")
  58. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  59. user = models.User.objects.get(email=data['email'])
  60. self.assertEqual(user.email, data['email'])
  61. self.assertEqual(user.registration_remote_ip, "1.3.3.8")
  62. self.assertIsNone(user.locked)
  63. url = reverse('v1:register')
  64. data = {'email': utils.generateUsername(), 'password': utils.generateRandomString(size=12)}
  65. response = self.client.post(url, data, REMOTE_ADDR="1.3.3.9")
  66. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  67. user = models.User.objects.get(email=data['email'])
  68. self.assertEqual(user.email, data['email'])
  69. self.assertEqual(user.registration_remote_ip, "1.3.3.9")
  70. self.assertIsNone(user.locked)
  71. def test_multiple_registration_not_locked_same_ip_long_time(self):
  72. url = reverse('v1:register')
  73. data = {'email': utils.generateUsername(), 'password': utils.generateRandomString(size=12)}
  74. response = self.client.post(url, data, REMOTE_ADDR="1.3.3.10")
  75. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  76. user = models.User.objects.get(email=data['email'])
  77. self.assertEqual(user.email, data['email'])
  78. self.assertEqual(user.registration_remote_ip, "1.3.3.10")
  79. self.assertIsNone(user.locked)
  80. #fake registration time
  81. user.created = timezone.now() - timedelta(hours=settings.ABUSE_BY_REMOTE_IP_PERIOD_HRS+1)
  82. user.save()
  83. url = reverse('v1:register')
  84. data = {'email': utils.generateUsername(), 'password': utils.generateRandomString(size=12)}
  85. response = self.client.post(url, data, REMOTE_ADDR="1.3.3.10")
  86. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  87. user = models.User.objects.get(email=data['email'])
  88. self.assertEqual(user.email, data['email'])
  89. self.assertEqual(user.registration_remote_ip, "1.3.3.10")
  90. self.assertIsNone(user.locked)
  91. def test_send_captcha_email_manually(self):
  92. outboxlen = len(mail.outbox)
  93. url = reverse('v1:register')
  94. data = {'email': utils.generateUsername(),
  95. 'password': utils.generateRandomString(size=12), 'dyn': True}
  96. response = self.client.post(url, data, REMOTE_ADDR="1.3.3.10")
  97. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  98. user = models.User.objects.get(email=data['email'])
  99. r = RequestFactory().request(HTTP_HOST=settings.ALLOWED_HOSTS[0])
  100. r.version = 'v1'
  101. r.versioning_scheme = NamespaceVersioning()
  102. send_account_lock_email(r, user)
  103. self.assertEqual(len(mail.outbox), outboxlen+1)
  104. def test_multiple_registration_locked_same_email_host(self):
  105. outboxlen = len(mail.outbox)
  106. url = reverse('v1:register')
  107. for i in range(settings.ABUSE_BY_EMAIL_HOSTNAME_LIMIT):
  108. data = {
  109. 'email': utils.generateRandomString() + '@test-same-email.desec.io',
  110. 'password': utils.generateRandomString(size=12),
  111. 'dyn': True,
  112. }
  113. response = self.client.post(url, data, REMOTE_ADDR=utils.generateRandomIPv4Address())
  114. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  115. user = models.User.objects.get(email=data['email'])
  116. self.assertEqual(user.email, data['email'])
  117. self.assertIsNone(user.locked)
  118. self.assertEqual(len(mail.outbox), outboxlen)
  119. url = reverse('v1:register')
  120. data = {
  121. 'email': utils.generateRandomString() + '@test-same-email.desec.io',
  122. 'password': utils.generateRandomString(size=12),
  123. 'dyn': True,
  124. }
  125. response = self.client.post(url, data, REMOTE_ADDR=utils.generateRandomIPv4Address())
  126. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  127. user = models.User.objects.get(email=data['email'])
  128. self.assertEqual(user.email, data['email'])
  129. self.assertIsNotNone(user.locked)
  130. self.assertEqual(len(mail.outbox), outboxlen + 1)
  131. def test_multiple_registration_not_locked_same_email_host_long_time(self):
  132. outboxlen = len(mail.outbox)
  133. url = reverse('v1:register')
  134. for i in range(settings.ABUSE_BY_EMAIL_HOSTNAME_LIMIT):
  135. data = {
  136. 'email': utils.generateRandomString() + '@test-same-email-1.desec.io',
  137. 'password': utils.generateRandomString(size=12),
  138. 'dyn': True,
  139. }
  140. response = self.client.post(url, data, REMOTE_ADDR=utils.generateRandomIPv4Address())
  141. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  142. user = models.User.objects.get(email=data['email'])
  143. self.assertEqual(user.email, data['email'])
  144. self.assertIsNone(user.locked)
  145. #fake registration time
  146. user = models.User.objects.get(email=data['email'])
  147. user.created = timezone.now() - timedelta(hours=settings.ABUSE_BY_REMOTE_IP_PERIOD_HRS+1)
  148. user.save()
  149. self.assertEqual(len(mail.outbox), outboxlen)
  150. url = reverse('v1:register')
  151. data = {
  152. 'email': utils.generateRandomString() + '@test-same-email-1.desec.io',
  153. 'password': utils.generateRandomString(size=12),
  154. 'dyn': True,
  155. }
  156. response = self.client.post(url, data, REMOTE_ADDR=utils.generateRandomIPv4Address())
  157. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  158. user = models.User.objects.get(email=data['email'])
  159. self.assertEqual(user.email, data['email'])
  160. self.assertIsNone(user.locked)
  161. self.assertEqual(len(mail.outbox), outboxlen)
  162. def test_token_email(self):
  163. outboxlen = len(mail.outbox)
  164. url = reverse('v1:register')
  165. data = {
  166. 'email': utils.generateRandomString() + '@test-same-email.desec.io',
  167. 'password': utils.generateRandomString(size=12),
  168. 'dyn': False,
  169. }
  170. response = self.client.post(url, data, REMOTE_ADDR=utils.generateRandomIPv4Address())
  171. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  172. self.assertEqual(len(mail.outbox), outboxlen + 1)
  173. user = models.User.objects.get(email=data['email'])
  174. self.assertTrue(user.get_or_create_first_token() in mail.outbox[-1].body)