12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- from datetime import date, datetime
- 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') < date.today():
- 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
|