Commit 559fa4b7 authored by Michal Čihař's avatar Michal Čihař

Add simple honeypot based spam protection (issue #82)

parent d830dc2c
......@@ -30,6 +30,7 @@
<form action="{{ unit.translation.get_translate_url }}" method="post">
{% csrf_token %}
{% if antispam %}<div id="s_content">{{ antispam }}</div>{% endif %}
<input type="hidden" name="type" value="{{ type }}" />
<input type="hidden" name="pos" value="{{ unit.position }}" />
<input type="hidden" name="q" value="{{ search_query }}" />
......
......@@ -283,4 +283,5 @@ $(function() {
$("form.autosubmit select").change(function() {
$("form.autosubmit").submit();
});
$('div#s_content').hide();
});
......@@ -100,6 +100,19 @@ class TranslationForm(forms.Form):
target = PluralField(required = False)
fuzzy = forms.BooleanField(label = pgettext_lazy('Checkbox for marking translation fuzzy', 'Fuzzy'), required = False)
class AntispamForm(forms.Form):
'''
Honeypot based spam protection form.
'''
content = forms.CharField()
def clean(self):
'''
Check if content is empty.
'''
if self.cleaned_data['content'] != '':
raise ValidationError('Invalid value')
class SimpleUploadForm(forms.Form):
file = forms.FileField(label = _('File'))
......
......@@ -15,7 +15,7 @@ from django.core.urlresolvers import reverse
from weblate.trans.models import Project, SubProject, Translation, Unit, Suggestion, Check, Dictionary, Change
from weblate.lang.models import Language
from weblate.trans.checks import CHECKS
from weblate.trans.forms import TranslationForm, UploadForm, SimpleUploadForm, ExtraUploadForm, SearchForm, MergeForm, AutoForm, WordForm, DictUploadForm, ReviewForm, LetterForm
from weblate.trans.forms import TranslationForm, UploadForm, SimpleUploadForm, ExtraUploadForm, SearchForm, MergeForm, AutoForm, WordForm, DictUploadForm, ReviewForm, LetterForm, AntispamForm
from weblate.trans.util import join_plural
from weblate.accounts.models import Profile
......@@ -660,8 +660,10 @@ def translate(request, project, subproject, lang):
if request.user.is_authenticated():
profile = request.user.get_profile()
antispam = None
else:
profile = None
antispam = AntispamForm()
secondary = None
unit = None
......@@ -670,6 +672,19 @@ def translate(request, project, subproject, lang):
# Any form submitted?
if request.method == 'POST':
# Antispam protection
if not request.user.is_authenticated():
antispam = AntispamForm(request.POST)
if not antispam.is_valid():
# Silently redirect to next entry
return HttpResponseRedirect('%s?type=%s&pos=%d%s' % (
obj.get_translate_url(),
rqtype,
pos,
search_url
))
form = TranslationForm(request.POST)
if form.is_valid() and not obj.subproject.locked:
# Check whether translation is not outdated
......@@ -929,6 +944,7 @@ def translate(request, project, subproject, lang):
'filter_count': filter_count,
'filter_pos': filter_count + 1 - units.count(),
'form': form,
'antispam': antispam,
'target_language': obj.language.code,
'secondary': secondary,
'search_query': search_query,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment