test_bans.py 7.7 KB

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