testregistration.py 9.3 KB

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