from recaptcha.client.captcha import displayhtml, submit as submit_recaptcha
from django.utils.translation import ugettext_lazy as _
from misago.conf import settings
from misago.core import forms
def validate_recaptcha(request):
raise NotImplementedError('reCaptcha 2 is not implemented')
answer = self.cleaned_data['qa_answer'].lower()
for predefined_answer in settings.qa_answers.lower().splitlines():
predefined_answer = predefined_answer.strip().lower()
if answer == predefined_answer:
self.has_qa_captcha = False
return self.cleaned_data['qa_answer']
else:
raise forms.ValidationError(_("Entered answer is incorrect."))
def validate_qacaptcha(request):
raise NotImplementedError('Q&A captcha is not implemented')
def validate_nocaptcha(request):
return # no captcha means no validation
CAPTCHA_TESTS = {
're': validate_recaptcha,
'qa': validate_qacaptcha,
'no': validate_nocaptcha,
}
def validate_captcha(request):
if not session_already_passed_test(request.session):
# run test and if it didn't raise validation error,
# mark session as passing so we don't troll uses anymore
CAPTCHA_TESTS[settings['captcha_type']](request)
mark_session_as_passing(request.session)
"""
Q&A
"""
def clean_qa_answer(self):
answer = self.cleaned_data['qa_answer'].lower()
for predefined_answer in settings.qa_answers.lower().splitlines():
predefined_answer = predefined_answer.strip().lower()
if answer == predefined_answer:
self.has_qa_captcha = False
mark_session_as_passing(self.session)
return self.cleaned_data['qa_answer']
else:
raise forms.ValidationError(_("Entered answer is incorrect."))
def add_qa_test_to_form(request, test_passed):
qa_answer_field = forms.CharField(label=settings.qa_question,
help_text=settings.qa_help_text,
required=(not test_passed))
extra_fields = {
'passed_qa_captcha': test_passed,
'has_qa_captcha': True,
'qa_answer': qa_answer_field,
'clean_qa_answer': clean_qa_answer,
}
if test_passed:
extra_fields['has_qa_captcha'] = False
extra_fields.pop('clean_qa_answer')
return extra_fields
"""
Session utils
"""
def session_already_passed_test(session):
return session.get('passed_captcha')
def mark_session_as_passing(session):
session['passed_captcha'] = True