49 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# Captcha/ReCaptcha validators. We override the standard validators from
 | 
						|
# plone.formwidget.captcha and plone.formwidget.recaptcha, in order to
 | 
						|
# switch between the two. This is necessary, because the zcml registration
 | 
						|
# of the CaptchaValidator has to be there, no matter which captcha solution
 | 
						|
# is installed, or even when no captcha solution is installed.
 | 
						|
 | 
						|
from Acquisition import aq_inner
 | 
						|
 | 
						|
from z3c.form import validator
 | 
						|
 | 
						|
from z3c.form.interfaces import IValidator
 | 
						|
 | 
						|
from zope.component import getMultiAdapter, provideAdapter, queryUtility
 | 
						|
 | 
						|
from zope.schema import ValidationError
 | 
						|
 | 
						|
from plone.registry.interfaces import IRegistry
 | 
						|
 | 
						|
from plone.app.discussion.interfaces import IDiscussionSettings
 | 
						|
 | 
						|
from plone.formwidget.captcha import CaptchaMessageFactory as _
 | 
						|
 | 
						|
class WrongCaptchaCode(ValidationError):
 | 
						|
    __doc__ = _("""The code you entered was wrong, please enter the new one.""")
 | 
						|
 | 
						|
class CaptchaValidator(validator.SimpleFieldValidator):
 | 
						|
 | 
						|
    def validate(self, value):
 | 
						|
        super(CaptchaValidator, self).validate(value)
 | 
						|
 | 
						|
        registry = queryUtility(IRegistry)
 | 
						|
        settings = registry.forInterface(IDiscussionSettings)
 | 
						|
 | 
						|
        if settings.captcha == 'captcha':
 | 
						|
            # Fetch captcha view
 | 
						|
            captcha = getMultiAdapter((aq_inner(self.context), self.request), name='captcha')
 | 
						|
            if value:
 | 
						|
                if not captcha.verify(value):
 | 
						|
                    raise WrongCaptchaCode
 | 
						|
                else:
 | 
						|
                    return True
 | 
						|
            raise WrongCaptchaCode
 | 
						|
        elif settings.captcha == 'recaptcha':
 | 
						|
            # Fetch recatpcha view
 | 
						|
            captcha = getMultiAdapter((aq_inner(self.context), self.request), name='recaptcha')
 | 
						|
            if not captcha.verify():
 | 
						|
                raise WrongCaptchaCode
 | 
						|
            else:
 | 
						|
                return True |