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,7 +33,7 @@
 
 
 class CaptchaSystem(Component):
-    implements(IRequestHandler, IRejectHandler, IFilterStrategy)
+    implements(IRequestHandler, IRejectHandler, IFilterStrategy, IRequestFilter)
 
     captcha = ExtensionOption('spam-filter', 'captcha', ICaptchaMethod,
                               'ExpressionCaptcha',
@@ -42,8 +43,9 @@
         """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 +60,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)
@@ -81,6 +87,17 @@
                 del req.session['captcha_expected']
                 del req.session['captcha_reject_reason']
                 req.session['captcha_verified'] = int(time.time())
+                for key, value in req.session.iteritems():
+                    self.log.info('Found "%s" = "%s" in req.session', key, value)
+                    if key.startswith('captcha_arg_'):
+                        arg = key[12:]
+                        req.args[arg] = value
+                        self.log.info('Found and set arg "%s"', arg)
+                keys = req.session.keys()
+                for key in keys:
+                    if key.startswith('captcha_arg_'):
+                        self.log.info('Delete req.session "%s"', key)
+                        del req.session[key]
                 req.session.save()
                 req.redirect(redirect)
             else:
@@ -93,6 +110,42 @@
         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", req.path_info, req.method)
+        #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']):
+            #req.environ['PATH_INFO'] = req.session.get('captcha_redirect', req.href())
+            self.env.log.warn(u"F Captcha %s", req.path_info)
+            #del req.session['captcha_redirect']
+            #del req.session['captcha_expected']
+            #del req.session['captcha_reject_reason']
+            #req.session['captcha_verified'] = int(time.time())
+            #req.args = {}
+            #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()
+        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):

