test_authentication.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import re
  2. from django.core import mail
  3. from rest_framework import status
  4. from rest_framework.status import HTTP_200_OK, HTTP_401_UNAUTHORIZED
  5. from desecapi.models import Token, User
  6. from desecapi.tests.base import DynDomainOwnerTestCase, DesecTestCase
  7. class DynUpdateAuthenticationTestCase(DynDomainOwnerTestCase):
  8. NUM_OWNED_DOMAINS = 1
  9. def _get_dyndns12(self):
  10. with self.assertPdnsNoRequestsBut(self.requests_desec_rr_sets_update()):
  11. return self.client.get(self.reverse('v1:dyndns12update'))
  12. def assertDynDNS12Status(self, code=HTTP_200_OK, authorization=None):
  13. if authorization:
  14. self.client.set_credentials_basic_auth(authorization)
  15. self.assertStatus(self._get_dyndns12(), code)
  16. def test_username_password(self):
  17. # noinspection PyPep8Naming
  18. def assertDynDNS12AuthenticationStatus(username, token, code):
  19. self.client.set_credentials_basic_auth(username, token)
  20. self.assertDynDNS12Status(code)
  21. assertDynDNS12AuthenticationStatus('', self.token.key, HTTP_200_OK)
  22. assertDynDNS12AuthenticationStatus(self.owner.get_username(), self.token.key, HTTP_200_OK)
  23. assertDynDNS12AuthenticationStatus(self.my_domain.name, self.token.key, HTTP_200_OK)
  24. assertDynDNS12AuthenticationStatus(' ' + self.my_domain.name, self.token.key, HTTP_401_UNAUTHORIZED)
  25. assertDynDNS12AuthenticationStatus('wrong', self.token.key, HTTP_401_UNAUTHORIZED)
  26. assertDynDNS12AuthenticationStatus('', 'wrong', HTTP_401_UNAUTHORIZED)
  27. assertDynDNS12AuthenticationStatus(self.user.get_username(), 'wrong', HTTP_401_UNAUTHORIZED)
  28. def test_malformed_basic_auth(self):
  29. for authorization in [
  30. 'asdf:asdf:sadf',
  31. 'asdf',
  32. 'bull[%]shit',
  33. '你好',
  34. '💩💩💩💩',
  35. '💩💩:💩💩',
  36. ]:
  37. self.assertDynDNS12Status(authorization=authorization, code=HTTP_401_UNAUTHORIZED)
  38. class TokenAuthenticationTestCase(DynDomainOwnerTestCase):
  39. def _get_domains(self):
  40. with self.assertPdnsNoRequestsBut(self.request_pdns_zone_retrieve_crypto_keys()):
  41. return self.client.get(self.reverse('v1:domain-list'))
  42. def assertAuthenticationStatus(self, code=HTTP_200_OK, token=''):
  43. self.client.set_credentials_token_auth(token)
  44. self.assertStatus(self._get_domains(), code)
  45. def test_token_case_sensitive(self):
  46. self.assertAuthenticationStatus(HTTP_200_OK, self.token.key)
  47. self.assertAuthenticationStatus(HTTP_401_UNAUTHORIZED, self.token.key.upper())
  48. self.assertAuthenticationStatus(HTTP_401_UNAUTHORIZED, self.token.key.lower())