test_bans.py 7.7 KB

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