Index: tracspamfilter/captcha/api.py
===================================================================
--- tracspamfilter/captcha/api.py	(revision 9691)
+++ tracspamfilter/captcha/api.py	(working copy)
@@ -19,6 +19,7 @@
 from trac.core import *
 from trac.config import ExtensionOption, IntOption
 from trac.web.api import IRequestHandler
+from trac.web import IRequestFilter
 from tracspamfilter.api import IFilterStrategy, IRejectHandler, RejectContent
 
 
@@ -32,18 +33,22 @@
 
 
 class CaptchaSystem(Component):
-    implements(IRequestHandler, IRejectHandler, IFilterStrategy)
+    implements(IRequestHandler, IRejectHandler, IFilterStrategy, IRequestFilter)
 
+    handlers = ExtensionPoint(IRequestHandler)
+
     captcha = ExtensionOption('spam-filter', 'captcha', ICaptchaMethod,
                               'ExpressionCaptcha',
         """ CAPTCHA method to use for verifying humans. """)
 
-    karma_points = IntOption('spam-filter', 'captcha_karma', 10,
+#    karma_points = IntOption('spam-filter', 'captcha_karma', 10,
+    karma_points = IntOption('spam-filter', 'captcha_karma', 100,
         """By how many points a successful CAPTCHA response increases the
         overall score.""")
 
-    karma_lifetime = IntOption('spam-filter', 'captcha_karma_lifetime', 86400,
-        """Time in seconds that a successful CAPTCHA response increases
+ #   karma_lifetime = IntOption('spam-filter', 'captcha_karma_lifetime', 86400,
+    karma_lifetime = IntOption('spam-filter', 'captcha_karma_lifetime', 30,
+         """Time in seconds that a successful CAPTCHA response increases
         karma.""")
 
     # IFilterStrategy methods
@@ -58,9 +63,13 @@
     # IRejectHandler methods
 
     def reject_content(self, req, message):
+        self.log.info('Reject 0 "%s"', req.path_info)
         if self._expired(req):
             req.session['captcha_reject_reason'] = message
             req.session['captcha_redirect'] = req.href(req.path_info)
+            for key, value in req.args.iteritems():
+                req.session['captcha_arg_%s' % (key)] = value
+                self.log.info('Reject 1 "%s" = "%s"', key, value)
             req.redirect(req.href.captcha())
         else:
             raise RejectContent(message)
@@ -68,6 +77,7 @@
     # IRequestHandler methods
 
     def match_request(self, req):
+        self.log.info('Match "%s"', req.path_info)
         return req.path_info == '/captcha'
     
     def process_request(self, req):
@@ -93,6 +103,51 @@
         req.session.save()
         return 'verify_captcha.html', data, None
 
+    def pre_process_request(self, req, handler):
+        self.env.log.warn(u"F PATH %s METHOD %s handler %s", req.path_info, req.method, handler)
+        #for key, value in req.session.iteritems():
+        #    self.log.info('F Session "%s" = "%s"', key, value)
+        #for key, value in req.args.iteritems():
+        #    self.log.info('F Args "%s" = "%s"', key, value)
+        if(req.path_info == '/captcha' and req.method == 'POST' and
+        req.args['captcha_response'] == req.session['captcha_expected']):
+            handlers = ExtensionPoint(IRequestHandler)
+            req.environ['PATH_INFO'] = req.session.get('captcha_redirect', req.href())
+            for key, value in req.session.iteritems():
+                self.log.info('F Found "%s" = "%s" in req.session', key, value)
+                if key.startswith('captcha_arg_'):
+                    arg = key[12:]
+                    req.args[arg] = value
+                    self.log.info('F Found and set arg "%s"', arg)
+            keys = req.session.keys()
+            for key in keys:
+                if key.startswith('captcha_arg_'):
+                    self.log.info('F Delete req.session "%s"', key)
+                    del req.session[key]
+            req.session.save()
+            self.env.log.warn(u"F Captcha %s", req.path_info)
+            try:
+                for newhandler in self.handlers:
+                    self.log.info('F Handler "%s"', newhandler)
+                    if newhandler.match_request(req):
+                        self.log.info('F Match')
+                        handler = newhandler
+                        del req.session['captcha_redirect']
+                        del req.session['captcha_expected']
+                        del req.session['captcha_reject_reason']
+                        req.session['captcha_verified'] = int(time.time())
+                        break
+            except TracError, e:
+                return (handler)
+        return (handler)
+
+    def post_process_request(self, req, template, content_type):
+        return (template, content_type)
+
+    def post_process_request(self, req, template, data, content_type):
+        return (template, data, content_type)
+
+
     # Internal methods
 
     def _expired(self, req):

