Edgewall Software

Ticket #7173: captchahandler.diff

File captchahandler.diff, 4.7 KB (added by stoecker, 21 months ago)

development code to show possible way

  • 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 
    3738    captcha = ExtensionOption('spam-filter', 'captcha', ICaptchaMethod, 
    3839                              'ExpressionCaptcha', 
     
    4243        """By how many points a successful CAPTCHA response increases the 
    4344        overall score.""") 
    4445 
    45     karma_lifetime = IntOption('spam-filter', 'captcha_karma_lifetime', 86400, 
    46         """Time in seconds that a successful CAPTCHA response increases 
     46 #   karma_lifetime = IntOption('spam-filter', 'captcha_karma_lifetime', 86400, 
     47    karma_lifetime = IntOption('spam-filter', 'captcha_karma_lifetime', 30, 
     48         """Time in seconds that a successful CAPTCHA response increases 
    4749        karma.""") 
    4850 
    4951    # IFilterStrategy methods 
     
    5860    # IRejectHandler methods 
    5961 
    6062    def reject_content(self, req, message): 
     63        self.log.info('Reject 0 "%s"', req.path_info) 
    6164        if self._expired(req): 
    6265            req.session['captcha_reject_reason'] = message 
    6366            req.session['captcha_redirect'] = req.href(req.path_info) 
     67            for key, value in req.args.iteritems(): 
     68                req.session['captcha_arg_%s' % (key)] = value 
     69                self.log.info('Reject 1 "%s" = "%s"', key, value) 
    6470            req.redirect(req.href.captcha()) 
    6571        else: 
    6672            raise RejectContent(message) 
     
    8187                del req.session['captcha_expected'] 
    8288                del req.session['captcha_reject_reason'] 
    8389                req.session['captcha_verified'] = int(time.time()) 
     90                for key, value in req.session.iteritems(): 
     91                    self.log.info('Found "%s" = "%s" in req.session', key, value) 
     92                    if key.startswith('captcha_arg_'): 
     93                        arg = key[12:] 
     94                        req.args[arg] = value 
     95                        self.log.info('Found and set arg "%s"', arg) 
     96                keys = req.session.keys() 
     97                for key in keys: 
     98                    if key.startswith('captcha_arg_'): 
     99                        self.log.info('Delete req.session "%s"', key) 
     100                        del req.session[key] 
    84101                req.session.save() 
    85102                req.redirect(redirect) 
    86103            else: 
     
    93110        req.session.save() 
    94111        return 'verify_captcha.html', data, None 
    95112 
     113    def pre_process_request(self, req, handler): 
     114        #self.env.log.warn(u"F PATH %s METHOD %s", req.path_info, req.method) 
     115        #for key, value in req.session.iteritems(): 
     116        #    self.log.info('F Session "%s" = "%s"', key, value) 
     117        #for key, value in req.args.iteritems(): 
     118        #    self.log.info('F Args "%s" = "%s"', key, value) 
     119        if(req.path_info == '/captcha' and req.method == 'POST' and 
     120        req.args['captcha_response'] == req.session['captcha_expected']): 
     121            #req.environ['PATH_INFO'] = req.session.get('captcha_redirect', req.href()) 
     122            self.env.log.warn(u"F Captcha %s", req.path_info) 
     123            #del req.session['captcha_redirect'] 
     124            #del req.session['captcha_expected'] 
     125            #del req.session['captcha_reject_reason'] 
     126            #req.session['captcha_verified'] = int(time.time()) 
     127            #req.args = {} 
     128            #for key, value in req.session.iteritems(): 
     129            #    self.log.info('F Found "%s" = "%s" in req.session', key, value) 
     130            #    if key.startswith('captcha_arg_'): 
     131            #        arg = key[12:] 
     132            #        req.args[arg] = value 
     133            #        self.log.info('F Found and set arg "%s"', arg) 
     134            #keys = req.session.keys() 
     135            #for key in keys: 
     136            #    if key.startswith('captcha_arg_'): 
     137            #         self.log.info('F Delete req.session "%s"', key) 
     138            #         del req.session[key] 
     139            #req.session.save() 
     140        return (handler) 
     141 
     142    def post_process_request(self, req, template, content_type): 
     143        return (template, content_type) 
     144 
     145    def post_process_request(self, req, template, data, content_type): 
     146        return (template, data, content_type) 
     147 
     148 
    96149    # Internal methods 
    97150 
    98151    def _expired(self, req):