web/captcha.py
branchstable
changeset 5037 7778a2bbdf9d
parent 4722 9c13d5db03d9
child 5223 6abd6e3599f4
child 5421 8167de96c523
equal deleted inserted replaced
5036:3e436a494ce3 5037:7778a2bbdf9d
    15 
    15 
    16 
    16 
    17 from time import time
    17 from time import time
    18 
    18 
    19 from cubicweb import tags
    19 from cubicweb import tags
    20 from cubicweb.web import formwidgets as fw
    20 from cubicweb.web import ProcessFormError, formwidgets as fw
    21 
    21 
    22 
    22 
    23 def pil_captcha(text, fontfile, fontsize):
    23 def pil_captcha(text, fontfile, fontsize):
    24     """Generate a captcha image. Return a PIL image object.
    24     """Generate a captcha image. Return a PIL image object.
    25 
    25 
    61 
    61 
    62 
    62 
    63 class CaptchaWidget(fw.TextInput):
    63 class CaptchaWidget(fw.TextInput):
    64     def render(self, form, field, renderer=None):
    64     def render(self, form, field, renderer=None):
    65         # t=int(time()*100) to make sure img is not cached
    65         # t=int(time()*100) to make sure img is not cached
    66         src = form._cw.build_url('view', vid='captcha', t=int(time()*100))
    66         src = form._cw.build_url('view', vid='captcha', t=int(time()*100),
       
    67                                  captchakey=field.input_name(form))
    67         img = tags.img(src=src, alt=u'captcha')
    68         img = tags.img(src=src, alt=u'captcha')
    68         img = u'<div class="captcha">%s</div>' % img
    69         img = u'<div class="captcha">%s</div>' % img
    69         return img + super(CaptchaWidget, self).render(form, field, renderer)
    70         return img + super(CaptchaWidget, self).render(form, field, renderer)
       
    71 
       
    72     def process_field_data(self, form, field):
       
    73         captcha = form._cw.get_session_data(field.input_name(form), None,
       
    74                                             pop=True)
       
    75         val = super(CaptchaWidget, self).process_field_data(form, field)
       
    76         if val is None:
       
    77             return val # required will be checked by field
       
    78         if captcha is None:
       
    79             msg = form._cw._('unable to check captcha, please try again')
       
    80             raise ProcessFormError(msg)
       
    81         elif val.lower() != captcha.lower():
       
    82             msg = form._cw._('incorrect captcha value')
       
    83             raise ProcessFormError(msg)
       
    84         return val