test_bans.py 8.9 KB

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