bans.py 2.3 KB

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