Edgewall Software

Ticket #7173: captchapass.diff

File captchapass.diff, 4.8 KB (added by stoecker, 21 months ago)

Working version (tested with newticket) still including lots of debug code

  • tracspamfilter/captcha/api.py

     
    1919from trac.core import * 
    2020from trac.config import ExtensionOption, IntOption 
    2121from trac.web.api import IRequestHandler 
     22from trac.web import IRequestFilter 
    2223from tracspamfilter.api import IFilterStrategy, IRejectHandler, RejectContent 
    2324 
    2425 
     
    3233 
    3334 
    3435class CaptchaSystem(Component): 
    35     implements(IRequestHandler, IRejectHandler, IFilterStrategy) 
     36    implements(IRequestHandler, IRejectHandler, IFilterStrategy, IRequestFilter) 
    3637 
     38    handlers = ExtensionPoint(IRequestHandler) 
     39 
    3740    captcha = ExtensionOption('spam-filter', 'captcha', ICaptchaMethod, 
    3841                              'ExpressionCaptcha', 
    3942        """ CAPTCHA method to use for verifying humans. """) 
    4043 
    41     karma_points = IntOption('spam-filter', 'captcha_karma', 10, 
     44#    karma_points = IntOption('spam-filter', 'captcha_karma', 10, 
     45    karma_points = IntOption('spam-filter', 'captcha_karma', 100, 
    4246        """By how many points a successful CAPTCHA response increases the 
    4347        overall score.""") 
    4448 
    45     karma_lifetime = IntOption('spam-filter', 'captcha_karma_lifetime', 86400, 
    46         """Time in seconds that a successful CAPTCHA response increases 
     49 #   karma_lifetime = IntOption('spam-filter', 'captcha_karma_lifetime', 86400, 
     50    karma_lifetime = IntOption('spam-filter', 'captcha_karma_lifetime', 30, 
     51         """Time in seconds that a successful CAPTCHA response increases 
    4752        karma.""") 
    4853 
    4954    # IFilterStrategy methods 
     
    5863    # IRejectHandler methods 
    5964 
    6065    def reject_content(self, req, message): 
     66        self.log.info('Reject 0 "%s"', req.path_info) 
    6167        if self._expired(req): 
    6268            req.session['captcha_reject_reason'] = message 
    6369            req.session['captcha_redirect'] = req.href(req.path_info) 
     70            for key, value in req.args.iteritems(): 
     71                req.session['captcha_arg_%s' % (key)] = value 
     72                self.log.info('Reject 1 "%s" = "%s"', key, value) 
    6473            req.redirect(req.href.captcha()) 
    6574        else: 
    6675            raise RejectContent(message) 
     
    6877    # IRequestHandler methods 
    6978 
    7079    def match_request(self, req): 
     80        self.log.info('Match "%s"', req.path_info) 
    7181        return req.path_info == '/captcha' 
    7282     
    7383    def process_request(self, req): 
     
    93103        req.session.save() 
    94104        return 'verify_captcha.html', data, None 
    95105 
     106    def pre_process_request(self, req, handler): 
     107        self.env.log.warn(u"F PATH %s METHOD %s handler %s", req.path_info, req.method, handler) 
     108        #for key, value in req.session.iteritems(): 
     109        #    self.log.info('F Session "%s" = "%s"', key, value) 
     110        #for key, value in req.args.iteritems(): 
     111        #    self.log.info('F Args "%s" = "%s"', key, value) 
     112        if(req.path_info == '/captcha' and req.method == 'POST' and 
     113        req.args['captcha_response'] == req.session['captcha_expected']): 
     114            handlers = ExtensionPoint(IRequestHandler) 
     115            req.environ['PATH_INFO'] = req.session.get('captcha_redirect', req.href()) 
     116            for key, value in req.session.iteritems(): 
     117                self.log.info('F Found "%s" = "%s" in req.session', key, value) 
     118                if key.startswith('captcha_arg_'): 
     119                    arg = key[12:] 
     120                    req.args[arg] = value 
     121                    self.log.info('F Found and set arg "%s"', arg) 
     122            keys = req.session.keys() 
     123            for key in keys: 
     124                if key.startswith('captcha_arg_'): 
     125                    self.log.info('F Delete req.session "%s"', key) 
     126                    del req.session[key] 
     127            req.session.save() 
     128            self.env.log.warn(u"F Captcha %s", req.path_info) 
     129            try: 
     130                for newhandler in self.handlers: 
     131                    self.log.info('F Handler "%s"', newhandler) 
     132                    if newhandler.match_request(req): 
     133                        self.log.info('F Match') 
     134                        handler = newhandler 
     135                        del req.session['captcha_redirect'] 
     136                        del req.session['captcha_expected'] 
     137                        del req.session['captcha_reject_reason'] 
     138                        req.session['captcha_verified'] = int(time.time()) 
     139                        break 
     140            except TracError, e: 
     141                return (handler) 
     142        return (handler) 
     143 
     144    def post_process_request(self, req, template, content_type): 
     145        return (template, content_type) 
     146 
     147    def post_process_request(self, req, template, data, content_type): 
     148        return (template, data, content_type) 
     149 
     150 
    96151    # Internal methods 
    97152 
    98153    def _expired(self, req):