test_tokens.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. from ipaddress import IPv4Network
  2. from rest_framework import status
  3. from desecapi.models import Token
  4. from desecapi.tests.base import DomainOwnerTestCase
  5. class TokenPermittedTestCase(DomainOwnerTestCase):
  6. def setUp(self):
  7. super().setUp()
  8. self.token.perm_manage_tokens = True
  9. self.token.save()
  10. self.token2 = self.create_token(self.owner, name='testtoken')
  11. self.other_token = self.create_token(self.user)
  12. def test_token_last_used(self):
  13. self.assertIsNone(Token.objects.get(pk=self.token.id).last_used)
  14. self.client.get(self.reverse('v1:root'))
  15. self.assertIsNotNone(Token.objects.get(pk=self.token.id).last_used)
  16. def test_list_tokens(self):
  17. response = self.client.get(self.reverse('v1:token-list'))
  18. self.assertStatus(response, status.HTTP_200_OK)
  19. self.assertEqual(len(response.data), 2)
  20. self.assertIn('id', response.data[0])
  21. self.assertFalse(any(field in response.data[0] for field in ['token', 'key', 'value']))
  22. self.assertFalse(any(token.encode() in response.content for token in [self.token.plain, self.token2.plain]))
  23. self.assertNotContains(response, self.token.plain)
  24. def test_delete_my_token(self):
  25. token_id = Token.objects.get(user=self.owner, name='testtoken').id
  26. url = self.reverse('v1:token-detail', pk=token_id)
  27. response = self.client.delete(url)
  28. self.assertStatus(response, status.HTTP_204_NO_CONTENT)
  29. self.assertFalse(Token.objects.filter(pk=token_id).exists())
  30. response = self.client.get(url)
  31. self.assertStatus(response, status.HTTP_404_NOT_FOUND)
  32. def test_retrieve_my_token(self):
  33. token_id = Token.objects.get(user=self.owner, name='testtoken').id
  34. url = self.reverse('v1:token-detail', pk=token_id)
  35. response = self.client.get(url)
  36. self.assertStatus(response, status.HTTP_200_OK)
  37. self.assertEqual(
  38. set(response.data.keys()),
  39. {'id', 'created', 'last_used', 'max_age', 'max_unused_period', 'name', 'perm_manage_tokens',
  40. 'allowed_subnets', 'is_valid'}
  41. )
  42. self.assertFalse(any(token.encode() in response.content for token in [self.token.plain, self.token2.plain]))
  43. def test_retrieve_other_token(self):
  44. token_id = Token.objects.get(user=self.user).id
  45. url = self.reverse('v1:token-detail', pk=token_id)
  46. response = self.client.get(url)
  47. self.assertStatus(response, status.HTTP_404_NOT_FOUND)
  48. def test_update_my_token(self):
  49. url = self.reverse('v1:token-detail', pk=self.token.id)
  50. for method in [self.client.patch, self.client.put]:
  51. datas = [
  52. {'name': method.__name__},
  53. {'allowed_subnets': ['127.0.0.0/8']},
  54. {'allowed_subnets': ['127.0.0.0/8', '::/0']},
  55. {'max_age': '365 00:10:33.123456'},
  56. {'max_age': None},
  57. {'max_unused_period': '365 00:10:33.123456'},
  58. {'max_unused_period': None},
  59. ]
  60. for data in datas:
  61. response = method(url, data=data)
  62. self.assertStatus(response, status.HTTP_200_OK)
  63. for k, v in data.items():
  64. self.assertEqual(response.data[k], v)
  65. # Revoke token management permission
  66. response = self.client.patch(url, data={'perm_manage_tokens': False})
  67. self.assertStatus(response, status.HTTP_200_OK)
  68. # Verify that the change cannot be undone
  69. response = self.client.patch(url, data={'perm_manage_tokens': True})
  70. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  71. def test_create_token(self):
  72. n = len(Token.objects.filter(user=self.owner).all())
  73. datas = [
  74. {},
  75. {'name': '', 'perm_manage_tokens': True},
  76. {'name': 'foobar'},
  77. {'allowed_subnets': ['1.2.3.32/28', 'bade::affe/128']},
  78. ]
  79. for data in datas:
  80. response = self.client.post(self.reverse('v1:token-list'), data=data)
  81. self.assertStatus(response, status.HTTP_201_CREATED)
  82. self.assertEqual(
  83. set(response.data.keys()),
  84. {'id', 'created', 'last_used', 'max_age', 'max_unused_period', 'name', 'perm_manage_tokens',
  85. 'allowed_subnets', 'is_valid', 'token'}
  86. )
  87. self.assertEqual(response.data['name'], data.get('name', ''))
  88. self.assertEqual(response.data['allowed_subnets'], data.get('allowed_subnets', ['0.0.0.0/0', '::/0']))
  89. self.assertEqual(response.data['perm_manage_tokens'], data.get('perm_manage_tokens', False))
  90. self.assertIsNone(response.data['last_used'])
  91. self.assertEqual(len(Token.objects.filter(user=self.owner).all()), n + len(datas))
  92. class TokenForbiddenTestCase(DomainOwnerTestCase):
  93. def setUp(self):
  94. super().setUp()
  95. self.token2 = self.create_token(self.owner, name='testtoken')
  96. self.other_token = self.create_token(self.user)
  97. def test_token_last_used(self):
  98. self.assertIsNone(Token.objects.get(pk=self.token.id).last_used)
  99. self.client.get(self.reverse('v1:root'))
  100. self.assertIsNotNone(Token.objects.get(pk=self.token.id).last_used)
  101. def test_list_tokens(self):
  102. response = self.client.get(self.reverse('v1:token-list'))
  103. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  104. def test_delete_my_token(self):
  105. for token_id in [Token.objects.get(user=self.owner, name='testtoken').id, self.token.id]:
  106. url = self.reverse('v1:token-detail', pk=token_id)
  107. response = self.client.delete(url)
  108. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  109. def test_retrieve_my_token(self):
  110. for token_id in [Token.objects.get(user=self.owner, name='testtoken').id, self.token.id]:
  111. url = self.reverse('v1:token-detail', pk=token_id)
  112. response = self.client.get(url)
  113. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  114. def test_retrieve_other_token(self):
  115. token_id = Token.objects.get(user=self.user).id
  116. url = self.reverse('v1:token-detail', pk=token_id)
  117. response = self.client.get(url)
  118. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  119. def test_update_my_token(self):
  120. url = self.reverse('v1:token-detail', pk=self.token.id)
  121. for method in [self.client.patch, self.client.put]:
  122. datas = [{'name': method.__name__}, {'allowed_subnets': ['127.0.0.0/8']}]
  123. for data in datas:
  124. response = method(url, data=data)
  125. self.assertStatus(response, status.HTTP_403_FORBIDDEN)
  126. def test_create_token(self):
  127. datas = [{}, {'name': ''}, {'name': 'foobar'}]
  128. for data in datas:
  129. response = self.client.post(self.reverse('v1:token-list'), data=data)
  130. self.assertStatus(response, status.HTTP_403_FORBIDDEN)