test_totp.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. from rest_framework import status
  2. from desecapi.tests.base import DomainOwnerTestCase
  3. class TOTPFactorTestCase(DomainOwnerTestCase):
  4. def setUp(self):
  5. super().setUp()
  6. # Make the token a log-in token
  7. self.token.perm_manage_tokens = True
  8. self.token.save()
  9. def test_workflow(self):
  10. # Request setting up TOTP factor
  11. self.client.post(self.reverse("v1:totp-list"))
  12. # Factor is not yet created
  13. self.assertFalse(self.owner.basefactor_set.exists())
  14. # Retrieve confirmation link
  15. confirmation_link = self.assertEmailSent(
  16. subject_contains="deSEC",
  17. body_contains="request to create a TOTP token",
  18. recipient=[self.owner.email],
  19. pattern=r"following link[^:]*:\s+([^\s]*)",
  20. )
  21. self.assertConfirmationLinkRedirect(confirmation_link)
  22. # Redeem confirmation link
  23. response = self.client.post(confirmation_link)
  24. self.assertResponse(response, status.HTTP_200_OK)
  25. totp = response.data
  26. self.assertEqual(totp.keys(), {"id", "created", "last_used", "name", "secret"})
  27. self.assertEqual(totp["name"], "")
  28. self.assertIsNone(totp["last_used"])
  29. self.assertRegex(totp["secret"], r"^[A-Z0-9]{52}$") # 32 bytes make 52 chars
  30. self.assertEqual(
  31. self.owner.basefactor_set.get().totpfactor.last_verified_timestep, 0
  32. )
  33. # Can't fetch the secret
  34. response = self.client.get(self.reverse("v1:totp-detail", pk=totp["id"]))
  35. self.assertEqual(
  36. response.data, {k: v for k, v in totp.items() if k != "secret"}
  37. )
  38. # Ensure that MFA is not active yet
  39. response = self.client.get(self.reverse("v1:domain-list"))
  40. self.assertEqual(len(response.data), 2)