test_authentication.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from rest_framework import status
  2. from rest_framework.status import HTTP_200_OK, HTTP_401_UNAUTHORIZED
  3. from desecapi.models import Token, User
  4. from desecapi.tests.base import DynDomainOwnerTestCase, DesecTestCase
  5. class DynUpdateAuthenticationTestCase(DynDomainOwnerTestCase):
  6. NUM_OWNED_DOMAINS = 1
  7. def _get_dyndns12(self):
  8. with self.assertPdnsNoRequestsBut(self.requests_desec_rr_sets_update()):
  9. return self.client.get(self.reverse('v1:dyndns12update'))
  10. def assertDynDNS12Status(self, code=HTTP_200_OK, authorization=None):
  11. if authorization:
  12. self.client.set_credentials_basic_auth(authorization)
  13. self.assertStatus(self._get_dyndns12(), code)
  14. def test_username_password(self):
  15. # noinspection PyPep8Naming
  16. def assertDynDNS12AuthenticationStatus(username, token, code):
  17. self.client.set_credentials_basic_auth(username, token)
  18. self.assertDynDNS12Status(code)
  19. assertDynDNS12AuthenticationStatus('', self.token.key, HTTP_200_OK)
  20. assertDynDNS12AuthenticationStatus(self.owner.get_username(), self.token.key, HTTP_200_OK)
  21. assertDynDNS12AuthenticationStatus(self.my_domain.name, self.token.key, HTTP_200_OK)
  22. assertDynDNS12AuthenticationStatus(' ' + self.my_domain.name, self.token.key, HTTP_401_UNAUTHORIZED)
  23. assertDynDNS12AuthenticationStatus('wrong', self.token.key, HTTP_401_UNAUTHORIZED)
  24. assertDynDNS12AuthenticationStatus('', 'wrong', HTTP_401_UNAUTHORIZED)
  25. assertDynDNS12AuthenticationStatus(self.user.get_username(), 'wrong', HTTP_401_UNAUTHORIZED)
  26. def test_malformed_basic_auth(self):
  27. for authorization in [
  28. 'asdf:asdf:sadf',
  29. 'asdf',
  30. 'bull[%]shit',
  31. '你好',
  32. '💩💩💩💩',
  33. '💩💩:💩💩',
  34. ]:
  35. self.assertDynDNS12Status(authorization=authorization, code=HTTP_401_UNAUTHORIZED)
  36. class SignUpLoginTestCase(DesecTestCase):
  37. EMAIL = None
  38. PASSWORD = None
  39. REGISTRATION_ENDPOINT = None
  40. LOGIN_ENDPOINT = None
  41. REGISTRATION_STATUS = status.HTTP_201_CREATED
  42. LOGIN_STATUS = status.HTTP_201_CREATED
  43. def __init__(self, *args, **kwargs):
  44. super().__init__(*args, **kwargs)
  45. self.EMAIL = self.random_username()
  46. self.PASSWORD = self.random_password()
  47. if not self.REGISTRATION_ENDPOINT:
  48. self.REGISTRATION_ENDPOINT = self.reverse('v1:register')
  49. if not self.LOGIN_ENDPOINT:
  50. self.LOGIN_ENDPOINT = self.reverse('v1:login')
  51. def sign_up(self):
  52. self.assertStatus(
  53. self.client.post(self.REGISTRATION_ENDPOINT, {
  54. 'email': self.EMAIL,
  55. 'password': self.PASSWORD,
  56. }),
  57. self.REGISTRATION_STATUS
  58. )
  59. def log_in(self):
  60. response = self.client.post(self.LOGIN_ENDPOINT, {
  61. 'email': self.EMAIL,
  62. 'password': self.PASSWORD,
  63. })
  64. self.assertContains(response, "auth_token", status_code=self.LOGIN_STATUS)
  65. def test_sign_up(self):
  66. self.sign_up()
  67. def test_log_in(self):
  68. self.sign_up()
  69. self.log_in()
  70. def test_log_in_twice(self):
  71. self.sign_up()
  72. self.log_in()
  73. self.log_in()
  74. def test_log_in_two_tokens(self):
  75. self.sign_up() # this may create a token
  76. for _ in range(2):
  77. Token.objects.create(user=User.objects.get(email=self.EMAIL))
  78. self.log_in()
  79. class URLSignUpLoginTestCase(SignUpLoginTestCase):
  80. REGISTRATION_ENDPOINT = '/api/v1/auth/users/'
  81. LOGIN_ENDPOINT = '/api/v1/auth/token/login/'
  82. class LegacyURLSignUpLoginTestCase(SignUpLoginTestCase):
  83. REGISTRATION_ENDPOINT = '/api/v1/auth/users/create/'
  84. LOGIN_ENDPOINT = '/api/v1/auth/token/create/'
  85. class TokenAuthenticationTestCase(DynDomainOwnerTestCase):
  86. def _get_domains(self):
  87. with self.assertPdnsNoRequestsBut(self.request_pdns_zone_retrieve_crypto_keys()):
  88. return self.client.get(self.reverse('v1:domain-list'))
  89. def assertAuthenticationStatus(self, code=HTTP_200_OK, token=''):
  90. self.client.set_credentials_token_auth(token)
  91. self.assertStatus(self._get_domains(), code)
  92. def test_token_case_sensitive(self):
  93. self.assertAuthenticationStatus(HTTP_200_OK, self.token.key)
  94. self.assertAuthenticationStatus(HTTP_401_UNAUTHORIZED, self.token.key.upper())
  95. self.assertAuthenticationStatus(HTTP_401_UNAUTHORIZED, self.token.key.lower())