test_bans.py 7.6 KB

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