testdyndns12update.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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 django.db import transaction
  6. import base64
  7. import httpretty
  8. from django.conf import settings
  9. class DynDNS12UpdateTest(APITestCase):
  10. owner = None
  11. token = None
  12. username = None
  13. password = None
  14. def setUp(self):
  15. self.owner = utils.createUser()
  16. self.token = utils.createToken(user=self.owner)
  17. self.domain = utils.generateDynDomainname()
  18. self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
  19. url = reverse('domain-list')
  20. data = {'name': self.domain}
  21. response = self.client.post(url, data)
  22. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  23. self.username = response.data['name']
  24. self.password = self.token
  25. self.client.credentials(HTTP_AUTHORIZATION='Basic ' + base64.b64encode((self.username + ':' + self.password).encode()).decode())
  26. httpretty.enable()
  27. httpretty.HTTPretty.allow_net_connect = False
  28. httpretty.register_uri(httpretty.POST, settings.NSLORD_PDNS_API + '/zones')
  29. httpretty.register_uri(httpretty.PATCH, settings.NSLORD_PDNS_API + '/zones/' + self.domain + '.')
  30. def tearDown(self):
  31. httpretty.disable()
  32. def assertIP(self, ipv4=None, ipv6=None):
  33. old_credentials = self.client._credentials['HTTP_AUTHORIZATION']
  34. self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.password)
  35. url = reverse('domain-detail/byName', args=(self.username,))
  36. response = self.client.get(url)
  37. self.assertEqual(response.status_code, status.HTTP_200_OK)
  38. if ipv4 is not None:
  39. self.assertEqual(response.data['arecord'], ipv4)
  40. if ipv6 is not None:
  41. self.assertEqual(response.data['aaaarecord'], ipv6)
  42. self.client.credentials(HTTP_AUTHORIZATION=old_credentials)
  43. def testDynDNS1UpdateDDClientSuccess(self):
  44. # /nic/dyndns?action=edit&started=1&hostname=YES&host_id=foobar.dedyn.io&myip=10.1.2.3
  45. url = reverse('dyndns12update')
  46. response = self.client.get(url,
  47. {
  48. 'action': 'edit',
  49. 'started': 1,
  50. 'hostname': 'YES',
  51. 'host_id': self.username,
  52. 'myip': '10.1.2.3'
  53. })
  54. self.assertEqual(response.status_code, status.HTTP_200_OK)
  55. self.assertEqual(response.data, 'good')
  56. self.assertIP(ipv4='10.1.2.3')
  57. def testDynDNS1UpdateDDClientIPv6Success(self):
  58. # /nic/dyndns?action=edit&started=1&hostname=YES&host_id=foobar.dedyn.io&myipv6=::1337
  59. url = reverse('dyndns12update')
  60. response = self.client.get(url,
  61. {
  62. 'action': 'edit',
  63. 'started': 1,
  64. 'hostname': 'YES',
  65. 'host_id': self.username,
  66. 'myipv6': '::1337'
  67. })
  68. self.assertEqual(response.status_code, status.HTTP_200_OK)
  69. self.assertEqual(response.data, 'good')
  70. self.assertIP(ipv6='::1337')
  71. def testDynDNS2UpdateDDClientIPv4Success(self):
  72. #/nic/update?system=dyndns&hostname=foobar.dedyn.io&myip=10.2.3.4
  73. url = reverse('dyndns12update')
  74. response = self.client.get(url,
  75. {
  76. 'system': 'dyndns',
  77. 'hostname': self.username,
  78. 'myip': '10.2.3.4'
  79. })
  80. self.assertEqual(response.status_code, status.HTTP_200_OK)
  81. self.assertEqual(response.data, 'good')
  82. self.assertIP(ipv4='10.2.3.4')
  83. def testDynDNS2UpdateDDClientIPv6Success(self):
  84. #/nic/update?system=dyndns&hostname=foobar.dedyn.io&myipv6=::1338
  85. url = reverse('dyndns12update')
  86. response = self.client.get(url,
  87. {
  88. 'system': 'dyndns',
  89. 'hostname': self.username,
  90. 'myipv6': '::1338'
  91. })
  92. self.assertEqual(response.status_code, status.HTTP_200_OK)
  93. self.assertEqual(response.data, 'good')
  94. self.assertIP(ipv6='::1338')
  95. def testFritzBoxIPv6(self):
  96. #/
  97. url = reverse('dyndns12update')
  98. response = self.client.get(url)
  99. self.assertEqual(response.status_code, status.HTTP_200_OK)
  100. self.assertEqual(response.data, 'good')
  101. self.assertIP(ipv4='127.0.0.1')
  102. def testIdentificationByUsernameDomainname(self):
  103. # To force identification by the provided username (which is the domain name)
  104. # we add a second domain for the current user.
  105. self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
  106. url = reverse('domain-list')
  107. data = {'name': 'second-' + self.domain}
  108. response = self.client.post(url, data)
  109. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  110. self.client.credentials(HTTP_AUTHORIZATION='Basic ' + base64.b64encode((self.username + ':' + self.password).encode()).decode())
  111. url = reverse('dyndns12update')
  112. response = self.client.get(url, REMOTE_ADDR='10.5.5.5')
  113. self.assertEqual(response.status_code, status.HTTP_200_OK)
  114. self.assertEqual(response.data, 'good')
  115. self.assertIP(ipv4='10.5.5.5')
  116. def testManualIPv6(self):
  117. #/update?username=foobar.dedyn.io&password=secret
  118. self.client.credentials(HTTP_AUTHORIZATION='')
  119. url = reverse('dyndns12update')
  120. response = self.client.get(url,
  121. {
  122. 'username': self.username,
  123. 'password': self.token,
  124. })
  125. self.assertEqual(response.status_code, status.HTTP_200_OK)
  126. self.assertEqual(response.data, 'good')
  127. self.assertIP(ipv4='127.0.0.1')
  128. def testSuspendedUpdates(self):
  129. self.owner.captcha_required = True
  130. self.owner.save()
  131. httpretty.reset()
  132. httpretty.enable()
  133. httpretty.HTTPretty.allow_net_connect = False
  134. domain = self.owner.domains.all()[0]
  135. domain.arecord = '10.1.1.1'
  136. domain.save()
  137. httpretty.register_uri(httpretty.PATCH, settings.NSLORD_PDNS_API + '/zones/' + self.domain + '.')
  138. httpretty.register_uri(httpretty.GET, settings.NSLORD_PDNS_API + '/zones/' + self.domain + '.', status=200)
  139. self.owner.unlock()
  140. self.assertEqual(httpretty.last_request().method, 'PATCH')
  141. self.assertTrue((settings.NSLORD_PDNS_API + '/zones/' + self.domain + '.').endswith(httpretty.last_request().path))
  142. self.assertTrue(self.domain in httpretty.last_request().parsed_body)
  143. self.assertTrue('10.1.1.1' in httpretty.last_request().parsed_body)
  144. def testSuspendedUpdatesDomainCreation(self):
  145. self.owner.captcha_required = True
  146. self.owner.save()
  147. httpretty.reset()
  148. httpretty.enable()
  149. httpretty.HTTPretty.allow_net_connect = False
  150. url = reverse('domain-list')
  151. newdomain = utils.generateDynDomainname()
  152. data = {'name': newdomain, 'dyn': True, 'arecord': '10.2.2.2'}
  153. self.client.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
  154. response = self.client.post(url, data)
  155. self.assertEqual(response.status_code, status.HTTP_201_CREATED)
  156. domain = self.owner.domains.all()[0]
  157. domain.arecord = '10.1.1.1'
  158. domain.save()
  159. httpretty.register_uri(httpretty.POST, settings.NSLORD_PDNS_API + '/zones')
  160. httpretty.register_uri(httpretty.PATCH, settings.NSLORD_PDNS_API + '/zones/' + newdomain + '.')
  161. httpretty.register_uri(httpretty.GET, settings.NSLORD_PDNS_API + '/zones/' + newdomain + '.', status=200)
  162. httpretty.register_uri(httpretty.PATCH, settings.NSLORD_PDNS_API + '/zones/' + self.domain + '.')
  163. httpretty.register_uri(httpretty.GET, settings.NSLORD_PDNS_API + '/zones/' + self.domain + '.', status=200)
  164. self.owner.unlock()
  165. self.assertEqual(httpretty.last_request().method, 'PATCH')
  166. self.assertTrue(
  167. (settings.NSLORD_PDNS_API + '/zones/' + self.domain + '.').endswith(httpretty.last_request().path) \
  168. or (settings.NSLORD_PDNS_API + '/zones/' + newdomain + '.').endswith(httpretty.last_request().path)
  169. )
  170. self.assertTrue('10.2.2.2' in httpretty.last_request().parsed_body)