captcha.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from recaptcha.client.captcha import displayhtml, submit as submit_recaptcha
  2. from django.utils.translation import ugettext_lazy as _
  3. from misago.conf import settings
  4. from misago.core import forms
  5. def validate_recaptcha(request):
  6. raise NotImplementedError('reCaptcha 2 is not implemented')
  7. answer = self.cleaned_data['qa_answer'].lower()
  8. for predefined_answer in settings.qa_answers.lower().splitlines():
  9. predefined_answer = predefined_answer.strip().lower()
  10. if answer == predefined_answer:
  11. self.has_qa_captcha = False
  12. return self.cleaned_data['qa_answer']
  13. else:
  14. raise forms.ValidationError(_("Entered answer is incorrect."))
  15. def validate_qacaptcha(request):
  16. raise NotImplementedError('Q&A captcha is not implemented')
  17. def validate_nocaptcha(request):
  18. return # no captcha means no validation
  19. CAPTCHA_TESTS = {
  20. 're': validate_recaptcha,
  21. 'qa': validate_qacaptcha,
  22. 'no': validate_nocaptcha,
  23. }
  24. def validate_captcha(request):
  25. if not session_already_passed_test(request.session):
  26. # run test and if it didn't raise validation error,
  27. # mark session as passing so we don't troll uses anymore
  28. CAPTCHA_TESTS[settings['captcha_type']](request)
  29. mark_session_as_passing(request.session)
  30. """
  31. Q&A
  32. """
  33. def clean_qa_answer(self):
  34. answer = self.cleaned_data['qa_answer'].lower()
  35. for predefined_answer in settings.qa_answers.lower().splitlines():
  36. predefined_answer = predefined_answer.strip().lower()
  37. if answer == predefined_answer:
  38. self.has_qa_captcha = False
  39. mark_session_as_passing(self.session)
  40. return self.cleaned_data['qa_answer']
  41. else:
  42. raise forms.ValidationError(_("Entered answer is incorrect."))
  43. def add_qa_test_to_form(request, test_passed):
  44. qa_answer_field = forms.CharField(label=settings.qa_question,
  45. help_text=settings.qa_help_text,
  46. required=(not test_passed))
  47. extra_fields = {
  48. 'passed_qa_captcha': test_passed,
  49. 'has_qa_captcha': True,
  50. 'qa_answer': qa_answer_field,
  51. 'clean_qa_answer': clean_qa_answer,
  52. }
  53. if test_passed:
  54. extra_fields['has_qa_captcha'] = False
  55. extra_fields.pop('clean_qa_answer')
  56. return extra_fields
  57. """
  58. Session utils
  59. """
  60. def session_already_passed_test(session):
  61. return session.get('passed_captcha')
  62. def mark_session_as_passing(session):
  63. session['passed_captcha'] = True