banmodel.py 3.1 KB

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