|
|
"""
|
|
|
This module contains helper functions and helper classes.
|
|
|
"""
|
|
|
import hashlib
|
|
|
from django.utils import timezone
|
|
|
|
|
|
from neboard import settings
|
|
|
from boards.models import Post, User
|
|
|
from boards.models.post import SETTING_MODERATE
|
|
|
from boards.models.user import RANK_USER
|
|
|
import time
|
|
|
import neboard
|
|
|
|
|
|
|
|
|
KEY_CAPTCHA_FAILS = 'key_captcha_fails'
|
|
|
KEY_CAPTCHA_DELAY_TIME = 'key_captcha_delay_time'
|
|
|
KEY_CAPTCHA_LAST_ACTIVITY = 'key_captcha_last_activity'
|
|
|
|
|
|
|
|
|
def need_include_captcha(request):
|
|
|
"""
|
|
|
Check if request is made by a user.
|
|
|
It contains rules which check for bots.
|
|
|
"""
|
|
|
|
|
|
if not settings.ENABLE_CAPTCHA:
|
|
|
return False
|
|
|
|
|
|
enable_captcha = False
|
|
|
|
|
|
#newcomer
|
|
|
if KEY_CAPTCHA_LAST_ACTIVITY not in request.session:
|
|
|
return settings.ENABLE_CAPTCHA
|
|
|
|
|
|
last_activity = request.session[KEY_CAPTCHA_LAST_ACTIVITY]
|
|
|
current_delay = int(time.time()) - last_activity
|
|
|
|
|
|
delay_time = (request.session[KEY_CAPTCHA_DELAY_TIME]
|
|
|
if KEY_CAPTCHA_DELAY_TIME in request.session
|
|
|
else settings.CAPTCHA_DEFAULT_SAFE_TIME)
|
|
|
|
|
|
if current_delay < delay_time:
|
|
|
enable_captcha = True
|
|
|
|
|
|
print 'ENABLING' + str(enable_captcha)
|
|
|
|
|
|
return enable_captcha
|
|
|
|
|
|
|
|
|
def update_captcha_access(request, passed):
|
|
|
"""
|
|
|
Update captcha fields.
|
|
|
It will reduce delay time if user passed captcha verification and
|
|
|
it will increase it otherwise.
|
|
|
"""
|
|
|
session = request.session
|
|
|
|
|
|
delay_time = (request.session[KEY_CAPTCHA_DELAY_TIME]
|
|
|
if KEY_CAPTCHA_DELAY_TIME in request.session
|
|
|
else settings.CAPTCHA_DEFAULT_SAFE_TIME)
|
|
|
|
|
|
print "DELAY TIME = " + str(delay_time)
|
|
|
|
|
|
if passed:
|
|
|
delay_time -= 2 if delay_time >= 7 else 5
|
|
|
else:
|
|
|
delay_time += 10
|
|
|
|
|
|
session[KEY_CAPTCHA_LAST_ACTIVITY] = int(time.time())
|
|
|
session[KEY_CAPTCHA_DELAY_TIME] = delay_time
|
|
|
|
|
|
|
|
|
def get_client_ip(request):
|
|
|
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
|
|
|
if x_forwarded_for:
|
|
|
ip = x_forwarded_for.split(',')[-1].strip()
|
|
|
else:
|
|
|
ip = request.META.get('REMOTE_ADDR')
|
|
|
return ip
|
|
|
|
|
|
|
|
|
def datetime_to_epoch(datetime):
|
|
|
return int(time.mktime(timezone.localtime(
|
|
|
datetime,timezone.get_current_timezone()).timetuple())
|
|
|
* 1000000 + datetime.microsecond)
|
|
|
|
|
|
|
|
|
def get_user(request):
|
|
|
"""
|
|
|
Get current user from the session. If the user does not exist, create
|
|
|
a new one.
|
|
|
"""
|
|
|
|
|
|
session = request.session
|
|
|
if not 'user_id' in session:
|
|
|
request.session.save()
|
|
|
|
|
|
md5 = hashlib.md5()
|
|
|
md5.update(session.session_key)
|
|
|
new_id = md5.hexdigest()
|
|
|
|
|
|
while User.objects.filter(user_id=new_id).exists():
|
|
|
md5.update(str(timezone.now()))
|
|
|
new_id = md5.hexdigest()
|
|
|
|
|
|
time_now = timezone.now()
|
|
|
user = User.objects.create(user_id=new_id, rank=RANK_USER,
|
|
|
registration_time=time_now)
|
|
|
|
|
|
session['user_id'] = user.id
|
|
|
else:
|
|
|
user = User.objects.select_related('fav_tags').get(
|
|
|
id=session['user_id'])
|
|
|
|
|
|
return user
|
|
|
|
|
|
|
|
|
def get_theme(request, user=None):
|
|
|
"""
|
|
|
Get user's CSS theme
|
|
|
"""
|
|
|
|
|
|
if not user:
|
|
|
user = get_user(request)
|
|
|
theme = user.get_setting('theme')
|
|
|
if not theme:
|
|
|
theme = neboard.settings.DEFAULT_THEME
|
|
|
|
|
|
return theme
|