test_bans.py 8.6 KB

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