Edgewall Software

Ticket #7173: captchapass_final.diff

File captchapass_final.diff, 4.2 KB (added by stoecker, 21 months ago)

Final 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_expected'] 
     98            del req.session['captcha_reject_reason'] 
     99            req.session['captcha_verified'] = int(time.time()) 
     100            for key, value in req.session.iteritems(): 
     101                if key.startswith('captcha_arg_'): 
     102                    arg = key[12:] 
     103                    req.args[arg] = value 
     104            keys = req.session.keys() 
     105            for key in keys: 
     106                if key.startswith('captcha_arg_'): 
     107                    del req.session[key] 
     108            req.session.save() 
     109            try: 
     110                for newhandler in self.handlers: 
     111                    if newhandler.match_request(req): 
     112                        handler = newhandler 
     113                        break 
     114            except TracError, e: 
     115                return (handler) 
     116        return (handler) 
     117 
     118    def post_process_request(self, req, template, content_type): 
     119        return (template, content_type) 
     120 
     121    def post_process_request(self, req, template, data, content_type): 
     122        return (template, data, content_type) 
     123 
    96124    # Internal methods 
    97125 
    98126    def _expired(self, req): 
  • tracspamfilter/adapters.py

     
    8787 
    8888        text = req.args['text'] 
    8989        author = req.args.get('author', req.authname) 
    90         comment = req.args['comment'] 
     90        comment = req.args.get('comment') 
    9191 
    9292        # Test the actual page changes as well as the comment 
    9393        changes = [(page.text, text), (None, author)]