test_bans.py 8.6 KB

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