test_stop_abuse.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. from django.conf import settings
  2. from django.core import management
  3. from desecapi import models
  4. from desecapi.tests.base import DomainOwnerTestCase
  5. def block_exists(ip):
  6. return models.BlockedSubnet.objects.filter(subnet__net_contains=ip).exists()
  7. class StopAbuseCommandTest(DomainOwnerTestCase):
  8. @classmethod
  9. def setUpTestDataWithPdns(cls):
  10. super().setUpTestDataWithPdns()
  11. cls.create_rr_set(
  12. cls.my_domains[1], ["127.0.0.1", "4.2.2.4"], type="A", ttl=123
  13. )
  14. cls.create_rr_set(
  15. cls.other_domains[1], ["40.1.1.1", "127.0.0.2"], type="A", ttl=456
  16. )
  17. for d in cls.my_domains + cls.other_domains:
  18. cls.create_rr_set(d, ["ns1.example.", "ns2.example."], type="NS", ttl=456)
  19. cls.create_rr_set(
  20. d,
  21. ["ns1.example.", "ns2.example."],
  22. type="NS",
  23. ttl=456,
  24. subname="subname",
  25. )
  26. cls.create_rr_set(d, ['"foo"'], type="TXT", ttl=456)
  27. def test_noop(self):
  28. # test implicit by absence assertPdnsRequests
  29. management.call_command("stop-abuse")
  30. def test_remove_rrsets_by_domain_name(self):
  31. with self.assertRequests(
  32. self.requests_desec_rr_sets_update(name=self.my_domain.name)
  33. ):
  34. management.call_command("stop-abuse", self.my_domain)
  35. self.assertEqual(
  36. models.RRset.objects.filter(domain__name=self.my_domain.name).count(), 1
  37. ) # only NS left
  38. self.assertEqual(
  39. set(
  40. models.RR.objects.filter(
  41. rrset__domain__name=self.my_domain.name
  42. ).values_list("content", flat=True)
  43. ),
  44. set(settings.DEFAULT_NS),
  45. )
  46. self.assertTrue(block_exists("3.2.2.3"))
  47. self.assertFalse(block_exists("40.1.1.1"))
  48. self.assertFalse(block_exists("127.0.0.1"))
  49. def test_remove_rrsets_by_email(self):
  50. with self.assertRequests(
  51. *[self.requests_desec_rr_sets_update(name=d.name) for d in self.my_domains],
  52. expect_order=False,
  53. ):
  54. management.call_command("stop-abuse", self.owner.email)
  55. self.assertEqual(
  56. models.RRset.objects.filter(domain__name=self.my_domain.name).count(), 1
  57. ) # only NS left
  58. self.assertEqual(
  59. set(
  60. models.RR.objects.filter(
  61. rrset__domain__name=self.my_domain.name
  62. ).values_list("content", flat=True)
  63. ),
  64. set(settings.DEFAULT_NS),
  65. )
  66. self.assertTrue(block_exists("3.2.2.3"))
  67. self.assertTrue(block_exists("4.2.2.4"))
  68. self.assertFalse(block_exists("40.1.1.1"))
  69. self.assertFalse(block_exists("127.0.0.1"))
  70. def test_disable_user_by_domain_name(self):
  71. with self.assertRequests(
  72. self.requests_desec_rr_sets_update(name=self.my_domain.name)
  73. ):
  74. management.call_command("stop-abuse", self.my_domain)
  75. self.owner.refresh_from_db()
  76. self.assertEqual(self.owner.is_active, False)
  77. def test_disable_user_by_email(self):
  78. with self.assertRequests(
  79. *[self.requests_desec_rr_sets_update(name=d.name) for d in self.my_domains],
  80. expect_order=False,
  81. ):
  82. management.call_command("stop-abuse", self.owner.email)
  83. self.owner.refresh_from_db()
  84. self.assertEqual(self.owner.is_active, False)
  85. def test_keep_other_owned_domains_name(self):
  86. with self.assertRequests(
  87. self.requests_desec_rr_sets_update(name=self.my_domain.name)
  88. ):
  89. management.call_command("stop-abuse", self.my_domain)
  90. self.assertGreater(
  91. models.RRset.objects.filter(domain__name=self.my_domains[1].name).count(), 1
  92. )
  93. def test_dont_keep_other_owned_domains_email(self):
  94. with self.assertRequests(
  95. *[self.requests_desec_rr_sets_update(name=d.name) for d in self.my_domains],
  96. expect_order=False,
  97. ):
  98. management.call_command("stop-abuse", self.owner.email)
  99. self.assertEqual(
  100. models.RRset.objects.filter(domain__name=self.my_domains[1].name).count(), 1
  101. )
  102. def test_only_disable_owner(self):
  103. with self.assertRequests(
  104. self.requests_desec_rr_sets_update(name=self.my_domains[0].name),
  105. self.requests_desec_rr_sets_update(name=self.my_domains[1].name),
  106. expect_order=False,
  107. ):
  108. management.call_command("stop-abuse", self.my_domain, self.owner.email)
  109. self.my_domain.owner.refresh_from_db()
  110. self.other_domain.owner.refresh_from_db()
  111. self.assertEqual(self.my_domain.owner.is_active, False)
  112. self.assertEqual(self.other_domain.owner.is_active, True)
  113. def test_disable_owners_by_domain_name(self):
  114. with self.assertRequests(
  115. self.requests_desec_rr_sets_update(name=self.my_domain.name),
  116. self.requests_desec_rr_sets_update(name=self.other_domain.name),
  117. expect_order=False,
  118. ):
  119. management.call_command("stop-abuse", self.my_domain, self.other_domain)
  120. self.my_domain.owner.refresh_from_db()
  121. self.other_domain.owner.refresh_from_db()
  122. self.assertEqual(self.my_domain.owner.is_active, False)
  123. self.assertEqual(self.other_domain.owner.is_active, False)
  124. def test_disable_owners_by_email(self):
  125. with self.assertRequests(
  126. *[
  127. self.requests_desec_rr_sets_update(name=d.name)
  128. for d in self.my_domains + self.other_domains
  129. ],
  130. expect_order=False,
  131. ):
  132. management.call_command(
  133. "stop-abuse",
  134. self.owner.email,
  135. *[d.owner.email for d in self.other_domains],
  136. )
  137. self.my_domain.owner.refresh_from_db()
  138. self.other_domain.owner.refresh_from_db()
  139. self.assertEqual(self.my_domain.owner.is_active, False)
  140. self.assertEqual(self.other_domain.owner.is_active, False)