1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- import requests
- 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
- """
- Session flagging
- """
- def session_already_passed_test(session):
- return session.get('passed_captcha')
- def mark_session_as_passing(session):
- session['passed_captcha'] = True
- def reset_session(session):
- session.pop('passed_captcha', None)
- """
- Captcha tests
- """
- def recaptcha_test(request):
- r = requests.post('https://www.google.com/recaptcha/api/siteverify', data={
- 'secret': settings.recaptcha_secret_key,
- 'response': request.data.get('captcha'),
- 'remoteip': request.user_ip
- })
- if r.status_code == 200:
- response_json = r.json()
- if not response_json.get('success'):
- raise forms.ValidationError(_("Please try again."))
- else:
- raise forms.ValidationError(_("Failed to contact reCAPTCHA API."))
- def qacaptcha_test(request):
- answer = request.data.get('captcha', '').lower()
- for predefined_answer in settings.qa_answers.lower().splitlines():
- predefined_answer = predefined_answer.strip().lower()
- if answer == predefined_answer:
- break
- else:
- raise forms.ValidationError(_("Entered answer is incorrect."))
- def nocaptcha_test(request):
- return # no captcha means no validation
- CAPTCHA_TESTS = {
- 're': recaptcha_test,
- 'qa': qacaptcha_test,
- 'no': nocaptcha_test,
- }
- def test_request(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)
|