bans.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from datetime import datetime
  2. from django.utils import timezone
  3. from misago.core import cachebuster
  4. from misago.users.models import Ban
  5. """
  6. Utils for checking bans
  7. """
  8. BAN_CACHE_SESSION_KEY = 'misago_ip_check'
  9. BAN_VERSION_KEY = 'misago_bans'
  10. def is_user_banned(user):
  11. pass
  12. def is_ip_banned(request):
  13. session_ban_cache = _get_session_bancache(request)
  14. if session_ban_cache:
  15. if session_ban_cache['is_banned']:
  16. return session_ban_cache
  17. else:
  18. return False
  19. found_ban = Ban.objects.find_ban(ip=request._misago_real_ip)
  20. ban_cache = request.session[BAN_CACHE_SESSION_KEY] = {
  21. 'version': cachebuster.get_version(BAN_VERSION_KEY),
  22. 'ip': request._misago_real_ip,
  23. }
  24. if found_ban:
  25. if found_ban.valid_until:
  26. valid_until_as_string = found_ban.valid_until.strftime('%Y-%m-%d')
  27. ban_cache['valid_until'] = valid_until_as_string
  28. else:
  29. ban_cache['valid_until'] = None
  30. ban_cache.update({
  31. 'is_banned': True,
  32. 'message': found_ban.user_message
  33. })
  34. request.session[BAN_CACHE_SESSION_KEY] = ban_cache
  35. return _hydrate_session_cache(request.session[BAN_CACHE_SESSION_KEY])
  36. else:
  37. ban_cache['is_banned'] = False
  38. request.session[BAN_CACHE_SESSION_KEY] = ban_cache
  39. return False
  40. def _get_session_bancache(request):
  41. try:
  42. ban_cache = request.session[BAN_CACHE_SESSION_KEY]
  43. ban_cache = _hydrate_session_cache(ban_cache)
  44. if ban_cache['ip'] != request._misago_real_ip:
  45. return None
  46. if not cachebuster.is_valid(BAN_VERSION_KEY, ban_cache['version']):
  47. return None
  48. if ban_cache.get('valid_until'):
  49. """
  50. Make two timezone unaware dates and compare them
  51. """
  52. if ban_cache.get('valid_until') < timezone.now().date():
  53. return None
  54. return ban_cache
  55. except KeyError:
  56. return None
  57. def _hydrate_session_cache(ban_cache):
  58. hydrated = ban_cache.copy()
  59. if hydrated.get('valid_until'):
  60. expiration_datetime = datetime.strptime(ban_cache.get('valid_until'),
  61. '%Y-%m-%d')
  62. hydrated['valid_until'] = expiration_datetime.date()
  63. return hydrated