Ticket #7173: captchapass_final.diff
| File captchapass_final.diff, 4.2 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_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 96 124 # Internal methods 97 125 98 126 def _expired(self, req): -
tracspamfilter/adapters.py
87 87 88 88 text = req.args['text'] 89 89 author = req.args.get('author', req.authname) 90 comment = req.args ['comment']90 comment = req.args.get('comment') 91 91 92 92 # Test the actual page changes as well as the comment 93 93 changes = [(page.text, text), (None, author)]
