test_bans.py 7.7 KB

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