test_bans.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. from datetime import timedelta
  2. from django.contrib.auth import get_user_model
  3. from django.test import TestCase
  4. from django.utils import timezone
  5. from misago.conftest import get_cache_versions
  6. from misago.users.bans import (
  7. ban_ip,
  8. ban_user,
  9. get_email_ban,
  10. get_ip_ban,
  11. get_request_ip_ban,
  12. get_user_ban,
  13. get_username_ban,
  14. )
  15. from misago.users.constants import BANS_CACHE
  16. from misago.users.models import Ban
  17. UserModel = get_user_model()
  18. cache_versions = get_cache_versions()
  19. class GetBanTests(TestCase):
  20. def test_get_username_ban(self):
  21. """get_username_ban returns valid ban"""
  22. nonexistent_ban = get_username_ban("nonexistent")
  23. self.assertIsNone(nonexistent_ban)
  24. Ban.objects.create(
  25. banned_value="expired", expires_on=timezone.now() - timedelta(days=7)
  26. )
  27. expired_ban = get_username_ban("expired")
  28. self.assertIsNone(expired_ban)
  29. Ban.objects.create(banned_value="wrongtype", check_type=Ban.EMAIL)
  30. wrong_type_ban = get_username_ban("wrongtype")
  31. self.assertIsNone(wrong_type_ban)
  32. valid_ban = Ban.objects.create(
  33. banned_value="admi*", expires_on=timezone.now() + timedelta(days=7)
  34. )
  35. self.assertEqual(get_username_ban("admiral").pk, valid_ban.pk)
  36. registration_ban = Ban.objects.create(
  37. banned_value="bob*",
  38. expires_on=timezone.now() + timedelta(days=7),
  39. registration_only=True,
  40. )
  41. self.assertIsNone(get_username_ban("boberson"))
  42. self.assertEqual(get_username_ban("boberson", True).pk, registration_ban.pk)
  43. def test_get_email_ban(self):
  44. """get_email_ban returns valid ban"""
  45. nonexistent_ban = get_email_ban("non@existent.com")
  46. self.assertIsNone(nonexistent_ban)
  47. Ban.objects.create(
  48. banned_value="ex@pired.com",
  49. check_type=Ban.EMAIL,
  50. expires_on=timezone.now() - timedelta(days=7),
  51. )
  52. expired_ban = get_email_ban("ex@pired.com")
  53. self.assertIsNone(expired_ban)
  54. Ban.objects.create(banned_value="wrong@type.com", check_type=Ban.IP)
  55. wrong_type_ban = get_email_ban("wrong@type.com")
  56. self.assertIsNone(wrong_type_ban)
  57. valid_ban = Ban.objects.create(
  58. banned_value="*.ru",
  59. check_type=Ban.EMAIL,
  60. expires_on=timezone.now() + timedelta(days=7),
  61. )
  62. self.assertEqual(get_email_ban("banned@mail.ru").pk, valid_ban.pk)
  63. registration_ban = Ban.objects.create(
  64. banned_value="*.ua",
  65. check_type=Ban.EMAIL,
  66. expires_on=timezone.now() + timedelta(days=7),
  67. registration_only=True,
  68. )
  69. self.assertIsNone(get_email_ban("banned@mail.ua"))
  70. self.assertEqual(get_email_ban("banned@mail.ua", True).pk, registration_ban.pk)
  71. def test_get_ip_ban(self):
  72. """get_ip_ban returns valid ban"""
  73. nonexistent_ban = get_ip_ban("123.0.0.1")
  74. self.assertIsNone(nonexistent_ban)
  75. Ban.objects.create(
  76. banned_value="124.0.0.1",
  77. check_type=Ban.IP,
  78. expires_on=timezone.now() - timedelta(days=7),
  79. )
  80. expired_ban = get_ip_ban("124.0.0.1")
  81. self.assertIsNone(expired_ban)
  82. Ban.objects.create(banned_value="wrongtype", check_type=Ban.EMAIL)
  83. wrong_type_ban = get_ip_ban("wrongtype")
  84. self.assertIsNone(wrong_type_ban)
  85. valid_ban = Ban.objects.create(
  86. banned_value="125.0.0.*",
  87. check_type=Ban.IP,
  88. expires_on=timezone.now() + timedelta(days=7),
  89. )
  90. self.assertEqual(get_ip_ban("125.0.0.1").pk, valid_ban.pk)
  91. registration_ban = Ban.objects.create(
  92. banned_value="188.*",
  93. check_type=Ban.IP,
  94. expires_on=timezone.now() + timedelta(days=7),
  95. registration_only=True,
  96. )
  97. self.assertIsNone(get_ip_ban("188.12.12.41"))
  98. self.assertEqual(get_ip_ban("188.12.12.41", True).pk, registration_ban.pk)
  99. class UserBansTests(TestCase):
  100. def setUp(self):
  101. self.user = UserModel.objects.create_user("Bob", "bob@boberson.com", "pass123")
  102. def test_no_ban(self):
  103. """user is not caught by ban"""
  104. self.assertIsNone(get_user_ban(self.user, cache_versions))
  105. self.assertFalse(self.user.ban_cache.is_banned)
  106. def test_permanent_ban(self):
  107. """user is caught by permanent ban"""
  108. Ban.objects.create(
  109. banned_value="bob", user_message="User reason", staff_message="Staff reason"
  110. )
  111. user_ban = get_user_ban(self.user, cache_versions)
  112. self.assertIsNotNone(user_ban)
  113. self.assertEqual(user_ban.user_message, "User reason")
  114. self.assertEqual(user_ban.staff_message, "Staff reason")
  115. self.assertTrue(self.user.ban_cache.is_banned)
  116. def test_temporary_ban(self):
  117. """user is caught by temporary ban"""
  118. Ban.objects.create(
  119. banned_value="bo*",
  120. user_message="User reason",
  121. staff_message="Staff reason",
  122. expires_on=timezone.now() + timedelta(days=7),
  123. )
  124. user_ban = get_user_ban(self.user, cache_versions)
  125. self.assertIsNotNone(user_ban)
  126. self.assertEqual(user_ban.user_message, "User reason")
  127. self.assertEqual(user_ban.staff_message, "Staff reason")
  128. self.assertTrue(self.user.ban_cache.is_banned)
  129. def test_expired_ban(self):
  130. """user is not caught by expired ban"""
  131. Ban.objects.create(
  132. banned_value="bo*", expires_on=timezone.now() - timedelta(days=7)
  133. )
  134. self.assertIsNone(get_user_ban(self.user, cache_versions))
  135. self.assertFalse(self.user.ban_cache.is_banned)
  136. def test_expired_non_flagged_ban(self):
  137. """user is not caught by expired but checked ban"""
  138. Ban.objects.create(
  139. banned_value="bo*", expires_on=timezone.now() - timedelta(days=7)
  140. )
  141. Ban.objects.update(is_checked=True)
  142. self.assertIsNone(get_user_ban(self.user, cache_versions))
  143. self.assertFalse(self.user.ban_cache.is_banned)
  144. class MockRequest(object):
  145. def __init__(self):
  146. self.user_ip = "127.0.0.1"
  147. self.session = {}
  148. self.cache_versions = cache_versions
  149. class RequestIPBansTests(TestCase):
  150. def test_no_ban(self):
  151. """no ban found"""
  152. ip_ban = get_request_ip_ban(MockRequest())
  153. self.assertIsNone(ip_ban)
  154. def test_permanent_ban(self):
  155. """ip is caught by permanent ban"""
  156. Ban.objects.create(
  157. check_type=Ban.IP, banned_value="127.0.0.1", user_message="User reason"
  158. )
  159. ip_ban = get_request_ip_ban(MockRequest())
  160. self.assertTrue(ip_ban["is_banned"])
  161. self.assertEqual(ip_ban["ip"], "127.0.0.1")
  162. self.assertEqual(ip_ban["message"], "User reason")
  163. # repeated call uses cache
  164. get_request_ip_ban(MockRequest())
  165. def test_temporary_ban(self):
  166. """ip is caught by temporary ban"""
  167. Ban.objects.create(
  168. check_type=Ban.IP,
  169. banned_value="127.0.0.1",
  170. user_message="User reason",
  171. expires_on=timezone.now() + timedelta(days=7),
  172. )
  173. ip_ban = get_request_ip_ban(MockRequest())
  174. self.assertTrue(ip_ban["is_banned"])
  175. self.assertEqual(ip_ban["ip"], "127.0.0.1")
  176. self.assertEqual(ip_ban["message"], "User reason")
  177. # repeated call uses cache
  178. get_request_ip_ban(MockRequest())
  179. def test_expired_ban(self):
  180. """ip is not caught by expired ban"""
  181. Ban.objects.create(
  182. check_type=Ban.IP,
  183. banned_value="127.0.0.1",
  184. user_message="User reason",
  185. expires_on=timezone.now() - timedelta(days=7),
  186. )
  187. ip_ban = get_request_ip_ban(MockRequest())
  188. self.assertIsNone(ip_ban)
  189. # repeated call uses cache
  190. get_request_ip_ban(MockRequest())
  191. class BanUserTests(TestCase):
  192. def test_ban_user(self):
  193. """ban_user utility bans user"""
  194. user = UserModel.objects.create_user("Bob", "bob@boberson.com", "pass123")
  195. ban = ban_user(user, "User reason", "Staff reason")
  196. self.assertEqual(ban.user_message, "User reason")
  197. self.assertEqual(ban.staff_message, "Staff reason")
  198. db_ban = get_user_ban(user, cache_versions)
  199. self.assertEqual(ban.pk, db_ban.ban_id)
  200. class BanIpTests(TestCase):
  201. def test_ban_ip(self):
  202. """ban_ip utility bans IP address"""
  203. ban = ban_ip("127.0.0.1", "User reason", "Staff reason")
  204. self.assertEqual(ban.user_message, "User reason")
  205. self.assertEqual(ban.staff_message, "Staff reason")
  206. db_ban = get_ip_ban("127.0.0.1")
  207. self.assertEqual(ban.pk, db_ban.pk)