captcha.py 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import requests
  2. from django.core.exceptions import ValidationError
  3. from django.utils.translation import gettext as _
  4. from misago.conf import settings
  5. def recaptcha_test(request):
  6. r = requests.post(
  7. 'https://www.google.com/recaptcha/api/siteverify',
  8. data={
  9. 'secret': settings.recaptcha_secret_key,
  10. 'response': request.data.get('captcha'),
  11. 'remoteip': request.user_ip
  12. }
  13. )
  14. if r.status_code == 200:
  15. response_json = r.json()
  16. if not response_json.get('success'):
  17. raise ValidationError(_("Please try again."))
  18. else:
  19. raise ValidationError(_("Failed to contact reCAPTCHA API."))
  20. def qacaptcha_test(request):
  21. answer = request.data.get('captcha', '').lower()
  22. for predefined_answer in settings.qa_answers.lower().splitlines():
  23. predefined_answer = predefined_answer.strip().lower()
  24. if answer == predefined_answer:
  25. break
  26. else:
  27. raise ValidationError(_("Entered answer is incorrect."))
  28. def nocaptcha_test(request):
  29. return # no captcha means no validation
  30. CAPTCHA_TESTS = {
  31. 're': recaptcha_test,
  32. 'qa': qacaptcha_test,
  33. 'no': nocaptcha_test,
  34. }
  35. def test_request(request):
  36. CAPTCHA_TESTS[settings.captcha_type](request)