def test_object(self): captcha = MathCaptcha('1 * 2') self.assertFalse( captcha.validate(1) ) self.assertTrue( captcha.validate(2) ) restored = MathCaptcha.from_hash(captcha.hashed) self.assertEqual( captcha.question, restored.question ) self.assertRaises( ValueError, MathCaptcha.from_hash, captcha.hashed[:40] )
class CaptchaRegistrationForm(RegistrationForm): ''' Registration form with captcha protection. ''' captcha = forms.IntegerField(required=True) captcha_id = forms.CharField(widget=forms.HiddenInput) def __init__(self, data=None, *args, **kwargs): super(CaptchaRegistrationForm, self).__init__( data, *args, **kwargs ) # Load data self.tampering = False if data is None or 'captcha_id' not in data: self.captcha = MathCaptcha() else: try: self.captcha = MathCaptcha.from_hash(data['captcha_id']) except ValueError: self.captcha = MathCaptcha() self.tampering = True # Set correct label self.fields['captcha'].label = _('What is %s') % self.captcha.display self.fields['captcha_id'].initial = self.captcha.hashed def clean_captcha(self): ''' Validation for captcha. ''' if (self.tampering or not self.captcha.validate(self.cleaned_data['captcha'])): raise forms.ValidationError( _('Please check your math and try again.') ) if 'email' in self.cleaned_data: mail = self.cleaned_data['email'] else: mail = 'NONE' weblate.logger.info( 'Passed captcha for %s (%s = %s)', mail, self.captcha.question, self.cleaned_data['captcha'] )