Ticket #7173: captchapass_final_errorfix.diff
| File captchapass_final_errorfix.diff, 3.6 KB (added by stoecker, 21 months ago) |
|---|
-
tracspamfilter/captcha/api.py
18 18 19 19 from trac.core import * 20 20 from trac.config import ExtensionOption, IntOption 21 from trac.web.api import IRequest Handler21 from trac.web.api import IRequestFilter, IRequestHandler 22 22 from tracspamfilter.api import IFilterStrategy, IRejectHandler, RejectContent 23 23 24 24 … … 32 32 33 33 34 34 class CaptchaSystem(Component): 35 implements(IRequestHandler, IRejectHandler, IFilterStrategy )35 implements(IRequestHandler, IRejectHandler, IFilterStrategy, IRequestFilter) 36 36 37 handlers = ExtensionPoint(IRequestHandler) 38 37 39 captcha = ExtensionOption('spam-filter', 'captcha', ICaptchaMethod, 38 40 'ExpressionCaptcha', 39 41 """ CAPTCHA method to use for verifying humans. """) … … 61 63 if self._expired(req): 62 64 req.session['captcha_reject_reason'] = message 63 65 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 64 68 req.redirect(req.href.captcha()) 65 69 else: 66 70 raise RejectContent(message) … … 73 77 def process_request(self, req): 74 78 data = {} 75 79 if req.method == 'POST': 76 self.env.log.debug('CAPTCHA response: %s (expected %s)' %77 (req.args['captcha_response'], req.session['captcha_expected']))78 80 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' 86 82 else: 87 83 data['error'] = 'CAPTCHA verification failed' 88 84 else: … … 93 89 req.session.save() 94 90 return 'verify_captcha.html', data, None 95 91 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 96 122 # Internal methods 97 123 98 124 def _expired(self, req):
