|
@@ -0,0 +1,81 @@
|
|
|
+from datetime import datetime
|
|
|
+
|
|
|
+from django.utils import timezone
|
|
|
+from misago.core import cachebuster
|
|
|
+
|
|
|
+from misago.users.models import Ban
|
|
|
+
|
|
|
+
|
|
|
+"""
|
|
|
+Utils for checking bans
|
|
|
+"""
|
|
|
+BAN_CACHE_SESSION_KEY = 'misago_ip_check'
|
|
|
+BAN_VERSION_KEY = 'misago_bans'
|
|
|
+
|
|
|
+
|
|
|
+def is_user_banned(user):
|
|
|
+ pass
|
|
|
+
|
|
|
+
|
|
|
+def is_ip_banned(request):
|
|
|
+ session_ban_cache = _get_session_bancache(request)
|
|
|
+ if session_ban_cache:
|
|
|
+ if session_ban_cache['is_banned']:
|
|
|
+ return session_ban_cache
|
|
|
+ else:
|
|
|
+ return False
|
|
|
+
|
|
|
+ found_ban = Ban.objects.find_ban(ip=request._misago_real_ip)
|
|
|
+
|
|
|
+ ban_cache = request.session[BAN_CACHE_SESSION_KEY] = {
|
|
|
+ 'version': cachebuster.get_version(BAN_VERSION_KEY),
|
|
|
+ 'ip': request._misago_real_ip,
|
|
|
+ }
|
|
|
+
|
|
|
+ if found_ban:
|
|
|
+ if found_ban.valid_until:
|
|
|
+ valid_until_as_string = found_ban.valid_until.strftime('%Y-%m-%d')
|
|
|
+ ban_cache['valid_until'] = valid_until_as_string
|
|
|
+ else:
|
|
|
+ ban_cache['valid_until'] = None
|
|
|
+
|
|
|
+ ban_cache.update({
|
|
|
+ 'is_banned': True,
|
|
|
+ 'message': found_ban.user_message
|
|
|
+ })
|
|
|
+ request.session[BAN_CACHE_SESSION_KEY] = ban_cache
|
|
|
+ return _hydrate_session_cache(request.session[BAN_CACHE_SESSION_KEY])
|
|
|
+ else:
|
|
|
+ ban_cache['is_banned'] = False
|
|
|
+ request.session[BAN_CACHE_SESSION_KEY] = ban_cache
|
|
|
+ return False
|
|
|
+
|
|
|
+
|
|
|
+def _get_session_bancache(request):
|
|
|
+ try:
|
|
|
+ ban_cache = request.session[BAN_CACHE_SESSION_KEY]
|
|
|
+ ban_cache = _hydrate_session_cache(ban_cache)
|
|
|
+ if ban_cache['ip'] != request._misago_real_ip:
|
|
|
+ return None
|
|
|
+ if not cachebuster.is_valid(BAN_VERSION_KEY, ban_cache['version']):
|
|
|
+ return None
|
|
|
+ if ban_cache.get('valid_until'):
|
|
|
+ """
|
|
|
+ Make two timezone unaware dates and compare them
|
|
|
+ """
|
|
|
+ if ban_cache.get('valid_until') < timezone.now().date():
|
|
|
+ return None
|
|
|
+ return ban_cache
|
|
|
+ except KeyError:
|
|
|
+ return None
|
|
|
+
|
|
|
+
|
|
|
+def _hydrate_session_cache(ban_cache):
|
|
|
+ hydrated = ban_cache.copy()
|
|
|
+
|
|
|
+ if hydrated.get('valid_until'):
|
|
|
+ expiration_datetime = datetime.strptime(ban_cache.get('valid_until'),
|
|
|
+ '%Y-%m-%d')
|
|
|
+ hydrated['valid_until'] = expiration_datetime.date()
|
|
|
+
|
|
|
+ return hydrated
|