banmodel.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import re
  2. from django.db import models
  3. from django.db.models import Q
  4. from django.utils import timezone
  5. from misago.monitor import monitor
  6. BAN_NAME_EMAIL = 0
  7. BAN_NAME = 1
  8. BAN_EMAIL = 2
  9. BAN_IP = 3
  10. class BansManager(models.Manager):
  11. def check_ban(self, ip=False, username=False, email=False):
  12. bans_model = Ban.objects.filter(Q(expires=None) | Q(expires__gt=timezone.now()))
  13. if not (ip and username and email):
  14. if ip:
  15. bans_model.filter(test=BAN_IP)
  16. if username:
  17. bans_model.filter(test=BAN_NAME_EMAIL)
  18. bans_model.filter(test=BAN_NAME)
  19. if email:
  20. bans_model.filter(test=BAN_NAME_EMAIL)
  21. bans_model.filter(test=BAN_EMAIL)
  22. for ban in bans_model.order_by('-expires').iterator():
  23. if (
  24. # Check user name
  25. ((username and (ban.test == BAN_NAME_EMAIL or ban.test == BAN_NAME))
  26. and re.search('^' + re.escape(ban.ban).replace('\*', '(.*?)') + '$', username, flags=re.IGNORECASE))
  27. or # Check user email
  28. ((email and (ban.test == BAN_NAME_EMAIL or ban.test == BAN_EMAIL))
  29. and re.search('^' + re.escape(ban.ban).replace('\*', '(.*?)') + '$', email, flags=re.IGNORECASE))
  30. or # Check IP address
  31. (ip and ban.test == BAN_IP
  32. and re.search('^' + re.escape(ban.ban).replace('\*', '(.*?)') + '$', ip, flags=re.IGNORECASE))):
  33. return ban
  34. return False
  35. class Ban(models.Model):
  36. test = models.PositiveIntegerField(default=BAN_NAME_EMAIL)
  37. ban = models.CharField(max_length=255)
  38. reason_user = models.TextField(null=True, blank=True)
  39. reason_admin = models.TextField(null=True, blank=True)
  40. expires = models.DateTimeField(null=True, blank=True)
  41. objects = BansManager()
  42. class Meta:
  43. app_label = 'misago'
  44. class BanCache(object):
  45. def __init__(self):
  46. self.banned = False
  47. self.test = None
  48. self.expires = None
  49. self.reason_user = None
  50. self.version = 0
  51. def check_for_updates(self, request):
  52. if (self.version < monitor['bans_version']
  53. or (self.expires != None and self.expires < timezone.now())):
  54. self.version = monitor['bans_version']
  55. # Check Ban
  56. if request.user.is_authenticated():
  57. ban = Ban.objects.check_ban(
  58. ip=request.session.get_ip(request),
  59. username=request.user.username,
  60. email=request.user.email
  61. )
  62. else:
  63. ban = Ban.objects.check_ban(ip=request.session.get_ip(request))
  64. # Update ban cache
  65. if ban:
  66. self.banned = True
  67. self.reason_user = ban.reason_user
  68. self.expires = ban.expires
  69. self.test = ban.test
  70. else:
  71. self.banned = False
  72. self.reason_user = None
  73. self.expires = None
  74. self.test = None
  75. return True
  76. return False
  77. def is_banned(self):
  78. return self.banned