captcha.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from django.utils.translation import ugettext_lazy as _
  2. from misago.conf import settings
  3. from misago.core import forms
  4. def add_captcha_to_form(FormType, request):
  5. if session_already_passed_test(request.session):
  6. return FormType
  7. else:
  8. captcha_attrs = {}
  9. captcha_type = getattr(settings, FormType.captcha_setting)
  10. if captcha_type == 'recaptcha':
  11. captcha_attrs['has_recaptcha'] = True
  12. captcha_attrs.update(add_recaptcha_to_form(request))
  13. elif captcha_type == 'qa':
  14. captcha_attrs['has_qa_captcha'] = True
  15. captcha_attrs.update(add_qa_test_to_form(request))
  16. if captcha_attrs:
  17. captcha_attrs['session'] = request.session
  18. return type('FinalRegisterForm', (FormType,), captcha_attrs)
  19. """
  20. reCaptcha
  21. """
  22. def add_recaptcha_to_form(request):
  23. extra_fields = {}
  24. return extra_fields
  25. """
  26. Q&A
  27. """
  28. def clean_qa_answer(self):
  29. answer = self.cleaned_data['qa_answer']
  30. for predefined_answer in settings.qa_answers.lower().splitlines():
  31. predefined_answer = predefined_answer.strip().lower()
  32. if answer == predefined_answer:
  33. self.has_qa_captcha = False
  34. mark_session_as_passing(self.session)
  35. return answer
  36. else:
  37. raise forms.ValidationError(_("Entered answer is invalid."))
  38. def add_qa_test_to_form(request):
  39. qa_answer_field = forms.CharField(label=settings.qa_question,
  40. help_text=settings.qa_help_text)
  41. extra_fields = {
  42. 'qa_answer': qa_answer_field,
  43. 'clean_qa_answer': clean_qa_answer,
  44. }
  45. return extra_fields
  46. """
  47. Session utils
  48. """
  49. def session_already_passed_test(session):
  50. return session.get('passes_captcha')
  51. def mark_session_as_passing(session):
  52. session['passes_captcha'] = True