test_bans.py 7.6 KB

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