Edgewall Software

Ticket #7173: captchapass_final_errorfix.diff

File captchapass_final_errorfix.diff, 3.6 KB (added by stoecker, 21 months ago)

There was still a small glitch in error handling (value already deleted), which should be fixed in this version

  • tracspamfilter/captcha/api.py

     
    1818 
    1919from trac.core import * 
    2020from trac.config import ExtensionOption, IntOption 
    21 from trac.web.api import IRequestHandler 
     21from trac.web.api import IRequestFilter, IRequestHandler 
    2222from tracspamfilter.api import IFilterStrategy, IRejectHandler, RejectContent 
    2323 
    2424 
     
    3232 
    3333 
    3434class CaptchaSystem(Component): 
    35     implements(IRequestHandler, IRejectHandler, IFilterStrategy) 
     35    implements(IRequestHandler, IRejectHandler, IFilterStrategy, IRequestFilter) 
    3636 
     37    handlers = ExtensionPoint(IRequestHandler) 
     38 
    3739    captcha = ExtensionOption('spam-filter', 'captcha', ICaptchaMethod, 
    3840                              'ExpressionCaptcha', 
    3941        """ CAPTCHA method to use for verifying humans. """) 
     
    6163        if self._expired(req): 
    6264            req.session['captcha_reject_reason'] = message 
    6365            req.session['captcha_redirect'] = req.href(req.path_info) 
     66            for key, value in req.args.iteritems(): 
     67                req.session['captcha_arg_%s' % (key)] = value 
    6468            req.redirect(req.href.captcha()) 
    6569        else: 
    6670            raise RejectContent(message) 
     
    7377    def process_request(self, req): 
    7478        data = {} 
    7579        if req.method == 'POST': 
    76             self.env.log.debug('CAPTCHA response: %s (expected %s)' %  
    77                 (req.args['captcha_response'], req.session['captcha_expected'])) 
    7880            if req.args['captcha_response'] == req.session['captcha_expected']: 
    79                 redirect = req.session.get('captcha_redirect', req.href()) 
    80                 del req.session['captcha_redirect'] 
    81                 del req.session['captcha_expected'] 
    82                 del req.session['captcha_reject_reason'] 
    83                 req.session['captcha_verified'] = int(time.time()) 
    84                 req.session.save() 
    85                 req.redirect(redirect) 
     81                data['error'] = 'CAPTCHA failed to handle original request' 
    8682            else: 
    8783                data['error'] = 'CAPTCHA verification failed' 
    8884        else: 
     
    9389        req.session.save() 
    9490        return 'verify_captcha.html', data, None 
    9591 
     92    def pre_process_request(self, req, handler): 
     93        if(req.path_info == '/captcha' and req.method == 'POST' and 
     94        req.args['captcha_response'] == req.session['captcha_expected']): 
     95            req.environ['PATH_INFO'] = req.session.get('captcha_redirect', req.href()) 
     96            del req.session['captcha_redirect'] 
     97            del req.session['captcha_reject_reason'] 
     98            req.session['captcha_verified'] = int(time.time()) 
     99            keys = req.session.keys() 
     100            for key in keys: 
     101                if key.startswith('captcha_arg_'): 
     102                    arg = key[12:] 
     103                    req.args[arg] = req.session[key] 
     104                    del req.session[key] 
     105            try: 
     106                for newhandler in self.handlers: 
     107                    if newhandler.match_request(req): 
     108                        del req.session['captcha_expected'] 
     109                        handler = newhandler 
     110                        break 
     111            except TracError, e: 
     112                return (handler) 
     113            req.session.save() 
     114        return (handler) 
     115 
     116    def post_process_request(self, req, template, content_type): 
     117        return (template, content_type) 
     118 
     119    def post_process_request(self, req, template, data, content_type): 
     120        return (template, data, content_type) 
     121 
    96122    # Internal methods 
    97123 
    98124    def _expired(self, req):