test_bans.py 8.8 KB

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